1 package org
.argeo
.api
.acr
;
3 import java
.util
.Collections
;
4 import java
.util
.Comparator
;
5 import java
.util
.Iterator
;
6 import java
.util
.Objects
;
8 import java
.util
.function
.Function
;
10 import javax
.xml
.XMLConstants
;
11 import javax
.xml
.namespace
.NamespaceContext
;
12 import javax
.xml
.namespace
.QName
;
14 public class NamespaceUtils
{
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
);
21 int index
= nameWithPrefix
.indexOf(':');
23 return new ContentName(nameWithPrefix
);
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
);
34 public static String
toPrefixedName(NamespaceContext nameSpaceContext
, QName name
) {
35 if (XMLConstants
.NULL_NS_URI
.equals(name
.getNamespaceURI()))
36 return name
.getLocalPart();
37 String prefix
= nameSpaceContext
.getPrefix(name
.getNamespaceURI());
39 throw new IllegalStateException("Namespace " + name
.getNamespaceURI() + " is unbound.");
40 return prefix
+ ":" + name
.getLocalPart();
43 public final static Comparator
<QName
> QNAME_COMPARATOR
= new Comparator
<QName
>() {
46 public int compare(QName qn1
, QName qn2
) {
47 if (Objects
.equals(qn1
.getNamespaceURI(), qn2
.getNamespaceURI())) {// same namespace
48 return qn1
.getLocalPart().compareTo(qn2
.getLocalPart());
50 return qn1
.getNamespaceURI().compareTo(qn2
.getNamespaceURI());
57 private NamespaceUtils() {
61 * DEFAULT NAMESPACE CONTEXT OPERATIONS as specified in NamespaceContext
63 public static String
getStandardPrefix(String namespaceURI
) {
64 if (namespaceURI
== null)
65 throw new IllegalArgumentException("Namespace URI cannot be null");
66 if (XMLConstants
.XML_NS_URI
.equals(namespaceURI
))
67 return XMLConstants
.XML_NS_PREFIX
;
68 else if (XMLConstants
.XMLNS_ATTRIBUTE_NS_URI
.equals(namespaceURI
))
69 return XMLConstants
.XMLNS_ATTRIBUTE
;
73 public static Iterator
<String
> getStandardPrefixes(String namespaceURI
) {
74 String prefix
= getStandardPrefix(namespaceURI
);
77 return Collections
.singleton(prefix
).iterator();
80 public static String
getStandardNamespaceURI(String prefix
) {
82 throw new IllegalArgumentException("Prefix cannot be null");
83 if (XMLConstants
.XML_NS_PREFIX
.equals(prefix
))
84 return XMLConstants
.XML_NS_URI
;
85 else if (XMLConstants
.XMLNS_ATTRIBUTE
.equals(prefix
))
86 return XMLConstants
.XMLNS_ATTRIBUTE_NS_URI
;
90 public static String
getNamespaceURI(Function
<String
, String
> mapping
, String prefix
) {
91 String namespaceURI
= NamespaceUtils
.getStandardNamespaceURI(prefix
);
92 if (namespaceURI
!= null)
94 if (XMLConstants
.DEFAULT_NS_PREFIX
.equals(prefix
))
95 return XMLConstants
.NULL_NS_URI
;
96 namespaceURI
= mapping
.apply(prefix
);
97 if (namespaceURI
!= null)
99 return XMLConstants
.NULL_NS_URI
;
102 public static String
getPrefix(Function
<String
, String
> mapping
, String namespaceURI
) {
103 String prefix
= NamespaceUtils
.getStandardPrefix(namespaceURI
);
106 if (XMLConstants
.NULL_NS_URI
.equals(namespaceURI
))
107 return XMLConstants
.DEFAULT_NS_PREFIX
;
108 return mapping
.apply(namespaceURI
);
111 public static Iterator
<String
> getPrefixes(Function
<String
, Set
<String
>> mapping
, String namespaceURI
) {
112 Iterator
<String
> standard
= NamespaceUtils
.getStandardPrefixes(namespaceURI
);
113 if (standard
!= null)
115 if (XMLConstants
.NULL_NS_URI
.equals(namespaceURI
))
116 return Collections
.singleton(XMLConstants
.DEFAULT_NS_PREFIX
).iterator();
117 Set
<String
> prefixes
= mapping
.apply(namespaceURI
);
118 assert prefixes
!= null;
119 return prefixes
.iterator();