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=09aa9c8a2b9abec1a36bfb7059d44f07adc29787;hpb=052bd27d118a2addb3eae2253515890369a60182;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 09aa9c8a2b..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 @@ -8,9 +8,7 @@ package org.opendaylight.yangtools.yang.data.impl.codec; import com.google.common.annotations.Beta; -import com.google.common.base.Optional; import com.google.common.base.Preconditions; -import com.google.common.base.Predicate; import com.google.common.collect.Iterables; import java.io.IOException; import java.util.ArrayDeque; @@ -26,7 +24,7 @@ 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; @@ -35,10 +33,10 @@ 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.RpcDefinition; 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; @@ -54,55 +52,11 @@ public final class SchemaTracker { private final DataNodeContainer root; private SchemaTracker(final SchemaContext context, final SchemaPath path) { - SchemaNode current = Preconditions.checkNotNull(context); - for (final QName qname : path.getPathFromRoot()) { - SchemaNode child; - if(current instanceof DataNodeContainer) { - child = ((DataNodeContainer) current).getDataChildByName(qname); - - if (child == null && current instanceof SchemaContext) { - child = tryFindGroupings((SchemaContext) current, qname).orNull(); - } - - if(child == null && current instanceof SchemaContext) { - child = tryFindNotification((SchemaContext) current, qname) - .or(tryFindRpc(((SchemaContext) current), qname)).orNull(); - } - } else if (current instanceof ChoiceNode) { - child = ((ChoiceNode) current).getCaseNodeByName(qname); - } else if (current instanceof RpcDefinition) { - switch (qname.getLocalName()) { - case "input": - child = ((RpcDefinition) current).getInput(); - break; - case "output": - child = ((RpcDefinition) current).getOutput(); - break; - default: - child = null; - break; - } - } else { - throw new IllegalArgumentException(String.format("Schema node %s does not allow children.", current)); - } - current = child; - } + 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; } - private Optional tryFindGroupings(final SchemaContext ctx, final QName qname) { - return Optional. fromNullable(Iterables.find(ctx.getGroupings(), new SchemaNodePredicate(qname), null)); - } - - private Optional tryFindRpc(final SchemaContext ctx, final QName qname) { - return Optional.fromNullable(Iterables.find(ctx.getOperations(), new SchemaNodePredicate(qname), null)); - } - - private Optional tryFindNotification(final SchemaContext ctx, final QName qname) { - return Optional.fromNullable(Iterables.find(ctx.getNotifications(), new SchemaNodePredicate(qname), null)); - } - /** * Create a new writer with the specified context as its root. * @@ -136,24 +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); - if(schema == null && parent instanceof GroupingDefinition) { + if (schema == null && parent instanceof GroupingDefinition) { schema = ((GroupingDefinition) parent); } - if(schema == null && parent instanceof NotificationDefinition) { + if (schema == null && parent instanceof NotificationDefinition) { schema = ((NotificationDefinition) parent); } - } else if(parent instanceof ChoiceNode) { - for(final ChoiceCaseNode caze : ((ChoiceNode) parent).getCases()) { - final DataSchemaNode potential = caze.getDataChildByName(qname); - if(potential != null) { - schema = potential; - break; - } - } + } else if (parent instanceof ChoiceSchemaNode) { + schema = findChildInCases((ChoiceSchemaNode) parent, qname); } else { throw new IllegalStateException("Unsupported schema type "+ parent.getClass() +" on stack."); } @@ -161,6 +109,30 @@ public final class SchemaTracker { 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()); @@ -188,6 +160,7 @@ public final class SchemaTracker { return (LeafListSchemaNode)schema; } + @Deprecated public LeafListSchemaNode leafSetEntryNode() { final Object parent = getParent(); @@ -195,13 +168,25 @@ public final class SchemaTracker { return (LeafListSchemaNode) parent; } - public ChoiceNode 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 (ChoiceNode)schema; + return (ChoiceSchemaNode)schema; } public SchemaNode startContainerNode(final NodeIdentifier name) { @@ -213,18 +198,35 @@ public final class SchemaTracker { 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()); final HashSet realChildSchemas = new HashSet<>(); - for(final DataSchemaNode child : schema.getChildNodes()) { + for (final DataSchemaNode child : schema.getChildNodes()) { realChildSchemas.add(((DataNodeContainer) parent).getDataChildByName(child.getQName())); } final AugmentationSchema resolvedSchema = new EffectiveAugmentationSchema(schema, realChildSchemas); @@ -243,16 +245,4 @@ public final class SchemaTracker { return schemaStack.pop(); } - private static final class SchemaNodePredicate implements Predicate { - private final QName qname; - - public SchemaNodePredicate(final QName qname) { - this.qname = qname; - } - - @Override - public boolean apply(final SchemaNode input) { - return input.getQName().equals(qname); - } - } }