X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=binding%2Fmdsal-binding-dom-codec%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fmdsal%2Fbinding%2Fdom%2Fcodec%2Fimpl%2FBindingCodecContext.java;h=5a36251901cce18f614b6969c504fc94f431a55a;hb=9c5a7ec43786a795c6b5e464df51f20040c082c2;hp=65193771673e1402c6d1607f4e2a666573a44e4b;hpb=5901ab384ee5e8c77c19a0e6fde35b7804973dbd;p=mdsal.git diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingCodecContext.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingCodecContext.java index 6519377167..5a36251901 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingCodecContext.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingCodecContext.java @@ -46,7 +46,6 @@ import org.opendaylight.mdsal.binding.dom.codec.api.BindingInstanceIdentifierCod import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeWriterFactory; import org.opendaylight.mdsal.binding.dom.codec.api.BindingStreamEventWriter; import org.opendaylight.mdsal.binding.dom.codec.api.CommonDataObjectCodecTreeNode; -import org.opendaylight.mdsal.binding.dom.codec.impl.NodeCodecContext.CodecContextFactory; import org.opendaylight.mdsal.binding.dom.codec.spi.AbstractBindingNormalizedNodeSerializer; import org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecServices; import org.opendaylight.mdsal.binding.dom.codec.spi.BindingSchemaMapping; @@ -58,6 +57,7 @@ import org.opendaylight.yangtools.concepts.Delegator; import org.opendaylight.yangtools.concepts.Immutable; import org.opendaylight.yangtools.util.ClassLoaderUtils; import org.opendaylight.yangtools.yang.binding.Action; +import org.opendaylight.yangtools.yang.binding.Augmentation; import org.opendaylight.yangtools.yang.binding.BaseIdentity; import org.opendaylight.yangtools.yang.binding.BaseNotification; import org.opendaylight.yangtools.yang.binding.DataContainer; @@ -82,7 +82,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode; import org.opendaylight.yangtools.yang.data.api.schema.ValueNode; import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter; import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter; -import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult; +import org.opendaylight.yangtools.yang.data.impl.schema.NormalizationResultHolder; import org.opendaylight.yangtools.yang.model.api.AnydataSchemaNode; import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; @@ -154,7 +154,7 @@ public final class BindingCodecContext extends AbstractBindingNormalizedNodeSeri private final @NonNull InstanceIdentifierCodec instanceIdentifierCodec; private final @NonNull IdentityCodec identityCodec; private final @NonNull BindingRuntimeContext context; - private final @NonNull SchemaRootCodecContext root; + private final @NonNull RootCodecContext root; public BindingCodecContext() { this(ServiceLoader.load(BindingRuntimeContext.class).findFirst() @@ -163,7 +163,7 @@ public final class BindingCodecContext extends AbstractBindingNormalizedNodeSeri public BindingCodecContext(final BindingRuntimeContext context) { this.context = requireNonNull(context, "Binding Runtime Context is required."); - root = new SchemaRootCodecContext<>(this); + root = new RootCodecContext<>(this); identityCodec = new IdentityCodec(context); instanceIdentifierCodec = new InstanceIdentifierCodec(this); } @@ -208,7 +208,7 @@ public final class BindingCodecContext extends AbstractBindingNormalizedNodeSeri final InstanceIdentifier path, final NormalizedNodeStreamWriter domWriter) { final var yangArgs = new ArrayList(); final var codecContext = getCodecContextNode(path, yangArgs); - return Map.entry(YangInstanceIdentifier.create(yangArgs), + return Map.entry(YangInstanceIdentifier.of(yangArgs), new BindingToNormalizedStreamWriter(codecContext, domWriter)); } @@ -270,7 +270,7 @@ public final class BindingCodecContext extends AbstractBindingNormalizedNodeSeri */ @Nullable BindingDataObjectCodecTreeNode getCodecContextNode(final @NonNull YangInstanceIdentifier dom, final @Nullable Collection bindingArguments) { - NodeCodecContext currentNode = root; + CodecContext currentNode = root; ListNodeCodecContext currentList = null; for (var domArg : dom.getPathArguments()) { @@ -508,6 +508,28 @@ public final class BindingCodecContext extends AbstractBindingNormalizedNodeSeri return root.streamChild(childClass); } + @Override + @SuppressWarnings("unchecked") + public > BindingAugmentationCodecTreeNode getAugmentationCodec( + final InstanceIdentifier path) { + final var codecContext = getCodecContextNode(path, null); + if (codecContext instanceof BindingAugmentationCodecTreeNode) { + return (BindingAugmentationCodecTreeNode) codecContext; + } + throw new IllegalArgumentException(path + " does not refer to an Augmentation"); + } + + @Override + @SuppressWarnings("unchecked") + public BindingDataObjectCodecTreeNode getDataObjectCodec( + final InstanceIdentifier path) { + final var codecContext = getCodecContextNode(path, null); + if (codecContext instanceof BindingDataObjectCodecTreeNode) { + return (BindingDataObjectCodecTreeNode) codecContext; + } + throw new IllegalArgumentException(path + " does not refer to a plain DataObject"); + } + @Override @SuppressWarnings("unchecked") public CodecWithPath getSubtreeCodecWithPath(final InstanceIdentifier path) { @@ -516,7 +538,7 @@ public final class BindingCodecContext extends AbstractBindingNormalizedNodeSeri // TODO Do we need defensive check here? return new CodecWithPath<>((CommonDataObjectCodecTreeNode) codecContext, - YangInstanceIdentifier.create(yangArgs)); + YangInstanceIdentifier.of(yangArgs)); } @Override @@ -546,15 +568,34 @@ public final class BindingCodecContext extends AbstractBindingNormalizedNodeSeri return instanceIdentifierCodec.toBinding(dom); } + @Override + public > AugmentationResult toNormalizedAugmentation(final InstanceIdentifier path, + final A data) { + final var result = toNormalizedNode(path, data); + if (result instanceof AugmentationResult augment) { + return augment; + } + throw new IllegalArgumentException(path + " does not identify an Augmentation"); + } + + @Override + public NodeResult toNormalizedDataObject(final InstanceIdentifier path, final T data) { + final var result = toNormalizedNode(path, data); + if (result instanceof NodeResult node) { + return node; + } + throw new IllegalArgumentException(path + " does not identify a plain DataObject"); + } + @Override public NormalizedResult toNormalizedNode(final InstanceIdentifier path, final T data) { // We create Binding Stream Writer which translates from Binding to Normalized Nodes final var yangArgs = new ArrayList(); final var codecContext = getCodecContextNode(path, yangArgs); - final var yangPath = YangInstanceIdentifier.create(yangArgs); + final var yangPath = YangInstanceIdentifier.of(yangArgs); // We create DOM stream writer which produces normalized nodes - final var result = new NormalizedNodeResult(); + final var result = new NormalizationResultHolder(); final var domWriter = ImmutableNormalizedNodeStreamWriter.from(result); final var bindingWriter = new BindingToNormalizedStreamWriter(codecContext, domWriter); final var augment = codecContext instanceof BindingAugmentationCodecTreeNode augmentNode ? augmentNode @@ -581,9 +622,9 @@ public final class BindingCodecContext extends AbstractBindingNormalizedNodeSeri // Terminate the fake container and extract it to the result if (augment != null) { return new AugmentationResult(yangPath, augment.childPathArguments(), - ImmutableList.copyOf(((ContainerNode) result.getResult()).body())); + ImmutableList.copyOf(((ContainerNode) result.getResult().data()).body())); } - return new NodeResult(yangPath, result.getResult()); + return new NodeResult(yangPath, result.getResult().data()); } @Override @@ -678,9 +719,9 @@ public final class BindingCodecContext extends AbstractBindingNormalizedNodeSeri private @NonNull ContainerNode serializeDataObject(final DataObject data, final WriterFactoryMethod newWriter) { - final NormalizedNodeResult result = new NormalizedNodeResult(); + final var result = new NormalizationResultHolder(); // We create DOM stream writer which produces normalized nodes - final NormalizedNodeStreamWriter domWriter = ImmutableNormalizedNodeStreamWriter.from(result); + final var domWriter = ImmutableNormalizedNodeStreamWriter.from(result); final Class type = data.implementedInterface(); @SuppressWarnings("unchecked") final BindingStreamEventWriter writer = newWriter.createWriter(this, (Class) type, domWriter); @@ -690,16 +731,16 @@ public final class BindingCodecContext extends AbstractBindingNormalizedNodeSeri LOG.error("Unexpected failure while serializing data {}", data, e); throw new IllegalStateException("Failed to create normalized node", e); } - return (ContainerNode) result.getResult(); + return (ContainerNode) result.getResult().data(); } private static boolean notBindingRepresentable(final NormalizedNode data) { // ValueNode covers LeafNode and LeafSetEntryNode return data instanceof ValueNode - || data instanceof MapNode || data instanceof UnkeyedListNode - || data instanceof ChoiceNode - || data instanceof LeafSetNode; + || data instanceof MapNode || data instanceof UnkeyedListNode + || data instanceof ChoiceNode + || data instanceof LeafSetNode; } @SuppressWarnings("rawtypes")