]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.api.acr/src/org/argeo/api/acr/RuntimeNamespaceContext.java
Introduce UUID identified and openForEdit/freeze cycle
[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}, which is valid at runtime
14 * (when the software is running). Code contributing namespaces MUST register
15 * here with a single default prefix, nad MUST make sure that stored data
16 * contains the fully qualified namespace URI.
17 */
18 public class RuntimeNamespaceContext implements NamespaceContext {
19 public final static String XSD_DEFAULT_PREFIX = "xs";
20 public final static String XSD_INSTANCE_DEFAULT_PREFIX = "xsi";
21
22 private NavigableMap<String, String> prefixes = new TreeMap<>();
23 private NavigableMap<String, String> namespaces = new TreeMap<>();
24
25 /*
26 * NAMESPACE CONTEXT IMPLEMENTATION
27 */
28
29 @Override
30 public String getPrefix(String namespaceURI) throws IllegalArgumentException {
31 return NamespaceUtils.getPrefix((ns) -> {
32 String prefix = namespaces.get(ns);
33 if (prefix == null)
34 throw new IllegalArgumentException("Namespace " + ns + " is not registered.");
35 return prefix;
36 }, namespaceURI);
37 }
38
39 @Override
40 public String getNamespaceURI(String prefix) throws IllegalArgumentException {
41 return NamespaceUtils.getNamespaceURI((p) -> {
42 String ns = prefixes.get(p);
43 if (ns == null)
44 throw new IllegalArgumentException("Prefix " + p + " is not registered.");
45 return ns;
46 }, prefix);
47 }
48
49 @Override
50 public Iterator<String> getPrefixes(String namespaceURI) throws IllegalArgumentException {
51 return Collections.singleton(getPrefix(namespaceURI)).iterator();
52 }
53
54 /*
55 * STATIC
56 */
57 private final static RuntimeNamespaceContext INSTANCE = new RuntimeNamespaceContext();
58
59 static {
60 // Standard
61 register(XMLConstants.XML_NS_URI, XMLConstants.XML_NS_PREFIX);
62 register(XMLConstants.XMLNS_ATTRIBUTE_NS_URI, XMLConstants.XMLNS_ATTRIBUTE);
63
64 // Common
65 register(XMLConstants.W3C_XML_SCHEMA_NS_URI, XSD_DEFAULT_PREFIX);
66 register(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, XSD_INSTANCE_DEFAULT_PREFIX);
67
68 // Argeo specific
69 register(ArgeoNamespace.CR_NAMESPACE_URI, ArgeoNamespace.CR_DEFAULT_PREFIX);
70 register(ArgeoNamespace.LDAP_NAMESPACE_URI, ArgeoNamespace.LDAP_DEFAULT_PREFIX);
71 register(ArgeoNamespace.ROLE_NAMESPACE_URI, ArgeoNamespace.ROLE_DEFAULT_PREFIX);
72 }
73
74 /** The runtime namespace context instance. */
75 public static NamespaceContext getNamespaceContext() {
76 return INSTANCE;
77 }
78
79 /** The registered prefixes. */
80 public static Map<String, String> getPrefixes() {
81 return Collections.unmodifiableNavigableMap(INSTANCE.prefixes);
82 }
83
84 /** Registers a namespace URI / default prefix mapping. */
85 public synchronized static void register(String namespaceURI, String defaultPrefix) {
86 NavigableMap<String, String> prefixes = INSTANCE.prefixes;
87 NavigableMap<String, String> namespaces = INSTANCE.namespaces;
88 if (prefixes.containsKey(defaultPrefix)) {
89 String ns = prefixes.get(defaultPrefix);
90 if (ns.equals(namespaceURI))
91 return; // ignore silently
92 throw new IllegalStateException(
93 "Prefix " + defaultPrefix + " is already registered with namespace URI " + ns);
94 }
95 if (namespaces.containsKey(namespaceURI)) {
96 String p = namespaces.get(namespaceURI);
97 if (p.equals(defaultPrefix))
98 return; // ignore silently
99 throw new IllegalStateException("Namespace " + namespaceURI + " is already registered with prefix " + p);
100 }
101 prefixes.put(defaultPrefix, namespaceURI);
102 namespaces.put(namespaceURI, defaultPrefix);
103 }
104 }