Anyxml can have a number of underlying object models, with the most
common being DOMSource. This changes the entrypoint to work the same
as anydata, allowing implementations to support different models.
Change-Id: I06ec1e5d46e7bc2287b239ea97811d58544c8c2b
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
- public void startAnyxmlNode(final NodeIdentifier name) throws IOException {
- super.startAnyxmlNode(name);
- enterMetadataNode(name);
+ public boolean startAnyxmlNode(final NodeIdentifier name, final Class<?> objectModel) throws IOException {
+ final boolean ret = super.startAnyxmlNode(name, objectModel);
+ if (ret) {
+ enterMetadataNode(name);
+ }
+ return ret;
- public void startAnyxmlNode(final NodeIdentifier name) throws IOException {
- delegate().startAnyxmlNode(name);
+ public boolean startAnyxmlNode(final NodeIdentifier name, final Class<?> objectModel) throws IOException {
+ return delegate().startAnyxmlNode(name, objectModel);
- public void startAnyxmlNode(final NodeIdentifier name) {
+ public boolean startAnyxmlNode(final NodeIdentifier name, final Class<?> objectModel) {
LOG.debug("{}{}(anyxml)", ind(), name);
incIndent();
LOG.debug("{}{}(anyxml)", ind(), name);
incIndent();
* <li>{@code leaf-list} - Leaf list start is emitted using {@link #startLeafSet(NodeIdentifier, int)}. Individual
* leaf-list entries are emitted using {@link #startLeafSetEntryNode(NodeWithValue)}.
*
* <li>{@code leaf-list} - Leaf list start is emitted using {@link #startLeafSet(NodeIdentifier, int)}. Individual
* leaf-list entries are emitted using {@link #startLeafSetEntryNode(NodeWithValue)}.
*
- * <li>{@code anyxml} - An anyxml node event is emitted using {@link #startAnyxmlNode(NodeIdentifier)}.</li>
+ * <li>{@code anyxml} - An anyxml node event is emitted using {@link #startAnyxmlNode(NodeIdentifier, Class)}.</li>
*
* <li>{@code choice} - Choice node event is emitted by {@link #startChoiceNode(NodeIdentifier, int)} event.</li>
*
*
* <li>{@code choice} - Choice node event is emitted by {@link #startChoiceNode(NodeIdentifier, int)} event.</li>
*
* Emits start of new container. Valid sub-events are:
* <ul>
* <li>{@link #startLeafNode}</li>
* Emits start of new container. Valid sub-events are:
* <ul>
* <li>{@link #startLeafNode}</li>
- * <li>{@link #startAnyxmlNode(NodeIdentifier)}</li>
+ * <li>{@link #startAnyxmlNode(NodeIdentifier, Class)}</li>
* <li>{@link #startContainerNode(NodeIdentifier, int)}</li>
* <li>{@link #startChoiceNode(NodeIdentifier, int)}</li>
* <li>{@link #startLeafSet(NodeIdentifier, int)}</li>
* <li>{@link #startContainerNode(NodeIdentifier, int)}</li>
* <li>{@link #startChoiceNode(NodeIdentifier, int)}</li>
* <li>{@link #startLeafSet(NodeIdentifier, int)}</li>
* @param objectModel The object model of anydata content
* @return True if the specified object model is supported by this extension and the process of emitting the node
* has started. False if the object model is not supported and the node has not started to be emitted.
* @param objectModel The object model of anydata content
* @return True if the specified object model is supported by this extension and the process of emitting the node
* has started. False if the object model is not supported and the node has not started to be emitted.
+ * @throws NullPointerException if any argument is null
* @throws IOException if an underlying IO error occurs
*/
@Beta
* @throws IOException if an underlying IO error occurs
*/
@Beta
* Emits a start of anyxml node event.
*
* @param name name of node as defined in schema, namespace and revision are derived from parent node.
* Emits a start of anyxml node event.
*
* @param name name of node as defined in schema, namespace and revision are derived from parent node.
- * @throws NullPointerException if {@code name} is null
+ * @param objectModel The object model of anyxml content
+ * @return True if the specified object model is supported by this extension and the process of emitting the node
+ * has started. False if the object model is not supported and the node has not started to be emitted.
+ * @throws NullPointerException if any argument is null
* @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 choice} or a {@code unkeyed list}
* node.
* @throws IOException if an underlying IO error occurs
*/
* @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 choice} or a {@code unkeyed list}
* node.
* @throws IOException if an underlying IO error occurs
*/
- // FIXME: 4.0.0: this should follow the startAnydataNode template
- void startAnyxmlNode(NodeIdentifier name) throws IOException;
+ boolean startAnyxmlNode(NodeIdentifier name, Class<?> objectModel) throws IOException;
/**
* Set the value of current anyxml node. This call is only valid within the context in which an anyxml node is open.
/**
* Set the value of current anyxml node. This call is only valid within the context in which an anyxml node is open.
} else if (node instanceof AnyxmlNode) {
final AnyxmlNode<?> anyxmlNode = (AnyxmlNode<?>)node;
final Class<?> model = anyxmlNode.getValueObjectModel();
} else if (node instanceof AnyxmlNode) {
final AnyxmlNode<?> anyxmlNode = (AnyxmlNode<?>)node;
final Class<?> model = anyxmlNode.getValueObjectModel();
- if (DOMSource.class.isAssignableFrom(model)) {
+ if (writer.startAnyxmlNode(anyxmlNode.getIdentifier(), model)) {
final Object value = node.getValue();
final Object value = node.getValue();
- verify(value instanceof DOMSource, "Inconsistent anyxml node %s", anyxmlNode);
- writer.startAnyxmlNode(anyxmlNode.getIdentifier());
- writer.domSourceValue((DOMSource) value);
+ if (DOMSource.class.isAssignableFrom(model)) {
+ verify(value instanceof DOMSource, "Inconsistent anyxml node %s", anyxmlNode);
+ writer.domSourceValue((DOMSource) value);
+ } else {
+ writer.scalarValue(value);
+ }
writer.endNode();
return true;
}
writer.endNode();
return true;
}
- public final void startAnyxmlNode(final NodeIdentifier name) throws IOException {
- tracker.startAnyxmlNode(name);
- context.emittingChild(codecs.getSchemaContext(), writer);
- context.writeChildJsonIdentifier(codecs.getSchemaContext(), writer, name.getNodeType());
+ public final boolean startAnyxmlNode(final NodeIdentifier name, final Class<?> objectModel) throws IOException {
+ if (DOMSource.class.isAssignableFrom(objectModel)) {
+ tracker.startAnyxmlNode(name);
+ context.emittingChild(codecs.getSchemaContext(), writer);
+ context.writeChildJsonIdentifier(codecs.getSchemaContext(), writer, name.getNodeType());
+ return true;
+ }
+ return false;
- public void startAnyxmlNode(final NodeIdentifier name) throws IOException {
- tracker.startAnyxmlNode(name);
- startElement(name.getNodeType());
+ public boolean startAnyxmlNode(final NodeIdentifier name, final Class<?> objectModel) throws IOException {
+ if (DOMSource.class.isAssignableFrom(objectModel)) {
+ tracker.startAnyxmlNode(name);
+ startElement(name.getNodeType());
+ return true;
+ }
+ return false;
- public void startAnyxmlNode(final NodeIdentifier name) throws IOException {
- nodeTypeStack.push(NodeType.ANY_XML);
- startElement(name.getNodeType());
+ public boolean startAnyxmlNode(final NodeIdentifier name, final Class<?> objectModel) throws IOException {
+ if (DOMSource.class.isAssignableFrom(objectModel)) {
+ nodeTypeStack.push(NodeType.ANY_XML);
+ startElement(name.getNodeType());
+ return true;
+ }
+ return false;
- public void startAnyxmlNode(final NodeIdentifier name) {
+ public boolean startAnyxmlNode(final NodeIdentifier name, final Class<?> objectModel) {
checkDataNodeContainer();
checkDataNodeContainer();
- enter(name, ImmutableAnyXmlNodeBuilder.create());
- nextSchema = null;
+ if (DOMSource.class.isAssignableFrom(objectModel)) {
+ enter(name, ImmutableAnyXmlNodeBuilder.create());
+ nextSchema = null;
+ return true;
+ }
+ return false;
- public void startAnyxmlNode(final NodeIdentifier name) throws IOException {
- super.startAnyxmlNode(transform(name));
+ public boolean startAnyxmlNode(final NodeIdentifier name, final Class<?> objectModel) throws IOException {
+ return super.startAnyxmlNode(transform(name), objectModel);
public void write(final NormalizedNodeStreamWriter writer, final StreamWriterMetadataExtension metaWriter)
throws IOException {
writer.nextDataSchemaNode(getSchema());
public void write(final NormalizedNodeStreamWriter writer, final StreamWriterMetadataExtension metaWriter)
throws IOException {
writer.nextDataSchemaNode(getSchema());
- writer.startAnyxmlNode(provideNodeIdentifier());
- writeMetadata(metaWriter);
- writer.domSourceValue((DOMSource) getValue());
- writer.endNode();
+ if (writer.startAnyxmlNode(provideNodeIdentifier(), DOMSource.class)) {
+ writeMetadata(metaWriter);
+ writer.domSourceValue((DOMSource) getValue());
+ writer.endNode();
+ }