1 package org
.argeo
.api
.acr
;
3 import java
.util
.Collections
;
4 import java
.util
.Iterator
;
6 import java
.util
.NavigableMap
;
7 import java
.util
.TreeMap
;
9 import javax
.xml
.XMLConstants
;
10 import javax
.xml
.namespace
.NamespaceContext
;
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.
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";
22 private NavigableMap
<String
, String
> prefixes
= new TreeMap
<>();
23 private NavigableMap
<String
, String
> namespaces
= new TreeMap
<>();
26 * NAMESPACE CONTEXT IMPLEMENTATION
30 public String
getPrefix(String namespaceURI
) throws IllegalArgumentException
{
31 return NamespaceUtils
.getPrefix((ns
) -> {
32 String prefix
= namespaces
.get(ns
);
34 throw new IllegalArgumentException("Namespace " + ns
+ " is not registered.");
40 public String
getNamespaceURI(String prefix
) throws IllegalArgumentException
{
41 return NamespaceUtils
.getNamespaceURI((p
) -> {
42 String ns
= prefixes
.get(p
);
44 throw new IllegalArgumentException("Prefix " + p
+ " is not registered.");
50 public Iterator
<String
> getPrefixes(String namespaceURI
) throws IllegalArgumentException
{
51 return Collections
.singleton(getPrefix(namespaceURI
)).iterator();
57 private final static RuntimeNamespaceContext INSTANCE
= new RuntimeNamespaceContext();
61 register(XMLConstants
.XML_NS_URI
, XMLConstants
.XML_NS_PREFIX
);
62 register(XMLConstants
.XMLNS_ATTRIBUTE_NS_URI
, XMLConstants
.XMLNS_ATTRIBUTE
);
65 register(XMLConstants
.W3C_XML_SCHEMA_NS_URI
, XSD_DEFAULT_PREFIX
);
66 register(XMLConstants
.W3C_XML_SCHEMA_INSTANCE_NS_URI
, XSD_INSTANCE_DEFAULT_PREFIX
);
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
);
74 /** The runtime namespace context instance. */
75 public static NamespaceContext
getNamespaceContext() {
79 /** The registered prefixes. */
80 public static Map
<String
, String
> getPrefixes() {
81 return Collections
.unmodifiableNavigableMap(INSTANCE
.prefixes
);
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
);
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
);
101 prefixes
.put(defaultPrefix
, namespaceURI
);
102 namespaces
.put(namespaceURI
, defaultPrefix
);