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=75722e7f68c6cfa3443aed94e25f744f90c2947f;hb=8ac02d36bb5189e29514d837600f45e8eb546d36;hp=39181ae49fbf93ae556d1a4e092b671f26cfb2f9;hpb=baec9c157aeefd984e80c010b29a34e18147942e;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 39181ae49f..75722e7f68 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,35 +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; @@ -52,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} */ @@ -82,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} */ @@ -102,24 +90,49 @@ 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) { + if (parent instanceof GroupingDefinition) { + schema = (GroupingDefinition) parent; + } else if (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."); } + Preconditions.checkArgument(schema != null, "Could not find schema for node %s in %s", qname, parent); return schema; } + 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()); @@ -139,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(); @@ -154,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; } @@ -198,4 +244,5 @@ public final class SchemaTracker { public Object endNode() { return schemaStack.pop(); } + }