Added parsing of namespace in Json 83/2783/1
authormsunal <msunal@cisco.com>
Fri, 15 Nov 2013 15:16:11 +0000 (16:16 +0100)
committermsunal <msunal@cisco.com>
Fri, 15 Nov 2013 15:20:40 +0000 (16:20 +0100)
- if Json element contains namespace ( namespace:elementName ) then it is added to Node
- added test for status 404 in XML part

Change-Id: I376e1d997bb0e74b64545c8099fab13ceb12d7d1
Signed-off-by: Martin Sunal <msunal@cisco.com>
opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/rest/impl/JsonReader.java
opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/restconf/impl/CompositeNodeWrapper.java
opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/restconf/impl/SimpleNodeWrapper.java
opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/XmlProvidersTest.java

index fa00908e4d54c41245332ebc5d6dedc8f78492d9..3115994e01575a57661db4bbc73bc81927e9713d 100644 (file)
@@ -2,6 +2,7 @@ package org.opendaylight.controller.sal.rest.impl;
 
 import java.io.InputStream;
 import java.io.InputStreamReader;
+import java.net.URI;
 import java.util.Map.Entry;
 import java.util.Set;
 
@@ -48,7 +49,8 @@ class JsonReader {
     }
     
     private CompositeNodeWrapper createStructureWithRoot(String rootObjectName, JsonObject rootObject) {
-        CompositeNodeWrapper firstNode = new CompositeNodeWrapper(rootObjectName);
+        CompositeNodeWrapper firstNode = new CompositeNodeWrapper(getNamespaceFrom(rootObjectName),
+                getLocalNameFrom(rootObjectName));
         for (Entry<String, JsonElement> childOfFirstNode : rootObject.entrySet()) {
             addChildToParent(childOfFirstNode.getKey(), childOfFirstNode.getValue(), firstNode);
         }
@@ -57,7 +59,8 @@ class JsonReader {
     
     private void addChildToParent(String childName, JsonElement childType, CompositeNodeWrapper parent) {
         if (childType.isJsonObject()) {
-            CompositeNodeWrapper child = new CompositeNodeWrapper(childName);
+            CompositeNodeWrapper child = new CompositeNodeWrapper(getNamespaceFrom(childName),
+                    getLocalNameFrom(childName));
             parent.addValue(child);
             for (Entry<String, JsonElement> childOfChild : childType.getAsJsonObject().entrySet()) {
                 addChildToParent(childOfChild.getKey(), childOfChild.getValue(), child);
@@ -71,11 +74,28 @@ class JsonReader {
             String value = childPrimitive.getAsString();
             SimpleNodeWrapper child = null;
             if (value.equals("[null]")) {
-                child = new SimpleNodeWrapper(childName, null);
+                child = new SimpleNodeWrapper(getNamespaceFrom(childName), getLocalNameFrom(childName), null);
             } else {
-                child = new SimpleNodeWrapper(childName, value);
+                child = new SimpleNodeWrapper(getNamespaceFrom(childName), getLocalNameFrom(childName), value);
             }
             parent.addValue(child);
         }
     }
+
+    private URI getNamespaceFrom(String jsonElementName) {
+        int indexOfDelimeter = jsonElementName.lastIndexOf(':');
+        if (indexOfDelimeter == -1) {
+            return null;
+        }
+        return URI.create(jsonElementName.substring(0, indexOfDelimeter));
+    }
+
+    private String getLocalNameFrom(String jsonElementName) {
+        int indexOfDelimeter = jsonElementName.lastIndexOf(':');
+        if (indexOfDelimeter == -1) {
+            return jsonElementName;
+        }
+        return jsonElementName.substring(indexOfDelimeter + 1, jsonElementName.length());
+    }
+
 }
index da07bba187a25e185cab8b72211860e0ffd99437..e000c7e29e21c0a39904088351940d6862e3f42d 100644 (file)
@@ -29,6 +29,11 @@ public final class CompositeNodeWrapper implements NodeWrapper<CompositeNode>, C
     public CompositeNodeWrapper(String localName) {
         this.localName = Preconditions.checkNotNull(localName);
     }
+    
+    public CompositeNodeWrapper(URI namespace, String localName) {
+        this(localName);
+        this.namespace = namespace;
+    }
 
     @Override
     public String getLocalName() {
index 50b6ac77e6ee8b3c885efe87869231736ffce2d2..4600d0890bcc41f30f6f43ff0907c978156352a3 100644 (file)
@@ -24,6 +24,11 @@ public final class SimpleNodeWrapper implements NodeWrapper<SimpleNode<?>>, Simp
         this.value = value;
     }
     
+    public SimpleNodeWrapper(URI namespace, String localName, String value) {
+        this(localName, value);
+        this.namespace = namespace;
+    }
+    
     @Override
     public String getLocalName() {
         if (simpleNode != null) {
index 0b8b5d48de1d6fe40bafaa5e82b61e854162fed6..9d004362d29d0b64b9a8636f51430ccfa46d8ca3 100644 (file)
@@ -24,6 +24,7 @@ import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 
+import org.glassfish.jersey.client.ClientConfig;
 import org.glassfish.jersey.server.ResourceConfig;
 import org.glassfish.jersey.test.JerseyTest;
 import org.glassfish.jersey.test.TestProperties;
@@ -151,6 +152,21 @@ public class XmlProvidersTest extends JerseyTest {
                 Entity.entity("<SimpleNode>", new MediaType("application", "vnd.yang.api+xml")));
         assertEquals(400, response.getStatus());
     }
+    
+    @Test
+    public void testXmlToCompositeNode404NotFound() {
+        URI uri = null;
+        try {
+            uri = new URI("/datastore/" + URLEncoder.encode("ietf-interfaces:interfaces/interface/eth0", Charsets.US_ASCII.name()).toString());
+        } catch (UnsupportedEncodingException | URISyntaxException e) {
+            e.printStackTrace();
+        }
+        
+        when(brokerFacade.readOperationalData(any(InstanceIdentifier.class))).thenReturn(null);
+        
+        Response response = target(uri.toASCIIString()).request(MediaTypes.API+RestconfService.XML).get();
+        assertEquals(404, response.getStatus());
+    }
 
     @Override
     protected Application configure() {