BUG-5717: eliminate StmtContext.substatements()
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / reactor / StatementContextBase.java
index ef7338c7565d0e1832f9d0edb40dc65d04ccc44d..9d27131c64a26710eefd083242c6d90e6332af40 100644 (file)
@@ -22,8 +22,8 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.EnumMap;
 import java.util.EventListener;
+import java.util.HashMap;
 import java.util.Iterator;
-import java.util.LinkedHashMap;
 import java.util.Map;
 import javax.annotation.Nonnull;
 import org.opendaylight.yangtools.concepts.Identifiable;
@@ -49,6 +49,44 @@ import org.opendaylight.yangtools.yang.parser.stmt.reactor.NamespaceBehaviourWit
 public abstract class StatementContextBase<A, D extends DeclaredStatement<A>, E extends EffectiveStatement<A, D>>
         extends NamespaceStorageSupport implements StmtContext.Mutable<A, D, E>, Identifiable<StatementIdentifier> {
 
+    @SuppressWarnings({ "rawtypes", "unchecked" })
+    private final class SubContextBuilder extends ContextBuilder {
+        SubContextBuilder(final StatementDefinitionContext def, final StatementSourceReference sourceRef) {
+            super(def, sourceRef);
+        }
+
+        @Override
+        public StatementContextBase build() {
+            StatementContextBase<?, ?, ?> potential = null;
+
+            final StatementDefinition stmtDef = getDefinition().getPublicView();
+            // FIXME: this is rather ugly. Rather than having an explicit blacklist, StatementDefinitionContext should
+            //        give us information whether we should really bother with the substatements map.
+            if (stmtDef != Rfc6020Mapping.AUGMENT && stmtDef != Rfc6020Mapping.DEVIATION
+                    && stmtDef != Rfc6020Mapping.IMPORT && stmtDef != Rfc6020Mapping.TYPE) {
+                potential = substatements.get(createIdentifier());
+            }
+            if (potential == null) {
+                potential = new SubstatementContext(StatementContextBase.this, this);
+                if (substatements.isEmpty()) {
+                    substatements = new HashMap<>(1);
+                }
+                substatements.put(createIdentifier(), potential);
+                getDefinition().onStatementAdded(potential);
+            }
+            potential.resetLists();
+            switch (this.getStamementSource().getStatementSource()) {
+            case DECLARATION:
+                addDeclaredSubstatement(potential);
+                break;
+            case CONTEXT:
+                addEffectiveSubstatement(potential);
+                break;
+            }
+            return potential;
+        }
+    }
+
     /**
      * event listener when an item is added to model namespace
      */
@@ -255,14 +293,6 @@ public abstract class StatementContextBase<A, D extends DeclaredStatement<A>, E
         return maybeWrap(declared);
     }
 
-    /**
-     * @return collection of all substatements
-     */
-    @Override
-    public Collection<StatementContextBase<?, ?, ?>> substatements() {
-        return maybeWrap(substatements.values());
-    }
-
     @Override
     public Collection<StatementContextBase<?, ?, ?>> effectiveSubstatements() {
         return maybeWrap(effective);
@@ -373,40 +403,9 @@ public abstract class StatementContextBase<A, D extends DeclaredStatement<A>, E
      *
      * @return instance of ContextBuilder
      */
-    @SuppressWarnings({ "rawtypes", "unchecked" })
     public ContextBuilder<?, ?, ?> substatementBuilder(final StatementDefinitionContext<?, ?, ?> def,
             final StatementSourceReference ref) {
-        return new ContextBuilder(def, ref) {
-
-            @Override
-            public StatementContextBase build() throws SourceException {
-                StatementContextBase<?, ?, ?> potential = null;
-
-                final StatementDefinition stmtDef = getDefinition().getPublicView();
-                if (stmtDef != Rfc6020Mapping.AUGMENT && stmtDef != Rfc6020Mapping.DEVIATION
-                        && stmtDef != Rfc6020Mapping.TYPE) {
-                    potential = substatements.get(createIdentifier());
-                }
-                if (potential == null) {
-                    potential = new SubstatementContext(StatementContextBase.this, this);
-                    if (substatements.isEmpty()) {
-                        substatements = new LinkedHashMap<>(1);
-                    }
-                    substatements.put(createIdentifier(), potential);
-                    getDefinition().onStatementAdded(potential);
-                }
-                potential.resetLists();
-                switch (this.getStamementSource().getStatementSource()) {
-                case DECLARATION:
-                    addDeclaredSubstatement(potential);
-                    break;
-                case CONTEXT:
-                    addEffectiveSubstatement(potential);
-                    break;
-                }
-                return potential;
-            }
-        };
+        return new SubContextBuilder(def, ref);
     }
 
     /**