Add MultipleEntryDataWithSchema interface 01/90301/1
authorRobert Varga <robert.varga@pantheon.tech>
Fri, 5 Jun 2020 13:54:51 +0000 (15:54 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Fri, 5 Jun 2020 13:57:34 +0000 (15:57 +0200)
We are sharing essentially the same code in both JSON and XML
parsers, where we really to make this common code exposed from
appropriate NodeDataWithSchema.

Centralizing the interface contract and implementations allows us
to ditch external users of CompositeNodeDataWithSchema.addChild(),
which is now deprecated.

Change-Id: I5aca3d3eecba3f9e6ffee4b9ee15e70afa47aed6
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JsonParserStream.java
yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlParserStream.java
yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/CompositeNodeDataWithSchema.java
yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/LeafListNodeDataWithSchema.java
yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ListEntryNodeDataWithSchema.java
yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ListNodeDataWithSchema.java
yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/MultipleEntryDataWithSchema.java [new file with mode: 0644]

index e67804bef708e9f378abf87ac0e559f84f52c4e7..877173b4ebef7284948b964cc67bda2fb31ffb6d 100644 (file)
@@ -37,11 +37,10 @@ import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStre
 import org.opendaylight.yangtools.yang.data.util.AbstractNodeDataWithSchema;
 import org.opendaylight.yangtools.yang.data.util.AnyXmlNodeDataWithSchema;
 import org.opendaylight.yangtools.yang.data.util.CompositeNodeDataWithSchema;
-import org.opendaylight.yangtools.yang.data.util.LeafListEntryNodeDataWithSchema;
 import org.opendaylight.yangtools.yang.data.util.LeafListNodeDataWithSchema;
 import org.opendaylight.yangtools.yang.data.util.LeafNodeDataWithSchema;
-import org.opendaylight.yangtools.yang.data.util.ListEntryNodeDataWithSchema;
 import org.opendaylight.yangtools.yang.data.util.ListNodeDataWithSchema;
+import org.opendaylight.yangtools.yang.data.util.MultipleEntryDataWithSchema;
 import org.opendaylight.yangtools.yang.data.util.OperationAsContainer;
 import org.opendaylight.yangtools.yang.data.util.ParserStreamUtils;
 import org.opendaylight.yangtools.yang.data.util.SimpleNodeDataWithSchema;
@@ -327,16 +326,10 @@ public final class JsonParserStream implements Closeable, Flushable {
     }
 
     private static AbstractNodeDataWithSchema<?> newArrayEntry(final AbstractNodeDataWithSchema<?> parent) {
-        AbstractNodeDataWithSchema<?> newChild;
-        if (parent instanceof ListNodeDataWithSchema) {
-            newChild = ListEntryNodeDataWithSchema.forSchema(((ListNodeDataWithSchema) parent).getSchema());
-        } else if (parent instanceof LeafListNodeDataWithSchema) {
-            newChild = new LeafListEntryNodeDataWithSchema(((LeafListNodeDataWithSchema) parent).getSchema());
-        } else {
+        if (!(parent instanceof MultipleEntryDataWithSchema)) {
             throw new IllegalStateException("Found an unexpected array nested under " + parent.getSchema().getQName());
         }
-        ((CompositeNodeDataWithSchema<?>) parent).addChild(newChild);
-        return newChild;
+        return ((MultipleEntryDataWithSchema<?>) parent).newChildEntry();
     }
 
     private void setValue(final AbstractNodeDataWithSchema<?> parent, final String value) {
index acd9a11d4d39eafddeccd3927c864b8742283f36..8da82a28e01610be8ad27e221dc822bdfacf67ea 100644 (file)
@@ -66,6 +66,7 @@ import org.opendaylight.yangtools.yang.data.util.LeafNodeDataWithSchema;
 import org.opendaylight.yangtools.yang.data.util.ListEntryNodeDataWithSchema;
 import org.opendaylight.yangtools.yang.data.util.ListNodeDataWithSchema;
 import org.opendaylight.yangtools.yang.data.util.MountPointData;
+import org.opendaylight.yangtools.yang.data.util.MultipleEntryDataWithSchema;
 import org.opendaylight.yangtools.yang.data.util.OperationAsContainer;
 import org.opendaylight.yangtools.yang.data.util.ParserStreamUtils;
 import org.opendaylight.yangtools.yang.data.util.SimpleNodeDataWithSchema;
@@ -628,15 +629,8 @@ public final class XmlParserStream implements Closeable, Flushable {
     }
 
     private static AbstractNodeDataWithSchema<?> newEntryNode(final AbstractNodeDataWithSchema<?> parent) {
-        final AbstractNodeDataWithSchema<?> newChild;
-        if (parent instanceof ListNodeDataWithSchema) {
-            newChild = ListEntryNodeDataWithSchema.forSchema(((ListNodeDataWithSchema) parent).getSchema());
-        } else {
-            verify(parent instanceof LeafListNodeDataWithSchema, "Unexpected parent %s", parent);
-            newChild = new LeafListEntryNodeDataWithSchema(((LeafListNodeDataWithSchema) parent).getSchema());
-        }
-        ((CompositeNodeDataWithSchema<?>) parent).addChild(newChild);
-        return newChild;
+        verify(parent instanceof MultipleEntryDataWithSchema, "Unexpected parent %s", parent);
+        return ((MultipleEntryDataWithSchema<?>) parent).newChildEntry();
     }
 
     @Override
index ef4faae660fad083ce8984cd414c098575272453..8b79165cf9afe5f028def1aa8824b545c13258f4 100644 (file)
@@ -60,6 +60,7 @@ public class CompositeNodeDataWithSchema<T extends DataSchemaNode> extends Abstr
         return newChild == null ? addCompositeChild(schema) : newChild;
     }
 
+    @Deprecated
     public void addChild(final AbstractNodeDataWithSchema<?> newChild) {
         children.add(newChild);
     }
index 9636ec0fdaddf241cb57caae05441cc122026300..ceb4d661af8a23f61f996df33f91803527025573 100644 (file)
@@ -19,7 +19,8 @@ import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
  * <p>
  * Represents a YANG leaf-list node.
  */
-public class LeafListNodeDataWithSchema extends CompositeNodeDataWithSchema<LeafListSchemaNode> {
+public class LeafListNodeDataWithSchema extends CompositeNodeDataWithSchema<LeafListSchemaNode>
+        implements MultipleEntryDataWithSchema<LeafListEntryNodeDataWithSchema> {
     public LeafListNodeDataWithSchema(final LeafListSchemaNode schema) {
         super(schema);
     }
@@ -37,4 +38,11 @@ public class LeafListNodeDataWithSchema extends CompositeNodeDataWithSchema<Leaf
         super.write(writer, metaWriter);
         writer.endNode();
     }
+
+    @Override
+    public final LeafListEntryNodeDataWithSchema newChildEntry() {
+        final LeafListEntryNodeDataWithSchema child = new LeafListEntryNodeDataWithSchema(getSchema());
+        addChild(child);
+        return child;
+    }
 }
index 1f0e12b38f664ff14f5458b88c3ff7cbd353eef5..5f75ccdea95397bbee642274faa8ac21c965e29d 100644 (file)
@@ -13,6 +13,7 @@ import java.io.IOException;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.rfc7952.data.api.StreamWriterMetadataExtension;
 import org.opendaylight.yangtools.util.ImmutableMapTemplate;
 import org.opendaylight.yangtools.yang.common.QName;
@@ -86,7 +87,7 @@ public abstract class ListEntryNodeDataWithSchema extends AbstractMountPointData
         super(schema);
     }
 
-    public static ListEntryNodeDataWithSchema forSchema(final ListSchemaNode schema) {
+    public static @NonNull ListEntryNodeDataWithSchema forSchema(final ListSchemaNode schema) {
         final List<QName> keyDef = schema.getKeyDefinition();
         return keyDef.isEmpty() ? new Unkeyed(schema) :  new Keyed(schema, keyDef);
     }
index 3e22edf60022381fecba7d725eacbecc4ad589d9..65f967d4affdf7af7d515e827fba13550b9fd0ad 100644 (file)
@@ -19,8 +19,8 @@ import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
  * <p>
  * Represents a YANG list node.
  */
-public class ListNodeDataWithSchema extends CompositeNodeDataWithSchema<ListSchemaNode> {
-
+public class ListNodeDataWithSchema extends CompositeNodeDataWithSchema<ListSchemaNode>
+        implements MultipleEntryDataWithSchema<ListEntryNodeDataWithSchema> {
     public ListNodeDataWithSchema(final ListSchemaNode schema) {
         super(schema);
     }
@@ -41,4 +41,10 @@ public class ListNodeDataWithSchema extends CompositeNodeDataWithSchema<ListSche
         writer.endNode();
     }
 
+    @Override
+    public final ListEntryNodeDataWithSchema newChildEntry() {
+        final ListEntryNodeDataWithSchema child = ListEntryNodeDataWithSchema.forSchema(getSchema());
+        addChild(child);
+        return child;
+    }
 }
diff --git a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/MultipleEntryDataWithSchema.java b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/MultipleEntryDataWithSchema.java
new file mode 100644 (file)
index 0000000..e9b7ddd
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2020 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.util;
+
+import com.google.common.annotations.Beta;
+import org.eclipse.jdt.annotation.NonNull;
+
+/**
+ * Marker interface for {@link AbstractNodeDataWithSchema} specializations which are composed of multiple entries.
+ *
+ * @param <T> Entry AbstractNodeDataWithSchema type
+ */
+@Beta
+public interface MultipleEntryDataWithSchema<T extends AbstractNodeDataWithSchema<?>> {
+    /**
+     * Create a new child entry.
+     *
+     * @return A new child entry.
+     */
+    @NonNull T newChildEntry();
+}