Refactor anyxml/anydata 80/87480/1
authorRobert Varga <robert.varga@pantheon.tech>
Tue, 4 Feb 2020 18:30:04 +0000 (19:30 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 6 Feb 2020 11:23:56 +0000 (12:23 +0100)
These are quite simple classes, which are needlessly bloated. Fix
up implementation classes to shed ~50% of overhead.

This also leaves AbstractEffectiveMustConstraintAwareDataSchemaNode
without any users, hence we mark it for removal.

JIRA: YANGTOOLS-1065
Change-Id: I206b186e058f493a9b90aa2ed7529be0d88a1fc7
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
19 files changed:
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/AnydataEffectiveStatement.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/AnydataStatement.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/AnyxmlEffectiveStatement.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/AnyxmlStatement.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveMustConstraintAwareDataSchemaNode.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/EffectiveStatementMixins.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/AnydataEffectiveStatementImpl.java [deleted file]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/AnydataStatementSupport.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/EmptyAnydataEffectiveStatement.java [new file with mode: 0644]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/EmptyAnydataStatement.java [new file with mode: 0644]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/RegularAnydataEffectiveStatement.java [new file with mode: 0644]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/RegularAnydataStatement.java [moved from yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/AnydataStatementImpl.java with 53% similarity]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/AnyxmlEffectiveStatementImpl.java [deleted file]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/AnyxmlStatementSupport.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/EmptyAnyxmlEffectiveStatement.java [new file with mode: 0644]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/EmptyAnyxmlStatement.java [new file with mode: 0644]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/RegularAnyxmlEffectiveStatement.java [new file with mode: 0644]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/RegularAnyxmlStatement.java [moved from yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/AnyxmlStatementImpl.java with 50% similarity]
yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/YangParserSimpleTest.java

index d88a2c96b4bd418fd3d62ec190dacb26269fc1e4..69ac8bf18a80a9fbb25c74a80f59a6d82eca5df3 100644 (file)
@@ -8,8 +8,13 @@
 package org.opendaylight.yangtools.yang.model.api.stmt;
 
 import com.google.common.annotations.Beta;
+import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 
 @Beta
 public interface AnydataEffectiveStatement extends DataTreeEffectiveStatement<AnydataStatement> {
-
+    @Override
+    default StatementDefinition statementDefinition() {
+        return YangStmtMapping.ANYDATA;
+    }
 }
index 0b0325b88a8260bd28fcc06b38f09867834a6c03..cf9f5d70f131df15eaaf65ac3b2fe8a137f8d3ad 100644 (file)
@@ -9,6 +9,8 @@ package org.opendaylight.yangtools.yang.model.api.stmt;
 
 import com.google.common.annotations.Beta;
 import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 
 /**
  * The "anydata" statement defines an interior node in the schema tree. It takes one argument, which is an identifier,
@@ -22,6 +24,9 @@ import org.opendaylight.yangtools.yang.common.QName;
  */
 @Beta
 public interface AnydataStatement extends DataDefinitionStatement, ConfigStatementAwareDeclaredStatement<QName>,
-    MandatoryStatementAwareDeclaredStatement<QName>, MustStatementAwareDeclaredStatement<QName> {
-
+        MandatoryStatementAwareDeclaredStatement<QName>, MustStatementAwareDeclaredStatement<QName> {
+    @Override
+    default StatementDefinition statementDefinition() {
+        return YangStmtMapping.ANYDATA;
+    }
 }
index 9e8fdaa537e248bc0736ef7ccee735189643fa2e..87708948d33400c003567d4b4bc2caa822dd96a9 100644 (file)
@@ -8,8 +8,14 @@
 package org.opendaylight.yangtools.yang.model.api.stmt;
 
 import com.google.common.annotations.Beta;
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 
 @Beta
 public interface AnyxmlEffectiveStatement extends DataTreeEffectiveStatement<AnyxmlStatement> {
-
+    @Override
+    default @NonNull StatementDefinition statementDefinition() {
+        return YangStmtMapping.ANYXML;
+    }
 }
index c10b472aec4a6cc288a1fefa33987f5c400d16e1..0a91b488218f375c366e7a96080fee9986ded2cb 100644 (file)
@@ -7,9 +7,15 @@
  */
 package org.opendaylight.yangtools.yang.model.api.stmt;
 
+import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 
 public interface AnyxmlStatement extends DataDefinitionStatement, ConfigStatementAwareDeclaredStatement<QName>,
-    MandatoryStatementAwareDeclaredStatement<QName>, MustStatementAwareDeclaredStatement<QName> {
-
+        MandatoryStatementAwareDeclaredStatement<QName>, MustStatementAwareDeclaredStatement<QName> {
+    @Override
+    default @NonNull StatementDefinition statementDefinition() {
+        return YangStmtMapping.ANYXML;
+    }
 }
index 12226f34b52d5f8648aa6918fb130a87ab1d3eaf..2cfea879d2c7665a091bb8b4949dd71d9d022785 100644 (file)
@@ -7,7 +7,6 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt;
 
-import com.google.common.annotations.Beta;
 import com.google.common.collect.ImmutableSet;
 import java.lang.invoke.MethodHandles;
 import java.lang.invoke.VarHandle;
@@ -17,7 +16,7 @@ import org.opendaylight.yangtools.yang.model.api.MustDefinition;
 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 
-@Beta
+@Deprecated(forRemoval = true)
 public abstract class AbstractEffectiveMustConstraintAwareDataSchemaNode<D extends DeclaredStatement<QName>>
         extends AbstractEffectiveDataSchemaNode<D> implements MustConstraintAware {
     private static final VarHandle MUST_CONSTRAINTS;
index 2ca462fea79cc40824dd96217c4f7adfb7f9c012..3ca01d62ca7f9efeb3ff1d4d8866ab0735a73988 100644 (file)
@@ -29,6 +29,7 @@ import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.CopyableNode;
 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.DerivableSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.DocumentedNode;
 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
 import org.opendaylight.yangtools.yang.model.api.MandatoryAware;
@@ -323,7 +324,6 @@ public final class EffectiveStatementMixins {
      *
      * @param <D> Class representing declared version of this statement.
      */
-    @Beta
     public interface OperationContainerMixin<D extends DeclaredStatement<QName>>
             extends ContainerSchemaNode, DocumentedNodeMixin.WithStatus<QName, D>, DataNodeContainerMixin<QName, D>,
                     MustConstraintMixin<QName, D>, WhenConditionMixin<QName, D>, AugmentationTargetMixin<QName, D>,
@@ -374,6 +374,25 @@ public final class EffectiveStatementMixins {
         }
     }
 
+    /**
+     * Helper bridge for {@code anydata} and {@code anyxml} opaque data..
+     *
+     * @param <D> Class representing declared version of this statement.
+     */
+    public interface OpaqueDataSchemaNodeMixin<D extends DeclaredStatement<QName>>
+            extends DerivableSchemaNode, DataSchemaNodeMixin<QName, D>, DocumentedNodeMixin.WithStatus<QName, D>,
+                    MandatoryMixin<QName, D>, MustConstraintMixin<QName, D>, WhenConditionMixin<QName, D> {
+        @Override
+        default @NonNull QName argument() {
+            return getPath().getLastComponent();
+        }
+
+        @Override
+        default QName getQName() {
+            return argument();
+        }
+    }
+
     /**
      * Support interface for various mixins. Implementations are required to store 32bits worth of flags, which are
      * globally assigned to sub-interfaces -- thus providing storage for many low-cardinality properties.
diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/AnydataEffectiveStatementImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/AnydataEffectiveStatementImpl.java
deleted file mode 100644 (file)
index c0b8d04..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.anydata;
-
-import com.google.common.annotations.Beta;
-import com.google.common.base.MoreObjects;
-import java.util.Objects;
-import java.util.Optional;
-import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.model.api.AnydataSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.DerivableSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.stmt.AnydataEffectiveStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.AnydataStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.MandatoryEffectiveStatement;
-import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractEffectiveMustConstraintAwareDataSchemaNode;
-import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
-
-/**
- * YANG 1.1 AnyData effective statement implementation.
- */
-@Beta
-final class AnydataEffectiveStatementImpl extends AbstractEffectiveMustConstraintAwareDataSchemaNode<AnydataStatement>
-        implements AnydataEffectiveStatement, AnydataSchemaNode, DerivableSchemaNode {
-
-    private final AnydataSchemaNode original;
-    private final ContainerSchemaNode schema;
-    private final boolean mandatory;
-
-    AnydataEffectiveStatementImpl(final StmtContext<QName, AnydataStatement, AnydataEffectiveStatement> ctx) {
-        super(ctx);
-        this.original = (AnydataSchemaNode) ctx.getOriginalCtx().map(StmtContext::buildEffective).orElse(null);
-        mandatory = findFirstEffectiveSubstatementArgument(MandatoryEffectiveStatement.class).orElse(Boolean.FALSE)
-                .booleanValue();
-
-        /*
-         * :TODO we need to determine a way how to set schema of AnyData
-         */
-        this.schema = null;
-    }
-
-    @Override
-    public Optional<AnydataSchemaNode> getOriginal() {
-        return Optional.ofNullable(original);
-    }
-
-    @Override
-    public Optional<ContainerSchemaNode> getDataSchema() {
-        return Optional.ofNullable(schema);
-    }
-
-    @Override
-    public boolean isMandatory() {
-        return mandatory;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(getQName(),getPath());
-    }
-
-    @Override
-    public boolean equals(final Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null) {
-            return false;
-        }
-        if (getClass() != obj.getClass()) {
-            return false;
-        }
-
-        final AnydataEffectiveStatementImpl other = (AnydataEffectiveStatementImpl) obj;
-        return Objects.equals(getQName(), other.getQName()) && Objects.equals(getPath(), other.getPath());
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(this).add("qname", getQName()).add("path", getPath()).toString();
-    }
-}
index e729e8cb0fa9bbdf5991cbdfc2a3b09b0784fb8a..7f578b89dbd5cfc45f0c2a6ae39ec3e4eacf3d90 100644 (file)
@@ -7,19 +7,28 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.anydata;
 
+import com.google.common.collect.ImmutableList;
+import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.AnydataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.Status;
 import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
+import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.AnydataEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.AnydataStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.MandatoryEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.StatusEffectiveStatement;
 import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.ChildSchemaNodeNamespace;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractQNameStatementSupport;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseQNameStatementSupport;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.EffectiveStatementWithFlags.FlagsBuilder;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils;
 import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator;
 
 public final class AnydataStatementSupport
-        extends AbstractQNameStatementSupport<AnydataStatement, AnydataEffectiveStatement> {
+        extends BaseQNameStatementSupport<AnydataStatement, AnydataEffectiveStatement> {
     private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(
         YangStmtMapping.ANYDATA)
         .addOptional(YangStmtMapping.CONFIG)
@@ -52,18 +61,49 @@ public final class AnydataStatementSupport
     }
 
     @Override
-    public AnydataStatement createDeclared(final StmtContext<QName, AnydataStatement, ?> ctx) {
-        return new AnydataStatementImpl(ctx);
+    protected SubstatementValidator getSubstatementValidator() {
+        return SUBSTATEMENT_VALIDATOR;
     }
 
     @Override
-    public AnydataEffectiveStatement createEffective(
-            final StmtContext<QName, AnydataStatement, AnydataEffectiveStatement> ctx) {
-        return new AnydataEffectiveStatementImpl(ctx);
+    protected AnydataStatement createDeclared(final StmtContext<QName, AnydataStatement, ?> ctx,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        return new RegularAnydataStatement(ctx.coerceStatementArgument(), substatements);
     }
 
     @Override
-    protected SubstatementValidator getSubstatementValidator() {
-        return SUBSTATEMENT_VALIDATOR;
+    protected AnydataStatement createEmptyDeclared(final StmtContext<QName, AnydataStatement, ?> ctx) {
+        return new EmptyAnydataStatement(ctx.coerceStatementArgument());
+    }
+
+    @Override
+    protected AnydataEffectiveStatement createEffective(
+            final StmtContext<QName, AnydataStatement, AnydataEffectiveStatement> ctx,
+            final AnydataStatement declared,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        return new RegularAnydataEffectiveStatement(declared, ctx.getSchemaPath().get(),
+            computeFlags(ctx, substatements), findOriginal(ctx), substatements);
+    }
+
+    @Override
+    protected AnydataEffectiveStatement createEmptyEffective(
+            final StmtContext<QName, AnydataStatement, AnydataEffectiveStatement> ctx,
+            final AnydataStatement declared) {
+        return new EmptyAnydataEffectiveStatement(declared, ctx.getSchemaPath().get(),
+            computeFlags(ctx, ImmutableList.of()), findOriginal(ctx));
+    }
+
+    private static int computeFlags(final StmtContext<?, ?, ?> ctx,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        return new FlagsBuilder()
+                .setHistory(ctx.getCopyHistory())
+                .setStatus(findFirstArgument(substatements, StatusEffectiveStatement.class, Status.CURRENT))
+                .setConfiguration(ctx.isConfiguration())
+                .setMandatory(findFirstArgument(substatements, MandatoryEffectiveStatement.class, Boolean.FALSE))
+                .toFlags();
+    }
+
+    private static @Nullable AnydataSchemaNode findOriginal(final StmtContext<?, ?, ?> ctx) {
+        return (AnydataSchemaNode) ctx.getOriginalCtx().map(StmtContext::buildEffective).orElse(null);
     }
 }
\ No newline at end of file
diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/EmptyAnydataEffectiveStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/EmptyAnydataEffectiveStatement.java
new file mode 100644 (file)
index 0000000..670204e
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.anydata;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.base.MoreObjects;
+import java.util.Objects;
+import java.util.Optional;
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.AnydataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.stmt.AnydataEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.AnydataStatement;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredEffectiveStatement.Default;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.OpaqueDataSchemaNodeMixin;
+
+class EmptyAnydataEffectiveStatement extends Default<QName, AnydataStatement>
+        implements AnydataEffectiveStatement, AnydataSchemaNode, OpaqueDataSchemaNodeMixin<AnydataStatement> {
+    private final @NonNull SchemaPath path;
+    private final AnydataSchemaNode original;
+    private final int flags;
+
+    EmptyAnydataEffectiveStatement(final AnydataStatement declared, final SchemaPath path, final int flags,
+            final @Nullable AnydataSchemaNode original) {
+        super(declared);
+        this.path = requireNonNull(path);
+        this.flags = flags;
+        this.original = original;
+    }
+
+    @Override
+    public final @NonNull SchemaPath getPath() {
+        return path;
+    }
+
+    @Override
+    public final int flags() {
+        return flags;
+    }
+
+    @Override
+    public final Optional<AnydataSchemaNode> getOriginal() {
+        return Optional.ofNullable(original);
+    }
+
+    @Override
+    public final Optional<ContainerSchemaNode> getDataSchema() {
+        /*
+         * :TODO we need to determine a way how to set schema of AnyData
+         */
+        return Optional.empty();
+    }
+
+    @Override
+    public final int hashCode() {
+        return Objects.hash(getQName(), getPath());
+    }
+
+    @Override
+    public final boolean equals(final Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (!(obj instanceof EmptyAnydataEffectiveStatement)) {
+            return false;
+        }
+        final EmptyAnydataEffectiveStatement other = (EmptyAnydataEffectiveStatement) obj;
+        return Objects.equals(getQName(), other.getQName()) && Objects.equals(getPath(), other.getPath());
+    }
+
+    @Override
+    public final String toString() {
+        return MoreObjects.toStringHelper(this).add("qname", getQName()).add("path", getPath()).toString();
+    }
+}
diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/EmptyAnydataStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/EmptyAnydataStatement.java
new file mode 100644 (file)
index 0000000..593a5ee
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.anydata;
+
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.stmt.AnydataStatement;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.WithQNameArgument;
+
+final class EmptyAnydataStatement extends WithQNameArgument implements AnydataStatement {
+    EmptyAnydataStatement(final QName argument) {
+        super(argument);
+    }
+}
diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/RegularAnydataEffectiveStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/RegularAnydataEffectiveStatement.java
new file mode 100644 (file)
index 0000000..cac8eae
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.anydata;
+
+import com.google.common.collect.ImmutableList;
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
+import org.opendaylight.yangtools.yang.model.api.AnydataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.AnydataStatement;
+
+/**
+ * YANG 1.1 AnyData effective statement implementation.
+ */
+final class RegularAnydataEffectiveStatement extends EmptyAnydataEffectiveStatement {
+    private final @NonNull Object substatements;
+
+    RegularAnydataEffectiveStatement(final AnydataStatement declared, final SchemaPath path, final int flags,
+            final @Nullable AnydataSchemaNode original,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        super(declared, path, flags, original);
+        this.substatements = maskList(substatements);
+    }
+
+    @Override
+    public ImmutableList<? extends EffectiveStatement<?, ?>> effectiveSubstatements() {
+        return unmaskList(substatements);
+    }
+}
@@ -7,18 +7,17 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.anydata;
 
-import com.google.common.annotations.Beta;
+import com.google.common.collect.ImmutableList;
 import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.AnydataStatement;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
-import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.WithQNameArgument.WithSubstatements;
 
 /**
  * YANG 1.1 AnyData declared statement implementation.
  */
-@Beta
-final class AnydataStatementImpl extends AbstractDeclaredStatement<QName> implements AnydataStatement {
-    AnydataStatementImpl(final StmtContext<QName, AnydataStatement, ?> context) {
-        super(context);
+final class RegularAnydataStatement extends WithSubstatements implements AnydataStatement {
+    RegularAnydataStatement(final QName argument, final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        super(argument, substatements);
     }
 }
diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/AnyxmlEffectiveStatementImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/AnyxmlEffectiveStatementImpl.java
deleted file mode 100644 (file)
index e0e8bcd..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.anyxml;
-
-import java.util.Objects;
-import java.util.Optional;
-import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.DerivableSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlEffectiveStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.MandatoryEffectiveStatement;
-import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractEffectiveMustConstraintAwareDataSchemaNode;
-import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
-
-final class AnyxmlEffectiveStatementImpl extends AbstractEffectiveMustConstraintAwareDataSchemaNode<AnyxmlStatement>
-        implements AnyxmlEffectiveStatement, AnyxmlSchemaNode, DerivableSchemaNode {
-
-    private final AnyxmlSchemaNode original;
-    private final boolean mandatory;
-
-    AnyxmlEffectiveStatementImpl(final StmtContext<QName, AnyxmlStatement, AnyxmlEffectiveStatement> ctx) {
-        super(ctx);
-        this.original = (AnyxmlSchemaNode) ctx.getOriginalCtx().map(StmtContext::buildEffective).orElse(null);
-        mandatory = findFirstEffectiveSubstatementArgument(MandatoryEffectiveStatement.class).orElse(Boolean.FALSE)
-                .booleanValue();
-    }
-
-    @Override
-    public boolean isMandatory() {
-        return mandatory;
-    }
-
-    @Override
-    public Optional<AnyxmlSchemaNode> getOriginal() {
-        return Optional.ofNullable(original);
-    }
-
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + Objects.hashCode(getQName());
-        result = prime * result + Objects.hashCode(getPath());
-        return result;
-    }
-
-    @Override
-    public boolean equals(final Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null) {
-            return false;
-        }
-        if (getClass() != obj.getClass()) {
-            return false;
-        }
-
-        AnyxmlEffectiveStatementImpl other = (AnyxmlEffectiveStatementImpl) obj;
-        return Objects.equals(getQName(), other.getQName()) && Objects.equals(getPath(), other.getPath());
-    }
-
-    @Override
-    public String toString() {
-        return AnyxmlEffectiveStatementImpl.class.getSimpleName() + "["
-                + "qname=" + getQName()
-                + ", path=" + getPath()
-                + "]";
-    }
-}
index f2ed909fe48b124fce05ce42f38b263bfb541cd0..9a873aae1a270cc7d08930d780a2d90d072841ff 100644 (file)
@@ -7,19 +7,28 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.anyxml;
 
+import com.google.common.collect.ImmutableList;
+import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.Status;
 import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
+import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.MandatoryEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.StatusEffectiveStatement;
 import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.ChildSchemaNodeNamespace;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractQNameStatementSupport;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseQNameStatementSupport;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.EffectiveStatementWithFlags.FlagsBuilder;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils;
 import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator;
 
 public final class AnyxmlStatementSupport
-        extends AbstractQNameStatementSupport<AnyxmlStatement, AnyxmlEffectiveStatement> {
+        extends BaseQNameStatementSupport<AnyxmlStatement, AnyxmlEffectiveStatement> {
     private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(YangStmtMapping
         .ANYXML)
         .addOptional(YangStmtMapping.CONFIG)
@@ -52,18 +61,47 @@ public final class AnyxmlStatementSupport
     }
 
     @Override
-    public AnyxmlStatement createDeclared(final StmtContext<QName, AnyxmlStatement, ?> ctx) {
-        return new AnyxmlStatementImpl(ctx);
+    protected SubstatementValidator getSubstatementValidator() {
+        return SUBSTATEMENT_VALIDATOR;
     }
 
     @Override
-    public AnyxmlEffectiveStatement createEffective(
-            final StmtContext<QName, AnyxmlStatement, AnyxmlEffectiveStatement> ctx) {
-        return new AnyxmlEffectiveStatementImpl(ctx);
+    protected AnyxmlStatement createDeclared(final StmtContext<QName, AnyxmlStatement, ?> ctx,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        return new RegularAnyxmlStatement(ctx.coerceStatementArgument(), substatements);
     }
 
     @Override
-    protected SubstatementValidator getSubstatementValidator() {
-        return SUBSTATEMENT_VALIDATOR;
+    protected AnyxmlStatement createEmptyDeclared(final StmtContext<QName, AnyxmlStatement, ?> ctx) {
+        return new EmptyAnyxmlStatement(ctx.coerceStatementArgument());
+    }
+
+    @Override
+    protected AnyxmlEffectiveStatement createEffective(
+            final StmtContext<QName, AnyxmlStatement, AnyxmlEffectiveStatement> ctx,
+            final AnyxmlStatement declared, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        return new RegularAnyxmlEffectiveStatement(declared, ctx.getSchemaPath().get(),
+            computeFlags(ctx, substatements), findOriginal(ctx),substatements);
+    }
+
+    @Override
+    protected AnyxmlEffectiveStatement createEmptyEffective(
+            final StmtContext<QName, AnyxmlStatement, AnyxmlEffectiveStatement> ctx, final AnyxmlStatement declared) {
+        return new EmptyAnyxmlEffectiveStatement(declared, ctx.getSchemaPath().get(),
+            computeFlags(ctx, ImmutableList.of()), findOriginal(ctx));
+    }
+
+    private static int computeFlags(final StmtContext<?, ?, ?> ctx,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        return new FlagsBuilder()
+                .setHistory(ctx.getCopyHistory())
+                .setStatus(findFirstArgument(substatements, StatusEffectiveStatement.class, Status.CURRENT))
+                .setConfiguration(ctx.isConfiguration())
+                .setMandatory(findFirstArgument(substatements, MandatoryEffectiveStatement.class, Boolean.FALSE))
+                .toFlags();
+    }
+
+    private static @Nullable AnyxmlSchemaNode findOriginal(final StmtContext<?, ?, ?> ctx) {
+        return (AnyxmlSchemaNode) ctx.getOriginalCtx().map(StmtContext::buildEffective).orElse(null);
     }
 }
diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/EmptyAnyxmlEffectiveStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/EmptyAnyxmlEffectiveStatement.java
new file mode 100644 (file)
index 0000000..911a130
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.anyxml;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.base.MoreObjects;
+import java.util.Objects;
+import java.util.Optional;
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlStatement;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredEffectiveStatement.Default;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.OpaqueDataSchemaNodeMixin;
+
+class EmptyAnyxmlEffectiveStatement extends Default<QName, AnyxmlStatement>
+        implements AnyxmlEffectiveStatement, AnyxmlSchemaNode, OpaqueDataSchemaNodeMixin<AnyxmlStatement> {
+    private final @NonNull SchemaPath path;
+    private final AnyxmlSchemaNode original;
+    private final int flags;
+
+    EmptyAnyxmlEffectiveStatement(final AnyxmlStatement declared, final SchemaPath path, final int flags,
+            final @Nullable AnyxmlSchemaNode original) {
+        super(declared);
+        this.path = requireNonNull(path);
+        this.flags = flags;
+        this.original = original;
+    }
+
+    @Override
+    public final @NonNull SchemaPath getPath() {
+        return path;
+    }
+
+    @Override
+    public final int flags() {
+        return flags;
+    }
+
+    @Override
+    public final Optional<AnyxmlSchemaNode> getOriginal() {
+        return Optional.ofNullable(original);
+    }
+
+    @Override
+    public final int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + Objects.hashCode(getQName());
+        result = prime * result + Objects.hashCode(getPath());
+        return result;
+    }
+
+    @Override
+    public final boolean equals(final Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (!(obj instanceof EmptyAnyxmlEffectiveStatement)) {
+            return false;
+        }
+
+        EmptyAnyxmlEffectiveStatement other = (EmptyAnyxmlEffectiveStatement) obj;
+        return Objects.equals(getQName(), other.getQName()) && Objects.equals(getPath(), other.getPath());
+    }
+
+    @Override
+    public final String toString() {
+        return MoreObjects.toStringHelper(this).add("qname", getQName()).add("path", getPath()).toString();
+    }
+}
diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/EmptyAnyxmlStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/EmptyAnyxmlStatement.java
new file mode 100644 (file)
index 0000000..19df08c
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.anyxml;
+
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlStatement;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.WithQNameArgument;
+
+final class EmptyAnyxmlStatement extends WithQNameArgument implements AnyxmlStatement {
+    EmptyAnyxmlStatement(final QName argument) {
+        super(argument);
+    }
+}
diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/RegularAnyxmlEffectiveStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/RegularAnyxmlEffectiveStatement.java
new file mode 100644 (file)
index 0000000..de7bf25
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.anyxml;
+
+import com.google.common.collect.ImmutableList;
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
+import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlStatement;
+
+final class RegularAnyxmlEffectiveStatement extends EmptyAnyxmlEffectiveStatement {
+    private final @NonNull Object substatements;
+
+    RegularAnyxmlEffectiveStatement(final AnyxmlStatement declared, final SchemaPath path, final int flags,
+            final @Nullable AnyxmlSchemaNode original,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        super(declared, path, flags, original);
+        this.substatements = maskList(substatements);
+    }
+
+    @Override
+    public ImmutableList<? extends EffectiveStatement<?, ?>> effectiveSubstatements() {
+        return unmaskList(substatements);
+    }
+}
@@ -7,13 +7,14 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.anyxml;
 
+import com.google.common.collect.ImmutableList;
 import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlStatement;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
-import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.WithQNameArgument.WithSubstatements;
 
-final class AnyxmlStatementImpl extends AbstractDeclaredStatement<QName> implements AnyxmlStatement {
-    AnyxmlStatementImpl(final StmtContext<QName, AnyxmlStatement, ?> context) {
-        super(context);
+final class RegularAnyxmlStatement extends WithSubstatements implements AnyxmlStatement {
+    RegularAnyxmlStatement(final QName argument, final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        super(argument, substatements);
     }
 }
index 328ac01b3d2541cfc580314f0b6aea4987bf44e9..33268a1351354052b2e9d4ec47c6eb1fe063b230 100644 (file)
@@ -58,8 +58,8 @@ public class YangParserSimpleTest {
             QName.create(testModule.getQNameModule(), "data"));
         assertNotNull("'anyxml data not found'", data);
         assertFalse(data.equals(null));
-        assertEquals("AnyxmlEffectiveStatementImpl[qname=(urn:opendaylight:simple-nodes?revision=2013-07-30)data, "
-                + "path=AbsoluteSchemaPath{path=[(urn:opendaylight:simple-nodes?revision=2013-07-30)data]}]",
+        assertEquals("RegularAnyxmlEffectiveStatement{qname=(urn:opendaylight:simple-nodes?revision=2013-07-30)data, "
+                + "path=AbsoluteSchemaPath{path=[(urn:opendaylight:simple-nodes?revision=2013-07-30)data]}}",
                 data.toString());
 
         // test SchemaNode args
@@ -104,7 +104,7 @@ public class YangParserSimpleTest {
                 QName.create(testModule.getQNameModule(), "data2")).orElse(null);
 
         assertNotNull("'anydata data not found'", anydata);
-        assertEquals("AnydataEffectiveStatementImpl{qname=(urn:opendaylight:simple-nodes?revision=2013-07-30)data2, "
+        assertEquals("RegularAnydataEffectiveStatement{qname=(urn:opendaylight:simple-nodes?revision=2013-07-30)data2, "
                         + "path=AbsoluteSchemaPath{path=[(urn:opendaylight:simple-nodes?revision=2013-07-30)data2]}}",
                 anydata.toString());