BUG 907 distinguish augmented nodes
[controller.git] / opendaylight / md-sal / sal-rest-docgen / src / main / java / org / opendaylight / controller / sal / rest / doc / util / RestDocgenUtil.java
diff --git a/opendaylight/md-sal/sal-rest-docgen/src/main/java/org/opendaylight/controller/sal/rest/doc/util/RestDocgenUtil.java b/opendaylight/md-sal/sal-rest-docgen/src/main/java/org/opendaylight/controller/sal/rest/doc/util/RestDocgenUtil.java
new file mode 100644 (file)
index 0000000..9e1d82a
--- /dev/null
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.sal.rest.doc.util;
+
+import java.net.URI;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.Module;
+import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.opendaylight.yangtools.yang.model.api.SchemaNode;
+
+public class RestDocgenUtil {
+
+    private RestDocgenUtil() {
+    }
+
+    private static Map<URI, Map<Date, Module>> namespaceAndRevisionToModule = new HashMap<URI, Map<Date, Module>>();
+
+    /**
+     * Resolve path argument name for {@code node}.
+     *
+     * The name can contain also prefix which consists of module name followed by colon. The module prefix is presented
+     * if namespace of {@code node} and its parent is different. In other cases only name of {@code node} is returned.
+     *
+     * @return name of {@code node}
+     */
+    public static String resolvePathArgumentsName(final SchemaNode node, final SchemaContext schemaContext) {
+        Iterable<QName> schemaPath = node.getPath().getPathTowardsRoot();
+        Iterator<QName> it = schemaPath.iterator();
+        QName nodeQName = it.next();
+
+        QName parentQName = null;
+        if (it.hasNext()) {
+            parentQName = it.next();
+        }
+        if (isEqualNamespaceAndRevision(parentQName, nodeQName)) {
+            return node.getQName().getLocalName();
+        } else {
+            return resolveFullNameFromNode(node, schemaContext);
+        }
+    }
+
+    private synchronized static String resolveFullNameFromNode(final SchemaNode node, final SchemaContext schemaContext) {
+        final URI namespace = node.getQName().getNamespace();
+        final Date revision = node.getQName().getRevision();
+
+        Map<Date, Module> revisionToModule = namespaceAndRevisionToModule.get(namespace);
+        if (revisionToModule == null) {
+            revisionToModule = new HashMap<>();
+            namespaceAndRevisionToModule.put(namespace, revisionToModule);
+        }
+        Module module = revisionToModule.get(revision);
+        if (module == null) {
+            module = schemaContext.findModuleByNamespaceAndRevision(namespace, revision);
+            revisionToModule.put(revision, module);
+        }
+        if (module != null) {
+            return module.getName() + ":" + node.getQName().getLocalName();
+        }
+        return node.getQName().getLocalName();
+    }
+
+    public static String resolveNodesName(final SchemaNode node, final Module module, final SchemaContext schemaContext) {
+        if (node.getQName().getNamespace().equals(module.getQNameModule().getNamespace())
+                && node.getQName().getRevision().equals(module.getQNameModule().getRevision())) {
+            return node.getQName().getLocalName();
+        } else {
+            return resolveFullNameFromNode(node, schemaContext);
+        }
+    }
+
+    private static boolean isEqualNamespaceAndRevision(QName parentQName, QName nodeQName) {
+        if (parentQName == null) {
+            if (nodeQName == null) {
+                return true;
+            }
+            return false;
+        }
+        return parentQName.getNamespace().equals(nodeQName.getNamespace())
+                && parentQName.getRevision().equals(nodeQName.getRevision());
+    }
+}