From 12b2b83c5529c61ab1e5cf260f4ec6c01d809cef Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 30 May 2019 00:20:06 +0200 Subject: [PATCH] Refactor anydata-related interfaces As it turns out we need to expose more of our capabilities into the API interface, as otherwise we cannot link the functionality in javadoc. This refactors interfaces/implementations, allowing redirection. JIRA: YANGTOOLS-993 Change-Id: I142c9d50247d32d3ce24cb03e739618246a35a95 Signed-off-by: Robert Varga --- .../data/api/MetadataNormalizedAnydata.java | 22 +++++++++ ...> ImmutableMetadataNormalizedAnydata.java} | 11 +++-- .../data/util/NormalizedMetadataWriter.java | 8 ++- .../yang/data/api/schema/AnydataNode.java | 11 ++++- .../AnydataNormalizationException.java | 2 +- .../data/api/schema}/NormalizableAnydata.java | 6 ++- .../data/api/schema/NormalizedAnydata.java | 49 +++++++++++++++++++ .../gson/JSONNormalizedNodeStreamWriter.java | 2 +- .../yang/data/codec/xml/DOMSourceAnydata.java | 14 ++++-- .../data/codec/xml/StreamWriterFacade.java | 13 ++--- .../XMLStreamNormalizedNodeStreamWriter.java | 31 +++++------- .../schema/AbstractNormalizableAnydata.java | 14 +++--- ...a.java => ImmutableNormalizedAnydata.java} | 27 ++-------- 13 files changed, 143 insertions(+), 67 deletions(-) create mode 100644 yang/rfc7952-data-api/src/main/java/org/opendaylight/yangtools/rfc7952/data/api/MetadataNormalizedAnydata.java rename yang/rfc7952-data-util/src/main/java/org/opendaylight/yangtools/rfc7952/data/util/{MetadataNormalizedAnydata.java => ImmutableMetadataNormalizedAnydata.java} (75%) rename yang/{yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util => yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema}/AnydataNormalizationException.java (93%) rename yang/{yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util => yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema}/NormalizableAnydata.java (83%) create mode 100644 yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/NormalizedAnydata.java rename yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/{NormalizedAnydata.java => ImmutableNormalizedAnydata.java} (64%) diff --git a/yang/rfc7952-data-api/src/main/java/org/opendaylight/yangtools/rfc7952/data/api/MetadataNormalizedAnydata.java b/yang/rfc7952-data-api/src/main/java/org/opendaylight/yangtools/rfc7952/data/api/MetadataNormalizedAnydata.java new file mode 100644 index 0000000000..8d476d93c3 --- /dev/null +++ b/yang/rfc7952-data-api/src/main/java/org/opendaylight/yangtools/rfc7952/data/api/MetadataNormalizedAnydata.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2019 PANTHEON.tech, s.r.o. 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.rfc7952.data.api; + +import com.google.common.annotations.Beta; +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedAnydata; + +/** + * A piece of {@link NormalizedAnydata} with a corresponding piece of {@link NormalizedMetadata}. + */ +@Beta +@NonNullByDefault +public interface MetadataNormalizedAnydata extends NormalizedAnydata { + + NormalizedMetadata getMetadata(); +} diff --git a/yang/rfc7952-data-util/src/main/java/org/opendaylight/yangtools/rfc7952/data/util/MetadataNormalizedAnydata.java b/yang/rfc7952-data-util/src/main/java/org/opendaylight/yangtools/rfc7952/data/util/ImmutableMetadataNormalizedAnydata.java similarity index 75% rename from yang/rfc7952-data-util/src/main/java/org/opendaylight/yangtools/rfc7952/data/util/MetadataNormalizedAnydata.java rename to yang/rfc7952-data-util/src/main/java/org/opendaylight/yangtools/rfc7952/data/util/ImmutableMetadataNormalizedAnydata.java index b544d3bd31..00d5a73fbc 100644 --- a/yang/rfc7952-data-util/src/main/java/org/opendaylight/yangtools/rfc7952/data/util/MetadataNormalizedAnydata.java +++ b/yang/rfc7952-data-util/src/main/java/org/opendaylight/yangtools/rfc7952/data/util/ImmutableMetadataNormalizedAnydata.java @@ -12,30 +12,33 @@ import static java.util.Objects.requireNonNull; import com.google.common.annotations.Beta; import java.io.IOException; import org.eclipse.jdt.annotation.NonNullByDefault; +import org.opendaylight.yangtools.rfc7952.data.api.MetadataNormalizedAnydata; import org.opendaylight.yangtools.rfc7952.data.api.NormalizedMetadata; 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.util.NormalizedAnydata; +import org.opendaylight.yangtools.yang.data.util.ImmutableNormalizedAnydata; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; import org.opendaylight.yangtools.yang.model.api.SchemaContext; @Beta @NonNullByDefault -public final class MetadataNormalizedAnydata extends NormalizedAnydata { +public final class ImmutableMetadataNormalizedAnydata extends ImmutableNormalizedAnydata + implements MetadataNormalizedAnydata { private final NormalizedMetadata metadata; - public MetadataNormalizedAnydata(final SchemaContext schemaContext, final DataSchemaNode contextNode, + public ImmutableMetadataNormalizedAnydata(final SchemaContext schemaContext, final DataSchemaNode contextNode, final NormalizedNode data, final NormalizedMetadata metadata) { super(schemaContext, contextNode, data); this.metadata = requireNonNull(metadata); } + @Override public NormalizedMetadata getMetadata() { return metadata; } @Override public void writeTo(final NormalizedNodeStreamWriter writer, final boolean orderKeyLeaves) throws IOException { - NormalizedMetadataWriter.forStreamWriter(writer, orderKeyLeaves).write(getData(), metadata).flush(); + NormalizedMetadataWriter.forStreamWriter(writer, orderKeyLeaves).write(getData(), getMetadata()).flush(); } } diff --git a/yang/rfc7952-data-util/src/main/java/org/opendaylight/yangtools/rfc7952/data/util/NormalizedMetadataWriter.java b/yang/rfc7952-data-util/src/main/java/org/opendaylight/yangtools/rfc7952/data/util/NormalizedMetadataWriter.java index 43af90faaf..7adebcdda7 100644 --- a/yang/rfc7952-data-util/src/main/java/org/opendaylight/yangtools/rfc7952/data/util/NormalizedMetadataWriter.java +++ b/yang/rfc7952-data-util/src/main/java/org/opendaylight/yangtools/rfc7952/data/util/NormalizedMetadataWriter.java @@ -49,6 +49,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWrit * @author Robert Varga */ @Beta +// FIXME: 5.0.0: consider moving this class to api to keep related stuff together public final class NormalizedMetadataWriter implements Closeable, Flushable { private final NormalizedNodeStreamWriter writer; private final boolean orderKeyLeaves; @@ -117,8 +118,11 @@ public final class NormalizedMetadataWriter implements Closeable, Flushable { @Override public void close() throws IOException { - writer.flush(); - writer.close(); + try { + writer.flush(); + } finally { + writer.close(); + } } @Override diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/AnydataNode.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/AnydataNode.java index 01fb9c4420..080c2364ee 100644 --- a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/AnydataNode.java +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/AnydataNode.java @@ -11,7 +11,16 @@ import com.google.common.annotations.Beta; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; /** - * A NormalizedNode holding the contents of an {@code anydata} node in some object model. + * A NormalizedNode holding the contents of an {@code anydata} node in some object model. While no guarantees are placed + * on object models, there are related interfaces available for data interchange: + * + * * * @param Value type, uniquely identifying the object model used for values */ diff --git a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/AnydataNormalizationException.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/AnydataNormalizationException.java similarity index 93% rename from yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/AnydataNormalizationException.java rename to yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/AnydataNormalizationException.java index 05dced4c10..60c19a516d 100644 --- a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/AnydataNormalizationException.java +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/AnydataNormalizationException.java @@ -5,7 +5,7 @@ * 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.util; +package org.opendaylight.yangtools.yang.data.api.schema; import static java.util.Objects.requireNonNull; diff --git a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/NormalizableAnydata.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/NormalizableAnydata.java similarity index 83% rename from yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/NormalizableAnydata.java rename to yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/NormalizableAnydata.java index 2e782b79a5..6afe18af63 100644 --- a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/NormalizableAnydata.java +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/NormalizableAnydata.java @@ -5,13 +5,17 @@ * 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.util; +package org.opendaylight.yangtools.yang.data.api.schema; import com.google.common.annotations.Beta; import org.eclipse.jdt.annotation.NonNullByDefault; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; import org.opendaylight.yangtools.yang.model.api.SchemaContext; +/** + * An {@link AnydataNode#getValueObjectModel() anydata value object model} which can be normalized to + * {@link NormalizedAnydata} when provided with proper context. + */ @Beta @NonNullByDefault public interface NormalizableAnydata { diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/NormalizedAnydata.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/NormalizedAnydata.java new file mode 100644 index 0000000000..c25147000f --- /dev/null +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/NormalizedAnydata.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2019 PANTHEON.tech, s.r.o. 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.io.IOException; +import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.opendaylight.yangtools.concepts.Immutable; +import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter; +import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter; +import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; +import org.opendaylight.yangtools.yang.model.api.SchemaContext; +import org.opendaylight.yangtools.yang.model.api.SchemaContextProvider; + +/** + * The contents of an {@code anydata} node in a normalized format. This representation acts as a schema-bound bridge + * between the various (mostly parser-based) representations. Implementations of this interface are usually created + * from an instance of {@link NormalizableAnydata}. + * + *

+ * Note this interface does not have an equality contract and implementations are expected to default to identity + * equality (or in Valhalla-speak: be plain data). + */ +@Beta +@NonNullByDefault +public interface NormalizedAnydata extends Immutable, SchemaContextProvider { + + @Override + // FIXME: remove this override when SchemaContextProvider's method has sane semantics. + @NonNull SchemaContext getSchemaContext(); + + DataSchemaNode getContextNode(); + + NormalizedNode getData(); + + default void writeTo(final NormalizedNodeStreamWriter writer) throws IOException { + writeTo(writer, true); + } + + default void writeTo(final NormalizedNodeStreamWriter writer, final boolean orderKeyLeaves) throws IOException { + NormalizedNodeWriter.forStreamWriter(writer, orderKeyLeaves).write(getData()).flush(); + } +} diff --git a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONNormalizedNodeStreamWriter.java b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONNormalizedNodeStreamWriter.java index 940d8f4904..354f108d74 100644 --- a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONNormalizedNodeStreamWriter.java +++ b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONNormalizedNodeStreamWriter.java @@ -24,11 +24,11 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.Augmentat 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.YangInstanceIdentifier.NodeWithValue; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedAnydata; import org.opendaylight.yangtools.yang.data.api.schema.stream.AnydataExtension; 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.NormalizedAnydata; import org.opendaylight.yangtools.yang.data.util.SingleChildDataNodeContainer; import org.opendaylight.yangtools.yang.model.api.AnyDataSchemaNode; import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode; diff --git a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/DOMSourceAnydata.java b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/DOMSourceAnydata.java index 685f948d4d..04cb67e047 100644 --- a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/DOMSourceAnydata.java +++ b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/DOMSourceAnydata.java @@ -13,6 +13,7 @@ import com.google.common.base.MoreObjects.ToStringHelper; import java.io.IOException; import java.net.URISyntaxException; import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; import javax.xml.transform.dom.DOMSource; import org.eclipse.jdt.annotation.NonNullByDefault; import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter; @@ -21,6 +22,13 @@ import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.xml.sax.SAXException; +/** + * Internal parser representation of a parsed-out chunk of XML. This format is completely internal to the parser + * and can be changed at any time. Current implementation uses W3C DOM tree as the backing implementations, but others + * are possible as well. + * + * @author Robert Varga + */ @NonNullByDefault final class DOMSourceAnydata extends AbstractNormalizableAnydata { private final DOMSource source; @@ -29,8 +37,8 @@ final class DOMSourceAnydata extends AbstractNormalizableAnydata { this.source = requireNonNull(source); } - DOMSource getSource() { - return source; + XMLStreamReader toStreamReader() throws XMLStreamException { + return new DOMSourceXMLStreamReader(source); } @Override @@ -44,7 +52,7 @@ final class DOMSourceAnydata extends AbstractNormalizableAnydata { } try { - xmlParser.traverse(source).close(); + xmlParser.parse(toStreamReader()).close(); } catch (XMLStreamException | URISyntaxException | SAXException e) { throw new IOException("Failed to parse payload", e); } diff --git a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/StreamWriterFacade.java b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/StreamWriterFacade.java index 30cec9ca08..91e177e7da 100644 --- a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/StreamWriterFacade.java +++ b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/StreamWriterFacade.java @@ -19,9 +19,10 @@ import javax.xml.XMLConstants; import javax.xml.namespace.NamespaceContext; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; import javax.xml.stream.XMLStreamWriter; import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.data.util.NormalizedAnydata; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedAnydata; import org.opendaylight.yangtools.yang.data.util.SingleChildDataNodeContainer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -214,7 +215,7 @@ final class StreamWriterFacade extends ValueWriter { writer.flush(); } - void anydataWriteStreamReader(final DOMSourceXMLStreamReader reader) throws XMLStreamException { + void anydataWriteStreamReader(final XMLStreamReader reader) throws XMLStreamException { flushElement(); while (reader.hasNext()) { @@ -338,7 +339,7 @@ final class StreamWriterFacade extends ValueWriter { } } - private void forwardAttributes(final DOMSourceXMLStreamReader reader) throws XMLStreamException { + private void forwardAttributes(final XMLStreamReader reader) throws XMLStreamException { for (int i = 0, count = reader.getAttributeCount(); i < count; ++i) { final String localName = reader.getAttributeLocalName(i); final String value = reader.getAttributeValue(i); @@ -351,13 +352,13 @@ final class StreamWriterFacade extends ValueWriter { } } - private void forwardNamespaces(final DOMSourceXMLStreamReader reader) throws XMLStreamException { + private void forwardNamespaces(final XMLStreamReader reader) throws XMLStreamException { for (int i = 0; i < reader.getNamespaceCount(); ++i) { writer.writeNamespace(reader.getNamespacePrefix(i), reader.getNamespaceURI(i)); } } - private void forwardProcessingInstruction(final DOMSourceXMLStreamReader reader) throws XMLStreamException { + private void forwardProcessingInstruction(final XMLStreamReader reader) throws XMLStreamException { final String target = reader.getPITarget(); final String data = reader.getPIData(); if (data != null) { @@ -367,7 +368,7 @@ final class StreamWriterFacade extends ValueWriter { } } - private void forwardStartElement(final DOMSourceXMLStreamReader reader) throws XMLStreamException { + private void forwardStartElement(final XMLStreamReader reader) throws XMLStreamException { final String localName = reader.getLocalName(); final String prefix = reader.getPrefix(); if (prefix != null) { diff --git a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XMLStreamNormalizedNodeStreamWriter.java b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XMLStreamNormalizedNodeStreamWriter.java index cfa7e03295..e9cdabd634 100644 --- a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XMLStreamNormalizedNodeStreamWriter.java +++ b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XMLStreamNormalizedNodeStreamWriter.java @@ -25,11 +25,11 @@ import org.opendaylight.yangtools.yang.common.QName; 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.YangInstanceIdentifier.PathArgument; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedAnydata; import org.opendaylight.yangtools.yang.data.api.schema.stream.AnydataExtension; 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.NormalizedAnydata; import org.opendaylight.yangtools.yang.model.api.DataNodeContainer; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.model.api.SchemaPath; @@ -159,31 +159,22 @@ public abstract class XMLStreamNormalizedNodeStreamWriter implements Normaliz final void anydataValue(final Object value) throws IOException { if (value instanceof DOMSourceAnydata) { - anydataValue(((DOMSourceAnydata) value).getSource()); + try { + facade.anydataWriteStreamReader(((DOMSourceAnydata) value).toStreamReader()); + } catch (XMLStreamException e) { + throw new IOException("Unable to transform anydata value: " + value, e); + } } else if (value instanceof NormalizedAnydata) { - anydataValue((NormalizedAnydata) value); + try { + facade.emitNormalizedAnydata((NormalizedAnydata) value); + } catch (XMLStreamException e) { + throw new IOException("Unable to emit anydata value: " + value, e); + } } else { throw new IllegalStateException("Unexpected anydata value " + value); } } - private void anydataValue(final DOMSource domSource) throws IOException { - final Node domNode = requireNonNull(domSource.getNode()); - try { - facade.anydataWriteStreamReader(new DOMSourceXMLStreamReader(domSource)); - } catch (XMLStreamException e) { - throw new IOException("Unable to transform anyXml value: " + domNode, e); - } - } - - private void anydataValue(final NormalizedAnydata anydata) throws IOException { - try { - facade.emitNormalizedAnydata(anydata); - } catch (XMLStreamException e) { - throw new IOException("Unable to emit anydata value: " + anydata, e); - } - } - final void anyxmlValue(final DOMSource domSource) throws IOException { if (domSource != null) { final Node domNode = requireNonNull(domSource.getNode()); diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/AbstractNormalizableAnydata.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/AbstractNormalizableAnydata.java index 592890a041..504a2ef327 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/AbstractNormalizableAnydata.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/AbstractNormalizableAnydata.java @@ -14,12 +14,13 @@ import java.io.IOException; import java.util.Optional; import org.eclipse.jdt.annotation.NonNullByDefault; import org.opendaylight.yangtools.rfc7952.data.api.NormalizedMetadata; -import org.opendaylight.yangtools.rfc7952.data.util.MetadataNormalizedAnydata; +import org.opendaylight.yangtools.rfc7952.data.util.ImmutableMetadataNormalizedAnydata; +import org.opendaylight.yangtools.yang.data.api.schema.AnydataNormalizationException; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizableAnydata; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedAnydata; 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.util.AnydataNormalizationException; -import org.opendaylight.yangtools.yang.data.util.NormalizableAnydata; -import org.opendaylight.yangtools.yang.data.util.NormalizedAnydata; +import org.opendaylight.yangtools.yang.data.util.ImmutableNormalizedAnydata; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; import org.opendaylight.yangtools.yang.model.api.SchemaContext; @@ -43,8 +44,9 @@ public abstract class AbstractNormalizableAnydata implements NormalizableAnydata final NormalizedNode data = result.getResult(); final Optional optMeta = result.getMetadata(); - return optMeta.isPresent() ? new MetadataNormalizedAnydata(schemaContext, contextNode, data, optMeta.get()) - : new NormalizedAnydata(schemaContext, contextNode, result.getResult()); + return optMeta.isPresent() + ? new ImmutableMetadataNormalizedAnydata(schemaContext, contextNode, data, optMeta.get()) + : new ImmutableNormalizedAnydata(schemaContext, contextNode, result.getResult()); } @Override diff --git a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/NormalizedAnydata.java b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ImmutableNormalizedAnydata.java similarity index 64% rename from yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/NormalizedAnydata.java rename to yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ImmutableNormalizedAnydata.java index d831822291..6c21226f71 100644 --- a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/NormalizedAnydata.java +++ b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ImmutableNormalizedAnydata.java @@ -12,32 +12,21 @@ import static java.util.Objects.requireNonNull; import com.google.common.annotations.Beta; import com.google.common.base.MoreObjects; import com.google.common.base.MoreObjects.ToStringHelper; -import java.io.IOException; import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; -import org.opendaylight.yangtools.concepts.Immutable; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedAnydata; 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.api.schema.stream.NormalizedNodeWriter; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; import org.opendaylight.yangtools.yang.model.api.SchemaContext; -import org.opendaylight.yangtools.yang.model.api.SchemaContextProvider; -/** - * The contents of an {@code anydata} node in a normalized format. This representation acts as a schema-bound bridge - * between the various (mostly parser-based) representations. - * - *

- * Note this class (and all of its subclasses) rely on identity for their equality contract. - */ @Beta @NonNullByDefault -public class NormalizedAnydata implements Immutable, SchemaContextProvider { +public class ImmutableNormalizedAnydata implements NormalizedAnydata { private final SchemaContext schemaContext; private final DataSchemaNode contextNode; private final NormalizedNode data; - public NormalizedAnydata(final SchemaContext schemaContext, final DataSchemaNode contextNode, + public ImmutableNormalizedAnydata(final SchemaContext schemaContext, final DataSchemaNode contextNode, final NormalizedNode data) { this.schemaContext = requireNonNull(schemaContext); this.contextNode = requireNonNull(contextNode); @@ -49,22 +38,16 @@ public class NormalizedAnydata implements Immutable, SchemaContextProvider { return schemaContext; } + @Override public final DataSchemaNode getContextNode() { return contextNode; } + @Override public final NormalizedNode getData() { return data; } - public final void writeTo(final NormalizedNodeStreamWriter writer) throws IOException { - writeTo(writer, true); - } - - public void writeTo(final NormalizedNodeStreamWriter writer, final boolean orderKeyLeaves) throws IOException { - NormalizedNodeWriter.forStreamWriter(writer, orderKeyLeaves).write(data).flush(); - } - @Override public final int hashCode() { return super.hashCode(); -- 2.36.6