Add MinMaxElementsValidationFailedException
[yangtools.git] / yang / yang-data-impl / src / main / java / org / opendaylight / yangtools / yang / data / impl / schema / ImmutableNormalizedNodeStreamWriter.java
index 2b2e5857fbdc30205a86493a2254a820ab1bfacd..d8b9dc438e17282277b1941dff256d14ac82fb87 100644 (file)
@@ -11,11 +11,12 @@ 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 javax.xml.transform.dom.DOMSource;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.yangtools.odlext.model.api.YangModeledAnyXmlSchemaNode;
+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;
@@ -27,9 +28,11 @@ import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContaine
 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;
@@ -104,7 +107,7 @@ public class ImmutableNormalizedNodeStreamWriter implements NormalizedNodeStream
      * @param result {@link NormalizedNodeResult} object which will hold result value.
      * @return {@link NormalizedNodeStreamWriter} which will write item to supplied result holder.
      */
-    public static NormalizedNodeStreamWriter from(final NormalizedNodeResult result) {
+    public static @NonNull NormalizedNodeStreamWriter from(final NormalizedNodeResult result) {
         return result instanceof NormalizedNodeMetadataResult ? from((NormalizedNodeMetadataResult) result)
                 : new ImmutableNormalizedNodeStreamWriter(result);
     }
@@ -127,14 +130,14 @@ public class ImmutableNormalizedNodeStreamWriter implements NormalizedNodeStream
      * @param result {@link NormalizedNodeResult} object which will hold result value.
      * @return {@link NormalizedNodeStreamWriter} which will write item to supplied result holder.
      */
-    public static NormalizedNodeStreamWriter from(final NormalizedNodeMetadataResult result) {
+    public static @NonNull NormalizedNodeStreamWriter from(final NormalizedNodeMetadataResult result) {
         return new ImmutableMetadataNormalizedNodeStreamWriter(result);
     }
 
     @Override
     public void startLeafNode(final NodeIdentifier name) {
         checkDataNodeContainer();
-        enter(name, InterningLeafNodeBuilder.forSchema(nextSchema));
+        enter(name, leafNodeBuilder(nextSchema));
         nextSchema = null;
     }
 
@@ -151,7 +154,7 @@ public class ImmutableNormalizedNodeStreamWriter implements NormalizedNodeStream
         checkArgument(current instanceof ImmutableLeafSetNodeBuilder
             || current instanceof ImmutableOrderedLeafSetNodeBuilder || current instanceof NormalizedNodeResultBuilder,
             "LeafSetEntryNode is not valid for parent %s", current);
-        enter(name, ImmutableLeafSetEntryNodeBuilder.create());
+        enter(name, leafsetEntryNodeBuilder());
         nextSchema = null;
     }
 
@@ -162,10 +165,14 @@ public class ImmutableNormalizedNodeStreamWriter implements NormalizedNodeStream
     }
 
     @Override
-    public void startAnyxmlNode(final NodeIdentifier name) {
+    public boolean startAnyxmlNode(final NodeIdentifier name, final Class<?> objectModel) {
         checkDataNodeContainer();
-        enter(name, ImmutableAnyXmlNodeBuilder.create());
-        nextSchema = null;
+        if (DOMSource.class.isAssignableFrom(objectModel)) {
+            enter(name, ImmutableAnyXmlNodeBuilder.create());
+            nextSchema = null;
+            return true;
+        }
+        return false;
     }
 
     @Override
@@ -179,9 +186,9 @@ public class ImmutableNormalizedNodeStreamWriter implements NormalizedNodeStream
     public void startYangModeledAnyXmlNode(final NodeIdentifier name, final int childSizeHint) {
         checkDataNodeContainer();
 
-        checkArgument(nextSchema instanceof YangModeledAnyXmlSchemaNode,
-                "Schema of this node should be instance of YangModeledAnyXmlSchemaNode");
-        final YangModeledAnyXmlSchemaNode anyxmlSchema = (YangModeledAnyXmlSchemaNode) nextSchema;
+        checkArgument(nextSchema instanceof YangModeledAnyxmlSchemaNode,
+                "Schema of this node should be instance of YangModeledAnyxmlSchemaNode");
+        final YangModeledAnyxmlSchemaNode anyxmlSchema = (YangModeledAnyxmlSchemaNode) nextSchema;
         enter(name, UNKNOWN_SIZE == childSizeHint ? ImmutableYangModeledAnyXmlNodeBuilder.create(anyxmlSchema)
                 : ImmutableYangModeledAnyXmlNodeBuilder.create(anyxmlSchema, childSizeHint));
     }
@@ -276,6 +283,14 @@ public class ImmutableNormalizedNodeStreamWriter implements NormalizedNodeStream
         writeChild(product);
     }
 
+    @Override
+    public boolean startAnydataNode(final NodeIdentifier name, final Class<?> objectModel) throws IOException {
+        checkDataNodeContainer();
+        enter(name, ImmutableAnydataNodeBuilder.create(objectModel));
+        // We support all object models
+        return true;
+    }
+
     /**
      * Add a child not to the currently-open builder.
      *
@@ -308,6 +323,19 @@ public class ImmutableNormalizedNodeStreamWriter implements NormalizedNodeStream
         builders.push(builder);
     }
 
+    private <T> ImmutableLeafNodeBuilder<T> leafNodeBuilder(final DataSchemaNode schema) {
+        final InterningLeafNodeBuilder<T> interning = InterningLeafNodeBuilder.forSchema(schema);
+        return interning != null ? interning : leafNodeBuilder();
+    }
+
+    <T> ImmutableLeafNodeBuilder<T> leafNodeBuilder() {
+        return new ImmutableLeafNodeBuilder<>();
+    }
+
+    <T> ImmutableLeafSetEntryNodeBuilder<T> leafsetEntryNodeBuilder() {
+        return ImmutableLeafSetEntryNodeBuilder.create();
+    }
+
     private void checkDataNodeContainer() {
         @SuppressWarnings("rawtypes")
         final NormalizedNodeContainerBuilder current = currentContainer();