KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > gnu > xquery > util > QNameUtils


1 package gnu.xquery.util;
2 import gnu.mapping.*;
3 import gnu.xml.*;
4 import gnu.kawa.xml.*;
5 import gnu.text.URI_utils;
6
7 public class QNameUtils
8 {
9   public static Object JavaDoc resolveQNameUsingElement (Object JavaDoc qname, KElement node)
10   {
11     qname = KNode.atomicValue(qname);
12     if (qname == Values.empty || qname == null)
13       return qname;
14     if (qname instanceof Values
15         || ! (qname instanceof String JavaDoc || qname instanceof UntypedAtomic))
16       throw new RuntimeException JavaDoc("bad argument to QName");
17     String JavaDoc name = TextUtils.replaceWhitespace(qname.toString(), true);
18     int colon = name.indexOf(':');
19     String JavaDoc prefix, localPart, uri;
20     if (colon < 0)
21       {
22     prefix = null;
23     localPart = name;
24       }
25     else
26       {
27     prefix = name.substring(0, colon).intern();
28     localPart = name.substring(colon+1);
29       }
30     uri = node.lookupNamespaceURI(prefix);
31     if (uri == null)
32       {
33         if (prefix == null)
34           uri = "";
35         else
36           throw new RuntimeException JavaDoc("unknown namespace for '"+name+"'");
37       }
38     if (! validNCName(localPart)
39     || (prefix != null && ! validNCName(prefix)))
40       {
41     throw new RuntimeException JavaDoc("invalid QName syntax '"+name+"'");
42       }
43     return Symbol.make(uri, localPart, prefix == null ? "" : prefix);
44   }
45
46   /** Method called from compiled code to "cast" to a QName.
47    * @param qname The value to cast to QName.
48    * @param constructorNamespaces Namespace bindings from namespace
49    * attributes in direct element constructors.
50    * @param prologNamespaces Namespac bindings from query prolog,
51    * as well as builtin namespace prefixes.
52    */

53   public static Object JavaDoc resolveQName (Object JavaDoc qname,
54                      NamespaceBinding constructorNamespaces,
55                      NamespaceBinding prologNamespaces)
56   {
57     qname = KNode.atomicValue(qname);
58     if (qname instanceof Symbol)
59       return qname;
60     if (qname instanceof Values
61         || ! (qname instanceof String JavaDoc || qname instanceof UntypedAtomic))
62       throw new RuntimeException JavaDoc("bad argument to QName");
63     String JavaDoc name = TextUtils.replaceWhitespace(qname.toString(), true);
64     int colon = name.indexOf(':');
65     String JavaDoc prefix, localPart;
66     if (colon < 0)
67       {
68     localPart = name;
69     prefix = null;
70       }
71     else
72       {
73     prefix = name.substring(0, colon).intern();
74     localPart = name.substring(colon+1);
75       }
76     if (! validNCName(localPart)
77     || (prefix != null && ! validNCName(prefix)))
78       {
79     throw new RuntimeException JavaDoc("invalid QName syntax '"+name+"'");
80       }
81     String JavaDoc uri = resolvePrefix(prefix, constructorNamespaces, prologNamespaces);
82     return Symbol.make(uri, localPart, prefix == null ? "" : prefix);
83   }
84
85   /** Search for a uri matching the given prefix.
86    * @return uri or null if there is no binding for prefix.
87    */

88   public static String JavaDoc lookupPrefix (String JavaDoc prefix,
89                                      NamespaceBinding constructorNamespaces,
90                                      NamespaceBinding prologNamespaces)
91   {
92     String JavaDoc uri;
93
94     for (NamespaceBinding ns = constructorNamespaces; ; ns = ns.getNext())
95       {
96         if (ns == null)
97           {
98             uri = prologNamespaces.resolve(prefix);
99             break;
100           }
101     if (ns.getPrefix() == prefix || ns.getUri() == null)
102           {
103             uri = ns.getUri();
104             break;
105           }
106       }
107     if (uri == null && prefix == null)
108       uri = "";
109     return uri;
110   }
111
112   /** Search for a uri matching the given prefix.
113    * Throw exception if there is no binding and the prefix is non-empty.
114    */

115   public static String JavaDoc resolvePrefix (String JavaDoc prefix,
116                                       NamespaceBinding constructorNamespaces,
117                                       NamespaceBinding prologNamespaces)
118   {
119     String JavaDoc uri = lookupPrefix(prefix, constructorNamespaces, prologNamespaces);
120     if (uri == null)
121       throw new RuntimeException JavaDoc("unknown namespace prefix '"+prefix+"'");
122     return uri;
123   }
124
125   public static boolean validNCName (String JavaDoc name)
126   {
127     return XName.isName(name);
128   }
129
130   /** This implements the <code>fn:QName</code> standard function. */
131
132   public static Symbol makeQName (Object JavaDoc paramURI, String JavaDoc paramQName)
133   {
134     if (paramURI == null || paramURI == Values.empty)
135       paramURI = "";
136     int colon = paramQName.indexOf(':');
137     String JavaDoc namespaceURI = (String JavaDoc) paramURI, localPart, prefix;
138     if (colon < 0)
139       {
140     localPart = paramQName;
141     prefix = "";
142       }
143     else
144       {
145     localPart = paramQName.substring(colon+1);
146     prefix = paramQName.substring(0, colon).intern();
147       }
148     if (! validNCName(localPart)
149     || (colon >= 0 && ! validNCName(prefix)))
150       throw new IllegalArgumentException JavaDoc("invalid QName syntax '"+paramQName+"'");
151     if (colon >= 0 && namespaceURI.length() == 0)
152       throw new IllegalArgumentException JavaDoc("empty uri for '"+paramQName+"'");
153     return Symbol.make(namespaceURI, localPart, prefix);
154   }
155
156   public static Object JavaDoc localNameFromQName (Object JavaDoc name)
157   {
158     if (name == Values.empty || name == null)
159       return name;
160     if (name instanceof Symbol)
161       return ((Symbol) name).getName();
162     throw WrongType.make(null, "local-name-from-QName", 1, name);
163   }
164
165   public static Object JavaDoc prefixFromQName (Object JavaDoc name)
166   {
167     if (name == Values.empty || name == null)
168       return name;
169     if (name instanceof Symbol)
170       {
171         String JavaDoc prefix = ((Symbol) name).getPrefix();
172         if (prefix == null || prefix.length() == 0)
173           return Values.empty;
174         return prefix;
175       }
176     throw WrongType.make(null, "prefix-from-QName", 1, name);
177   }
178
179   public static Object JavaDoc namespaceURIFromQName (Object JavaDoc name)
180   {
181     if (name == Values.empty || name == null)
182       return name;
183     if (name instanceof Symbol)
184       return XDataType.toURI(((Symbol) name).getNamespaceURI());
185     throw WrongType.make(null, "namespace-uri", 1, name);
186   }
187
188   public static Object JavaDoc namespaceURIForPrefix (Object JavaDoc prefix,
189                           Object JavaDoc element)
190   {
191     KNode el = KNode.coerce(element);
192     if (el == null)
193       throw WrongType.make(null, "namespace-uri-for-prefix", 2, element);
194     String JavaDoc str;
195     if (prefix == null || prefix == Values.empty)
196       str = null;
197     else if (! (prefix instanceof String JavaDoc || prefix instanceof UntypedAtomic))
198       throw WrongType.make(null, "namespace-uri-for-prefix", 1, element);
199     else
200       {
201         str = prefix.toString().intern();
202         if (str == "")
203           str = null;
204       }
205     String JavaDoc uri = el.lookupNamespaceURI(str);
206     if (uri == null)
207       return Values.empty;
208     else
209       return uri;
210   }
211
212   public static Object JavaDoc resolveURI (Object JavaDoc relative, Object JavaDoc base)
213     throws java.net.URISyntaxException JavaDoc
214   {
215     if (relative instanceof KNode)
216       relative = KNode.atomicValue(relative);
217     if (base instanceof KNode)
218       base = KNode.atomicValue(base);
219     if (relative == Values.empty || relative == null)
220       return relative;
221     return URI_utils.resolve(relative, base);
222   }
223 }
224
Popular Tags