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%2FAbstractDataObjectCodecContext.java;h=83e9b0f721511dafc0b1aa28e148adba2ddac910;hb=889d6606afceea88af3884ee340008c0f8810496;hp=abdf316a3bd99a6f9ed819a49656f6610e2341d7;hpb=e5ce78e132ec0b885f2ba8f8eb6bf57ec4a33a4a;p=mdsal.git diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AbstractDataObjectCodecContext.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AbstractDataObjectCodecContext.java index abdf316a3b..83e9b0f721 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AbstractDataObjectCodecContext.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AbstractDataObjectCodecContext.java @@ -7,22 +7,18 @@ */ package org.opendaylight.mdsal.binding.dom.codec.impl; -import com.google.common.base.Throwables; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; -import java.lang.invoke.MethodHandle; import java.util.List; import java.util.Map; -import java.util.Optional; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.mdsal.binding.dom.codec.api.IncorrectNestingException; import org.opendaylight.mdsal.binding.runtime.api.CompositeRuntimeType; import org.opendaylight.yangtools.yang.binding.Augmentation; import org.opendaylight.yangtools.yang.binding.DataObject; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.binding.DataObjectStep; 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.DataContainerNode; import org.opendaylight.yangtools.yang.model.api.DocumentedNode.WithStatus; @@ -45,110 +41,59 @@ import org.opendaylight.yangtools.yang.model.api.DocumentedNode.WithStatus; * public is that it needs to be accessible by code generated at runtime. */ public abstract sealed class AbstractDataObjectCodecContext - extends DataContainerCodecContext + extends CommonDataObjectCodecContext permits AugmentationCodecContext, DataObjectCodecContext { - private final ImmutableMap, DataContainerCodecPrototype> byBindingArgClass; - private final ImmutableMap, DataContainerCodecPrototype> byStreamClass; + private final ImmutableMap, DataContainerPrototype> byBindingArgClass; + private final ImmutableMap, DataContainerPrototype> byStreamClass; private final ImmutableMap byYang; private final ImmutableMap leafChild; - private final MethodHandle proxyConstructor; - AbstractDataObjectCodecContext(final DataContainerCodecPrototype prototype, - final CodecDataObjectAnalysis analysis) { + AbstractDataObjectCodecContext(final CommonDataObjectCodecPrototype prototype, + final DataContainerAnalysis analysis) { super(prototype); byBindingArgClass = analysis.byBindingArgClass; byStreamClass = analysis.byStreamClass; byYang = analysis.byYang; leafChild = analysis.leafNodes; - proxyConstructor = analysis.proxyConstructor; } @Override public final WithStatus getSchema() { // FIXME: Bad cast, we should be returning an EffectiveStatement perhaps? - return (WithStatus) getType().statement(); + return (WithStatus) prototype().runtimeType().statement(); } @Override - @SuppressWarnings("unchecked") - public final DataContainerCodecContext streamChild(final Class childClass) { - return (DataContainerCodecContext) childNonNull(streamChildPrototype(childClass), childClass, - "Child %s is not valid child of %s", getBindingClass(), childClass).get(); - } - - @SuppressWarnings("unchecked") - @Override - public final Optional> possibleStreamChild( - final Class childClass) { - final var childProto = streamChildPrototype(childClass); - if (childProto != null) { - return Optional.of((DataContainerCodecContext) childProto.get()); - } - return Optional.empty(); - } - - @Nullable DataContainerCodecPrototype streamChildPrototype(final @NonNull Class childClass) { + DataContainerPrototype streamChildPrototype(final Class childClass) { return byStreamClass.get(childClass); } @Override - public final DataContainerCodecContext bindingPathArgumentChild(final InstanceIdentifier.PathArgument arg, + public final CommonDataObjectCodecContext bindingPathArgumentChild(final DataObjectStep step, final List builder) { - final var argType = arg.getType(); - final var context = childNonNull(pathChildPrototype(argType), argType, - "Class %s is not valid child of %s", argType, getBindingClass()) - .get(); - if (context instanceof ChoiceCodecContext choice) { - choice.addYangPathArgument(arg, builder); - - final var caseType = arg.getCaseType(); - final var type = arg.getType(); - final DataContainerCodecContext caze; - if (caseType.isPresent()) { - // Non-ambiguous addressing this should not pose any problems - caze = choice.streamChild(caseType.orElseThrow()); - } else { - caze = choice.getCaseByChildClass(type); - } - - caze.addYangPathArgument(arg, builder); - return caze.bindingPathArgumentChild(arg, builder); + final var type = step.type(); + final var context = childNonNull(pathChildPrototype(type), type, + "Class %s is not valid child of %s", type, getBindingClass()) + .getCodecContext(); + context.addYangPathArgument(step, builder); + if (context instanceof CommonDataObjectCodecContext dataObject) { + return dataObject; + } else if (context instanceof ChoiceCodecContext choice) { + return choice.bindingPathArgumentChild(step, builder); + } else { + throw new IllegalStateException("Unhandled context " + context); } - context.addYangPathArgument(arg, builder); - return context; } - @Nullable DataContainerCodecPrototype pathChildPrototype(final @NonNull Class argType) { + @Nullable DataContainerPrototype pathChildPrototype(final @NonNull Class argType) { return byBindingArgClass.get(argType); } @Override - public final 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()).get(); - } - - @Nullable CodecContextSupplier yangChildSupplier(final @NonNull NodeIdentifier arg) { + CodecContextSupplier yangChildSupplier(final NodeIdentifier arg) { return byYang.get(arg); } - @SuppressWarnings("checkstyle:illegalCatch") - final @NonNull D createBindingProxy(final DataContainerNode node) { - try { - return (D) proxyConstructor.invokeExact(this, node); - } catch (final Throwable e) { - Throwables.throwIfUnchecked(e); - throw new IllegalStateException(e); - } - } - final ValueNodeCodecContext getLeafChild(final String name) { final ValueNodeCodecContext value = leafChild.get(name); if (value == null) {