import static com.google.common.base.Preconditions.checkState;
import static java.util.Objects.requireNonNull;
-import static org.w3c.dom.Node.ELEMENT_NODE;
-import static org.w3c.dom.Node.TEXT_NODE;
import com.google.common.collect.ClassToInstanceMap;
import com.google.common.collect.ImmutableClassToInstanceMap;
import com.google.gson.stream.JsonWriter;
import java.io.IOException;
-import java.net.URI;
+import java.util.NoSuchElementException;
import java.util.regex.Pattern;
import javax.xml.transform.dom.DOMSource;
import org.checkerframework.checker.regex.qual.Regex;
import org.opendaylight.yangtools.rfc8528.data.api.MountPointContext;
import org.opendaylight.yangtools.rfc8528.data.api.MountPointIdentifier;
import org.opendaylight.yangtools.rfc8528.data.api.StreamWriterMountPointExtension;
+import org.opendaylight.yangtools.yang.common.XMLNamespace;
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.NodeIdentifierWithPredicates;
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.SingleChildDataNodeContainer;
+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;
-import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
+import org.opendaylight.yangtools.yang.model.api.EffectiveStatementInference;
import org.opendaylight.yangtools.yang.model.api.SchemaNode;
import org.opendaylight.yangtools.yang.model.api.SchemaPath;
import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode;
import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
+import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
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);
* @return A stream writer instance
*/
public static NormalizedNodeStreamWriter createExclusiveWriter(final JSONCodecFactory codecFactory,
- final SchemaPath path, final URI initialNs, final JsonWriter jsonWriter) {
- return new Exclusive(codecFactory, SchemaTracker.create(codecFactory.getEffectiveModelContext(), path),
- jsonWriter, new JSONStreamWriterExclusiveRootContext(initialNs));
+ final SchemaPath path, final XMLNamespace initialNs, final JsonWriter jsonWriter) {
+ return new Exclusive(codecFactory,
+ NormalizedNodeInferenceStack.of(codecFactory.getEffectiveModelContext(), path), jsonWriter,
+ new JSONStreamWriterExclusiveRootContext(initialNs));
}
/**
* the writer too.
*
* @param codecFactory JSON codec factory
- * @param path Schema Path
+ * @param rootNode Root node inference
* @param initialNs Initial namespace
* @param jsonWriter JsonWriter
* @return A stream writer instance
*/
public static NormalizedNodeStreamWriter createExclusiveWriter(final JSONCodecFactory codecFactory,
- final Absolute path, final URI initialNs, final JsonWriter jsonWriter) {
- return new Exclusive(codecFactory, SchemaTracker.create(codecFactory.getEffectiveModelContext(), path),
- jsonWriter, new JSONStreamWriterExclusiveRootContext(initialNs));
+ final EffectiveStatementInference rootNode, final XMLNamespace initialNs, final JsonWriter jsonWriter) {
+ return new Exclusive(codecFactory, NormalizedNodeInferenceStack.of(rootNode), jsonWriter,
+ new JSONStreamWriterExclusiveRootContext(initialNs));
}
/**
* the writer too.
*
* @param codecFactory JSON codec factory
- * @param rootNode Root node
+ * @param path Schema Path
* @param initialNs Initial namespace
* @param jsonWriter JsonWriter
* @return A stream writer instance
*/
public static NormalizedNodeStreamWriter createExclusiveWriter(final JSONCodecFactory codecFactory,
- final DataNodeContainer rootNode, final URI initialNs, final JsonWriter jsonWriter) {
- return new Exclusive(codecFactory, SchemaTracker.create(rootNode), jsonWriter,
+ final Absolute path, final XMLNamespace initialNs, final JsonWriter jsonWriter) {
+ return new Exclusive(codecFactory,
+ NormalizedNodeInferenceStack.of(codecFactory.getEffectiveModelContext(), path), jsonWriter,
new JSONStreamWriterExclusiveRootContext(initialNs));
}
* @return A stream writer instance
*/
public static NormalizedNodeStreamWriter createNestedWriter(final JSONCodecFactory codecFactory,
- final SchemaPath path, final URI initialNs, final JsonWriter jsonWriter) {
- return new Nested(codecFactory, SchemaTracker.create(codecFactory.getEffectiveModelContext(), path), jsonWriter,
- new JSONStreamWriterSharedRootContext(initialNs));
+ final SchemaPath path, final XMLNamespace initialNs, final JsonWriter jsonWriter) {
+ return new Nested(codecFactory, NormalizedNodeInferenceStack.of(codecFactory.getEffectiveModelContext(), path),
+ jsonWriter, new JSONStreamWriterSharedRootContext(initialNs));
}
/**
* @return A stream writer instance
*/
public static NormalizedNodeStreamWriter createNestedWriter(final JSONCodecFactory codecFactory,
- final Absolute path, final URI initialNs, final JsonWriter jsonWriter) {
- return new Nested(codecFactory, SchemaTracker.create(codecFactory.getEffectiveModelContext(), path), jsonWriter,
- new JSONStreamWriterSharedRootContext(initialNs));
+ final Absolute path, final XMLNamespace initialNs, final JsonWriter jsonWriter) {
+ return new Nested(codecFactory, NormalizedNodeInferenceStack.of(codecFactory.getEffectiveModelContext(), path),
+ jsonWriter, new JSONStreamWriterSharedRootContext(initialNs));
}
/**
* close the wrapped writer; the caller must take care of that.
*
* @param codecFactory JSON codec factory
- * @param rootNode Root node
+ * @param rootNode Root node inference
* @param initialNs Initial namespace
* @param jsonWriter JsonWriter
* @return A stream writer instance
*/
public static NormalizedNodeStreamWriter createNestedWriter(final JSONCodecFactory codecFactory,
- final DataNodeContainer rootNode, final URI initialNs, final JsonWriter jsonWriter) {
- return new Nested(codecFactory, SchemaTracker.create(rootNode), jsonWriter,
+ final EffectiveStatementInference rootNode, final XMLNamespace initialNs, final JsonWriter 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()));
}
return false;
}
- @Override
- public final void startYangModeledAnyXmlNode(final NodeIdentifier name, final int childSizeHint)
- throws IOException {
- tracker.startYangModeledAnyXmlNode(name);
- context = new JSONStreamWriterNamedObjectContext(context, name, true);
- }
-
@Override
public final void endNode() throws IOException {
tracker.endNode();
}
private void writeNormalizedAnydata(final NormalizedAnydata anydata) throws IOException {
+ // Adjust state to point to parent node and ensure it can handle data tree nodes
+ final SchemaInferenceStack.Inference inference;
+ try {
+ final SchemaInferenceStack stack = SchemaInferenceStack.ofInference(anydata.getInference());
+ stack.exitToDataTree();
+ inference = stack.toInference();
+ } catch (IllegalArgumentException | IllegalStateException | NoSuchElementException e) {
+ throw new IOException("Cannot emit " + anydata, e);
+ }
+
anydata.writeTo(JSONNormalizedNodeStreamWriter.createNestedWriter(
- codecs.rebaseTo(anydata.getEffectiveModelContext()),
- new SingleChildDataNodeContainer(anydata.getContextNode()), context.getNamespace(), writer));
+ codecs.rebaseTo(inference.getEffectiveModelContext()), inference, context.getNamespace(), writer));
}
private void writeAnyXmlValue(final DOMSource anyXmlValue) throws IOException {
}
private static boolean isArrayElement(final Node node) {
- if (ELEMENT_NODE == node.getNodeType()) {
+ if (Node.ELEMENT_NODE == node.getNodeType()) {
final String nodeName = node.getNodeName();
for (Node nextNode = node.getNextSibling(); nextNode != null; nextNode = nextNode.getNextSibling()) {
- if (ELEMENT_NODE == nextNode.getNodeType() && nodeName.equals(nextNode.getNodeName())) {
+ if (Node.ELEMENT_NODE == nextNode.getNodeType() && nodeName.equals(nextNode.getNodeName())) {
return true;
}
}
private void writeObject(Node node) throws IOException {
String previousNodeName = "";
while (node != null) {
- if (ELEMENT_NODE == node.getNodeType()) {
+ if (Node.ELEMENT_NODE == node.getNodeType()) {
if (!node.getNodeName().equals(previousNodeName)) {
previousNodeName = node.getNodeName();
writer.name(node.getNodeName());
final NodeList children = node.getChildNodes();
for (int i = 0, length = children.getLength(); i < length; i++) {
final Node childNode = children.item(i);
- if (ELEMENT_NODE == childNode.getNodeType()) {
+ if (Node.ELEMENT_NODE == childNode.getNodeType()) {
return (Element) childNode;
}
}
final NodeList children = node.getChildNodes();
for (int i = 0, length = children.getLength(); i < length; i++) {
final Node childNode = children.item(i);
- if (TEXT_NODE == childNode.getNodeType()) {
+ if (Node.TEXT_NODE == childNode.getNodeType()) {
return (Text) childNode;
}
}