X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;ds=sidebyside;f=binding%2Fmdsal-binding-dom-codec%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fmdsal%2Fbinding%2Fdom%2Fcodec%2Fimpl%2FDataContainerAnalysis.java;h=c799bbbbac0b49285d0a27a09020b66927a3e834;hb=f3be50ed801e5de305eb46b824e6bc3c6075e4bc;hp=cbb3a974196eb3e9289d3ab719c19eb36dfb7a1c;hpb=3b18d17d6882c14b0f3542717e3ca539c0bc9593;p=mdsal.git diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataContainerAnalysis.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataContainerAnalysis.java index cbb3a97419..c799bbbbac 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataContainerAnalysis.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataContainerAnalysis.java @@ -26,6 +26,7 @@ import org.opendaylight.mdsal.binding.runtime.api.ContainerLikeRuntimeType; import org.opendaylight.mdsal.binding.runtime.api.ContainerRuntimeType; import org.opendaylight.mdsal.binding.runtime.api.ListRuntimeType; import org.opendaylight.yangtools.util.ClassLoaderUtils; +import org.opendaylight.yangtools.yang.binding.ChoiceIn; import org.opendaylight.yangtools.yang.binding.DataContainer; import org.opendaylight.yangtools.yang.binding.OpaqueObject; import org.opendaylight.yangtools.yang.binding.contract.Naming; @@ -42,8 +43,8 @@ final class DataContainerAnalysis { private static final Logger LOG = LoggerFactory.getLogger(DataContainerAnalysis.class); // Needed for DataContainerCodecContext - final @NonNull ImmutableMap, CommonDataObjectCodecPrototype> byStreamClass; - final @NonNull ImmutableMap, CommonDataObjectCodecPrototype> byBindingArgClass; + final @NonNull ImmutableMap, DataContainerPrototype> byStreamClass; + final @NonNull ImmutableMap, DataContainerPrototype> byBindingArgClass; final @NonNull ImmutableMap byYang; final @NonNull ImmutableMap leafNodes; @@ -73,8 +74,8 @@ final class DataContainerAnalysis { } leafNodes = leafBuilder.build(); - final var byBindingArgClassBuilder = new HashMap, CommonDataObjectCodecPrototype>(); - final var byStreamClassBuilder = new HashMap, CommonDataObjectCodecPrototype>(); + final var byBindingArgClassBuilder = new HashMap, DataContainerPrototype>(); + final var byStreamClassBuilder = new HashMap, DataContainerPrototype>(); final var daoPropertiesBuilder = new HashMap, PropertyInfo>(); for (var childDataObj : clsToMethod.entrySet()) { final var method = childDataObj.getValue(); @@ -91,14 +92,11 @@ final class DataContainerAnalysis { final var childProto = getChildPrototype(runtimeType, factory, itemFactory, retClass); byStreamClassBuilder.put(childProto.javaClass(), childProto); - byYangBuilder.put(childProto.getYangArg(), childProto); - - // FIXME: It really feels like we should be specializing DataContainerCodecPrototype so as to ditch - // createInstance() and then we could do an instanceof check instead. - if (childProto.runtimeType() instanceof ChoiceRuntimeType) { - final var choice = (ChoiceCodecContext) childProto.getCodecContext(); - for (var cazeChild : choice.getCaseChildrenClasses()) { - byBindingArgClassBuilder.put(cazeChild, childProto); + byYangBuilder.put(childProto.yangArg(), childProto); + + if (childProto instanceof ChoiceCodecPrototype choiceProto) { + for (var cazeChild : choiceProto.getCodecContext().getCaseChildrenClasses()) { + byBindingArgClassBuilder.put(cazeChild, choiceProto); } } } @@ -127,7 +125,7 @@ final class DataContainerAnalysis { daoProperties = ImmutableMap.copyOf(daoPropertiesBuilder); } - private static @NonNull CommonDataObjectCodecPrototype getChildPrototype(final CompositeRuntimeType type, + private static @NonNull DataContainerPrototype getChildPrototype(final CompositeRuntimeType type, final CodecContextFactory factory, final CodecItemFactory itemFactory, final Class childClass) { final var child = type.bindingChild(JavaTypeName.create(childClass)); @@ -135,6 +133,11 @@ final class DataContainerAnalysis { throw DataContainerCodecContext.childNullException(factory.getRuntimeContext(), childClass, "Node %s does not have child named %s", type, childClass); } + + if (child instanceof ChoiceRuntimeType choice) { + return new ChoiceCodecPrototype<>(factory, choice, childClass.asSubclass(ChoiceIn.class)); + } + final var item = itemFactory.createItem(childClass, child.statement()); if (child instanceof ContainerLikeRuntimeType containerLike) { if (child instanceof ContainerRuntimeType container @@ -145,14 +148,11 @@ final class DataContainerAnalysis { } else if (child instanceof ListRuntimeType list) { return list.keyType() != null ? new MapCodecPrototype(item, list, factory) : new ListCodecPrototype(item, list, factory); - } else if (child instanceof ChoiceRuntimeType choice) { - return new ChoiceCodecPrototype(item, choice, factory); } else { throw new UnsupportedOperationException("Unhandled type " + child); } } - // FIXME: MDSAL-780: these methods perform analytics using java.lang.reflect to acquire the basic shape of the // class. This is not exactly AOT friendly, as most of the information should be provided by // CompositeRuntimeType.