0
|
1 /*
|
|
2 * (c) Copyright IBM Corp 2002, 2005
|
|
3 */
|
|
4
|
|
5 package edu.uga.cs.lsdis.meteors.wadls.util.xml;
|
|
6
|
|
7 import javax.wadls.Application;
|
|
8 import javax.wadls.WADLSException;
|
|
9 import javax.xml.XMLConstants;
|
|
10 import javax.xml.namespace.*;
|
|
11
|
|
12 import org.w3c.dom.*;
|
|
13
|
|
14 public class QNameUtils
|
|
15 {
|
|
16 public static boolean matches(QName qname, Node node)
|
|
17 {
|
|
18 return (node != null && qname.equals(newQName(node)));
|
|
19 }
|
|
20
|
|
21 public static QName newQName(Node node)
|
|
22 {
|
|
23 if (node != null)
|
|
24 {
|
|
25 // System.out.println("node:namespace uri is " + node.getNamespaceURI());
|
|
26 QName q = new QName(node.getNamespaceURI(), node.getLocalName());
|
|
27 //System.out.println("Qname generated is "+q);
|
|
28 return q;
|
|
29
|
|
30 }
|
|
31 else
|
|
32 {
|
|
33 return new QName(null, null);
|
|
34 }
|
|
35 }
|
|
36
|
|
37 public static QName getQName(String prefixedValue,
|
|
38 Element contextEl)
|
|
39 throws WADLSException{
|
|
40 int index = prefixedValue.indexOf(':');
|
|
41 String prefix = (index != -1)
|
|
42 ? prefixedValue.substring(0, index)
|
|
43 : null;
|
|
44 String localPart = prefixedValue.substring(index + 1);
|
|
45 String namespaceURI = DOMUtils.getNamespaceURIFromPrefix(contextEl, prefix);
|
|
46
|
|
47 if (namespaceURI != null)
|
|
48 return new QName(namespaceURI, localPart);
|
|
49 else{
|
|
50 String faultCode = (prefix == null)
|
|
51 ? WADLSException.NO_PREFIX_SPECIFIED
|
|
52 : WADLSException.UNBOUND_PREFIX;
|
|
53
|
|
54 WADLSException wsdlExc = new WADLSException(faultCode,
|
|
55 "Unable to determine " +
|
|
56 "namespace of '" +
|
|
57 prefixedValue + "'.");
|
|
58
|
|
59 wsdlExc.setLocation(XPathUtils.getXPathExprFromNode(contextEl));
|
|
60
|
|
61 throw wsdlExc;
|
|
62 }
|
|
63 }
|
|
64
|
|
65 /**
|
|
66 * Parse a string, return a QName.
|
|
67 * The String can be only in the form of "{namespace}localpart"
|
|
68 * @param qNameAsString
|
|
69 * @return A QName by parsing the given string.
|
|
70 */
|
|
71 public static QName generateQName(String qNameAsString){
|
|
72 return generateQName(qNameAsString, null);
|
|
73 }
|
|
74
|
|
75 /**
|
|
76 * Parse a string, return a QName.
|
|
77 * The String may be in the form of "prefix:localpart" or "{namespace}localpart"
|
|
78 * @param qNameAsString
|
|
79 * @param wsdlDef Wsdl definition for the purpose of getting URI from prefix, and vice versa.
|
|
80 * @return A QName by paring the given string.
|
|
81 */
|
|
82 public static QName generateQName(String qNameAsString, Application wadlApp){
|
|
83 String nsURI = null;
|
|
84 String prefix = null;
|
|
85 String localPart = null;
|
|
86
|
|
87 if (qNameAsString == null) {
|
|
88 throw new IllegalArgumentException("cannot create QName from \"null\" or \"\" String");
|
|
89 }
|
|
90
|
|
91 if (qNameAsString.charAt(0) == '{') { //namespace + localpart
|
|
92 int endOfNamespaceURI = qNameAsString.indexOf('}');
|
|
93 if (endOfNamespaceURI == -1) {
|
|
94 throw new IllegalArgumentException(
|
|
95 "cannot create QName from \""
|
|
96 + qNameAsString
|
|
97 + "\", missing closing \"}\"");
|
|
98 }
|
|
99 else{
|
|
100 nsURI = qNameAsString.substring(1, endOfNamespaceURI);
|
|
101 //get prefix from wsdls definition
|
|
102 if (wadlApp != null)
|
|
103 prefix = wadlApp.getPrefix(nsURI);
|
|
104 localPart = qNameAsString.substring(endOfNamespaceURI + 1);
|
|
105 return new QName(nsURI, localPart, nsURI);
|
|
106 }
|
|
107
|
|
108 }
|
|
109 else{
|
|
110 int endOfPrefix = qNameAsString.indexOf(':'); //try prefix
|
|
111
|
|
112 if (endOfPrefix == -1){ //localpart only, use tagetNamespace from wsdls definition
|
|
113 if (wadlApp != null)
|
|
114 nsURI = wadlApp.getTargetNamespace();
|
|
115 else
|
|
116 nsURI = XMLConstants.NULL_NS_URI;
|
|
117 return new QName(nsURI, qNameAsString);
|
|
118 }
|
|
119 else if (wadlApp != null){ //prefix + localpart
|
|
120 prefix = qNameAsString.substring(1, endOfPrefix);
|
|
121 nsURI = wadlApp.getNamespace(prefix);
|
|
122 localPart = qNameAsString.substring(endOfPrefix + 1);
|
|
123 return new QName(nsURI, localPart, nsURI);
|
|
124 }
|
|
125 else
|
|
126 throw new IllegalArgumentException(
|
|
127 "cannot create QName from \""
|
|
128 + qNameAsString
|
|
129 + "\", no URI and no wsdl definition is given");
|
|
130 }
|
|
131 }
|
|
132 } |