X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.api.acr%2Fsrc%2Forg%2Fargeo%2Fapi%2Facr%2FRuntimeNamespaceContext.java;fp=org.argeo.api.acr%2Fsrc%2Forg%2Fargeo%2Fapi%2Facr%2FRuntimeNamespaceContext.java;h=fe50fd0c3b58058c55a16b0c3feef24486f64510;hb=117eaabc86f6c09eff9a4b971ac137d51f45e953;hp=1c55156ee352b389c387c56f2ea30103dae2371c;hpb=be6d2dbdf3ccafc9b8ac8820a68a3eb7de859b06;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.api.acr/src/org/argeo/api/acr/RuntimeNamespaceContext.java b/org.argeo.api.acr/src/org/argeo/api/acr/RuntimeNamespaceContext.java index 1c55156ee..fe50fd0c3 100644 --- a/org.argeo.api.acr/src/org/argeo/api/acr/RuntimeNamespaceContext.java +++ b/org.argeo.api.acr/src/org/argeo/api/acr/RuntimeNamespaceContext.java @@ -10,8 +10,10 @@ import javax.xml.XMLConstants; import javax.xml.namespace.NamespaceContext; /** - * Programmatically defined {@link NamespaceContext}, code contributing - * namespaces MUST register here with a single default prefix. + * Programmatically defined {@link NamespaceContext}, which is valid at runtime + * (when the software is running). Code contributing namespaces MUST register + * here with a single default prefix, nad MUST make sure that stored data + * contains the fully qualified namespace URI. */ public class RuntimeNamespaceContext implements NamespaceContext { public final static String XSD_DEFAULT_PREFIX = "xs"; @@ -20,35 +22,38 @@ public class RuntimeNamespaceContext implements NamespaceContext { private NavigableMap prefixes = new TreeMap<>(); private NavigableMap namespaces = new TreeMap<>(); + /* + * NAMESPACE CONTEXT IMPLEMENTATION + */ + @Override - public String getPrefix(String namespaceURI) { + public String getPrefix(String namespaceURI) throws IllegalArgumentException { return NamespaceUtils.getPrefix((ns) -> { String prefix = namespaces.get(ns); if (prefix == null) - throw new IllegalStateException("Namespace " + ns + " is not registered."); + throw new IllegalArgumentException("Namespace " + ns + " is not registered."); return prefix; }, namespaceURI); } @Override - public String getNamespaceURI(String prefix) { + public String getNamespaceURI(String prefix) throws IllegalArgumentException { return NamespaceUtils.getNamespaceURI((p) -> { String ns = prefixes.get(p); if (ns == null) - throw new IllegalStateException("Prefix " + p + " is not registered."); + throw new IllegalArgumentException("Prefix " + p + " is not registered."); return ns; }, prefix); } @Override - public Iterator getPrefixes(String namespaceURI) { + public Iterator getPrefixes(String namespaceURI) throws IllegalArgumentException { return Collections.singleton(getPrefix(namespaceURI)).iterator(); } /* * STATIC */ - private final static RuntimeNamespaceContext INSTANCE = new RuntimeNamespaceContext(); static { @@ -66,30 +71,34 @@ public class RuntimeNamespaceContext implements NamespaceContext { register(ArgeoNamespace.ROLE_NAMESPACE_URI, ArgeoNamespace.ROLE_DEFAULT_PREFIX); } + /** The runtime namespace context instance. */ public static NamespaceContext getNamespaceContext() { return INSTANCE; } + /** The registered prefixes. */ public static Map getPrefixes() { return Collections.unmodifiableNavigableMap(INSTANCE.prefixes); } - public synchronized static void register(String namespaceURI, String prefix) { + /** Registers a namespace URI / default prefix mapping. */ + public synchronized static void register(String namespaceURI, String defaultPrefix) { NavigableMap prefixes = INSTANCE.prefixes; NavigableMap namespaces = INSTANCE.namespaces; - if (prefixes.containsKey(prefix)) { - String ns = prefixes.get(prefix); + if (prefixes.containsKey(defaultPrefix)) { + String ns = prefixes.get(defaultPrefix); if (ns.equals(namespaceURI)) return; // ignore silently - throw new IllegalStateException("Prefix " + prefix + " is already registered with namespace URI " + ns); + throw new IllegalStateException( + "Prefix " + defaultPrefix + " is already registered with namespace URI " + ns); } if (namespaces.containsKey(namespaceURI)) { String p = namespaces.get(namespaceURI); - if (p.equals(prefix)) + if (p.equals(defaultPrefix)) return; // ignore silently throw new IllegalStateException("Namespace " + namespaceURI + " is already registered with prefix " + p); } - prefixes.put(prefix, namespaceURI); - namespaces.put(namespaceURI, prefix); + prefixes.put(defaultPrefix, namespaceURI); + namespaces.put(namespaceURI, defaultPrefix); } }