X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-data-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fdata%2Fimpl%2Fschema%2FInstanceIdToNodes.java;h=f867c5ab85ab16d269e9ef85b17447755ac5c551;hb=refs%2Fchanges%2F98%2F93898%2F1;hp=1eca9b8417f7a2310807fa070c271f400d41069d;hpb=f4212253d03d6917ce6317d99c4d47a1e5028905;p=yangtools.git diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/InstanceIdToNodes.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/InstanceIdToNodes.java index 1eca9b8417..f867c5ab85 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/InstanceIdToNodes.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/InstanceIdToNodes.java @@ -16,22 +16,24 @@ import java.util.List; import java.util.Optional; import javax.xml.transform.dom.DOMSource; import org.eclipse.jdt.annotation.NonNull; -import org.opendaylight.yangtools.concepts.Identifiable; +import org.opendaylight.yangtools.concepts.AbstractIdentifiable; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; -import org.opendaylight.yangtools.yang.data.api.schema.AnyXmlNode; +import org.opendaylight.yangtools.yang.data.api.schema.AnydataNode; +import org.opendaylight.yangtools.yang.data.api.schema.DOMSourceAnyxmlNode; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode; import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode; import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.CollectionNodeBuilder; import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.NormalizedNodeBuilder; -import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode; +import org.opendaylight.yangtools.yang.model.api.AnydataSchemaNode; +import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode; import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode; import org.opendaylight.yangtools.yang.model.api.AugmentationTarget; import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode; import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode; -import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; +import org.opendaylight.yangtools.yang.model.api.ContainerLike; import org.opendaylight.yangtools.yang.model.api.DataNodeContainer; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode; @@ -42,16 +44,9 @@ import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; * Base strategy for converting an instance identifier into a normalized node structure. * Use provided static methods for generic YangInstanceIdentifier -> NormalizedNode translation in ImmutableNodes. */ -abstract class InstanceIdToNodes implements Identifiable { - private final T identifier; - +abstract class InstanceIdToNodes extends AbstractIdentifiable { InstanceIdToNodes(final T identifier) { - this.identifier = identifier; - } - - @Override - public final T getIdentifier() { - return identifier; + super(identifier); } /** @@ -99,34 +94,61 @@ abstract class InstanceIdToNodes implements Identifiable } } - private static final class AnyXmlNormalization extends InstanceIdToNodes { - AnyXmlNormalization(final AnyXmlSchemaNode schema) { + private abstract static class AbstractOpaqueNormalization extends InstanceIdToNodes { + AbstractOpaqueNormalization(final DataSchemaNode schema) { super(NodeIdentifier.create(schema.getQName())); } @Override - InstanceIdToNodes getChild(final PathArgument child) { + final InstanceIdToNodes getChild(final PathArgument child) { return null; } + @Override + final boolean isMixin() { + return false; + } + } + + private static final class AnydataNormalization extends AbstractOpaqueNormalization { + AnydataNormalization(final AnydataSchemaNode schema) { + super(schema); + } + + @Override + NormalizedNode create(final PathArgument first, final Iterator others, + final Optional> deepestChild) { + checkState(deepestChild.isPresent(), "Cannot instantiate anydata node without a value"); + final NormalizedNode child = deepestChild.get(); + checkState(child instanceof AnydataNode, "Invalid child %s", child); + return createAnydata((AnydataNode) child); + } + + private AnydataNode createAnydata(final AnydataNode child) { + return Builders.anydataBuilder(child.getValueObjectModel()).withValue(child.getValue()) + .withNodeIdentifier(getIdentifier()).build(); + } + } + + private static final class AnyXmlNormalization extends AbstractOpaqueNormalization { + AnyXmlNormalization(final AnyxmlSchemaNode schema) { + super(schema); + } + @Override NormalizedNode create(final PathArgument first, final Iterator others, final Optional> deepestChild) { - final NormalizedNodeBuilder builder = Builders.anyXmlBuilder() + final NormalizedNodeBuilder builder = + Builders.anyXmlBuilder() .withNodeIdentifier(getIdentifier()); if (deepestChild.isPresent()) { final NormalizedNode child = deepestChild.get(); - checkState(child instanceof AnyXmlNode); - builder.withValue(((AnyXmlNode) child).getValue()); + checkState(child instanceof DOMSourceAnyxmlNode, "Invalid child %s", child); + builder.withValue(((DOMSourceAnyxmlNode) child).getValue()); } return builder.build(); } - - @Override - boolean isMixin() { - return false; - } } private static Optional findChildSchemaNode(final DataNodeContainer parent, final QName child) { @@ -151,7 +173,7 @@ abstract class InstanceIdToNodes implements Identifiable private static ChoiceSchemaNode findChoice(final Iterable choices, final QName child) { for (final ChoiceSchemaNode choice : choices) { - for (final CaseSchemaNode caze : choice.getCases().values()) { + for (final CaseSchemaNode caze : choice.getCases()) { if (findChildSchemaNode(caze, child).isPresent()) { return choice; } @@ -180,8 +202,8 @@ abstract class InstanceIdToNodes implements Identifiable } static InstanceIdToNodes fromDataSchemaNode(final DataSchemaNode potential) { - if (potential instanceof ContainerSchemaNode) { - return new InstanceIdToCompositeNodes.ContainerTransformation((ContainerSchemaNode) potential); + if (potential instanceof ContainerLike) { + return new InstanceIdToCompositeNodes.ContainerTransformation((ContainerLike) potential); } else if (potential instanceof ListSchemaNode) { return fromListSchemaNode((ListSchemaNode) potential); } else if (potential instanceof LeafSchemaNode) { @@ -190,8 +212,10 @@ abstract class InstanceIdToNodes implements Identifiable return new InstanceIdToCompositeNodes.ChoiceNodeNormalization((ChoiceSchemaNode) potential); } else if (potential instanceof LeafListSchemaNode) { return fromLeafListSchemaNode((LeafListSchemaNode) potential); - } else if (potential instanceof AnyXmlSchemaNode) { - return new AnyXmlNormalization((AnyXmlSchemaNode) potential); + } else if (potential instanceof AnydataSchemaNode) { + return new AnydataNormalization((AnydataSchemaNode) potential); + } else if (potential instanceof AnyxmlSchemaNode) { + return new AnyXmlNormalization((AnyxmlSchemaNode) potential); } return null; }