BUG-1091: sever the NormalizedNode/Node relationship 16/9016/5
authorRobert Varga <rovarga@cisco.com>
Tue, 15 Jul 2014 11:07:55 +0000 (13:07 +0200)
committerRobert Varga <rovarga@cisco.com>
Tue, 15 Jul 2014 12:19:10 +0000 (14:19 +0200)
This clarifies the API intent.

Node and NormalizedNode both serve as abstract supertypes which are then
specialized. The artificial Node->NormalizedNode relationship creates
the illusion that NormalizedNode is a semantical sibling of SimpleNode
and CompositeNode -- which is simply not true.

Change-Id: I62f56bc70ee570e719fea7660b7ef36ee59072d6
Signed-off-by: Robert Varga <rovarga@cisco.com>
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/NormalizedNode.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/xml/XmlDocumentUtils.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/nodes/AbstractImmutableNormalizedNode.java
yang/yang-data-operations/src/main/java/org/opendaylight/yangtools/yang/data/operations/DataModificationException.java

index 4e3416fd1fb22b5b83243cd1e922cdf5d6ee8d86..36d4bdd228f55a20ede67e22457918eccf653edd 100644 (file)
@@ -10,7 +10,6 @@ package org.opendaylight.yangtools.yang.data.api.schema;
 import org.opendaylight.yangtools.concepts.Identifiable;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.data.api.Node;
 
 /**
  *
@@ -23,31 +22,26 @@ import org.opendaylight.yangtools.yang.data.api.Node;
  * @param <K> Local identifier of node
  * @param <V> Value of node
  */
