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(String nameWithPrefix
) {
17 return parsePrefixedName(RuntimeNamespaceContext
.getNamespaceContext(), nameWithPrefix
);
20 public static ContentName
parsePrefixedName(NamespaceContext nameSpaceContext
, String nameWithPrefix
) {
21 Objects
.requireNonNull(nameWithPrefix
, "Name cannot be null");
22 if (nameWithPrefix
.charAt(0) == '{') {
23 return new ContentName(QName
.valueOf(nameWithPrefix
), nameSpaceContext
);
25 int index
= nameWithPrefix
.indexOf(':');
27 return new ContentName(nameWithPrefix
);
29 String prefix
= nameWithPrefix
.substring(0, index
);
30 // TODO deal with empty name?
31 String localName
= nameWithPrefix
.substring(index
+ 1);
32 String namespaceURI
= nameSpaceContext
.getNamespaceURI(prefix
);
33 if (XMLConstants
.NULL_NS_URI
.equals(namespaceURI
))
34 throw new IllegalStateException("Prefix " + prefix
+ " is unbound.");
35 return new ContentName(namespaceURI
, localName
, prefix
);
38 public static String
toPrefixedName(QName name
) {
39 return toPrefixedName(RuntimeNamespaceContext
.getNamespaceContext(), name
);
42 public static String
toPrefixedName(NamespaceContext nameSpaceContext
, QName name
) {
43 if (XMLConstants
.NULL_NS_URI
.equals(name
.getNamespaceURI()))
44 return name
.getLocalPart();
45 String prefix
= nameSpaceContext
.getPrefix(name
.getNamespaceURI());
47 throw new IllegalStateException("Namespace " + name
.getNamespaceURI() + " is unbound.");
48 return prefix
+ ":" + name
.getLocalPart();
51 public final static Comparator
<QName
> QNAME_COMPARATOR
= new Comparator
<QName
>() {
54 public int compare(QName qn1
, QName qn2
) {
55 if (Objects
.equals(qn1
.getNamespaceURI(), qn2
.getNamespaceURI())) {// same namespace
56 return qn1
.getLocalPart().compareTo(qn2
.getLocalPart());
58 return qn1
.getNamespaceURI().compareTo(qn2
.getNamespaceURI());
64 public static boolean hasNamespace(QName qName
) {
65 return !qName
.getNamespaceURI().equals(XMLConstants
.NULL_NS_URI
);
69 * DEFAULT NAMESPACE CONTEXT OPERATIONS as specified in NamespaceContext
71 public static String
getStandardPrefix(String namespaceURI
) {
72 if (namespaceURI
== null)
73 throw new IllegalArgumentException("Namespace URI cannot be null");
74 if (XMLConstants
.XML_NS_URI
.equals(namespaceURI
))
75 return XMLConstants
.XML_NS_PREFIX
;
76 else if (XMLConstants
.XMLNS_ATTRIBUTE_NS_URI
.equals(namespaceURI
))
77 return XMLConstants
.XMLNS_ATTRIBUTE
;
81 public static Iterator
<String
> getStandardPrefixes(String namespaceURI
) {
82 String prefix
= getStandardPrefix(namespaceURI
);
85 return Collections
.singleton(prefix
).iterator();
88 public static String
getStandardNamespaceURI(String prefix
) {
90 throw new IllegalArgumentException("Prefix cannot be null");
91 if (XMLConstants
.XML_NS_PREFIX
.equals(prefix
))
92 return XMLConstants
.XML_NS_URI
;
93 else if (XMLConstants
.XMLNS_ATTRIBUTE
.equals(prefix
))
94 return XMLConstants
.XMLNS_ATTRIBUTE_NS_URI
;
98 public static String
getNamespaceURI(Function
<String
, String
> mapping
, String prefix
) {
99 String namespaceURI
= NamespaceUtils
.getStandardNamespaceURI(prefix
);
100 if (namespaceURI
!= null)
102 if (XMLConstants
.DEFAULT_NS_PREFIX
.equals(prefix
))
103 return XMLConstants
.NULL_NS_URI
;
104 namespaceURI
= mapping
.apply(prefix
);
105 if (namespaceURI
!= null)
107 return XMLConstants
.NULL_NS_URI
;
110 public static String
getPrefix(Function
<String
, String
> mapping
, String namespaceURI
) {
111 String prefix
= NamespaceUtils
.getStandardPrefix(namespaceURI
);
114 if (XMLConstants
.NULL_NS_URI
.equals(namespaceURI
))
115 return XMLConstants
.DEFAULT_NS_PREFIX
;
116 return mapping
.apply(namespaceURI
);
119 public static Iterator
<String
> getPrefixes(Function
<String
, Set
<String
>> mapping
, String namespaceURI
) {
120 Iterator
<String
> standard
= NamespaceUtils
.getStandardPrefixes(namespaceURI
);
121 if (standard
!= null)
123 if (XMLConstants
.NULL_NS_URI
.equals(namespaceURI
))
124 return Collections
.singleton(XMLConstants
.DEFAULT_NS_PREFIX
).iterator();
125 Set
<String
> prefixes
= mapping
.apply(namespaceURI
);
126 assert prefixes
!= null;
127 return prefixes
.iterator();
131 private NamespaceUtils() {