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%2Fcodec%2FSchemaTracker.java;h=18dbab2b3e67892381e85dad6237f4a5b1f11286;hb=c24d6e2f39acbb11e22b5676bb7481ed52bec461;hp=cb7747fc6c70ea2451629b943d14fc680f5f40db;hpb=448c005a625dd6ae602cd15e36404571da6c1a37;p=yangtools.git diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/SchemaTracker.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/SchemaTracker.java index cb7747fc6c..18dbab2b3e 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/SchemaTracker.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/SchemaTracker.java @@ -9,32 +9,35 @@ package org.opendaylight.yangtools.yang.data.impl.codec; import com.google.common.annotations.Beta; import com.google.common.base.Preconditions; +import com.google.common.collect.Iterables; import java.io.IOException; import java.util.ArrayDeque; import java.util.Deque; import java.util.HashSet; -import javax.xml.stream.XMLStreamWriter; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier; 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.stream.NormalizedNodeStreamWriter; import org.opendaylight.yangtools.yang.data.impl.schema.SchemaUtils; -import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.AugmentationSchemaProxy; import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode; import org.opendaylight.yangtools.yang.model.api.AugmentationSchema; import org.opendaylight.yangtools.yang.model.api.AugmentationTarget; import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode; -import org.opendaylight.yangtools.yang.model.api.ChoiceNode; +import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode; import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; import org.opendaylight.yangtools.yang.model.api.DataNodeContainer; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; +import org.opendaylight.yangtools.yang.model.api.GroupingDefinition; import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode; import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; +import org.opendaylight.yangtools.yang.model.api.NotificationDefinition; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.model.api.SchemaNode; import org.opendaylight.yangtools.yang.model.api.SchemaPath; +import org.opendaylight.yangtools.yang.model.api.YangModeledAnyXmlSchemaNode; +import org.opendaylight.yangtools.yang.model.util.EffectiveAugmentationSchema; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -49,26 +52,14 @@ public final class SchemaTracker { private final DataNodeContainer root; private SchemaTracker(final SchemaContext context, final SchemaPath path) { - DataSchemaNode current = Preconditions.checkNotNull(context); - for (QName qname : path.getPathFromRoot()) { - final DataSchemaNode child; - if(current instanceof DataNodeContainer) { - child = ((DataNodeContainer) current).getDataChildByName(qname); - } else if (current instanceof ChoiceNode) { - child = ((ChoiceNode) current).getCaseNodeByName(qname); - } else { - throw new IllegalArgumentException(String.format("Schema node %s does not allow children.",current)); - } - current = child; - } - Preconditions.checkArgument(current instanceof DataNodeContainer,"Schema path must point to container or list. Supplied path %s pointed to: %s",path,current); - this.root = (DataNodeContainer) current; + SchemaNode current = SchemaUtils.findParentSchemaOnPath(context, path); + Preconditions.checkArgument(current instanceof DataNodeContainer,"Schema path must point to container or list or an rpc input/output. Supplied path %s pointed to: %s",path,current); + root = (DataNodeContainer) current; } /** * Create a new writer with the specified context as its root. * - * @param writer Output {@link XMLStreamWriter} * @param context Associated {@link SchemaContext}. * @return A new {@link NormalizedNodeStreamWriter} */ @@ -79,8 +70,8 @@ public final class SchemaTracker { /** * Create a new writer with the specified context and rooted in the specified schema path * - * @param writer Output {@link XMLStreamWriter} - * @param context Associated {@link SchemaContext}. + * @param context Associated {@link SchemaContext} + * @param path schema path * * @return A new {@link NormalizedNodeStreamWriter} */ @@ -99,17 +90,18 @@ public final class SchemaTracker { final Object parent = getParent(); SchemaNode schema = null; final QName qname = name.getNodeType(); - if(parent instanceof DataNodeContainer) { + if (parent instanceof DataNodeContainer) { schema = ((DataNodeContainer)parent).getDataChildByName(qname); - } else if(parent instanceof ChoiceNode) { - for(ChoiceCaseNode caze : ((ChoiceNode) parent).getCases()) { - DataSchemaNode potential = caze.getDataChildByName(qname); - if(potential != null) { - schema = potential; - break; - } + if (schema == null && parent instanceof GroupingDefinition) { + schema = ((GroupingDefinition) parent); + } + + if (schema == null && parent instanceof NotificationDefinition) { + schema = ((NotificationDefinition) parent); } + } else if (parent instanceof ChoiceSchemaNode) { + schema = findChildInCases((ChoiceSchemaNode) parent, qname); } else { throw new IllegalStateException("Unsupported schema type "+ parent.getClass() +" on stack."); } @@ -117,7 +109,31 @@ public final class SchemaTracker { return schema; } - public void startList(final NodeIdentifier name) { + private static SchemaNode findChildInCases(final ChoiceSchemaNode parent, final QName qname) { + DataSchemaNode schema = null; + for (final ChoiceCaseNode caze : parent.getCases()) { + final DataSchemaNode potential = caze.getDataChildByName(qname); + if (potential != null) { + schema = potential; + break; + } + } + return schema; + } + + private static SchemaNode findCaseByChild(final ChoiceSchemaNode parent, final QName qname) { + DataSchemaNode schema = null; + for (final ChoiceCaseNode caze : parent.getCases()) { + final DataSchemaNode potential = caze.getDataChildByName(qname); + if (potential != null) { + schema = caze; + break; + } + } + return schema; + } + + public void startList(final PathArgument name) { final SchemaNode schema = getSchema(name); Preconditions.checkArgument(schema instanceof ListSchemaNode, "Node %s is not a list", schema.getPath()); schemaStack.push(schema); @@ -136,14 +152,15 @@ public final class SchemaTracker { return (LeafSchemaNode) schema; } - public SchemaNode startLeafSet(final NodeIdentifier name) { + public LeafListSchemaNode startLeafSet(final NodeIdentifier name) { final SchemaNode schema = getSchema(name); Preconditions.checkArgument(schema instanceof LeafListSchemaNode, "Node %s is not a leaf-list", schema.getPath()); schemaStack.push(schema); - return schema; + return (LeafListSchemaNode)schema; } + @Deprecated public LeafListSchemaNode leafSetEntryNode() { final Object parent = getParent(); @@ -151,36 +168,68 @@ public final class SchemaTracker { return (LeafListSchemaNode) parent; } - public SchemaNode startChoiceNode(final NodeIdentifier name) { + public LeafListSchemaNode leafSetEntryNode(final QName qname) { + final Object parent = getParent(); + if (parent instanceof LeafListSchemaNode) { + return (LeafListSchemaNode) parent; + } + + final SchemaNode child = SchemaUtils.findChildSchemaByQName((SchemaNode) parent, qname); + Preconditions.checkArgument(child instanceof LeafListSchemaNode, + "Node %s is neither a leaf-list nor currently in a leaf-list", child.getPath()); + return (LeafListSchemaNode) child; + } + + public ChoiceSchemaNode startChoiceNode(final NodeIdentifier name) { LOG.debug("Enter choice {}", name); final SchemaNode schema = getSchema(name); - Preconditions.checkArgument(schema instanceof ChoiceNode, "Node %s is not a choice", schema.getPath()); + Preconditions.checkArgument(schema instanceof ChoiceSchemaNode, "Node %s is not a choice", schema.getPath()); schemaStack.push(schema); - return schema; + return (ChoiceSchemaNode)schema; } public SchemaNode startContainerNode(final NodeIdentifier name) { LOG.debug("Enter container {}", name); final SchemaNode schema = getSchema(name); - Preconditions.checkArgument(schema instanceof ContainerSchemaNode, "Node %s is not a container", schema.getPath()); + boolean isAllowed = schema instanceof ContainerSchemaNode; + isAllowed |= schema instanceof NotificationDefinition; + + Preconditions.checkArgument(isAllowed, "Node %s is not a container nor a notification", schema.getPath()); schemaStack.push(schema); + + return schema; + } + + public SchemaNode startYangModeledAnyXmlNode(final NodeIdentifier name) { + LOG.debug("Enter yang modeled anyXml {}", name); + final SchemaNode schema = getSchema(name); + + Preconditions.checkArgument(schema instanceof YangModeledAnyXmlSchemaNode, + "Node %s is not an yang modeled anyXml.", schema.getPath()); + + schemaStack.push(((YangModeledAnyXmlSchemaNode) schema).getSchemaOfAnyXmlData()); + return schema; } public AugmentationSchema startAugmentationNode(final AugmentationIdentifier identifier) { LOG.debug("Enter augmentation {}", identifier); - final Object parent = getParent(); + Object parent = getParent(); Preconditions.checkArgument(parent instanceof AugmentationTarget, "Augmentation not allowed under %s", parent); + if (parent instanceof ChoiceSchemaNode) { + final QName name = Iterables.get(identifier.getPossibleChildNames(), 0); + parent = findCaseByChild((ChoiceSchemaNode) parent, name); + } Preconditions.checkArgument(parent instanceof DataNodeContainer, "Augmentation allowed only in DataNodeContainer",parent); final AugmentationSchema schema = SchemaUtils.findSchemaForAugment((AugmentationTarget) parent, identifier.getPossibleChildNames()); - HashSet realChildSchemas = new HashSet<>(); - for(DataSchemaNode child : schema.getChildNodes()) { + final HashSet realChildSchemas = new HashSet<>(); + for (final DataSchemaNode child : schema.getChildNodes()) { realChildSchemas.add(((DataNodeContainer) parent).getDataChildByName(child.getQName())); } - AugmentationSchema resolvedSchema = new AugmentationSchemaProxy(schema, realChildSchemas); + final AugmentationSchema resolvedSchema = new EffectiveAugmentationSchema(schema, realChildSchemas); schemaStack.push(resolvedSchema); return resolvedSchema; } @@ -195,4 +244,5 @@ public final class SchemaTracker { public Object endNode() { return schemaStack.pop(); } + }