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%2FDataContainerCodecContext.java;h=2848884b277148ce1a9343210324234ea3e7b4f6;hb=889d6606afceea88af3884ee340008c0f8810496;hp=838e55b4ebe4a82fe12b2e507e5c09768d124201;hpb=e6ae7a92534576f8a253961d0a4bc9ea59f5ef5d;p=mdsal.git diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataContainerCodecContext.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataContainerCodecContext.java index 838e55b4eb..2848884b27 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataContainerCodecContext.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataContainerCodecContext.java @@ -12,6 +12,7 @@ import static java.util.Objects.requireNonNull; import com.google.common.collect.ImmutableCollection; import com.google.common.collect.ImmutableSet; import edu.umd.cs.findbugs.annotations.CheckReturnValue; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.io.IOException; import java.lang.invoke.MethodHandles; import java.lang.invoke.VarHandle; @@ -40,10 +41,11 @@ import org.opendaylight.yangtools.yang.binding.Augmentation; import org.opendaylight.yangtools.yang.binding.BindingObject; import org.opendaylight.yangtools.yang.binding.DataContainer; import org.opendaylight.yangtools.yang.binding.DataObject; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument; +import org.opendaylight.yangtools.yang.binding.DataObjectStep; import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.common.QNameModule; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter; import org.opendaylight.yangtools.yang.data.impl.schema.NormalizationResultHolder; @@ -60,9 +62,10 @@ import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -abstract sealed class DataContainerCodecContext +abstract sealed class DataContainerCodecContext> extends CodecContext implements BindingDataContainerCodecTreeNode - permits CommonDataObjectCodecContext { + permits ChoiceCodecContext, CommonDataObjectCodecContext { private static final Logger LOG = LoggerFactory.getLogger(DataContainerCodecContext.class); private static final VarHandle EVENT_STREAM_SERIALIZER; @@ -75,49 +78,73 @@ abstract sealed class DataContainerCodecContext getBindingClass() { + return (Class) prototype().javaClass(); + } - protected abstract @NonNull T type(); + // overridden in AugmentationCodecContext + @Override + protected NodeIdentifier getDomPathArgument() { + return prototype.yangArg(); + } @Override - public abstract CodecContext yangPathArgumentChild(YangInstanceIdentifier.PathArgument arg); + public final ChildAddressabilitySummary getChildAddressabilitySummary() { + return childAddressabilitySummary; + } + // Non-final for ChoiceCodecContext @Override - public CommonDataObjectCodecContext bindingPathArgumentChild(final PathArgument arg, - final List builder) { - final var child = getStreamChild(arg.getType()); - child.addYangPathArgument(arg, builder); - return child; + public CodecContext yangPathArgumentChild(final PathArgument arg) { + CodecContextSupplier supplier; + if (arg instanceof NodeIdentifier nodeId) { + supplier = yangChildSupplier(nodeId); + } else if (arg instanceof NodeIdentifierWithPredicates nip) { + supplier = yangChildSupplier(new NodeIdentifier(nip.getNodeType())); + } else { + supplier = null; + } + return childNonNull(supplier, arg, "Argument %s is not valid child of %s", arg, getSchema()).getCodecContext(); } + abstract @Nullable CodecContextSupplier yangChildSupplier(@NonNull NodeIdentifier arg); + + @Override + public abstract CommonDataObjectCodecContext bindingPathArgumentChild(DataObjectStep step, + List builder); + /** * Serializes supplied Binding Path Argument and adds all necessary YANG instance identifiers to supplied list. * - * @param arg Binding Path Argument + * @param step Binding Path Argument * @param builder DOM Path argument. */ - final void addYangPathArgument(final PathArgument arg, final List builder) { + final void addYangPathArgument(final DataObjectStep step, final List builder) { if (builder != null) { - addYangPathArgument(builder, arg); + addYangPathArgument(builder, step); } } - void addYangPathArgument(final @NonNull List builder, final PathArgument arg) { + void addYangPathArgument(final @NonNull List builder, final DataObjectStep step) { final var yangArg = getDomPathArgument(); if (yangArg != null) { builder.add(yangArg); @@ -125,34 +152,34 @@ abstract sealed class DataContainerCodecContext CommonDataObjectCodecContext getStreamChild(final Class childClass) { + public final DataContainerCodecContext getStreamChild(final Class childClass) { return childNonNull(streamChild(childClass), childClass, "Child %s is not valid child of %s", getBindingClass(), childClass); } @SuppressWarnings("unchecked") @Override - public final CommonDataObjectCodecContext streamChild(final Class childClass) { + public final DataContainerCodecContext streamChild(final Class childClass) { final var childProto = streamChildPrototype(requireNonNull(childClass)); - return childProto == null ? null : (CommonDataObjectCodecContext) childProto.get(); + return childProto == null ? null : (DataContainerCodecContext) childProto.getCodecContext(); } - abstract @Nullable CommonDataObjectCodecPrototype streamChildPrototype(@NonNull Class childClass); + abstract @Nullable DataContainerPrototype streamChildPrototype(@NonNull Class childClass); @Override public String toString() { return getClass().getSimpleName() + " [" + getBindingClass() + "]"; } - static final & BindingNormalizedNodeCodec> + static final & BindingNormalizedNodeCodec> @NonNull BindingNormalizedNodeCachingCodec createCachingCodec(final C context, final ImmutableCollection> cacheSpecifier) { return cacheSpecifier.isEmpty() ? new NonCachingCodec<>(context) : new CachingNormalizedNodeCodec<>(context, ImmutableSet.copyOf(cacheSpecifier)); } - protected final @NonNull V childNonNull(final @Nullable V nullable, - final YangInstanceIdentifier.PathArgument child, final String message, final Object... args) { + protected final @NonNull V childNonNull(final @Nullable V nullable, final PathArgument child, + final String message, final Object... args) { if (nullable == null) { throw childNullException(child.getNodeType(), message, args); } @@ -177,8 +204,8 @@ abstract sealed class DataContainerCodecContext childClass, final String message, final Object... args) { - return childNullException(factory().getRuntimeContext(), childClass, message, args); + return childNullException(prototype().contextFactory().getRuntimeContext(), childClass, message, args); } @CheckReturnValue @@ -220,7 +247,7 @@ abstract sealed class DataContainerCodecContext