Instance identifier support
[controller.git] / opendaylight / md-sal / sal-rest-connector / src / main / java / org / opendaylight / controller / sal / rest / impl / XmlReader.java
index 014e839f2665c7e9aa7c89c5a9f344aaef377b7b..d6f8a9874b963a90fa62e595e5bb7e6a9fcad8b0 100644 (file)
@@ -14,8 +14,8 @@ import javax.xml.stream.events.StartElement;
 import javax.xml.stream.events.XMLEvent;
 
 import org.opendaylight.controller.sal.restconf.impl.CompositeNodeWrapper;
-import org.opendaylight.controller.sal.restconf.impl.IdentityValuesDTO;
 import org.opendaylight.controller.sal.restconf.impl.EmptyNodeWrapper;
+import org.opendaylight.controller.sal.restconf.impl.IdentityValuesDTO;
 import org.opendaylight.controller.sal.restconf.impl.NodeWrapper;
 import org.opendaylight.controller.sal.restconf.impl.SimpleNodeWrapper;
 import org.opendaylight.yangtools.yang.data.api.Node;
@@ -148,6 +148,7 @@ public class XmlReader {
                 final Characters chars = innerEvent.asCharacters();
                 if (!chars.isWhiteSpace()) {
                     data = innerEvent.asCharacters().getData();
+                    data = data + getAdditionalData(eventReader.nextEvent());
                 }
             } else if (innerEvent.isEndElement()) {
                 if (startElement.getLocation().getCharacterOffset() == innerEvent.getLocation().getCharacterOffset()) {
@@ -160,6 +161,21 @@ public class XmlReader {
         return data;
     }
 
+    private String getAdditionalData(XMLEvent event) throws XMLStreamException {
+        String data = "";
+        if (eventReader.hasNext()) {
+            final XMLEvent innerEvent = eventReader.peek();
+            if (innerEvent.isCharacters() && !innerEvent.isEndElement()) {
+                final Characters chars = innerEvent.asCharacters();
+                if (!chars.isWhiteSpace()) {
+                    data = innerEvent.asCharacters().getData();
+                    data = data + getAdditionalData(eventReader.nextEvent());
+                }
+            }
+        }
+        return data;
+    }
+
     private String getLocalNameFor(StartElement startElement) {
         return startElement.getName().getLocalPart();
     }
@@ -169,23 +185,23 @@ public class XmlReader {
         return namespaceURI.isEmpty() ? null : URI.create(namespaceURI);
     }
 
-    /**
-     * @param value
-     *            value of startElement
-     * @param startElement
-     *            element containing value
-     * @return if value is "prefix:value" then {@link IdentityValuesDTO} else the same
-     *         string as parameter "value"
-     */
     private Object resolveValueOfElement(String value, StartElement startElement) {
-        String[] namespaceAndValue = value.split(":");
-        if (namespaceAndValue.length != 2) { // it is not "prefix:value"
-            return value;
+        // it could be instance-identifier Built-In Type
+        if (value.startsWith("/")) {
+            IdentityValuesDTO iiValue = RestUtil.asInstanceIdentifier(value, new RestUtil.PrefixMapingFromXml(startElement));
+            if (iiValue != null) {
+                return iiValue;
+            }
         }
-        String namespace = startElement.getNamespaceContext().getNamespaceURI(namespaceAndValue[0]);
-        if (namespace != null && !namespace.isEmpty()) {
-            return new IdentityValuesDTO(namespace, namespaceAndValue[1], namespaceAndValue[0]);
+        // it could be identityref Built-In Type
+        String[] namespaceAndValue = value.split(":");
+        if (namespaceAndValue.length == 2) {
+            String namespace = startElement.getNamespaceContext().getNamespaceURI(namespaceAndValue[0]);
+            if (namespace != null && !namespace.isEmpty()) {
+                return new IdentityValuesDTO(namespace, namespaceAndValue[1], namespaceAndValue[0]);
+            }
         }
+        // it is not "prefix:value" but just "value"
         return value;
     }