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