Cleanup use of Guava library
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / rfc6020 / StmtNamespaceContext.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.yangtools.yang.parser.stmt.rfc6020;
9
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;
13
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;
22
23 /**
24  * A {@link NamespaceContext} implementation based on the set of imports and local module namespace.
25  */
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;
30
31     private String localNamespaceURI;
32
33     private StmtNamespaceContext(final StmtContext<?, ?, ?> ctx) {
34         this(ctx, ImmutableBiMap.of());
35     }
36
37     private StmtNamespaceContext(final StmtContext<?, ?, ?> ctx, final BiMap<String, String> uriToPrefix) {
38         this.ctx = requireNonNull(ctx);
39         this.uriToPrefix = ImmutableBiMap.copyOf(requireNonNull(uriToPrefix));
40     }
41
42     public static NamespaceContext create(final StmtContext<?, ?, ?> ctx) {
43         return new StmtNamespaceContext(ctx);
44     }
45
46     public static NamespaceContext create(final StmtContext<?, ?, ?> ctx, final BiMap<String, String> uriToPrefix) {
47         return new StmtNamespaceContext(ctx, uriToPrefix);
48     }
49
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);
54         }
55         return localNamespaceURI;
56     }
57
58     @Override
59     public String getNamespaceURI(final String prefix) {
60         // API-mandated by NamespaceContext
61         checkArgument(prefix != null);
62
63         final String uri = uriToPrefix.inverse().get(prefix);
64         if (uri != null) {
65             return uri;
66         }
67
68         if (prefix.isEmpty()) {
69             return localNamespaceURI();
70         }
71
72         final QNameModule module = StmtContextUtils.getModuleQNameByPrefix(ctx, prefix);
73         return module == null ? null : module.getNamespace().toString();
74     }
75
76     @Override
77     public String getPrefix(final String namespaceURI) {
78         // API-mandated by NamespaceContext
79         checkArgument(namespaceURI != null);
80
81         final String prefix = uriToPrefix.get(namespaceURI);
82         if (prefix != null) {
83             return prefix;
84         }
85
86         if (localNamespaceURI().equals(namespaceURI)) {
87             return "";
88         }
89         return ctx.getFromNamespace(URIStringToImpPrefix.class, namespaceURI);
90     }
91
92     @Override
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()));
98     }
99 }