2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.controller.sal.rest.doc.util;
11 import java.util.Date;
12 import java.util.HashMap;
13 import java.util.Iterator;
15 import org.opendaylight.yangtools.yang.common.QName;
16 import org.opendaylight.yangtools.yang.model.api.Module;
17 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
18 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
20 public class RestDocgenUtil {
22 private RestDocgenUtil() {
25 private static Map<URI, Map<Date, Module>> namespaceAndRevisionToModule = new HashMap<URI, Map<Date, Module>>();
28 * Resolve path argument name for {@code node}.
30 * The name can contain also prefix which consists of module name followed by colon. The module prefix is presented
31 * if namespace of {@code node} and its parent is different. In other cases only name of {@code node} is returned.
33 * @return name of {@code node}
35 public static String resolvePathArgumentsName(final SchemaNode node, final SchemaContext schemaContext) {
36 Iterable<QName> schemaPath = node.getPath().getPathTowardsRoot();
37 Iterator<QName> it = schemaPath.iterator();
38 QName nodeQName = it.next();
40 QName parentQName = null;
42 parentQName = it.next();
44 if (isEqualNamespaceAndRevision(parentQName, nodeQName)) {
45 return node.getQName().getLocalName();
47 return resolveFullNameFromNode(node, schemaContext);
51 private synchronized static String resolveFullNameFromNode(final SchemaNode node, final SchemaContext schemaContext) {
52 final URI namespace = node.getQName().getNamespace();
53 final Date revision = node.getQName().getRevision();
55 Map<Date, Module> revisionToModule = namespaceAndRevisionToModule.get(namespace);
56 if (revisionToModule == null) {
57 revisionToModule = new HashMap<>();
58 namespaceAndRevisionToModule.put(namespace, revisionToModule);
60 Module module = revisionToModule.get(revision);
62 module = schemaContext.findModuleByNamespaceAndRevision(namespace, revision);
63 revisionToModule.put(revision, module);
66 return module.getName() + ":" + node.getQName().getLocalName();
68 return node.getQName().getLocalName();
71 public static String resolveNodesName(final SchemaNode node, final Module module, final SchemaContext schemaContext) {
72 if (node.getQName().getNamespace().equals(module.getQNameModule().getNamespace())
73 && node.getQName().getRevision().equals(module.getQNameModule().getRevision())) {
74 return node.getQName().getLocalName();
76 return resolveFullNameFromNode(node, schemaContext);
80 private static boolean isEqualNamespaceAndRevision(QName parentQName, QName nodeQName) {
81 if (parentQName == null) {
82 if (nodeQName == null) {
87 return parentQName.getNamespace().equals(nodeQName.getNamespace())
88 && parentQName.getRevision().equals(nodeQName.getRevision());