X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-data-util%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fdata%2Futil%2FMountPointData.java;h=aaae6bc213e2ee05e1980e265023df04b84890b0;hb=2c1b962ce1e46312c44dde093515d12c8675480f;hp=52892ad823a64d2ba528e1c99345a645adccff28;hpb=e3287e24f631008fdcd591a0e706bcd9254c401e;p=yangtools.git diff --git a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/MountPointData.java b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/MountPointData.java index 52892ad823..aaae6bc213 100644 --- a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/MountPointData.java +++ b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/MountPointData.java @@ -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 { +public final class MountPointData extends AbstractIdentifiable { private static final Logger LOG = LoggerFactory.getLogger(MountPointData.class); private final Map yangLib = new EnumMap<>(ContainerName.class); private final List 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 { 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 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 entry : yangLib.entrySet()) { - final Optional 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 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); } } }