]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.api.acr/src/org/argeo/api/acr/RuntimeNamespaceContext.java
Clarify system roles
[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.XMLConstants;
10 import javax.xml.namespace.NamespaceContext;
11
12 /**
13 * Programmatically defined {@link NamespaceContext}, code contributing
14 * namespaces MUST register here with a single default prefix.
15 */
16 public class RuntimeNamespaceContext implements NamespaceContext {
17 public final static String XSD_DEFAULT_PREFIX = "xs";
18 public final static String XSD_INSTANCE_DEFAULT_PREFIX = "xsi";
19
20 private NavigableMap<String, String> prefixes = new TreeMap<>();
21 private NavigableMap<String, String> namespaces = new TreeMap<>();
22
23 @Override
24 public String getPrefix(String namespaceURI) {
25 return NamespaceUtils.getPrefix((ns) -> {
26 String prefix = namespaces.get(ns);
27 if (prefix == null)
28 throw new IllegalStateException("Namespace " + ns + " is not registered.");
29 return prefix;
30 }, namespaceURI);
31 }
32
33 @Override
34 public String getNamespaceURI(String prefix) {
35 return NamespaceUtils.getNamespaceURI((p) -> {
36 String ns = prefixes.get(p);
37 if (ns == null)
38 throw new IllegalStateException("Prefix " + p + " is not registered.");
39 return ns;
40 }, prefix);
41 }
42
43 @Override
44 public Iterator<String> getPrefixes(String namespaceURI) {
45 return Collections.singleton(getPrefix(namespaceURI)).iterator();
46 }
47
48 /*
49 * STATIC
50 */
51
52 private final static RuntimeNamespaceContext INSTANCE = new RuntimeNamespaceContext();
53
54 static {
55 // Standard
56 register(XMLConstants.XML_NS_URI, XMLConstants.XML_NS_PREFIX);
57 register(XMLConstants.XMLNS_ATTRIBUTE_NS_URI, XMLConstants.XMLNS_ATTRIBUTE);
58
59 // Common
60 register(XMLConstants.W3C_XML_SCHEMA_NS_URI, XSD_DEFAULT_PREFIX);
61 register(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, XSD_INSTANCE_DEFAULT_PREFIX);
62
63 // Argeo specific
64 register(CrName.CR_NAMESPACE_URI, CrName.CR_DEFAULT_PREFIX);
65 register(CrName.LDAP_NAMESPACE_URI, CrName.LDAP_DEFAULT_PREFIX);
66 register(CrName.ROLE_NAMESPACE_URI, CrName.ROLE_DEFAULT_PREFIX);
67 }
68
69 public static NamespaceContext getNamespaceContext() {
70 return INSTANCE;
71 }
72
73 public static Map<String, String> getPrefixes() {
74 return Collections.unmodifiableNavigableMap(INSTANCE.prefixes);
75 }
76
77 public synchronized static void register(String namespaceURI, String prefix) {
78 NavigableMap<String, String> prefixes = INSTANCE.prefixes;
79 NavigableMap<String, String> namespaces = INSTANCE.namespaces;
80 if (prefixes.containsKey(prefix)) {
81 String ns = prefixes.get(prefix);
82 if (ns.equals(namespaceURI))
83 return; // ignore silently
84 throw new IllegalStateException("Prefix " + prefix + " is already registered with namespace URI " + ns);
85 }
86 if (namespaces.containsKey(namespaceURI)) {
87 String p = namespaces.get(namespaceURI);
88 if (p.equals(prefix))
89 return; // ignore silently
90 throw new IllegalStateException("Namespace " + namespaceURI + " is already registered with prefix " + p);
91 }
92 prefixes.put(prefix, namespaceURI);
93 namespaces.put(namespaceURI, prefix);
94 }
95 }