import org.opendaylight.yangtools.yang.binding.ChoiceIn;
import org.opendaylight.yangtools.yang.binding.DataContainer;
import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.DataObjectStep;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.opendaylight.yangtools.yang.binding.Key;
import org.opendaylight.yangtools.yang.binding.KeyAware;
return new DataContainerSerializer(BindingCodecContext.this, streamers.get(key));
}
});
- private final LoadingCache<Class<? extends DataObject>, DataContainerCodecContext<?, ?>> childrenByClass =
+ private final LoadingCache<Class<? extends DataObject>, DataContainerCodecContext<?, ?, ?>> childrenByClass =
CacheBuilder.newBuilder().build(new CacheLoader<>() {
@Override
- public DataContainerCodecContext<?, ?> load(final Class<? extends DataObject> key) {
+ public DataContainerCodecContext<?, ?, ?> load(final Class<? extends DataObject> key) {
final var childSchema = context.getTypes().bindingChild(JavaTypeName.create(key));
if (childSchema instanceof ContainerLikeRuntimeType containerLike) {
if (childSchema instanceof ContainerRuntimeType container
return list.keyType() == null ? new ListCodecContext<>(key, list, BindingCodecContext.this)
: MapCodecContext.of(key, list, BindingCodecContext.this);
} else if (childSchema instanceof ChoiceRuntimeType choice) {
- return new ChoiceCodecContext<>(key, choice, BindingCodecContext.this);
+ return new ChoiceCodecContext<>(key.asSubclass(ChoiceIn.class), choice, BindingCodecContext.this);
} else if (childSchema == null) {
throw DataContainerCodecContext.childNullException(context, key, "%s is not top-level item.", key);
} else {
});
// FIXME: this could also be a leaf!
- private final LoadingCache<QName, DataContainerCodecContext<?, ?>> childrenByDomArg =
+ private final LoadingCache<QName, DataContainerCodecContext<?, ?, ?>> childrenByDomArg =
CacheBuilder.newBuilder().build(new CacheLoader<>() {
@Override
- public DataContainerCodecContext<?, ?> load(final QName qname) throws ClassNotFoundException {
+ public DataContainerCodecContext<?, ?, ?> load(final QName qname) throws ClassNotFoundException {
final var type = context.getTypes();
final var child = type.schemaTreeChild(qname);
if (child == null) {
return new BindingToNormalizedStreamWriter(getActionCodec(action).output(), domWriter);
}
- @NonNull DataContainerCodecContext<?,?> getCodecContextNode(final InstanceIdentifier<?> binding,
+ @NonNull DataContainerCodecContext<?, ?, ?> getCodecContextNode(final InstanceIdentifier<?> binding,
final List<PathArgument> builder) {
final var it = binding.getPathArguments().iterator();
- final var arg = it.next();
-
- DataContainerCodecContext<?, ?> current;
- final var caseType = arg.getCaseType();
- if (caseType.isPresent()) {
- final @NonNull Class<? extends DataObject> type = caseType.orElseThrow();
- final var choice = choicesByClass.getUnchecked(type);
- choice.addYangPathArgument(arg, builder);
- final var caze = choice.getStreamChild(type);
- caze.addYangPathArgument(arg, builder);
- current = caze.bindingPathArgumentChild(arg, builder);
+ final var step = it.next();
+
+ final DataContainerCodecContext<?, ?, ?> start;
+ final var caseType = step.caseType();
+ if (caseType != null) {
+ final var choice = choicesByClass.getUnchecked(caseType);
+ choice.addYangPathArgument(step, builder);
+ final var caze = choice.getStreamChild(caseType);
+ caze.addYangPathArgument(step, builder);
+ start = caze.bindingPathArgumentChild(step, builder);
} else {
- final var child = getStreamChild(arg.getType());
- child.addYangPathArgument(arg, builder);
- current = child;
+ final var child = getStreamChild(step.type());
+ child.addYangPathArgument(step, builder);
+ start = child;
}
+ var current = start;
while (it.hasNext()) {
current = current.bindingPathArgumentChild(it.next(), builder);
}
* @throws IllegalArgumentException if {@code dom} is empty
*/
@Nullable BindingDataObjectCodecTreeNode<?> getCodecContextNode(final @NonNull YangInstanceIdentifier dom,
- final @Nullable Collection<InstanceIdentifier.PathArgument> bindingArguments) {
+ final @Nullable Collection<DataObjectStep<?>> bindingArguments) {
final var it = dom.getPathArguments().iterator();
if (!it.hasNext()) {
throw new IllegalArgumentException("Path may not be empty");
@Override
@SuppressWarnings("unchecked")
- public <E extends DataObject> CommonDataObjectCodecContext<E, ?> getStreamChild(final Class<E> childClass) {
+ public <E extends DataObject> DataContainerCodecContext<E, ?, ?> getStreamChild(final Class<E> childClass) {
final var result = Notification.class.isAssignableFrom(childClass) ? getNotificationContext(childClass)
: getOrRethrow(childrenByClass, childClass);
- return (CommonDataObjectCodecContext<E, ?>) result;
+ return (DataContainerCodecContext<E, ?, ?>) result;
}
@Override
return null;
}
- final var builder = new ArrayList<InstanceIdentifier.PathArgument>();
+ final var builder = new ArrayList<DataObjectStep<?>>();
final var codec = getCodecContextNode(path, builder);
if (codec == null) {
if (data != null) {