/* * 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> namespaceAndRevisionToModule = new HashMap>(); /** * 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 schemaPath = node.getPath().getPathTowardsRoot(); Iterator 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 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()); } }