Hide CompositeNodeDataWithSchema.addChild()
[yangtools.git] / yang / yang-data-util / src / main / java / org / opendaylight / yangtools / yang / data / util / MountPointData.java
index 52892ad823a64d2ba528e1c99345a645adccff28..aaae6bc213e2ee05e1980e265023df04b84890b0 100644 (file)
@@ -16,20 +16,15 @@ import java.util.ArrayList;
 import java.util.EnumMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.concepts.AbstractIdentifiable;
-import org.opendaylight.yangtools.rfc8528.data.api.DynamicMountPointSchemaResolver;
-import org.opendaylight.yangtools.rfc8528.data.api.MountPointStreamWriter;
-import org.opendaylight.yangtools.rfc8528.model.api.MountPointSchemaResolver;
-import org.opendaylight.yangtools.rfc8528.model.api.StaticMountPointSchemaResolver;
-import org.opendaylight.yangtools.rfc8528.model.api.YangLibraryConstants.ContainerName;
-import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
-import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+import org.opendaylight.yangtools.rfc8528.data.api.MountPointChild;
+import org.opendaylight.yangtools.rfc8528.data.api.MountPointContext;
+import org.opendaylight.yangtools.rfc8528.data.api.MountPointContextFactory;
+import org.opendaylight.yangtools.rfc8528.data.api.MountPointIdentifier;
+import org.opendaylight.yangtools.rfc8528.data.api.StreamWriterMountPointExtension;
+import org.opendaylight.yangtools.rfc8528.data.api.YangLibraryConstants.ContainerName;
 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
-import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.model.parser.api.YangParserException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -38,14 +33,18 @@ import org.slf4j.LoggerFactory;
  * YANG Schema Mount-supported data attached to either a {@code list} item or a {@code container}.
  */
 @Beta
-public final class MountPointData extends AbstractIdentifiable<QName> {
+public final class MountPointData extends AbstractIdentifiable<MountPointIdentifier> {
     private static final Logger LOG = LoggerFactory.getLogger(MountPointData.class);
 
     private final Map<ContainerName, MountPointChild> yangLib = new EnumMap<>(ContainerName.class);
     private final List<MountPointChild> children = new ArrayList<>();
+    private final MountPointContextFactory contextFactory;
 
-    MountPointData(final QName label) {
-        super(label);
+    private MountPointChild schemaMounts;
+
+    MountPointData(final MountPointIdentifier mountId, final MountPointContextFactory contextFactory) {
+        super(mountId);
+        this.contextFactory = requireNonNull(contextFactory);
     }
 
     public void setContainer(final @NonNull ContainerName containerName, final @NonNull MountPointChild data) {
@@ -54,74 +53,33 @@ public final class MountPointData extends AbstractIdentifiable<QName> {
         addChild(data);
     }
 
+    public void setSchemaMounts(final @NonNull MountPointChild data) {
+        checkState(schemaMounts == null, "Attempted to reset schema-mounts from %s to %s", schemaMounts, data);
+        schemaMounts = requireNonNull(data);
+        addChild(data);
+    }
+
     public void addChild(final @NonNull MountPointChild data) {
         children.add(requireNonNull(data));
     }
 
     void write(final @NonNull NormalizedNodeStreamWriter writer) throws IOException {
-        final MountPointStreamWriter mountWriter = writer.getExtensions().getInstance(MountPointStreamWriter.class);
+        final StreamWriterMountPointExtension mountWriter = writer.getExtensions()
+            .getInstance(StreamWriterMountPointExtension.class);
         if (mountWriter == null) {
             LOG.debug("Writer {} does not support mount points, ignoring data in {}", writer, getIdentifier());
             return;
         }
 
-        final Optional<MountPointSchemaResolver> optResolver = mountWriter.findMountPoint(getIdentifier());
-        if (!optResolver.isPresent()) {
-            LOG.debug("Mount point for {} is not present, ignoring it", getIdentifier());
-            return;
-        }
-
-        final MountPointSchemaResolver resolver = optResolver.get();
-        if (resolver instanceof StaticMountPointSchemaResolver) {
-            writeStatic(mountWriter, ((StaticMountPointSchemaResolver) resolver).getSchemaContext());
-        } else if (resolver instanceof DynamicMountPointSchemaResolver) {
-            writeDynamic(mountWriter, (DynamicMountPointSchemaResolver) resolver);
-        } else {
-            throw new IOException("Unhandled resolver " + resolver);
+        final MountPointContext mountCtx;
+        try {
+            mountCtx = contextFactory.createContext(yangLib, schemaMounts);
+        } catch (YangParserException e) {
+            throw new IOException("Failed to resolve mount point " + getIdentifier(), e);
         }
-    }
-
-    private void writeDynamic(final @NonNull MountPointStreamWriter mountWriter,
-            final DynamicMountPointSchemaResolver resolver) throws IOException {
-        for (Entry<ContainerName, MountPointChild> entry : yangLib.entrySet()) {
-            final Optional<SchemaContext> optContext = resolver.findContainerContext(entry.getKey());
-            if (!optContext.isPresent()) {
-                LOG.debug("YANG Library context for mount point {} container {} not found", getIdentifier(),
-                    entry.getKey());
-                continue;
-            }
-
-            final NormalizedNode<?, ?> data = entry.getValue().normalizeTo(optContext.get());
-            if (!(data instanceof ContainerNode)) {
-                throw new IOException("Invalid non-container " + data);
-            }
-
-            final SchemaContext context;
-            try {
-                context = resolver.assembleSchemaContext((ContainerNode) data);
-            } catch (YangParserException e) {
-                throw new IOException("Failed to assemble context for " + data, e);
-            }
-
-            writeStatic(mountWriter, context);
-            return;
-        }
-
-        LOG.warn("Failed to create a dynamic context for mount point {}, ignoring its data", getIdentifier());
-    }
-
-    private void writeStatic(final @NonNull MountPointStreamWriter mountWriter,
-            final @NonNull SchemaContext schemaContext) throws IOException {
-        final Optional<NormalizedNodeStreamWriter> optWriter = mountWriter.startMountPoint(getIdentifier(),
-            schemaContext);
-        if (!optWriter.isPresent()) {
-            LOG.debug("Ignoring mount point {} data due to writer decision", getIdentifier());
-            return;
-        }
-
-        try (NormalizedNodeStreamWriter writer = optWriter.get()) {
+        try (NormalizedNodeStreamWriter nestedWriter = mountWriter.startMountPoint(getIdentifier(), mountCtx)) {
             for (MountPointChild child : children) {
-                child.writeTo(writer, schemaContext);
+                child.writeTo(nestedWriter, mountCtx);
             }
         }
     }