]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.api.acr/src/org/argeo/api/acr/RuntimeNamespaceContext.java
Make current subject more similar to future evolution of Java
[lgpl/argeo-commons.git] / org.argeo.api.acr / src / org / argeo / api / acr / RuntimeNamespaceContext.java
1 package org.argeo.api.acr;
2
3 import java.util.Collections;
4 import java.util.Iterator;
5 import java.util.Map;
6 import java.util.NavigableMap;
7 import java.util.TreeMap;
8
9 import javax.xml.namespace.NamespaceContext;
10
11 /**
12 * Programmatically defined {@link NamespaceContext}, code contributing
13 * namespaces MUST register here with a single default prefix.
14 */
15 public class RuntimeNamespaceContext implements NamespaceContext {
16 private NavigableMap<String, String> prefixes = new TreeMap<>();
17 private NavigableMap<String, String> namespaces = new TreeMap<>();
18
19 @Override
20 public String getPrefix(String namespaceURI) {
21 return NamespaceUtils.getPrefix((ns) -> {
22 String prefix = namespaces.get(ns);
23 if (prefix == null)
24 throw new IllegalStateException("Namespace " + ns + " is not registered.");
25 return prefix;
26 }, namespaceURI);
27 }
28
29 @Override
30 public String getNamespaceURI(String prefix) {
31 return NamespaceUtils.getNamespaceURI((p) -> {
32 String ns = prefixes.get(p);
33 if (ns == null)
34 throw new IllegalStateException("Prefix " + p + " is not registered.");
35 return ns;
36 }, prefix);
37 }
38
39 @Override
40 public Iterator<String> getPrefixes(String namespaceURI) {
41 return Collections.singleton(getPrefix(namespaceURI)).iterator();
42 }
43
44 /*
45 * STATIC
46 */
47
48 private final static RuntimeNamespaceContext INSTANCE = new RuntimeNamespaceContext();
49
50 static {
51 register(CrName.CR_NAMESPACE_URI, CrName.CR_DEFAULT_PREFIX);
52 register(CrName.LDAP_NAMESPACE_URI, CrName.LDAP_DEFAULT_PREFIX);
53 register(CrName.ROLE_NAMESPACE_URI, CrName.ROLE_DEFAULT_PREFIX);
54 }
55
56 public static NamespaceContext getNamespaceContext() {
57 return INSTANCE;
58 }
59
60 public static Map<String, String> getPrefixes() {
61 return Collections.unmodifiableNavigableMap(INSTANCE.prefixes);
62 }
63
64 public synchronized static void register(String namespaceURI, String prefix) {
65 NavigableMap<String, String> prefixes = INSTANCE.prefixes;
66 NavigableMap<String, String> namespaces = INSTANCE.namespaces;
67 if (prefixes.containsKey(prefix)) {
68 String ns = prefixes.get(prefix);
69 if (ns.equals(namespaceURI))
70 return; // ignore silently
71 throw new IllegalStateException("Prefix " + prefix + " is already registered with namespace URI " + ns);
72 }
73 if (namespaces.containsKey(namespaceURI)) {
74 String p = namespaces.get(namespaceURI);
75 if (p.equals(prefix))
76 return; // ignore silently
77 throw new IllegalStateException("Namespace " + namespaceURI + " is already registered with prefix " + p);
78 }
79 prefixes.put(prefix, namespaceURI);
80 namespaces.put(namespaceURI, prefix);
81 }
82 }