Correct DefaultWith{Schema,Data}Tree statefulness
[yangtools.git] / model / yang-model-spi / src / main / java / org / opendaylight / yangtools / yang / model / spi / meta / AbstractDeclaredEffectiveStatement.java
index 0f1d64dbeae928e26333bb4d785de400d920d92a..d6c03f749e61d8c778089546df8915972ab909b5 100644 (file)
@@ -225,39 +225,21 @@ public abstract class AbstractDeclaredEffectiveStatement<A, D extends DeclaredSt
      */
     public abstract static class DefaultWithSchemaTree<A, D extends DeclaredStatement<A>,
             E extends SchemaTreeAwareEffectiveStatement<A, D>> extends WithSchemaTree<A, D, E> {
-        public abstract static class WithSubstatements<A, D extends DeclaredStatement<A>,
-                E extends SchemaTreeAwareEffectiveStatement<A, D>> extends DefaultWithSchemaTree<A, D, E> {
-            private final @NonNull Object substatements;
-
-            protected WithSubstatements(final D declared,
-                    final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
-                super(declared, substatements);
-                this.substatements = maskList(substatements);
-            }
-
-            protected WithSubstatements(final WithSubstatements<A, D, E> original) {
-                super(original);
-                this.substatements = original.substatements;
-            }
-
-            @Override
-            public final ImmutableList<? extends EffectiveStatement<?, ?>> effectiveSubstatements() {
-                return unmaskList(substatements);
-            }
-        }
-
         private final @NonNull ImmutableMap<QName, SchemaTreeEffectiveStatement<?>> schemaTree;
+        private final @NonNull Object substatements;
         private final @NonNull D declared;
 
         protected DefaultWithSchemaTree(final D declared,
                 final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
             this.declared = requireNonNull(declared);
+            this.substatements = maskList(substatements);
             this.schemaTree = ImmutableMap.copyOf(createSchemaTreeNamespace(substatements));
         }
 
         protected DefaultWithSchemaTree(final DefaultWithSchemaTree<A, D, E> original) {
             this.declared = original.declared;
             this.schemaTree = original.schemaTree;
+            this.substatements = original.substatements;
         }
 
         @Override
@@ -265,6 +247,11 @@ public abstract class AbstractDeclaredEffectiveStatement<A, D extends DeclaredSt
             return declared;
         }
 
+        @Override
+        public final ImmutableList<? extends EffectiveStatement<?, ?>> effectiveSubstatements() {
+            return unmaskList(substatements);
+        }
+
         @Override
         protected final Map<QName, SchemaTreeEffectiveStatement<?>> schemaTreeNamespace() {
             return schemaTree;
@@ -281,34 +268,17 @@ public abstract class AbstractDeclaredEffectiveStatement<A, D extends DeclaredSt
      */
     public abstract static class DefaultWithDataTree<A, D extends DeclaredStatement<A>,
             E extends DataTreeAwareEffectiveStatement<A, D>> extends WithDataTree<A, D, E> {
-        public abstract static class WithSubstatements<A, D extends DeclaredStatement<A>,
-                E extends DataTreeAwareEffectiveStatement<A, D>> extends DefaultWithDataTree<A, D, E> {
-            private final @NonNull Object substatements;
-
-            protected WithSubstatements(final D declared,
-                    final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
-                super(declared, substatements);
-                this.substatements = maskList(substatements);
-            }
-
-            protected WithSubstatements(final WithSubstatements<A, D, E> original) {
-                super(original);
-                this.substatements = original.substatements;
-            }
-
-            @Override
-            public final ImmutableList<? extends EffectiveStatement<?, ?>> effectiveSubstatements() {
-                return unmaskList(substatements);
-            }
-        }
-
         private final @NonNull ImmutableMap<QName, SchemaTreeEffectiveStatement<?>> schemaTree;
         private final @NonNull ImmutableMap<QName, DataTreeEffectiveStatement<?>> dataTree;
+        private final @NonNull Object substatements;
         private final @NonNull D declared;
 
         protected DefaultWithDataTree(final D declared,
                 final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
             this.declared = requireNonNull(declared);
+            this.substatements = maskList(substatements);
+
+            // Note we call schema.values() so we do not retain them, as that is just pure memory overhead
             final Map<QName, SchemaTreeEffectiveStatement<?>> schema = createSchemaTreeNamespace(substatements);
             this.schemaTree = ImmutableMap.copyOf(schema);
             this.dataTree = createDataTreeNamespace(schema.values(), schemaTree);
@@ -318,6 +288,7 @@ public abstract class AbstractDeclaredEffectiveStatement<A, D extends DeclaredSt
             this.declared = original.declared;
             this.schemaTree = original.schemaTree;
             this.dataTree = original.dataTree;
+            this.substatements = original.substatements;
         }
 
         @Override
@@ -325,6 +296,11 @@ public abstract class AbstractDeclaredEffectiveStatement<A, D extends DeclaredSt
             return declared;
         }
 
+        @Override
+        public final ImmutableList<? extends EffectiveStatement<?, ?>> effectiveSubstatements() {
+            return unmaskList(substatements);
+        }
+
         @Override
         protected final Map<QName, SchemaTreeEffectiveStatement<?>> schemaTreeNamespace() {
             return schemaTree;