]> git.argeo.org Git - lgpl/argeo-commons.git/blob - acr/NamespaceUtils.java
Prepare next development cycle
[lgpl/argeo-commons.git] / acr / NamespaceUtils.java
1 package org.argeo.api.acr;
2
3 import java.util.Collections;
4 import java.util.Iterator;
5 import java.util.Objects;
6 import java.util.Set;
7 import java.util.function.Function;
8
9 import javax.xml.XMLConstants;
10 import javax.xml.namespace.NamespaceContext;
11 import javax.xml.namespace.QName;
12
13 public class NamespaceUtils {
14
15 public static ContentName parsePrefixedName(NamespaceContext nameSpaceContext, String nameWithPrefix) {
16 Objects.requireNonNull(nameWithPrefix, "Name cannot be null");
17 if (nameWithPrefix.charAt(0) == '{') {
18 return new ContentName(QName.valueOf(nameWithPrefix), nameSpaceContext);
19 }
20 int index = nameWithPrefix.indexOf(':');
21 if (index < 0) {
22 return new ContentName(nameWithPrefix);
23 }
24 String prefix = nameWithPrefix.substring(0, index);
25 // TODO deal with empty name?
26 String localName = nameWithPrefix.substring(index + 1);
27 String namespaceURI = nameSpaceContext.getNamespaceURI(prefix);
28 if (XMLConstants.NULL_NS_URI.equals(namespaceURI))
29 throw new IllegalStateException("Prefix " + prefix + " is unbound.");
30 return new ContentName(namespaceURI, localName, prefix);
31 }
32
33 public static String toPrefixedName(NamespaceContext nameSpaceContext, QName name) {
34 if (XMLConstants.NULL_NS_URI.equals(name.getNamespaceURI()))
35 return name.getLocalPart();
36 String prefix = nameSpaceContext.getPrefix(name.getNamespaceURI());
37 if (prefix == null)
38 throw new IllegalStateException("Namespace " + name.getNamespaceURI() + " is unbound.");
39 return prefix + ":" + name.getLocalPart();
40 }
41
42 /** singleton */
43 private NamespaceUtils() {
44 }
45
46 /*
47 * DEFAULT NAMESPACE CONTEXT OPERATIONS as specified in NamespaceContext
48 */
49 public static String getStandardPrefix(String namespaceURI) {
50 if (namespaceURI == null)
51 throw new IllegalArgumentException("Namespace URI cannot be null");
52 if (XMLConstants.XML_NS_URI.equals(namespaceURI))
53 return XMLConstants.XML_NS_PREFIX;
54 else if (XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(namespaceURI))
55 return XMLConstants.XMLNS_ATTRIBUTE;
56 return null;
57 }
58
59 public static Iterator<String> getStandardPrefixes(String namespaceURI) {
60 String prefix = getStandardPrefix(namespaceURI);
61 if (prefix == null)
62 return null;
63 return Collections.singleton(prefix).iterator();
64 }
65
66 public static String getStandardNamespaceURI(String prefix) {
67 if (prefix == null)
68 throw new IllegalArgumentException("Prefix cannot be null");
69 if (XMLConstants.XML_NS_PREFIX.equals(prefix))
70 return XMLConstants.XML_NS_URI;
71 else if (XMLConstants.XMLNS_ATTRIBUTE.equals(prefix))
72 return XMLConstants.XMLNS_ATTRIBUTE_NS_URI;
73 return null;
74 }
75
76 public static String getNamespaceURI(Function<String, String> mapping, String prefix) {
77 String namespaceURI = NamespaceUtils.getStandardNamespaceURI(prefix);
78 if (namespaceURI != null)
79 return namespaceURI;
80 if (XMLConstants.DEFAULT_NS_PREFIX.equals(prefix))
81 return XMLConstants.NULL_NS_URI;
82 namespaceURI = mapping.apply(prefix);
83 if (namespaceURI != null)
84 return namespaceURI;
85 return XMLConstants.NULL_NS_URI;
86 }
87
88 public static String getPrefix(Function<String, String> mapping, String namespaceURI) {
89 String prefix = NamespaceUtils.getStandardPrefix(namespaceURI);
90 if (prefix != null)
91 return prefix;
92 if (XMLConstants.NULL_NS_URI.equals(namespaceURI))
93 return XMLConstants.DEFAULT_NS_PREFIX;
94 return mapping.apply(namespaceURI);
95 }
96
97 public static Iterator<String> getPrefixes(Function<String, Set<String>> mapping, String namespaceURI) {
98 Iterator<String> standard = NamespaceUtils.getStandardPrefixes(namespaceURI);
99 if (standard != null)
100 return standard;
101 if (XMLConstants.NULL_NS_URI.equals(namespaceURI))
102 return Collections.singleton(XMLConstants.DEFAULT_NS_PREFIX).iterator();
103 Set<String> prefixes = mapping.apply(namespaceURI);
104 assert prefixes != null;
105 return prefixes.iterator();
106 }
107
108 }