Rework NormalizedNode type hierarchy
[yangtools.git] / yang / yang-data-impl / src / main / java / org / opendaylight / yangtools / yang / data / impl / schema / tree / NormalizedNodeContainerSupport.java
index fe82ab8bc5e410702bfa74587c581c9e5cd41087..26cb28fc8e7f32250cbd306511ff25784fdc1de9 100644 (file)
@@ -13,81 +13,11 @@ import static java.util.Objects.requireNonNull;
 import com.google.common.base.MoreObjects;
 import java.util.function.Function;
 import java.util.function.Supplier;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
-import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.NormalizedNodeContainerBuilder;
-import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableMapEntryNodeBuilder;
-
-abstract class NormalizedNodeContainerSupport<K extends PathArgument, T extends NormalizedNode<K, ?>> {
-    static final class Single<K extends PathArgument, T extends NormalizedNode<K, ?>>
-            extends NormalizedNodeContainerSupport<K, T> {
-        Single(final Class<T> requiredClass,
-                final Function<T, NormalizedNodeContainerBuilder<K, ?, ?, T>> copyBuilder,
-                final Supplier<NormalizedNodeContainerBuilder<K, ?, ?, T>> emptyBuilder) {
-            this(requiredClass, ChildTrackingPolicy.UNORDERED, copyBuilder, emptyBuilder);
-        }
-
-        Single(final Class<T> requiredClass, final ChildTrackingPolicy childPolicy,
-                final Function<T, NormalizedNodeContainerBuilder<K, ?, ?, T>> copyBuilder,
-                final Supplier<NormalizedNodeContainerBuilder<K, ?, ?, T>> emptyBuilder) {
-            super(requiredClass, childPolicy, copyBuilder, emptyBuilder);
-        }
-
-        @Override
-        NormalizedNodeContainerBuilder<?, ?, ?, T> createBuilder(final NormalizedNode<?, ?> original) {
-            return copyBuilder.apply(cast(original));
-        }
-
-        @Override
-        NormalizedNode<?, ?> createEmptyValue(final NormalizedNode<?, ?> original) {
-            return emptyBuilder.get().withNodeIdentifier(cast(original).getIdentifier()).build();
-        }
-
-        private T cast(final NormalizedNode<?, ?> original) {
-            checkArgument(requiredClass.isInstance(original), "Require %s, got %s", requiredClass, original);
-            return requiredClass.cast(original);
-        }
-    }
-
-    // FIXME: MapEntry a refactor of a hack, originally introduced in
-    //        Change-Id: I9dc02a1917f38e8a0d62279843974b9869c48693. DataTreeRoot needs to be fixed up to properly
-    //        handle the lookup of through maps.
-    static final class MapEntry<T extends NormalizedNode<NodeIdentifier, ?>>
-            extends NormalizedNodeContainerSupport<NodeIdentifier, T> {
-        MapEntry(final Class<T> requiredClass, final ChildTrackingPolicy childPolicy,
-                final Function<T, NormalizedNodeContainerBuilder<NodeIdentifier, ?, ?, T>> copyBuilder,
-                final Supplier<NormalizedNodeContainerBuilder<NodeIdentifier, ?, ?, T>> emptyBuilder) {
-            super(requiredClass, childPolicy, copyBuilder, emptyBuilder);
-        }
-
-        @Override
-        NormalizedNodeContainerBuilder<?, ?, ?, ?> createBuilder(final NormalizedNode<?, ?> original) {
-            if (requiredClass.isInstance(original)) {
-                return copyBuilder.apply(requiredClass.cast(original));
-            }
-            if (original instanceof MapEntryNode) {
-                return ImmutableMapEntryNodeBuilder.create((MapEntryNode) original);
-            }
-            throw new IllegalArgumentException("Expected either MapEntryNode or " + requiredClass + ", offending node: "
-                    + original);
-        }
-
-        @Override
-        NormalizedNode<?, ?> createEmptyValue(final NormalizedNode<?, ?> original) {
-            if (requiredClass.isInstance(original)) {
-                return emptyBuilder.get().withNodeIdentifier(requiredClass.cast(original).getIdentifier()).build();
-            }
-            if (original instanceof MapEntryNode) {
-                return ImmutableMapEntryNodeBuilder.create()
-                        .withNodeIdentifier(((MapEntryNode) original).getIdentifier()).build();
-            }
-            throw new IllegalArgumentException("Expected either MapEntryNode or " + requiredClass + ", offending node: "
-                    + original);
-        }
-    }
 
+final class NormalizedNodeContainerSupport<K extends PathArgument, T extends NormalizedNode> {
     final Function<T, NormalizedNodeContainerBuilder<K, ?, ?, T>> copyBuilder;
     final Supplier<NormalizedNodeContainerBuilder<K, ?, ?, T>> emptyBuilder;
     final ChildTrackingPolicy childPolicy;
@@ -102,13 +32,27 @@ abstract class NormalizedNodeContainerSupport<K extends PathArgument, T extends
         this.emptyBuilder = requireNonNull(emptyBuilder);
     }
 
-    @SuppressWarnings("rawtypes")
-    abstract NormalizedNodeContainerBuilder createBuilder(NormalizedNode<?, ?> original);
+    NormalizedNodeContainerSupport(final Class<T> requiredClass,
+            final Function<T, NormalizedNodeContainerBuilder<K, ?, ?, T>> copyBuilder,
+            final Supplier<NormalizedNodeContainerBuilder<K, ?, ?, T>> emptyBuilder) {
+        this(requiredClass, ChildTrackingPolicy.UNORDERED, copyBuilder, emptyBuilder);
+    }
 
-    abstract NormalizedNode<?, ?> createEmptyValue(NormalizedNode<?, ?> original);
+    NormalizedNodeContainerBuilder<?, ?, ?, T> createBuilder(final NormalizedNode original) {
+        return copyBuilder.apply(cast(original));
+    }
+
+    NormalizedNode createEmptyValue(final NormalizedNode original) {
+        return emptyBuilder.get().withNodeIdentifier((K) cast(original).getIdentifier()).build();
+    }
+
+    private T cast(final NormalizedNode original) {
+        checkArgument(requiredClass.isInstance(original), "Require %s, got %s", requiredClass, original);
+        return requiredClass.cast(original);
+    }
 
     @Override
-    public final String toString() {
+    public String toString() {
         return MoreObjects.toStringHelper(this).add("requiredClass", requiredClass).toString();
     }
 }