--- /dev/null
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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.api.schema;
+
+import com.google.common.annotations.Beta;
+import java.util.Collection;
+import javax.annotation.Nonnull;
+import org.opendaylight.yangtools.yang.data.api.AttributesContainer;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
+import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
+
+/**
+ * AnyXML node with schema of contained XML data.
+ */
+@Beta
+public interface YangModeledAnyXmlNode extends AttributesContainer, DataContainerNode<NodeIdentifier>,
+ DataContainerChild<NodeIdentifier, Collection<DataContainerChild<? extends PathArgument, ?>>> {
+
+ /**
+ * @return DataSchemaNode - schema of contained XML data
+ */
+ @Nonnull
+ ContainerSchemaNode getSchemaOfAnyXmlData();
+}
delegate().startContainerNode(name, childSizeHint, attributes);
}
+ @Override
+ public void startYangModeledAnyXmlNode(final NodeIdentifier name, final int childSizeHint,
+ final Map<QName, String> attributes) throws IOException {
+ delegate().startYangModeledAnyXmlNode(name, childSizeHint, attributes);
+ }
+
@Override
public void startUnkeyedListItem(final NodeIdentifier name, final int childSizeHint,
final Map<QName, String> attributes) throws IOException {
delegate().anyxmlNode(name, value);
}
+ @Override
+ public void startYangModeledAnyXmlNode(final NodeIdentifier name, final int childSizeHint) throws IOException {
+ delegate().startYangModeledAnyXmlNode(name, childSizeHint);
+ }
+
@Override
public void endNode() throws IOException {
delegate().endNode();
LOG.debug("{}{}(anyxml)=", ind(), name, value);
}
+ @Override
+ public void startYangModeledAnyXmlNode(final NodeIdentifier name, final int childSizeHint) {
+ LOG.debug("{}{}(yangModeledAnyXml)", ind(), name);
+ incIndent();
+ }
+
@Override
public void flush() {
LOG.trace("<<FLUSH>>");
void startContainerNode(YangInstanceIdentifier.NodeIdentifier name, int childSizeHint, Map<QName, String> attributes) throws IOException;
+ void startYangModeledAnyXmlNode(YangInstanceIdentifier.NodeIdentifier name, int childSizeHint, Map<QName, String> attributes) throws IOException;
+
void startUnkeyedListItem(YangInstanceIdentifier.NodeIdentifier name, int childSizeHint, Map<QName, String> attributes) throws IOException;
void startMapEntryNode(YangInstanceIdentifier.NodeIdentifierWithPredicates identifier, int childSizeHint, Map<QName, String> attributes) throws IOException;
* name of node as defined in schema, namespace and revision are
* derived from parent node.
* @param childSizeHint
+ * Non-negative count of expected direct child nodes or
+ * {@link #UNKNOWN_SIZE} if count is unknown. This is only hint
+ * and should not fail writing of child events, if there are more
+ * events than count.
* @throws IllegalArgumentException
+ * If emitted node is invalid in current context or was emitted
+ * multiple times.
* @throws IllegalStateException
* If node was emitted inside <code>map</code>,
* <code>choice</code> <code>unkeyed list</code> node.
*
* @param identifier
* QName to value pairs of keys of map entry node. Values MUST BE constant over time.
+ * @param childSizeHint
+ * Non-negative count of expected direct child nodes or
+ * {@link #UNKNOWN_SIZE} if count is unknown. This is only hint
+ * and should not fail writing of child events, if there are more
+ * events than count.
* @throws IllegalArgumentException
* If key contains incorrect value.
* @throws IllegalStateException
* @param name
* name of node as defined in schema, namespace and revision are
* derived from parent node.
+ * @param childSizeHint
+ * Non-negative count of expected direct child nodes or
+ * {@link #UNKNOWN_SIZE} if count is unknown. This is only hint
+ * and should not fail writing of child events, if there are more
+ * events than count.
* @throws IllegalArgumentException
+ * If emitted node is invalid in current context or was emitted
+ * multiple times.
* @throws IllegalStateException
* If node was emitted inside <code>map</code>,
* <code>choice</code> <code>unkeyed list</code> node.
* name of node as defined in schema, namespace and revision are
* derived from parent node.
* @param childSizeHint
+ * Non-negative count of expected direct child nodes or
+ * {@link #UNKNOWN_SIZE} if count is unknown. This is only hint
+ * and should not fail writing of child events, if there are more
+ * events than count.
* @throws IllegalArgumentException
+ * If emitted node is invalid in current context or was emitted
+ * multiple times.
* @throws IllegalStateException
* If node was emitted inside <code>map</code>,
* <code>choice</code> <code>unkeyed list</code> node.
* Emits anyxml node event.
*
* @param name
+ * name of node as defined in schema, namespace and revision are
+ * derived from parent node.
* @param value
+ * Value of AnyXml node.
* @throws IllegalArgumentException
+ * If emitted node is invalid in current context or was emitted
+ * multiple times.
* @throws IllegalStateException
* If node was emitted inside <code>map</code>,
* <code>choice</code> <code>unkeyed list</code> node.
*/
void anyxmlNode(NodeIdentifier name, Object value) throws IOException;
+ /**
+ *
+ * Emits start of new yang modeled anyXml node.
+ *
+ * <p>
+ * End of yang modeled anyXml node event is emitted by invoking {@link #endNode()}.
+ *
+ * <p>
+ * Valid sub-events are:
+ * <ul>
+ * <li>{@link #leafNode}</li>
+ * <li>{@link #startContainerNode}</li>
+ * <li>{@link #startLeafSet}</li>
+ * <li>{@link #startMapNode}</li>
+ * <li>{@link #startUnkeyedList}</li>
+ * </ul>
+ *
+ * @param name
+ * name of node as defined in schema, namespace and revision are
+ * derived from parent node.
+ * @param childSizeHint
+ * Non-negative count of expected direct child nodes or
+ * {@link #UNKNOWN_SIZE} if count is unknown. This is only hint
+ * and should not fail writing of child events, if there are more
+ * events than count.
+ * @throws IllegalArgumentException
+ * If emitted node is invalid in current context or was emitted
+ * multiple times.
+ * @throws IllegalStateException
+ * If node was emitted inside <code>map</code>,
+ * <code>choice</code> <code>unkeyed list</code> node.
+ * @throws IOException if an underlying IO error occurs
+ */
+ void startYangModeledAnyXmlNode(NodeIdentifier name, int childSizeHint) throws IOException;
+
/**
* Emits end event for node.
*
writer.value(String.valueOf(value));
}
+ @Override
+ public void startYangModeledAnyXmlNode(final NodeIdentifier name, final int childSizeHint) throws IOException {
+ tracker.startYangModeledAnyXmlNode(name);
+ context = new JSONStreamWriterNamedObjectContext(context, name, true);
+ }
+
@Override
public void endNode() throws IOException {
tracker.endNode();
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;
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;
}
*
* @param writer Output {@link XMLStreamWriter}
* @param context Associated {@link SchemaContext}.
+ * @param path path
*
* @return A new {@link NormalizedNodeStreamWriter}
*/
writeAttributes(attributes);
}
+ @Override
+ public void startYangModeledAnyXmlNode(final NodeIdentifier name, final int childSizeHint, final Map<QName, String> attributes) throws IOException {
+ startYangModeledAnyXmlNode(name, childSizeHint);
+ writeAttributes(attributes);
+ }
+
@Override
public void startUnkeyedListItem(final NodeIdentifier name, final int childSizeHint, final Map<QName, String> attributes) throws IOException {
startUnkeyedListItem(name, childSizeHint);
}
}
+ @Override
+ public void startYangModeledAnyXmlNode(final NodeIdentifier name, final int childSizeHint) throws IOException {
+ final SchemaNode schema = tracker.startYangModeledAnyXmlNode(name);
+ startElement(schema.getQName());
+ }
+
public static String toString(final Element xml) {
try {
final Transformer transformer = TransformerFactory.newInstance().newTransformer();
import org.opendaylight.yangtools.yang.data.api.schema.OrderedMapNode;
import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode;
+import org.opendaylight.yangtools.yang.data.api.schema.YangModeledAnyXmlNode;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.CollectionNodeBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeAttrBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableOrderedMapNodeSchemaAwareBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableUnkeyedListEntryNodeBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableUnkeyedListNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableYangModeledAnyXmlNodeBuilder;
import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode;
import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
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.YangModeledAnyXmlSchemaNode;
public final class Builders {
return ImmutableAnyXmlNodeSchemaAwareBuilder.create(schema);
}
+ public static <T> DataContainerNodeAttrBuilder<NodeIdentifier, YangModeledAnyXmlNode> yangModeledAnyXmlBuilder(
+ final YangModeledAnyXmlSchemaNode schema) {
+ return ImmutableYangModeledAnyXmlNodeBuilder.create(schema);
+ }
+
public static <T> ListNodeBuilder<T,LeafSetEntryNode<T>> leafSetBuilder() {
return ImmutableLeafSetNodeBuilder.create();
}
import org.opendaylight.yangtools.yang.data.api.schema.OrderedMapNode;
import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode;
+import org.opendaylight.yangtools.yang.data.api.schema.YangModeledAnyXmlNode;
import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
import org.opendaylight.yangtools.yang.data.api.schema.stream.SchemaAwareNormalizedNodeStreamWriter;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.CollectionNodeBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableOrderedMapNodeBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableUnkeyedListEntryNodeBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableUnkeyedListNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableYangModeledAnyXmlNodeBuilder;
import org.opendaylight.yangtools.yang.data.util.LeafInterner;
import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.YangModeledAnyXmlSchemaNode;
/**
*
enter(builder.withNodeIdentifier(name));
}
+ @Override
+ public void startYangModeledAnyXmlNode(final NodeIdentifier name, final int childSizeHint) {
+ checkDataNodeContainer();
+
+ Preconditions.checkArgument(nextSchema instanceof YangModeledAnyXmlSchemaNode,
+ "Schema of this node should be instance of YangModeledAnyXmlSchemaNode");
+ final DataContainerNodeAttrBuilder<NodeIdentifier, YangModeledAnyXmlNode> builder = UNKNOWN_SIZE == childSizeHint ? ImmutableYangModeledAnyXmlNodeBuilder
+ .create((YangModeledAnyXmlSchemaNode) nextSchema) : ImmutableYangModeledAnyXmlNodeBuilder.create(
+ (YangModeledAnyXmlSchemaNode) nextSchema, childSizeHint);
+ enter(builder.withNodeIdentifier(name));
+ }
+
@Override
public void startUnkeyedList(final NodeIdentifier name, final int childSizeHint) {
checkDataNodeContainer();
--- /dev/null
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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.schema.builder.impl;
+
+import com.google.common.base.Preconditions;
+import java.util.Map;
+import org.opendaylight.yangtools.yang.common.QName;
+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.DataContainerChild;
+import org.opendaylight.yangtools.yang.data.api.schema.YangModeledAnyXmlNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeAttrBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.nodes.AbstractImmutableDataContainerAttrNode;
+import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.YangModeledAnyXmlSchemaNode;
+
+public class ImmutableYangModeledAnyXmlNodeBuilder extends
+ AbstractImmutableDataContainerNodeAttrBuilder<NodeIdentifier, YangModeledAnyXmlNode> {
+
+ private final ContainerSchemaNode contentSchema;
+
+ private ImmutableYangModeledAnyXmlNodeBuilder(final YangModeledAnyXmlSchemaNode yangModeledAnyXMLSchemaNode) {
+ Preconditions.checkNotNull(yangModeledAnyXMLSchemaNode, "Yang modeled any xml node must not be null.");
+ super.withNodeIdentifier(NodeIdentifier.create(yangModeledAnyXMLSchemaNode.getQName()));
+ this.contentSchema = yangModeledAnyXMLSchemaNode.getSchemaOfAnyXmlData();
+ }
+
+ private ImmutableYangModeledAnyXmlNodeBuilder(final YangModeledAnyXmlSchemaNode yangModeledAnyXMLSchemaNode, final int sizeHint) {
+ super(sizeHint);
+ Preconditions.checkNotNull(yangModeledAnyXMLSchemaNode, "Yang modeled any xml node must not be null.");
+ super.withNodeIdentifier(NodeIdentifier.create(yangModeledAnyXMLSchemaNode.getQName()));
+ this.contentSchema = yangModeledAnyXMLSchemaNode.getSchemaOfAnyXmlData();
+ }
+
+ public static DataContainerNodeAttrBuilder<NodeIdentifier, YangModeledAnyXmlNode> create(
+ final YangModeledAnyXmlSchemaNode yangModeledAnyXMLSchemaNode) {
+ return new ImmutableYangModeledAnyXmlNodeBuilder(yangModeledAnyXMLSchemaNode);
+ }
+
+ public static DataContainerNodeAttrBuilder<NodeIdentifier, YangModeledAnyXmlNode> create(
+ final YangModeledAnyXmlSchemaNode yangModeledAnyXMLSchemaNode, final int sizeHint) {
+ return new ImmutableYangModeledAnyXmlNodeBuilder(yangModeledAnyXMLSchemaNode, sizeHint);
+ }
+
+ @Override
+ public YangModeledAnyXmlNode build() {
+ return new ImmutableYangModeledAnyXmlNode(getNodeIdentifier(), buildValue(), getAttributes(), contentSchema);
+ }
+
+ private static final class ImmutableYangModeledAnyXmlNode extends
+ AbstractImmutableDataContainerAttrNode<NodeIdentifier> implements YangModeledAnyXmlNode {
+
+ private final ContainerSchemaNode contentSchema;
+
+ ImmutableYangModeledAnyXmlNode(final NodeIdentifier nodeIdentifier,
+ final Map<PathArgument, DataContainerChild<? extends PathArgument, ?>> value,
+ final Map<QName, String> attributes, final ContainerSchemaNode contentSchema) {
+ super(value, nodeIdentifier, attributes);
+ this.contentSchema = Preconditions.checkNotNull(contentSchema, "Schema of yang modeled anyXml content cannot be null.");
+ }
+
+ @Override
+ public ContainerSchemaNode getSchemaOfAnyXmlData() {
+ return contentSchema;
+ }
+ }
+}
delegate().anyxmlNode(transform(name), value);
}
+ @Override
+ public void startYangModeledAnyXmlNode(final NodeIdentifier name, final int childSizeHint) throws IOException, IllegalArgumentException {
+ delegate().startYangModeledAnyXmlNode(transform(name), childSizeHint);
+ }
+
@Override
public void endNode() throws IOException, IllegalStateException {
delegate().endNode();
--- /dev/null
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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.model.api;
+
+import com.google.common.annotations.Beta;
+import javax.annotation.Nonnull;
+
+/**
+ * The "YangModeledAnyXml" interface defines an interior node in the schema tree. It takes
+ * one argument, which is an identifier represented by QName inherited from
+ * {@link SchemaNode}, followed by a block of substatements that holds detailed
+ * anyxml information. The substatements are defined in {@link DataSchemaNode}.
+ * The "YangModeledAnyXml" in contrast to the "AnyXml" interface can also provide schema
+ * of contained XML information. <br>
+ * <br>
+ * This interface was modeled according to definition in <a
+ * href="https://tools.ietf.org/html/rfc6020#section-7.10">[RFC-6020] The anyxml
+ * Statement</a>
+ *
+ *
+ */
+@Beta
+public interface YangModeledAnyXmlSchemaNode extends AnyXmlSchemaNode {
+
+ /**
+ * @return DataSchemaNode - schema of contained XML data
+ */
+ @Nonnull
+ ContainerSchemaNode getSchemaOfAnyXmlData();
+}