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.AugmentationNode;
+import org.opendaylight.yangtools.yang.data.api.schema.DistinctNodeContainer;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodeContainer;
import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.DerivableSchemaNode;
import org.opendaylight.yangtools.yang.model.api.DocumentedNode.WithStatus;
-import org.opendaylight.yangtools.yang.model.util.SchemaNodeUtils;
+import org.opendaylight.yangtools.yang.model.api.SchemaNode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
extends DataContainerCodecContext<D, T> {
private static final Logger LOG = LoggerFactory.getLogger(DataObjectCodecContext.class);
private static final MethodType CONSTRUCTOR_TYPE = MethodType.methodType(void.class,
- DataObjectCodecContext.class, NormalizedNodeContainer.class);
+ DataObjectCodecContext.class, DistinctNodeContainer.class);
private static final MethodType DATAOBJECT_TYPE = MethodType.methodType(DataObject.class,
- DataObjectCodecContext.class, NormalizedNodeContainer.class);
+ DataObjectCodecContext.class, DistinctNodeContainer.class);
private static final VarHandle MISMATCHED_AUGMENTED;
static {
// Check if it is:
// - exactly same schema node, or
// - instantiated node was added via uses statement and is instantiation of same grouping
- if (origDef.equals(sameName) || origDef.equals(SchemaNodeUtils.getRootOriginalIfPossible(sameName))) {
+ if (origDef.equals(sameName) || origDef.equals(getRootOriginalIfPossible(sameName))) {
childSchema = sameName;
} else {
// Node has same name, but clearly is different
final QName instantiedName = origDef.getQName().bindTo(namespace());
final DataSchemaNode potential = getSchema().dataChildByName(instantiedName);
// We check if it is really instantiated from same definition as class was derived
- if (potential != null && origDef.equals(SchemaNodeUtils.getRootOriginalIfPossible(potential))) {
+ if (potential != null && origDef.equals(getRootOriginalIfPossible(potential))) {
childSchema = potential;
} else {
childSchema = null;
return DataContainerCodecPrototype.from(createBindingArg(childClass, nonNullChild), nonNullChild, factory());
}
+ private static SchemaNode getRootOriginalIfPossible(final SchemaNode data) {
+ Optional<SchemaNode> previous = Optional.empty();
+ Optional<SchemaNode> next = getOriginalIfPossible(data);
+ while (next.isPresent()) {
+ previous = next;
+ next = getOriginalIfPossible(next.get());
+ }
+ return previous.orElse(null);
+ }
+
+ private static Optional<SchemaNode> getOriginalIfPossible(final SchemaNode node) {
+ if (node instanceof DerivableSchemaNode) {
+ @SuppressWarnings("unchecked")
+ final Optional<SchemaNode> ret = (Optional<SchemaNode>) ((DerivableSchemaNode) node).getOriginal();
+ return ret;
+ }
+ return Optional.empty();
+ }
+
@SuppressWarnings("unchecked")
Item<?> createBindingArg(final Class<?> childClass, final DataSchemaNode childSchema) {
return Item.of((Class<? extends DataObject>) childClass);
}
@SuppressWarnings("checkstyle:illegalCatch")
- protected final @NonNull D createBindingProxy(final NormalizedNodeContainer<?, ?, ?> node) {
+ protected final @NonNull D createBindingProxy(final DistinctNodeContainer<?, ?> node) {
try {
return (D) proxyConstructor.invokeExact(this, node);
} catch (final Throwable e) {
@SuppressWarnings("unchecked")
Map<Class<? extends Augmentation<?>>, Augmentation<?>> getAllAugmentationsFrom(
- final NormalizedNodeContainer<?, PathArgument, NormalizedNode<?, ?>> data) {
+ final DistinctNodeContainer<PathArgument, NormalizedNode> data) {
@SuppressWarnings("rawtypes")
final Map map = new HashMap<>();
- for (final NormalizedNode<?, ?> childValue : data.getValue()) {
+ for (final NormalizedNode childValue : data.body()) {
if (childValue instanceof AugmentationNode) {
final AugmentationNode augDomNode = (AugmentationNode) childValue;
final DataContainerCodecPrototype<?> codecProto = augmentationByYang.get(augDomNode.getIdentifier());
}
}
for (final DataContainerCodecPrototype<?> value : augmentationByStream.values()) {
- final Optional<NormalizedNode<?, ?>> augData = data.getChild(value.getYangArg());
- if (augData.isPresent()) {
- map.put(value.getBindingClass(), value.get().deserializeObject(augData.get()));
+ final NormalizedNode augData = data.childByArg(value.getYangArg());
+ if (augData != null) {
+ map.put(value.getBindingClass(), value.get().deserializeObject(augData));
}
}
return map;