Bug 3645 - instance-identifier parsing error 93/22693/2
authorJan Hajnar <jhajnar@cisco.com>
Tue, 16 Jun 2015 07:14:40 +0000 (09:14 +0200)
committerGerrit Code Review <gerrit@opendaylight.org>
Thu, 18 Jun 2015 01:47:42 +0000 (01:47 +0000)
* added method deserializeKeyValue in AbstractStringInstanceIdentifierCodec
* added implementations for deserializeKeyValue for XML and JSON codecs

Change-Id: I97f68534d4ecc7b0cbb8e67ba899c9b4bfe91650
Signed-off-by: Jan Hajnar <jhajnar@cisco.com>
(cherry picked from commit 0c092cbca774271a87578432212fb398f61543a4)

yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONCodecFactory.java
yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONStringInstanceIdentifierCodec.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/xml/ElementInstanceIdentifierParser.java
yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/AbstractStringInstanceIdentifierCodec.java
yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/XpathStringParsingPathArgumentBuilder.java

index 9df9b347dc16c59a19931c650814420d59a8c221..4c8dcca7febd727bedcb6d262ba46c9da028dd85 100644 (file)
@@ -80,7 +80,7 @@ public final class JSONCodecFactory {
 
     private JSONCodecFactory(final SchemaContext context) {
         this.schemaContext = Preconditions.checkNotNull(context);
-        iidCodec = new JSONStringInstanceIdentifierCodec(context);
+        iidCodec = new JSONStringInstanceIdentifierCodec(context, this);
     }
 
     /**
index 528162a359e2151e2b971ec573cbe85abb2f63b0..bb57f2fa8d7eaf124847a46e147c6150e66f6d7d 100644 (file)
@@ -14,16 +14,20 @@ import java.net.URI;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.util.AbstractModuleStringInstanceIdentifierCodec;
 import org.opendaylight.yangtools.yang.data.util.DataSchemaContextTree;
+import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 
 final class JSONStringInstanceIdentifierCodec extends AbstractModuleStringInstanceIdentifierCodec implements JSONCodec<YangInstanceIdentifier> {
     private final SchemaContext context;
     private final DataSchemaContextTree dataContextTree;
+    private final JSONCodecFactory codecFactory;
 
-    JSONStringInstanceIdentifierCodec(final SchemaContext context) {
+    JSONStringInstanceIdentifierCodec(final SchemaContext context, final JSONCodecFactory jsonCodecFactory) {
         this.context = Preconditions.checkNotNull(context);
         this.dataContextTree = DataSchemaContextTree.from(context);
+        this.codecFactory = jsonCodecFactory;
     }
 
     @Override
@@ -47,6 +51,14 @@ final class JSONStringInstanceIdentifierCodec extends AbstractModuleStringInstan
         return true;
     }
 
+    @Override
+    protected Object deserializeKeyValue(DataSchemaNode schemaNode, String value) {
+        Preconditions.checkNotNull(schemaNode, "schemaNode cannot be null");
+        Preconditions.checkArgument(schemaNode instanceof LeafSchemaNode, "schemaNode must be of type LeafSchemaNode");
+        final JSONCodec<Object> objectJSONCodec = codecFactory.codecFor(schemaNode);
+        return objectJSONCodec.deserialize(value);
+    }
+
     /**
      * Serialize YangInstanceIdentifier with specified JsonWriter.
      *
index 150189ae1183f7e9bae2ccbc391860c1808f784e..4274f6db4230181bf8046195baf05c5cc7880cd4 100644 (file)
@@ -10,10 +10,17 @@ package org.opendaylight.yangtools.yang.data.impl.codec.xml;
 import com.google.common.base.Preconditions;
 import java.net.URI;
 import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.data.impl.codec.TypeDefinitionAwareCodec;
 import org.opendaylight.yangtools.yang.data.util.AbstractStringInstanceIdentifierCodec;
 import org.opendaylight.yangtools.yang.data.util.DataSchemaContextTree;
+import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.IdentityrefTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition;
+import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil;
 import org.w3c.dom.Element;
 
 final class ElementInstanceIdentifierParser extends AbstractStringInstanceIdentifierCodec {
@@ -27,6 +34,23 @@ final class ElementInstanceIdentifierParser extends AbstractStringInstanceIdenti
         this.dataContextTree = DataSchemaContextTree.from(schema);
     }
 
+    @Override
+    protected Object deserializeKeyValue(final DataSchemaNode schemaNode, final String value) {
+        Preconditions.checkNotNull(schemaNode, "schemaNode cannot be null");
+        Preconditions.checkArgument(schemaNode instanceof LeafSchemaNode, "schemaNode must be of type LeafSchemaNode");
+        TypeDefinition<?> originalType = XmlUtils.resolveBaseTypeFrom(((LeafSchemaNode) schemaNode).getType());
+        if (originalType instanceof IdentityrefTypeDefinition) {
+            return new ElementIdentityrefParser(schema, element).deserialize(value);
+        } else if (originalType instanceof LeafrefTypeDefinition) {
+            originalType = SchemaContextUtil.getBaseTypeForLeafRef((LeafrefTypeDefinition) originalType, schema,
+                    schemaNode);
+        }
+        final TypeDefinitionAwareCodec<Object, ? extends TypeDefinition<?>> keyCodec =
+                XmlUtils.DEFAULT_XML_CODEC_PROVIDER.codecFor(originalType);
+        Preconditions.checkState(keyCodec != null, String.format("Cannot find codec for type '%s'.", originalType));
+        return keyCodec.deserialize(value);
+    }
+
     @Override
     protected String prefixForNamespace(final URI namespace) {
         return element.lookupPrefix(namespace.toString());
index ef6ac8eb31860a72325d98d7436f82ba291f8e24..d0abc8a74c7077822e6e22e7c6cb936eba6e0db0 100644 (file)
@@ -17,6 +17,7 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdent
 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.codec.InstanceIdentifierCodec;
+import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 
 /**
  * Abstract utility class for representations which encode {@link YangInstanceIdentifier} as a
@@ -83,6 +84,10 @@ public abstract class AbstractStringInstanceIdentifierCodec extends AbstractName
      */
     protected abstract @Nonnull DataSchemaContextTree getDataContextTree();
 
+    protected Object deserializeKeyValue(DataSchemaNode schemaNode, String value) {
+        return value;
+    }
+
     @Override
     public final YangInstanceIdentifier deserialize(final String data) {
         Preconditions.checkNotNull(data, "Data may not be null");
index d25f0655c0652bdf383e4051dda65059c36e2298..5bf9611492bb6575cbcfff8def3d671165a2b37d 100644 (file)
@@ -150,15 +150,18 @@ class XpathStringParsingPathArgumentBuilder implements Builder<Iterable<PathArgu
             skipWhitespaces();
             checkCurrentAndSkip(EQUALS, "Precondition must contain '='");
             skipWhitespaces();
-            final Object value = deserializeValue(key,nextQuotedValue());
+            final String keyValue = nextQuotedValue();
             skipWhitespaces();
             checkCurrentAndSkip(PRECONDITION_END, "Precondition must ends with ']'");
 
             // Break-out from method for leaf-list case
             if(key == null && currentNode.isLeaf()) {
                 checkValid(offset == data.length(), "Leaf argument must be last argument of instance identifier.");
-                return new YangInstanceIdentifier.NodeWithValue(name, value);
+                return new YangInstanceIdentifier.NodeWithValue(name, keyValue);
             }
+            final DataSchemaContextNode<?> keyNode = currentNode.getChild(key);
+            checkValid(keyNode != null, "%s is not correct schema node identifier.", key);
+            final Object value = codec.deserializeKeyValue(keyNode.getDataSchemaNode(), keyValue);
             keyValues.put(key, value);
         }
         return new YangInstanceIdentifier.NodeIdentifierWithPredicates(name, keyValues.build());