X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-data-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fdata%2Fimpl%2Fschema%2FImmutableNormalizedNodeStreamWriter.java;h=d8b9dc438e17282277b1941dff256d14ac82fb87;hb=refs%2Fchanges%2F13%2F93913%2F1;hp=21fda47433d6542f80d95bfe6dd0c3eb07b40ace;hpb=b655d5e1807cf5fca0f8a4c0ecc8da565bd923c7;p=yangtools.git diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/ImmutableNormalizedNodeStreamWriter.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/ImmutableNormalizedNodeStreamWriter.java index 21fda47433..d8b9dc438e 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/ImmutableNormalizedNodeStreamWriter.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/ImmutableNormalizedNodeStreamWriter.java @@ -7,244 +7,362 @@ */ package org.opendaylight.yangtools.yang.data.impl.schema; -import com.google.common.base.Preconditions; +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkState; +import static java.util.Objects.requireNonNull; + +import java.io.IOException; import java.util.ArrayDeque; import java.util.Deque; -import java.util.List; +import javax.xml.transform.dom.DOMSource; +import org.eclipse.jdt.annotation.NonNull; +import org.opendaylight.yangtools.odlext.model.api.YangModeledAnyxmlSchemaNode; 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.YangInstanceIdentifier.NodeWithValue; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; -import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode; 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.builder.api.DataContainerNodeBuilder; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.ListNodeBuilder; import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.NormalizedNodeBuilder; import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.NormalizedNodeContainerBuilder; +import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableAnyXmlNodeBuilder; +import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableAnydataNodeBuilder; import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableAugmentationNodeBuilder; +import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableChoiceNodeBuilder; +import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder; +import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafNodeBuilder; +import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafSetEntryNodeBuilder; import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafSetNodeBuilder; +import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableMapEntryNodeBuilder; import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableMapNodeBuilder; +import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableOrderedLeafSetNodeBuilder; +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.model.api.DataSchemaNode; /** + * Implementation of {@link NormalizedNodeStreamWriter}, which constructs immutable instances of + * {@link NormalizedNode}s. * - * Implementation of {@link NormalizedNodeStreamWriter}, which constructs - * immutable instances of {@link NormalizedNode}s. *
- * This writer supports two modes of behaviour one is using {@link #from(NormalizedNodeResult)} - * where resulting NormalizedNode will be stored in supplied result object. - * - * Other mode of operation is using {@link #from(NormalizedNodeContainerBuilder)}, - * where all created nodes will be written to this builder. + * This writer supports two modes of behaviour one is using {@link #from(NormalizedNodeResult)} where resulting + * NormalizedNode will be stored in supplied result object. * + *
+ * Other mode of operation is using {@link #from(NormalizedNodeContainerBuilder)}, where all created nodes will be + * written to this builder. * + *
+ * This class is not final for purposes of customization, normal users should not need to subclass it.
*/
public class ImmutableNormalizedNodeStreamWriter implements NormalizedNodeStreamWriter {
-
-
-
@SuppressWarnings("rawtypes")
- private final Deque
- * Type of supplied {@link NormalizedNodeContainerBuilder} affects,
- * which events could be emitted in order to ensure proper construction of
- * data.
+ * Type of supplied {@link NormalizedNodeContainerBuilder} affects, which events could be emitted in order
+ * to ensure proper construction of data.
*
* @param builder Builder to which data will be written.
* @return {@link NormalizedNodeStreamWriter} which writes data
*/
- public static final NormalizedNodeStreamWriter from(final NormalizedNodeContainerBuilder, ?, ?, ?> builder) {
+ public static @NonNull NormalizedNodeStreamWriter from(final NormalizedNodeContainerBuilder, ?, ?, ?> builder) {
return new ImmutableNormalizedNodeStreamWriter(builder);
}
/**
+ * Creates a {@link NormalizedNodeStreamWriter} which creates one instance of top-level {@link NormalizedNode}
+ * (type of NormalizedNode) is determined by first start event.
*
- * Creates a {@link NormalizedNodeStreamWriter} which creates one instance of top
- * level {@link NormalizedNode} (type of NormalizedNode) is determined by first
- * start event.
*
- * Result is built when {@link #endNode()} associated with that start event
- * is emitted.
+ * Result is built when {@link #endNode()} associated with that start event is emitted.
+ *
+ *
+ * Writer properly creates also nested {@link NormalizedNode} instances, if their are supported inside the scope
+ * of the first event.
+ *
+ *
+ * This method is useful for clients, which knows there will be one top-level node written, but does not know which
+ * type of {@link NormalizedNode} will be written.
+ *
+ * @param result {@link NormalizedNodeResult} object which will hold result value.
+ * @return {@link NormalizedNodeStreamWriter} which will write item to supplied result holder.
+ */
+ public static @NonNull NormalizedNodeStreamWriter from(final NormalizedNodeResult result) {
+ return result instanceof NormalizedNodeMetadataResult ? from((NormalizedNodeMetadataResult) result)
+ : new ImmutableNormalizedNodeStreamWriter(result);
+ }
+
+ /**
+ * Creates a {@link NormalizedNodeStreamWriter} which creates one instance of top-level {@link NormalizedNode}
+ * (type of NormalizedNode) is determined by first start event.
+ *
*
- * Writer properly creates also nested {@link NormalizedNode} instances,
- * if their are supported inside the scope of first event.
+ * Result is built when {@link #endNode()} associated with that start event is emitted.
+ *
*
- * This method is useful for clients, which knows there will be one
- * top level node written, but does not know which type of {@link NormalizedNode}
- * will be writen.
+ * Writer properly creates also nested {@link NormalizedNode} instances, if their are supported inside the scope
+ * of the first event.
*
+ *
+ * This method is useful for clients, which knows there will be one top-level node written, but does not know which
+ * type of {@link NormalizedNode} will be written.
*
* @param result {@link NormalizedNodeResult} object which will hold result value.
- * @return {@link NormalizedNodeStreamWriter} whcih will write item to supplied result holder.
+ * @return {@link NormalizedNodeStreamWriter} which will write item to supplied result holder.
*/
- public static final NormalizedNodeStreamWriter from(final NormalizedNodeResult result) {
- return new ImmutableNormalizedNodeStreamWriter(new NormalizedNodeResultBuilder(result));
+ public static @NonNull NormalizedNodeStreamWriter from(final NormalizedNodeMetadataResult result) {
+ return new ImmutableMetadataNormalizedNodeStreamWriter(result);
}
+ @Override
+ public void startLeafNode(final NodeIdentifier name) {
+ checkDataNodeContainer();
+ enter(name, leafNodeBuilder(nextSchema));
+ nextSchema = null;
+ }
- @SuppressWarnings("rawtypes")
- private NormalizedNodeContainerBuilder getCurrent() {
- return builders.peek();
+ @Override
+ public void startLeafSet(final NodeIdentifier name, final int childSizeHint) {
+ checkDataNodeContainer();
+ enter(name, UNKNOWN_SIZE == childSizeHint ? InterningLeafSetNodeBuilder.create(nextSchema)
+ : InterningLeafSetNodeBuilder.create(nextSchema, childSizeHint));
}
- @SuppressWarnings("rawtypes")
- private void enter(final NormalizedNodeContainerBuilder next) {
- builders.push(next);
+ @Override
+ public void startLeafSetEntryNode(final NodeWithValue> name) {
+ final NormalizedNodeBuilder, ?, ?> current = current();
+ checkArgument(current instanceof ImmutableLeafSetNodeBuilder
+ || current instanceof ImmutableOrderedLeafSetNodeBuilder || current instanceof NormalizedNodeResultBuilder,
+ "LeafSetEntryNode is not valid for parent %s", current);
+ enter(name, leafsetEntryNodeBuilder());
+ nextSchema = null;
}
- @SuppressWarnings("unchecked")
- private void writeChild(final NormalizedNode, ?> child) {
- getCurrent().addChild(child);
+ @Override
+ public void startOrderedLeafSet(final NodeIdentifier name, final int childSizeHint) {
+ checkDataNodeContainer();
+ enter(name, Builders.orderedLeafSetBuilder());
}
@Override
- @SuppressWarnings({"rawtypes","unchecked"})
- public void endNode() {
- final NormalizedNodeContainerBuilder finishedBuilder = builders.poll();
- Preconditions.checkState(finishedBuilder != null, "Node which should be closed does not exists.");
- NormalizedNodeContainerBuilder current = getCurrent();
- Preconditions.checkState(current != null, "Reached top level node, which could not be closed in this writer.");
- NormalizedNode