Populate data/ hierarchy
[yangtools.git] / yang / yang-data-api / src / main / java / org / opendaylight / yangtools / yang / data / api / schema / stream / NormalizedNodeStreamWriter.java
diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/NormalizedNodeStreamWriter.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/NormalizedNodeStreamWriter.java
deleted file mode 100644 (file)
index 9a800ec..0000000
+++ /dev/null
@@ -1,382 +0,0 @@
-/*
- * Copyright (c) 2014 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.stream;
-
-import static java.util.Objects.requireNonNull;
-
-import com.google.common.annotations.Beta;
-import java.io.Closeable;
-import java.io.Flushable;
-import java.io.IOException;
-import javax.xml.transform.dom.DOMSource;
-import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.yangtools.concepts.ExtensibleObject;
-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.model.api.DataSchemaNode;
-
-/**
- * Event Stream Writer based on Normalized Node tree representation.
- *
- * <h2>Writing Event Stream</h2>
- * Each entity is emitted by invoking its corresponding {@code start*} event, optionally followed by interior events and
- * invoking {@link #endNode()}. Some entities supported nested entities, some do not, see below for restrictions.
- *
- * <p>
- * While this interface defines basic events, the event stream may be extended through
- * {@link NormalizedNodeStreamWriterExtension}s discoverable through {@link #getExtensions()} method. The set of these
- * extensions is immutable during the lifetime of a writer and may be freely cached.
- *
- * <ul>
- * <li>{@code container} - Container node representation, start event is emitted using
- * {@link #startContainerNode(NodeIdentifier, int)}.
- * </li>
- *
- * <li>{@code list} - YANG list statement has two representation in event stream - unkeyed list and map. An unkeyed
- * list is YANG list which did not specify a {@code key} statement. A map is a {@code list} with a {@code key}
- * statement.
- * <ul>
- * <li>{@code Map} - Map start event is emitted using {@link #startMapNode(NodeIdentifier, int)}. Each map entry start
- * is emitted using {@link #startMapEntryNode(NodeIdentifierWithPredicates, int)}.
- * </li>
- * <li>{@code UnkeyedList} - Unkeyed list represent list without keys, unkeyed list start is emitted using
- * {@link #startUnkeyedList(NodeIdentifier, int)}. Each list item is emitted using
- * {@link #startUnkeyedListItem(NodeIdentifier, int)}.</li>
- * </ul>
- * </li>
- *
- * <li>{@code leaf} - Leaf node start event is emitted using {@link #startLeafNode(NodeIdentifier)}. Leaf node values
- * need to be emitted through {@link #scalarValue(Object)}.
- * </li>
- *
- * <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, Class)}.</li>
- *
- * <li>{@code choice} - Choice node event is emitted by {@link #startChoiceNode(NodeIdentifier, int)} event.</li>
- *
- * <li>{@code augment} - Represents augmentation, augmentation node is started by invoking
- * {@link #startAugmentationNode(AugmentationIdentifier)}.
- * </li>
- * </ul>
- *
- * <h3>Implementation notes</h3>
- *
- * <p>
- * Implementations of this interface must not hold user suppled objects and resources needlessly.
- */
-public interface NormalizedNodeStreamWriter extends Closeable, Flushable,
-        ExtensibleObject<NormalizedNodeStreamWriter, NormalizedNodeStreamWriterExtension> {
-    /**
-     * Methods in this interface allow users to hint the underlying implementation about the sizing of container-like
-     * constructors (leafLists, containers, etc.). These hints may be taken into account by a particular implementation
-     * to improve performance, but clients are not required to provide hints. This constant should be used by clients
-     * who either do not have the sizing information, or do not wish to divulge it (for whatever reasons).
-     *
-     * <p>
-     * Implementations are free to ignore these hints completely, but if they do use them, they are expected to be
-     * resilient in face of missing and mismatched hints, which is to say the user can specify startLeafSet(..., 1) and
-     * then call leafNode() 15 times.
-     *
-     * <p>
-     * The acceptable hint values are non-negative integers and this constant, all other values will result, based on
-     * implementation preference, in the hint being completely ignored or IllegalArgumentException being thrown.
-     */
-    int UNKNOWN_SIZE = -1;
-
-    /**
-     * Emits a start of leaf 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
-     * @throws IllegalArgumentException If emitted leaf node 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
-     */
-    void startLeafNode(NodeIdentifier name) throws IOException;
-
-    /**
-     * Emits a start of system-ordered leaf set (leaf-list). While this entity is open,
-     * only {@link #startLeafSetEntryNode(NodeWithValue)} calls are valid. Implementations are free to reorder entries
-     * within the leaf-list.
-     *
-     * @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 NullPointerException if {@code name} is null
-     * @throws IllegalArgumentException If emitted leaf 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
-     */
-    void startLeafSet(NodeIdentifier name, int childSizeHint) throws IOException;
-
-    /**
-     * Emits a start of a user-ordered leaf set (leaf-list). While this entity is open, only
-     * {@link #startLeafSetEntryNode(NodeWithValue)} calls are valid. Implementations must retain the same entry order.
-     *
-     * @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 NullPointerException if {@code name} is null
-     * @throws IllegalArgumentException If emitted leaf 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
-     */
-    void startOrderedLeafSet(NodeIdentifier name, int childSizeHint) throws IOException;
-
-    /**
-     * Emits a leaf set entry node.
-     *
-     * @param name name of the node as defined in the schema.
-     * @throws NullPointerException if {@code name} is null
-     * @throws IllegalArgumentException if {@code name} does not match enclosing leaf set entity
-     * @throws IllegalStateException If node was emitted outside {@code leaf set} node.
-     * @throws IOException if an underlying IO error occurs
-     */
-    void startLeafSetEntryNode(NodeWithValue<?> name) throws IOException;
-
-    /**
-     * Emits start of new container. Valid sub-events are:
-     * <ul>
-     * <li>{@link #startLeafNode}</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 #startMapNode(NodeIdentifier, int)}</li>
-     * <li>{@link #startUnkeyedList(NodeIdentifier, int)}</li>
-     * <li>{@link #startAugmentationNode(AugmentationIdentifier)}</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 NullPointerException if {@code name} 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
-     */
-    void startContainerNode(NodeIdentifier name, int childSizeHint) throws IOException;
-
-    /**
-     * Emits start of unkeyed list node event. Valid subevents is only
-     * {@link #startUnkeyedListItem(NodeIdentifier, int)}.
-     *
-     * @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 NullPointerException if {@code name} 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
-     */
-    void startUnkeyedList(NodeIdentifier name, int childSizeHint) throws IOException;
-
-    /**
-     * Emits start of new unkeyed list item. Valid sub-events are:
-     * <ul>
-     * <li>{@link #startLeafNode}</li>
-     * <li>{@link #startContainerNode(NodeIdentifier, int)}</li>
-     * <li>{@link #startChoiceNode(NodeIdentifier, int)}</li>
-     * <li>{@link #startLeafSet(NodeIdentifier, int)}</li>
-     * <li>{@link #startMapNode(NodeIdentifier, int)}</li>
-     * <li>{@link #startUnkeyedList(NodeIdentifier, int)}</li>
-     * <li>{@link #startAugmentationNode(AugmentationIdentifier)}</li>
-     * </ul>
-     *
-     * @param name Identifier of 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 NullPointerException if {@code name} is null
-     * @throws IllegalStateException If node was emitted outside <code>unkeyed list</code> node.
-     * @throws IOException if an underlying IO error occurs
-     */
-    void startUnkeyedListItem(NodeIdentifier name, int childSizeHint) throws IOException;
-
-    /**
-     * Emits start of map node event. Valid subevent is only
-     * {@link #startMapEntryNode(NodeIdentifierWithPredicates, int)}.
-     *
-     * @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 NullPointerException if {@code name} 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
-     */
-    void startMapNode(NodeIdentifier name, int childSizeHint) throws IOException;
-
-    /**
-     * Emits start of map entry. Valid sub-events are:
-     * <ul>
-     * <li>{@link #startLeafNode}</li>
-     * <li>{@link #startContainerNode(NodeIdentifier, int)}</li>
-     * <li>{@link #startChoiceNode(NodeIdentifier, int)}</li>
-     * <li>{@link #startLeafSet(NodeIdentifier, int)}</li>
-     * <li>{@link #startMapNode(NodeIdentifier, int)}</li>
-     * <li>{@link #startUnkeyedList(NodeIdentifier, int)}</li>
-     * <li>{@link #startAugmentationNode(AugmentationIdentifier)}</li>
-     * </ul>
-     *
-     * @param identifier QName to value pairs of keys of map entry 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 NullPointerException if {@code name} is null
-     * @throws IllegalArgumentException If key contains incorrect value.
-     * @throws IllegalStateException If node was emitted outside {@code map entry} node.
-     * @throws IOException if an underlying IO error occurs
-     */
-    void startMapEntryNode(NodeIdentifierWithPredicates identifier, int childSizeHint) throws IOException;
-
-    /**
-     * Emits start of map node event.  Valid subevent is only
-     * {@link #startMapEntryNode(NodeIdentifierWithPredicates, int)}.
-     *
-     * @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 NullPointerException if {@code name} 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
-     */
-    void startOrderedMapNode(NodeIdentifier name, int childSizeHint) throws IOException;
-
-    /**
-     * Emits start of a choice node event.
-     *
-     * @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 NullPointerException if {@code name} 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
-     */
-    void startChoiceNode(NodeIdentifier name, int childSizeHint) throws IOException;
-
-    /**
-     * Emits start of augmentation node. Valid sub-events are:
-     * <ul>
-     * <li>{@link #startLeafNode}</li>
-     * <li>{@link #startContainerNode(NodeIdentifier, int)}</li>
-     * <li>{@link #startChoiceNode(NodeIdentifier, int)}</li>
-     * <li>{@link #startLeafSet(NodeIdentifier, int)}</li>
-     * <li>{@link #startMapNode(NodeIdentifier, int)}</li>
-     * <li>{@link #startUnkeyedList(NodeIdentifier, int)}</li>
-     * </ul>
-     *
-     * @param identifier Augmentation identifier
-     * @throws NullPointerException if {@code identifier} is null
-     * @throws IllegalArgumentException If augmentation is invalid in current context.
-     * @throws IOException if an underlying IO error occurs
-     */
-    void startAugmentationNode(AugmentationIdentifier identifier) throws IOException;
-
-    /**
-     * Start emitting a new anydata node identified by name.
-     *
-     * @param name The name of the anydata element
-     * @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
-    boolean startAnydataNode(NodeIdentifier name, Class<?> objectModel) throws IOException;
-
-    /**
-     * Emits a start of anyxml node event.
-     *
-     * @param name name of node as defined in schema, namespace and revision are derived from parent node.
-     * @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
-     */
-    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.
-     *
-     * @param value node value
-     * @throws NullPointerException if the argument is null
-     * @throws IllegalArgumentException if the argument does not represents a valid value
-     * @throws IllegalStateException if an anyxml node is not open or if it's value has already been set and this
-     *                               implementation does not allow resetting the value.
-     * @throws IOException if an underlying IO error occurs
-     */
-    // FIXME: 7.0.0: this probably should integrated with scalarValue()
-    void domSourceValue(DOMSource value) throws IOException;
-
-    /**
-     * Emits end event for node.
-     *
-     * @throws IllegalStateException If there is no start* event to be closed.
-     * @throws IOException if an underlying IO error occurs
-     */
-    void endNode() throws IOException;
-
-    /**
-     * Attach the specified {@link DataSchemaNode} to the next node which will get started or emitted. The default
-     * implementation does nothing.
-     *
-     * @param schema DataSchemaNode
-     * @throws NullPointerException if the argument is null
-     */
-    default void nextDataSchemaNode(final @NonNull DataSchemaNode schema) {
-        requireNonNull(schema);
-    }
-
-    /**
-     * Set the value of current node. This call is only valid within the context in which a value-bearing node is open,
-     * such as a LeafNode, LeafSetEntryNode.
-     *
-     * @param value node value, must be effectively immutable
-     * @throws NullPointerException if the argument is null
-     * @throws IllegalArgumentException if the argument does not represents a valid value
-     * @throws IllegalStateException if a value-bearing node is not open or if it's value has already been set and this
-     *                               implementation does not allow resetting the value.
-     * @throws IOException if an underlying IO error occurs
-     */
-    void scalarValue(@NonNull Object value) throws IOException;
-
-    @Override
-    void close() throws IOException;
-
-    @Override
-    void flush() throws IOException;
-}