BUG-1092: rename data.api.InstanceIdentifier to YangInstanceIdentifier
[yangtools.git] / yang / yang-data-impl / src / main / java / org / opendaylight / yangtools / yang / data / impl / codec / xml / InstanceIdentifierForXmlCodec.java
index 440e68da86f426215a9464e5fbfb3b94ca37ccc0..0ad2fc213438c39e23fc2eb530dd1d06984c918c 100644 (file)
@@ -13,20 +13,17 @@ import com.google.common.base.Splitter;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.ThreadLocalRandom;
+import java.util.Map.Entry;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifierWithPredicates;
-import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeWithValue;
-import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.w3c.dom.Element;
@@ -40,7 +37,7 @@ public final class InstanceIdentifierForXmlCodec {
         throw new UnsupportedOperationException("Utility class");
     }
 
-    public static InstanceIdentifier deserialize(final Element element, final SchemaContext schemaContext) {
+    public static YangInstanceIdentifier deserialize(final Element element, final SchemaContext schemaContext) {
         Preconditions.checkNotNull(element, "Value of element for deserialization can't be null");
         Preconditions.checkNotNull(schemaContext,
                 "Schema context for deserialization of instance identifier type can't be null");
@@ -62,35 +59,20 @@ public final class InstanceIdentifierForXmlCodec {
                 result.add(pathArgument);
             }
         }
-        return InstanceIdentifier.create(result);
+        return YangInstanceIdentifier.create(result);
     }
 
-    public static Element serialize(final InstanceIdentifier data, final Element element) {
-        Preconditions.checkNotNull(data, "Variable should contain instance of instance identifier and can't be null");
+    public static Element serialize(final YangInstanceIdentifier id, final Element element) {
+        Preconditions.checkNotNull(id, "Variable should contain instance of instance identifier and can't be null");
         Preconditions.checkNotNull(element, "DOM element can't be null");
-        Map<String, String> prefixes = new HashMap<>();
-        StringBuilder textContent = new StringBuilder();
-        for (PathArgument pathArgument : data.getPathArguments()) {
-            textContent.append('/');
-            writeIdentifierWithNamespacePrefix(element, textContent, pathArgument.getNodeType(), prefixes);
-            if (pathArgument instanceof NodeIdentifierWithPredicates) {
-                Map<QName, Object> predicates = ((NodeIdentifierWithPredicates) pathArgument).getKeyValues();
-
-                for (QName keyValue : predicates.keySet()) {
-                    String predicateValue = String.valueOf(predicates.get(keyValue));
-                    textContent.append('[');
-                    writeIdentifierWithNamespacePrefix(element, textContent, keyValue, prefixes);
-                    textContent.append("='");
-                    textContent.append(predicateValue);
-                    textContent.append("']");
-                }
-            } else if (pathArgument instanceof NodeWithValue) {
-                textContent.append("[.='");
-                textContent.append(((NodeWithValue) pathArgument).getValue());
-                textContent.append("']");
-            }
+
+        final RandomPrefix prefixes = new RandomPrefix();
+        final String str = XmlUtils.encodeIdentifier(prefixes, id);
+
+        for (Entry<URI, String> e: prefixes.getPrefixes()) {
+            element.setAttribute("xmlns:" + e.getValue(), e.getKey().toString());
         }
-        element.setTextContent(textContent.toString());
+        element.setTextContent(str);
         return element;
     }
 
@@ -128,9 +110,9 @@ public final class InstanceIdentifierForXmlCodec {
         }
 
         if (predicates.isEmpty()) {
-            return new InstanceIdentifier.NodeIdentifier(mainQName);
+            return new YangInstanceIdentifier.NodeIdentifier(mainQName);
         } else {
-            return new InstanceIdentifier.NodeIdentifierWithPredicates(mainQName, predicates);
+            return new YangInstanceIdentifier.NodeIdentifierWithPredicates(mainQName, predicates);
         }
 
     }
@@ -167,7 +149,7 @@ public final class InstanceIdentifierForXmlCodec {
         } catch (URISyntaxException e) {
             throw new IllegalArgumentException("It wasn't possible to convert " + namespaceStr + " to URI object.");
         } catch (NullPointerException e) {
-            throw new IllegalArgumentException("I wasn't possible to get namespace for prefix " + prefix);
+            throw new IllegalArgumentException("It wasn't possible to get namespace for prefix " + prefix);
         }
 
         Module module = schemaContext.findModuleByNamespaceAndRevision(namespace, null);
@@ -198,39 +180,4 @@ public final class InstanceIdentifierForXmlCodec {
             return null;
         }
     }
-
-    private static void writeIdentifierWithNamespacePrefix(final Element element, final StringBuilder textContent, final QName qName,
-            final Map<String, String> prefixes) {
-        String namespace = qName.getNamespace().toString();
-        String prefix = prefixes.get(namespace);
-        if (prefix == null) {
-            prefix = qName.getPrefix();
-            if (prefix == null || prefix.isEmpty() || prefixes.containsValue(prefix)) {
-                prefix = generateNewPrefix(prefixes.values());
-            }
-        }
-
-        element.setAttribute("xmlns:" + prefix, namespace.toString());
-        textContent.append(prefix);
-        prefixes.put(namespace, prefix);
-
-        textContent.append(':');
-        textContent.append(qName.getLocalName());
-    }
-
-    private static String generateNewPrefix(final Collection<String> prefixes) {
-        String result;
-
-        final ThreadLocalRandom random = ThreadLocalRandom.current();
-        do {
-            StringBuilder sb = new StringBuilder();
-            for (int i = 0; i < 4; i++) {
-                sb.append('a' + random.nextInt(25));
-            }
-
-            result = sb.toString();
-        } while (prefixes.contains(result));
-
-        return result;
-    }
 }