Hide {Extension,Input,Output,Submodule}EffeciveStatementImpl 25/65425/4
authorRobert Varga <robert.varga@pantheon.tech>
Sat, 11 Nov 2017 02:07:44 +0000 (03:07 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 13 Nov 2017 10:39:43 +0000 (11:39 +0100)
SchemaNode-backing is an implementation detail, which we do not have
to enforce via type safety -- it is sufficient to place verification
guards, as the connection between the two APIs is not clarified and
statement compatibility will get clarified when the fate of those
APIs is decided.

Change-Id: Ib63b3d42437a3292e58d084cbf311b5217b43dbe
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveModule.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/EffectiveStatementBase.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/action/ActionEffectiveStatementImpl.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/extension/ExtensionEffectiveStatementImpl.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/input/InputEffectiveStatementImpl.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/output/OutputEffectiveStatementImpl.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/rpc/RpcEffectiveStatementImpl.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/submodule/SubmoduleEffectiveStatementImpl.java

index 6607bf821269d9069866a181988cd620b6dc1b90..9363d361568b4796b11ccd9278a12e3cc3a16d36 100644 (file)
@@ -12,13 +12,13 @@ import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.base.MoreObjects;
+import com.google.common.base.Verify;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import java.net.URI;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
@@ -56,11 +56,10 @@ import org.opendaylight.yangtools.yang.model.api.stmt.BelongsToEffectiveStatemen
 import org.opendaylight.yangtools.yang.model.api.stmt.ContactEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.OrganizationEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.PrefixEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.SubmoduleEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.SubmoduleStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.TypedefEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.YangVersionEffectiveStatement;
-import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.extension.ExtensionEffectiveStatementImpl;
-import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.submodule.SubmoduleEffectiveStatementImpl;
 import org.opendaylight.yangtools.yang.parser.spi.meta.MutableStatement;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable;
@@ -142,13 +141,13 @@ public abstract class AbstractEffectiveModule<D extends DeclaredStatement<String
              * for modules. In case of submodules it does not make sense because
              * of possible circular chains of includes between submodules.
              */
-            final Collection<StmtContext<?, ?, ?>> includedSubmodules = includedSubmodulesMap.values();
             final Set<Module> submodulesInit = new HashSet<>();
             final List<EffectiveStatement<?, ?>> substatementsOfSubmodulesInit = new ArrayList<>();
-            for (final StmtContext<?, ?, ?> submoduleCtx : includedSubmodules) {
-                final SubmoduleEffectiveStatementImpl submodule = (SubmoduleEffectiveStatementImpl) submoduleCtx
-                        .buildEffective();
-                submodulesInit.add(submodule);
+            for (final StmtContext<?, ?, ?> submoduleCtx : includedSubmodulesMap.values()) {
+                final EffectiveStatement<?, ?> submodule = submoduleCtx.buildEffective();
+                Verify.verify(submodule instanceof SubmoduleEffectiveStatement);
+                Verify.verify(submodule instanceof Module, "Submodule statement %s is not a Module", submodule);
+                submodulesInit.add((Module) submodule);
                 substatementsOfSubmodulesInit.addAll(submodule.effectiveSubstatements().stream()
                         .filter(sub -> sub instanceof SchemaNode || sub instanceof DataNodeContainer)
                         .collect(Collectors.toList()));
@@ -227,8 +226,8 @@ public abstract class AbstractEffectiveModule<D extends DeclaredStatement<String
             if (effectiveStatement instanceof FeatureDefinition) {
                 featuresInit.add((FeatureDefinition) effectiveStatement);
             }
-            if (effectiveStatement instanceof ExtensionEffectiveStatementImpl) {
-                extensionNodesInit.add((ExtensionEffectiveStatementImpl) effectiveStatement);
+            if (effectiveStatement instanceof ExtensionDefinition) {
+                extensionNodesInit.add((ExtensionDefinition) effectiveStatement);
             }
             if (effectiveStatement instanceof DataSchemaNode) {
                 final DataSchemaNode dataSchemaNode = (DataSchemaNode) effectiveStatement;
index efaf464d70acd5f6989f75bc581802a93cb22010..3392b33a3f75a48637ff030d590505f61ae4f5df 100644 (file)
@@ -56,8 +56,7 @@ public abstract class EffectiveStatementBase<A, D extends DeclaredStatement<A>>
 
     /**
      * Create a set of substatements. This method is split out so it can be overridden in
-     * {@link org.opendaylight.yangtools.yang.parser.rfc7950.stmt.extension.ExtensionEffectiveStatementImpl} to leak
-     * a not-fully-initialized instance.
+     * ExtensionEffectiveStatementImpl to leak a not-fully-initialized instance.
      *
      * @param substatementsInit proposed substatements
      * @return Filtered substatements
index 9f6f7c83a4fcecfd7eb7220f2fca62112145c7f8..401f5848a0eeca1c28f3cdc9efae7b5ad6f7aadf 100644 (file)
@@ -8,6 +8,7 @@
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.action;
 
 import com.google.common.base.MoreObjects;
+import com.google.common.base.Verify;
 import com.google.common.collect.ImmutableSet;
 import java.util.HashSet;
 import java.util.LinkedHashSet;
@@ -21,11 +22,11 @@ import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ActionEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ActionStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.InputEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.OutputEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.TypedefEffectiveStatement;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractEffectiveSchemaNode;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStmtUtils;
-import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.input.InputEffectiveStatementImpl;
-import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.output.OutputEffectiveStatementImpl;
 import org.opendaylight.yangtools.yang.parser.spi.meta.CopyHistory;
 import org.opendaylight.yangtools.yang.parser.spi.meta.CopyType;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
@@ -42,8 +43,9 @@ final class ActionEffectiveStatementImpl extends AbstractEffectiveSchemaNode<Act
     ActionEffectiveStatementImpl(
             final StmtContext<QName, ActionStatement, EffectiveStatement<QName, ActionStatement>> ctx) {
         super(ctx);
-        this.input = firstEffective(InputEffectiveStatementImpl.class);
-        this.output = firstEffective(OutputEffectiveStatementImpl.class);
+
+        input = findAsContainer(this, InputEffectiveStatement.class);
+        output = findAsContainer(this, OutputEffectiveStatement.class);
 
         // initSubstatements
         final Set<GroupingDefinition> groupingsInit = new HashSet<>();
@@ -76,6 +78,13 @@ final class ActionEffectiveStatementImpl extends AbstractEffectiveSchemaNode<Act
         }
     }
 
+    private static ContainerSchemaNode findAsContainer(final EffectiveStatement<?, ?> parent,
+            final Class<? extends EffectiveStatement<QName, ?>> statementType) {
+        final EffectiveStatement<?, ?> statement = parent.findFirstEffectiveSubstatement(statementType).get();
+        Verify.verify(statement instanceof ContainerSchemaNode, "Child statement %s is not a ContainerSchemaNode");
+        return (ContainerSchemaNode) statement;
+    }
+
     @Override
     public ContainerSchemaNode getInput() {
         return input;
index 20fcaae201d20ef95213823c0becb9b117f8f196..36b29275a276e3e61b8e60c975b12b833dd80a62 100644 (file)
@@ -29,8 +29,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.YinElementEffectiveStateme
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractEffectiveDocumentedNode;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 
-// FIXME: hide this class
-public final class ExtensionEffectiveStatementImpl extends AbstractEffectiveDocumentedNode<QName, ExtensionStatement>
+final class ExtensionEffectiveStatementImpl extends AbstractEffectiveDocumentedNode<QName, ExtensionStatement>
         implements ExtensionDefinition, ExtensionEffectiveStatement {
     private static final class RecursionDetector extends ThreadLocal<Deque<ExtensionEffectiveStatementImpl>> {
         boolean check(final ExtensionEffectiveStatementImpl current) {
index f243e3b50461ef53ba1e7030fa7e10945298c1c4..7a2ab78c625fac3bef93b1a667dc2a319397e920 100644 (file)
@@ -19,8 +19,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.InputStatement;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractEffectiveContainerSchemaNode;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 
-// FIXME: hide this class
-public final class InputEffectiveStatementImpl extends AbstractEffectiveContainerSchemaNode<InputStatement>
+final class InputEffectiveStatementImpl extends AbstractEffectiveContainerSchemaNode<InputStatement>
         implements InputEffectiveStatement {
 
     InputEffectiveStatementImpl(
index e924ea6989f26dffb88ee1e917784695f59fb8a8..d8ad8e6cd15998babfe9fc00b6b7ac1d0f3e21a3 100644 (file)
@@ -19,8 +19,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.OutputStatement;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractEffectiveContainerSchemaNode;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 
-// FIXME: hide this class
-public final class OutputEffectiveStatementImpl extends AbstractEffectiveContainerSchemaNode<OutputStatement>
+final class OutputEffectiveStatementImpl extends AbstractEffectiveContainerSchemaNode<OutputStatement>
         implements OutputEffectiveStatement {
 
     OutputEffectiveStatementImpl(
index b5b8556c4c3d513734143cc7fc951dfa6305aaf6..f8794c3be61b4296f186ba6d84497769dda3b61b 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.rpc;
 
+import com.google.common.base.Verify;
 import com.google.common.collect.ImmutableSet;
 import java.util.HashSet;
 import java.util.LinkedHashSet;
@@ -18,13 +19,13 @@ import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.InputEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.OutputEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.RpcEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.RpcStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.TypedefEffectiveStatement;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractEffectiveSchemaNode;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStmtUtils;
-import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.input.InputEffectiveStatementImpl;
-import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.output.OutputEffectiveStatementImpl;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 
 final class RpcEffectiveStatementImpl extends AbstractEffectiveSchemaNode<RpcStatement>
@@ -37,8 +38,8 @@ final class RpcEffectiveStatementImpl extends AbstractEffectiveSchemaNode<RpcSta
     RpcEffectiveStatementImpl(final StmtContext<QName, RpcStatement,
             EffectiveStatement<QName, RpcStatement>> ctx) {
         super(ctx);
-        this.input = firstEffective(InputEffectiveStatementImpl.class);
-        this.output = firstEffective(OutputEffectiveStatementImpl.class);
+        input = findAsContainer(this, InputEffectiveStatement.class);
+        output = findAsContainer(this, OutputEffectiveStatement.class);
 
         // initSubstatements
         Set<GroupingDefinition> groupingsInit = new HashSet<>();
@@ -62,6 +63,13 @@ final class RpcEffectiveStatementImpl extends AbstractEffectiveSchemaNode<RpcSta
         this.typeDefinitions = ImmutableSet.copyOf(mutableTypeDefinitions);
     }
 
+    private static ContainerSchemaNode findAsContainer(final EffectiveStatement<?, ?> parent,
+            final Class<? extends EffectiveStatement<QName, ?>> statementType) {
+        final EffectiveStatement<?, ?> statement = parent.findFirstEffectiveSubstatement(statementType).get();
+        Verify.verify(statement instanceof ContainerSchemaNode, "Child statement %s is not a ContainerSchemaNode");
+        return (ContainerSchemaNode) statement;
+    }
+
     @Override
     public ContainerSchemaNode getInput() {
         return input;
index 786a64a0778621e458e3b1a152634574dba2f4a9..5c652e02dfcd675fee27c65bc26667b2ead4cd9d 100644 (file)
@@ -22,8 +22,7 @@ import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractEffectiveModu
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 import org.opendaylight.yangtools.yang.parser.spi.source.ModuleNameToModuleQName;
 
-// FIXME: hide this class
-public final class SubmoduleEffectiveStatementImpl extends AbstractEffectiveModule<SubmoduleStatement>
+final class SubmoduleEffectiveStatementImpl extends AbstractEffectiveModule<SubmoduleStatement>
         implements SubmoduleEffectiveStatement {
 
     private final QNameModule qnameModule;