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=0afa5e63e45a932d1ba14757198ffe58c21c7cda;hb=74ef67db283874e6024413355267120c77a6095c;hp=155f9863d601a2d420e20d9b8007c860b6024e0d;hpb=d3f582f6b1c1ff4147c255667bee3238e776d229;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 155f9863d6..0afa5e63e4 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,13 +7,10 @@
*/
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;
@@ -22,13 +19,12 @@ 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.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;
/**
- * Abstract base for {@link DataObjectCodecContext} and {@link AugmentationNodeContext}. They share most of their
+ * Abstract base for {@link DataObjectCodecContext} and {@link AugmentationCodecContext}. They share most of their
* mechanics, but notably:
*
* - DataObjectCodecContext has an exact DistinctNodeContainer and YangInstanceIdentifier mapping and can be the
@@ -45,59 +41,40 @@ 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
- permits AugmentationNodeContext, DataObjectCodecContext {
- private final ImmutableMap, DataContainerCodecPrototype>> byBindingArgClass;
- private final ImmutableMap, DataContainerCodecPrototype>> byStreamClass;
+ extends CommonDataObjectCodecContext
+ permits AugmentationCodecContext, DataObjectCodecContext {
+ private final ImmutableMap, CommonDataObjectCodecPrototype>> byBindingArgClass;
+ private final ImmutableMap, CommonDataObjectCodecPrototype>> 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) type().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) {
+ CommonDataObjectCodecPrototype> streamChildPrototype(final Class> childClass) {
return byStreamClass.get(childClass);
}
@Override
- public final DataContainerCodecContext, ?> bindingPathArgumentChild(final InstanceIdentifier.PathArgument arg,
+ public final CommonDataObjectCodecContext, ?> bindingPathArgumentChild(final InstanceIdentifier.PathArgument arg,
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();
+ .getCodecContext();
if (context instanceof ChoiceCodecContext> choice) {
choice.addYangPathArgument(arg, builder);
@@ -106,7 +83,7 @@ public abstract sealed class AbstractDataObjectCodecContext caze;
if (caseType.isPresent()) {
// Non-ambiguous addressing this should not pose any problems
- caze = choice.streamChild(caseType.orElseThrow());
+ caze = choice.getStreamChild(caseType.orElseThrow());
} else {
caze = choice.getCaseByChildClass(type);
}
@@ -118,37 +95,15 @@ public abstract sealed class AbstractDataObjectCodecContext pathChildPrototype(final @NonNull Class extends DataObject> argType) {
+ @Nullable CommonDataObjectCodecPrototype> pathChildPrototype(final @NonNull Class extends DataObject> 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) {