import org.opendaylight.yangtools.yang.data.api.schema.NormalizedAnydata;
import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriterExtension;
-import org.opendaylight.yangtools.yang.data.impl.codec.SchemaTracker;
+import org.opendaylight.yangtools.yang.data.util.NormalizedNodeInferenceStack;
import org.opendaylight.yangtools.yang.model.api.AnydataSchemaNode;
import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode;
import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
public abstract class JSONNormalizedNodeStreamWriter implements NormalizedNodeStreamWriter,
StreamWriterMountPointExtension {
private static final class Exclusive extends JSONNormalizedNodeStreamWriter {
- Exclusive(final JSONCodecFactory codecFactory, final SchemaTracker tracker, final JsonWriter writer,
- final JSONStreamWriterRootContext rootContext) {
+ Exclusive(final JSONCodecFactory codecFactory, final NormalizedNodeInferenceStack tracker,
+ final JsonWriter writer, final JSONStreamWriterRootContext rootContext) {
super(codecFactory, tracker, writer, rootContext);
}
}
private static final class Nested extends JSONNormalizedNodeStreamWriter {
- Nested(final JSONCodecFactory codecFactory, final SchemaTracker tracker, final JsonWriter writer,
+ Nested(final JSONCodecFactory codecFactory, final NormalizedNodeInferenceStack tracker, final JsonWriter writer,
final JSONStreamWriterRootContext rootContext) {
super(codecFactory, tracker, writer, rootContext);
}
private static final String NOT_DECIMAL_NUMBER_STRING = "-?\\d+";
private static final Pattern NOT_DECIMAL_NUMBER_PATTERN = Pattern.compile(NOT_DECIMAL_NUMBER_STRING);
- private final SchemaTracker tracker;
+ private final NormalizedNodeInferenceStack tracker;
private final JSONCodecFactory codecs;
private final JsonWriter writer;
private JSONStreamWriterContext context;
- JSONNormalizedNodeStreamWriter(final JSONCodecFactory codecFactory, final SchemaTracker tracker,
+ JSONNormalizedNodeStreamWriter(final JSONCodecFactory codecFactory, final NormalizedNodeInferenceStack tracker,
final JsonWriter writer, final JSONStreamWriterRootContext rootContext) {
this.writer = requireNonNull(writer);
this.codecs = requireNonNull(codecFactory);
*/
public static NormalizedNodeStreamWriter createExclusiveWriter(final JSONCodecFactory codecFactory,
final SchemaPath path, final XMLNamespace initialNs, final JsonWriter jsonWriter) {
- return new Exclusive(codecFactory, SchemaTracker.create(codecFactory.getEffectiveModelContext(), path),
- jsonWriter, new JSONStreamWriterExclusiveRootContext(initialNs));
+ return new Exclusive(codecFactory,
+ NormalizedNodeInferenceStack.of(codecFactory.getEffectiveModelContext(), path), jsonWriter,
+ new JSONStreamWriterExclusiveRootContext(initialNs));
}
/**
*/
public static NormalizedNodeStreamWriter createExclusiveWriter(final JSONCodecFactory codecFactory,
final EffectiveStatementInference rootNode, final XMLNamespace initialNs, final JsonWriter jsonWriter) {
- return new Exclusive(codecFactory, SchemaTracker.create(rootNode), jsonWriter,
+ return new Exclusive(codecFactory, NormalizedNodeInferenceStack.of(rootNode), jsonWriter,
new JSONStreamWriterExclusiveRootContext(initialNs));
}
*/
public static NormalizedNodeStreamWriter createExclusiveWriter(final JSONCodecFactory codecFactory,
final Absolute path, final XMLNamespace initialNs, final JsonWriter jsonWriter) {
- return new Exclusive(codecFactory, SchemaTracker.create(codecFactory.getEffectiveModelContext(), path),
- jsonWriter, new JSONStreamWriterExclusiveRootContext(initialNs));
+ return new Exclusive(codecFactory,
+ NormalizedNodeInferenceStack.of(codecFactory.getEffectiveModelContext(), path), jsonWriter,
+ new JSONStreamWriterExclusiveRootContext(initialNs));
}
/**
*/
public static NormalizedNodeStreamWriter createNestedWriter(final JSONCodecFactory codecFactory,
final SchemaPath path, final XMLNamespace initialNs, final JsonWriter jsonWriter) {
- return new Nested(codecFactory, SchemaTracker.create(codecFactory.getEffectiveModelContext(), path), jsonWriter,
- new JSONStreamWriterSharedRootContext(initialNs));
+ return new Nested(codecFactory, NormalizedNodeInferenceStack.of(codecFactory.getEffectiveModelContext(), path),
+ jsonWriter, new JSONStreamWriterSharedRootContext(initialNs));
}
/**
*/
public static NormalizedNodeStreamWriter createNestedWriter(final JSONCodecFactory codecFactory,
final Absolute path, final XMLNamespace initialNs, final JsonWriter jsonWriter) {
- return new Nested(codecFactory, SchemaTracker.create(codecFactory.getEffectiveModelContext(), path), jsonWriter,
- new JSONStreamWriterSharedRootContext(initialNs));
+ return new Nested(codecFactory, NormalizedNodeInferenceStack.of(codecFactory.getEffectiveModelContext(), path),
+ jsonWriter, new JSONStreamWriterSharedRootContext(initialNs));
}
/**
*/
public static NormalizedNodeStreamWriter createNestedWriter(final JSONCodecFactory codecFactory,
final EffectiveStatementInference rootNode, final XMLNamespace initialNs, final JsonWriter jsonWriter) {
- return new Nested(codecFactory, SchemaTracker.create(rootNode), jsonWriter,
+ return new Nested(codecFactory, NormalizedNodeInferenceStack.of(rootNode), jsonWriter,
new JSONStreamWriterSharedRootContext(initialNs));
}
public final NormalizedNodeStreamWriter startMountPoint(final MountPointIdentifier mountId,
final MountPointContext mountCtx) throws IOException {
final EffectiveModelContext ctx = mountCtx.getEffectiveModelContext();
- return new Nested(codecs.rebaseTo(ctx), SchemaTracker.create(ctx), writer,
+ return new Nested(codecs.rebaseTo(ctx), NormalizedNodeInferenceStack.of(ctx), writer,
new JSONStreamWriterSharedRootContext(context.getNamespace()));
}
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
-import org.opendaylight.yangtools.yang.data.impl.codec.SchemaTracker;
+import org.opendaylight.yangtools.yang.data.util.NormalizedNodeInferenceStack;
import org.opendaylight.yangtools.yang.model.api.AnydataSchemaNode;
import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode;
import org.opendaylight.yangtools.yang.model.api.ContainerLike;
final class SchemaAwareXMLStreamNormalizedNodeStreamWriter
extends XMLStreamNormalizedNodeStreamWriter<TypedDataSchemaNode> implements EffectiveModelContextProvider {
- private final SchemaTracker tracker;
+ private final NormalizedNodeInferenceStack tracker;
private final SchemaAwareXMLStreamWriterUtils streamUtils;
SchemaAwareXMLStreamNormalizedNodeStreamWriter(final XMLStreamWriter writer, final EffectiveModelContext context,
- final SchemaTracker tracker) {
+ final NormalizedNodeInferenceStack tracker) {
super(writer);
this.tracker = requireNonNull(tracker);
this.streamUtils = new SchemaAwareXMLStreamWriterUtils(context);
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedAnydata;
import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriterExtension;
-import org.opendaylight.yangtools.yang.data.impl.codec.SchemaTracker;
+import org.opendaylight.yangtools.yang.data.util.NormalizedNodeInferenceStack;
import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
import org.opendaylight.yangtools.yang.model.api.EffectiveStatementInference;
import org.opendaylight.yangtools.yang.model.api.SchemaPath;
*/
public static @NonNull NormalizedNodeStreamWriter create(final XMLStreamWriter writer,
final EffectiveModelContext context) {
- return new SchemaAwareXMLStreamNormalizedNodeStreamWriter(writer, context, SchemaTracker.create(context));
+ return new SchemaAwareXMLStreamNormalizedNodeStreamWriter(writer, context,
+ NormalizedNodeInferenceStack.of(context));
}
/**
public static @NonNull NormalizedNodeStreamWriter create(final XMLStreamWriter writer,
final EffectiveStatementInference inference) {
return new SchemaAwareXMLStreamNormalizedNodeStreamWriter(writer, inference.getEffectiveModelContext(),
- SchemaTracker.create(inference));
+ NormalizedNodeInferenceStack.of(inference));
}
/**
*/
public static @NonNull NormalizedNodeStreamWriter create(final XMLStreamWriter writer,
final EffectiveModelContext context, final SchemaPath path) {
- return new SchemaAwareXMLStreamNormalizedNodeStreamWriter(writer, context, SchemaTracker.create(context, path));
+ return new SchemaAwareXMLStreamNormalizedNodeStreamWriter(writer, context,
+ NormalizedNodeInferenceStack.of(context, path));
}
/**
*/
public static @NonNull NormalizedNodeStreamWriter create(final XMLStreamWriter writer,
final EffectiveModelContext context, final Absolute path) {
- return new SchemaAwareXMLStreamNormalizedNodeStreamWriter(writer, context, SchemaTracker.create(context, path));
+ return new SchemaAwareXMLStreamNormalizedNodeStreamWriter(writer, context,
+ NormalizedNodeInferenceStack.of(context, path));
}
/**
private static @NonNull NormalizedNodeStreamWriter forOperation(final XMLStreamWriter writer,
final EffectiveModelContext context, final Absolute operationPath, final QName qname) {
return new SchemaAwareXMLStreamNormalizedNodeStreamWriter(writer, context,
- SchemaTracker.forOperation(context, operationPath, qname));
+ NormalizedNodeInferenceStack.ofOperation(context, operationPath, qname));
}
/**
requires transitive org.opendaylight.yangtools.odlext.model.api;
requires transitive org.opendaylight.yangtools.rfc7952.data.api;
requires transitive org.opendaylight.yangtools.rfc8528.data.api;
+ requires transitive org.opendaylight.yangtools.yang.model.util;
requires com.google.common;
requires org.opendaylight.yangtools.yang.model.spi;
- requires org.opendaylight.yangtools.yang.model.util;
requires org.opendaylight.yangtools.util;
requires org.slf4j;
// Annotations
requires static org.eclipse.jdt.annotation;
+ requires org.opendaylight.yangtools.concepts;
}
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
-package org.opendaylight.yangtools.yang.data.impl.codec;
+package org.opendaylight.yangtools.yang.data.util;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Verify.verify;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.yangtools.concepts.Mutable;
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.NodeWithValue;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
-import org.opendaylight.yangtools.yang.data.impl.schema.SchemaUtils;
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.slf4j.LoggerFactory;
/**
- * Utility class for tracking the underlying state of the underlying schema node.
+ * Utility class for tracking schema state underlying a {@link NormalizedNode} structure.
*/
@Beta
-public final class SchemaTracker {
- private static final Logger LOG = LoggerFactory.getLogger(SchemaTracker.class);
+public final class NormalizedNodeInferenceStack implements Mutable {
+ private static final Logger LOG = LoggerFactory.getLogger(NormalizedNodeInferenceStack.class);
private final Deque<WithStatus> schemaStack = new ArrayDeque<>();
private final SchemaInferenceStack dataTree;
private final DataNodeContainer root;
- private SchemaTracker(final EffectiveModelContext context) {
+ private NormalizedNodeInferenceStack(final EffectiveModelContext context) {
root = requireNonNull(context);
dataTree = SchemaInferenceStack.of(context);
}
- private SchemaTracker(final SchemaInferenceStack dataTree) {
+ private NormalizedNodeInferenceStack(final SchemaInferenceStack dataTree) {
this.dataTree = requireNonNull(dataTree);
if (!dataTree.isEmpty()) {
final EffectiveStatement<?, ?> current = dataTree.currentStatement();
* @return A new {@link NormalizedNodeStreamWriter}
* @throws NullPointerException if {@code root} is null
*/
- public static @NonNull SchemaTracker create(final EffectiveStatementInference root) {
- return new SchemaTracker(SchemaInferenceStack.ofInference(root));
+ public static @NonNull NormalizedNodeInferenceStack of(final EffectiveStatementInference root) {
+ return new NormalizedNodeInferenceStack(SchemaInferenceStack.ofInference(root));
}
/**
* @return A new {@link NormalizedNodeStreamWriter}
* @throws NullPointerException if {@code root} is null
*/
- public static @NonNull SchemaTracker create(final Inference root) {
- return new SchemaTracker(root.toSchemaInferenceStack());
+ public static @NonNull NormalizedNodeInferenceStack of(final Inference root) {
+ return new NormalizedNodeInferenceStack(root.toSchemaInferenceStack());
}
/**
* @return A new {@link NormalizedNodeStreamWriter}
* @throws NullPointerException if {@code context} is null
*/
- public static @NonNull SchemaTracker create(final EffectiveModelContext context) {
- return new SchemaTracker(context);
+ public static @NonNull NormalizedNodeInferenceStack of(final EffectiveModelContext context) {
+ return new NormalizedNodeInferenceStack(context);
}
/**
*
* @param context Associated {@link EffectiveModelContext}
* @param path schema path
- * @return A new {@link SchemaTracker}
+ * @return A new {@link NormalizedNodeInferenceStack}
* @throws NullPointerException if any argument is null
* @throws IllegalArgumentException if {@code path} does not point to a valid root
*/
- public static @NonNull SchemaTracker create(final EffectiveModelContext context, final Absolute path) {
- return new SchemaTracker(SchemaInferenceStack.of(context, path));
+ public static @NonNull NormalizedNodeInferenceStack of(final EffectiveModelContext context, final Absolute path) {
+ return new NormalizedNodeInferenceStack(SchemaInferenceStack.of(context, path));
}
/**
*
* @param context Associated {@link EffectiveModelContext}
* @param path schema path
- * @return A new {@link SchemaTracker}
+ * @return A new {@link NormalizedNodeInferenceStack}
* @throws NullPointerException if any argument is null
* @throws IllegalArgumentException if {@code path} does not point to a valid root
*/
- public static @NonNull SchemaTracker create(final EffectiveModelContext context, final SchemaPath path) {
- return new SchemaTracker(SchemaInferenceStack.ofInstantiatedPath(context, path));
+ @Deprecated
+ public static @NonNull NormalizedNodeInferenceStack of(final EffectiveModelContext context, final SchemaPath path) {
+ return new NormalizedNodeInferenceStack(SchemaInferenceStack.ofInstantiatedPath(context, path));
}
/**
* @throws IllegalArgumentException if {@code operation} does not point to an actual operation or if {@code qname}
* does not identify a valid root underneath it.
*/
- public static @NonNull SchemaTracker forOperation(final EffectiveModelContext context, final Absolute operation,
- final QName qname) {
+ public static @NonNull NormalizedNodeInferenceStack ofOperation(final EffectiveModelContext context,
+ final Absolute operation, final QName qname) {
final SchemaInferenceStack stack = SchemaInferenceStack.of(context, operation);
final EffectiveStatement<?, ?> current = stack.currentStatement();
checkArgument(current instanceof RpcEffectiveStatement || current instanceof ActionEffectiveStatement,
"Path %s resolved into non-operation %s", operation, current);
stack.enterSchemaTree(qname);
- return new SchemaTracker(stack);
+ return new NormalizedNodeInferenceStack(stack);
}
/**
if (parent instanceof LeafListSchemaNode) {
return (LeafListSchemaNode) parent;
}
-
- // FIXME: when would this trigger?
- final SchemaNode child = SchemaUtils.findDataChildSchemaByQName((SchemaNode) parent, qname);
+ checkArgument(parent instanceof DataNodeContainer, "Cannot lookup %s in parent %s", qname, parent);
+ final DataSchemaNode child = ((DataNodeContainer) parent).dataChildByName(qname);
checkArgument(child instanceof LeafListSchemaNode,
"Node %s is neither a leaf-list nor currently in a leaf-list", child);
return (LeafListSchemaNode) child;
return schema;
}
+ public void startAnyxmlNode(final NodeIdentifier name) {
+ final SchemaNode schema = enterDataTree(name);
+ checkArgument(schema instanceof AnyxmlSchemaNode, "Node %s is not anyxml", schema);
+ schemaStack.push(schema);
+ }
+
+ public void startAnydataNode(final NodeIdentifier name) {
+ final SchemaNode schema = enterDataTree(name);
+ checkArgument(schema instanceof AnydataSchemaNode, "Node %s is not anydata", schema);
+ schemaStack.push(schema);
+ }
+
+ public Object endNode() {
+ final Object ret = schemaStack.pop();
+ // If this is a data tree node, make sure it is updated. Before that, though, we need to check if this is not
+ // actually listEntry -> list or leafListEntry -> leafList exit.
+ if (!(ret instanceof AugmentationSchemaNode) && getParent() != ret) {
+ dataTree.exit();
+ }
+ return ret;
+ }
+
public AugmentationSchemaNode startAugmentationNode(final AugmentationIdentifier identifier) {
LOG.debug("Enter augmentation {}", identifier);
Object parent = getParent();
parent = findCaseByChild((ChoiceSchemaNode) parent, name);
}
checkArgument(parent instanceof DataNodeContainer, "Augmentation allowed only in DataNodeContainer", parent);
- final AugmentationSchemaNode schema = SchemaUtils.findSchemaForAugment((AugmentationTarget) parent,
+ final AugmentationSchemaNode schema = findSchemaForAugment((AugmentationTarget) parent,
identifier.getPossibleChildNames());
final AugmentationSchemaNode resolvedSchema = EffectiveAugmentationSchema.create(schema,
(DataNodeContainer) parent);
return resolvedSchema;
}
+ // FIXME: 7.0.0: can we get rid of this?
+ private static @NonNull AugmentationSchemaNode findSchemaForAugment(final AugmentationTarget schema,
+ final Set<QName> qnames) {
+ for (final AugmentationSchemaNode augment : schema.getAvailableAugmentations()) {
+ if (qnames.equals(augment.getChildNodes().stream()
+ .map(DataSchemaNode::getQName)
+ .collect(Collectors.toUnmodifiableSet()))) {
+ return augment;
+ }
+ }
+
+ throw new IllegalStateException(
+ "Unknown augmentation node detected, identified by: " + qnames + ", in: " + schema);
+ }
+
+ // FIXME: 7.0.0: can we get rid of this?
private static SchemaNode findCaseByChild(final ChoiceSchemaNode parent, final QName qname) {
for (final CaseSchemaNode caze : parent.getCases()) {
final Optional<DataSchemaNode> potential = caze.findDataChildByName(qname);
}
return null;
}
-
- public void startAnyxmlNode(final NodeIdentifier name) {
- final SchemaNode schema = enterDataTree(name);
- checkArgument(schema instanceof AnyxmlSchemaNode, "Node %s is not anyxml", schema);
- schemaStack.push(schema);
- }
-
- public void startAnydataNode(final NodeIdentifier name) {
- final SchemaNode schema = enterDataTree(name);
- checkArgument(schema instanceof AnydataSchemaNode, "Node %s is not anydata", schema);
- schemaStack.push(schema);
- }
-
- public Object endNode() {
- final Object ret = schemaStack.pop();
- // If this is a data tree node, make sure it is updated. Before that, though, we need to check if this is not
- // actually listEntry -> list or leafListEntry -> leafList exit.
- if (!(ret instanceof AugmentationSchemaNode) && getParent() != ret) {
- dataTree.exit();
- }
- return ret;
- }
}