2 * Copyright (c) 2015 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.yangtools.yang.parser.stmt.rfc6020;
10 import static com.google.common.base.Preconditions.checkArgument;
11 import static com.google.common.base.Verify.verifyNotNull;
12 import static java.util.Objects.requireNonNull;
14 import com.google.common.collect.BiMap;
15 import com.google.common.collect.ImmutableBiMap;
16 import com.google.common.collect.Iterators;
17 import java.util.Iterator;
18 import javax.xml.namespace.NamespaceContext;
19 import org.opendaylight.yangtools.yang.common.QNameModule;
20 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
21 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils;
24 * A {@link NamespaceContext} implementation based on the set of imports and local module namespace.
26 // TODO: this is a useful utility, so should probably move to yang.parser.spi.meta.
27 final class StmtNamespaceContext implements NamespaceContext {
28 private final StmtContext<?, ?, ?> ctx;
29 private final BiMap<String, String> uriToPrefix;
31 private String localNamespaceURI;
33 private StmtNamespaceContext(final StmtContext<?, ?, ?> ctx) {
34 this(ctx, ImmutableBiMap.of());
37 private StmtNamespaceContext(final StmtContext<?, ?, ?> ctx, final BiMap<String, String> uriToPrefix) {
38 this.ctx = requireNonNull(ctx);
39 this.uriToPrefix = ImmutableBiMap.copyOf(requireNonNull(uriToPrefix));
42 public static NamespaceContext create(final StmtContext<?, ?, ?> ctx) {
43 return new StmtNamespaceContext(ctx);
46 public static NamespaceContext create(final StmtContext<?, ?, ?> ctx, final BiMap<String, String> uriToPrefix) {
47 return new StmtNamespaceContext(ctx, uriToPrefix);
50 private String localNamespaceURI() {
51 if (localNamespaceURI == null) {
52 localNamespaceURI = verifyNotNull(ctx.getPublicDefinition().getStatementName().getNamespace().toString(),
53 "Local namespace URI not found in %s", ctx);
55 return localNamespaceURI;
59 public String getNamespaceURI(final String prefix) {
60 // API-mandated by NamespaceContext
61 checkArgument(prefix != null);
63 final String uri = uriToPrefix.inverse().get(prefix);
68 if (prefix.isEmpty()) {
69 return localNamespaceURI();
72 final QNameModule module = StmtContextUtils.getModuleQNameByPrefix(ctx, prefix);
73 return module == null ? null : module.getNamespace().toString();
77 public String getPrefix(final String namespaceURI) {
78 // API-mandated by NamespaceContext
79 checkArgument(namespaceURI != null);
81 final String prefix = uriToPrefix.get(namespaceURI);
86 if (localNamespaceURI().equals(namespaceURI)) {
89 return ctx.getFromNamespace(URIStringToImpPrefix.class, namespaceURI);
93 public Iterator<String> getPrefixes(final String namespaceURI) {
94 // Ensures underlying map remains constant
95 return Iterators.unmodifiableIterator(Iterators.concat(
96 ctx.getAllFromNamespace(URIStringToImpPrefix.class).values().iterator(),
97 uriToPrefix.values().iterator()));