-public interface NormalizedNode<K extends InstanceIdentifier.PathArgument,V> extends
-    Identifiable<K>, //
-    Node<V> {
-
+public interface NormalizedNode<K extends InstanceIdentifier.PathArgument, V> extends Identifiable<K> {
     /**
-     *
      * QName of the node as defined in YANG schema.
      *
+     * @return QName of this node, non-null.
      */
-    @Override
     QName getNodeType();
 
     /**
+     * Locally unique identifier of the node.
      *
-     * Locally unique identifier of nodes
-     *
+     * @return Node identifier, non-null.
      */
     @Override
     K getIdentifier();
 
     /**
+     * Value of node.
      *
-     * Value of node
-     *
+     * @return Value of the node, may be null.
      */
-    @Override
     V getValue();
 }
index e011d3ec83bb13b85434c3c2261f061490fe7b57..53f768c072e9bb1dcae93077c08b62bd2d117f77 100644 (file)
@@ -19,6 +19,7 @@ import com.google.common.collect.ImmutableList;
 import java.net.URI;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
 
@@ -34,6 +35,7 @@ import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.ModifyAction;
 import org.opendaylight.yangtools.yang.data.api.Node;
 import org.opendaylight.yangtools.yang.data.api.SimpleNode;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.impl.ImmutableCompositeNode;
 import org.opendaylight.yangtools.yang.data.impl.SimpleNodeTOImpl;
 import org.opendaylight.yangtools.yang.data.impl.codec.TypeDefinitionAwareCodec;
@@ -192,24 +194,36 @@ public class XmlDocumentUtils {
         return itemEl;
     }
 
-    public static Element createElementFor(final Document doc, final Node<?> data) {
-        QName dataType = data.getNodeType();
-        Element ret;
-        if (dataType.getNamespace() != null) {
-            ret = doc.createElementNS(dataType.getNamespace().toString(), dataType.getLocalName());
+    private static final Element createElementFor(final Document doc, final QName qname, final Object obj) {
+        final Element ret;
+        if (qname.getNamespace() != null) {
+            ret = doc.createElementNS(qname.getNamespace().toString(), qname.getLocalName());
         } else {
-            ret = doc.createElementNS(null, dataType.getLocalName());
+            ret = doc.createElementNS(null, qname.getLocalName());
         }
-        if (data instanceof AttributesContainer && ((AttributesContainer) data).getAttributes() != null) {
-            for (Entry<QName, String> attribute : ((AttributesContainer) data).getAttributes().entrySet()) {
-                ret.setAttributeNS(attribute.getKey().getNamespace().toString(), attribute.getKey().getLocalName(),
-                        attribute.getValue());
-            }
 
+        if (obj instanceof AttributesContainer) {
+            final Map<QName, String> attrs = ((AttributesContainer)obj).getAttributes();
+
+            if (attrs != null) {
+                for (Entry<QName, String> attribute : attrs.entrySet()) {
+                    ret.setAttributeNS(attribute.getKey().getNamespace().toString(), attribute.getKey().getLocalName(),
+                            attribute.getValue());
+                }
+            }
         }
+
         return ret;
     }
 
+    public static Element createElementFor(final Document doc, final Node<?> data) {
+        return createElementFor(doc, data.getNodeType(), data);
+    }
+
+    public static Element createElementFor(final Document doc, final NormalizedNode<?, ?> data) {
+        return createElementFor(doc, data.getNodeType(), data);
+    }
+
     public static void writeValueByType(final Element element, final SimpleNode<?> node, final TypeDefinition<?> type,
             final DataSchemaNode schema, final XmlCodecProvider codecProvider) {
 
@@ -367,8 +381,8 @@ public class XmlDocumentUtils {
     public static Optional<ModifyAction> getModifyOperationFromAttributes(final Element xmlElement) {
         Attr attributeNodeNS = xmlElement.getAttributeNodeNS(OPERATION_ATTRIBUTE_QNAME.getNamespace().toString(), OPERATION_ATTRIBUTE_QNAME.getLocalName());
         if(attributeNodeNS == null) {
-                       return Optional.absent();
-               }
+            return Optional.absent();
+        }
 
         ModifyAction action = ModifyAction.fromXmlValue(attributeNodeNS.getValue());
         Preconditions.checkArgument(action.isOnElementPermitted(), "Unexpected operation %s on %s", action, xmlElement);
index 14b0f419297352315c71d5b2517395fee7e7cfb8..d5a6a2b501bab86229f012f66824ebe543ef5983 100644 (file)
@@ -7,19 +7,16 @@
  */
 package org.opendaylight.yangtools.yang.data.impl.schema.nodes;
 
-import org.opendaylight.yangtools.concepts.Immutable;
-import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.data.api.CompositeNode;
-import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-
 import com.google.common.base.Objects;
 import com.google.common.base.Objects.ToStringHelper;
 import com.google.common.base.Preconditions;
 
-public abstract class AbstractImmutableNormalizedNode<K extends InstanceIdentifier.PathArgument,V>
-        implements NormalizedNode<K, V>, Immutable {
+import org.opendaylight.yangtools.concepts.Immutable;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 
+public abstract class AbstractImmutableNormalizedNode<K extends InstanceIdentifier.PathArgument,V> implements NormalizedNode<K, V>, Immutable {
     private final K nodeIdentifier;
 
     protected AbstractImmutableNormalizedNode(final K nodeIdentifier) {
@@ -36,21 +33,6 @@ public abstract class AbstractImmutableNormalizedNode<K extends InstanceIdentifi
         return nodeIdentifier;
     }
 
-    @Override
-    public final CompositeNode getParent() {
-        throw new UnsupportedOperationException("Deprecated");
-    }
-
-    @Override
-    public final QName getKey() {
-        return getNodeType();
-    }
-
-    @Override
-    public final V setValue(final V value) {
-        throw new UnsupportedOperationException("Immutable");
-    }
-
     @Override
     public final String toString() {
         return addToStringAttributes(Objects.toStringHelper(this)).toString();
index d1e1f7c8fbd2f4a7285588644dd02d5b2185276a..bfbe329c7d40236e177ffad6bcd22d7c6ec53ca2 100644 (file)
@@ -7,6 +7,8 @@
  */
 package org.opendaylight.yangtools.yang.data.operations;
 
+import com.google.common.base.Optional;
+
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.Node;
 import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
@@ -16,8 +18,6 @@ import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
 import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 
-import com.google.common.base.Optional;
-
 public class DataModificationException extends Exception {
     // TODO replace QName as identifier for node with schema or NodeIdentifier,
     // Augmentation does not have a QName
@@ -45,6 +45,10 @@ public class DataModificationException extends Exception {
             super(String.format("Data missing for node: %s, %s", nodeType, modificationNode), nodeType);
         }
 
+        public DataMissingException(final QName nodeType, final NormalizedNode<?, ?> modificationNode) {
+            super(String.format("Data missing for node: %s, %s", nodeType, modificationNode), nodeType);
+        }
+
         static void check(final QName nodeQName, final Optional<? extends NormalizedNode<?, ?>> actualNode) throws DataMissingException {
             if (!actualNode.isPresent()) {
                 throw new DataMissingException(nodeQName);