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 resolveQNameUsingElement (Object 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 || qname instanceof UntypedAtomic)) 16 throw new RuntimeException ("bad argument to QName"); 17 String name = TextUtils.replaceWhitespace(qname.toString(), true); 18 int colon = name.indexOf(':'); 19 String 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 ("unknown namespace for '"+name+"'"); 37 } 38 if (! validNCName(localPart) 39 || (prefix != null && ! validNCName(prefix))) 40 { 41 throw new RuntimeException ("invalid QName syntax '"+name+"'"); 42 } 43 return Symbol.make(uri, localPart, prefix == null ? "" : prefix); 44 } 45 46 53 public static Object resolveQName (Object 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 || qname instanceof UntypedAtomic)) 62 throw new RuntimeException ("bad argument to QName"); 63 String name = TextUtils.replaceWhitespace(qname.toString(), true); 64 int colon = name.indexOf(':'); 65 String 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 ("invalid QName syntax '"+name+"'"); 80 } 81 String uri = resolvePrefix(prefix, constructorNamespaces, prologNamespaces); 82 return Symbol.make(uri, localPart, prefix == null ? "" : prefix); 83 } 84 85 88 public static String lookupPrefix (String prefix, 89 NamespaceBinding constructorNamespaces, 90 NamespaceBinding prologNamespaces) 91 { 92 String 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 115 public static String resolvePrefix (String prefix, 116 NamespaceBinding constructorNamespaces, 117 NamespaceBinding prologNamespaces) 118 { 119 String uri = lookupPrefix(prefix, constructorNamespaces, prologNamespaces); 120 if (uri == null) 121 throw new RuntimeException ("unknown namespace prefix '"+prefix+"'"); 122 return uri; 123 } 124 125 public static boolean validNCName (String name) 126 { 127 return XName.isName(name); 128 } 129 130 131 132 public static Symbol makeQName (Object paramURI, String paramQName) 133 { 134 if (paramURI == null || paramURI == Values.empty) 135 paramURI = ""; 136 int colon = paramQName.indexOf(':'); 137 String namespaceURI = (String ) 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 ("invalid QName syntax '"+paramQName+"'"); 151 if (colon >= 0 && namespaceURI.length() == 0) 152 throw new IllegalArgumentException ("empty uri for '"+paramQName+"'"); 153 return Symbol.make(namespaceURI, localPart, prefix); 154 } 155 156 public static Object localNameFromQName (Object 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 prefixFromQName (Object name) 166 { 167 if (name == Values.empty || name == null) 168 return name; 169 if (name instanceof Symbol) 170 { 171 String 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 namespaceURIFromQName (Object 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 namespaceURIForPrefix (Object prefix, 189 Object 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 str; 195 if (prefix == null || prefix == Values.empty) 196 str = null; 197 else if (! (prefix instanceof String || 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 uri = el.lookupNamespaceURI(str); 206 if (uri == null) 207 return Values.empty; 208 else 209 return uri; 210 } 211 212 public static Object resolveURI (Object relative, Object base) 213 throws java.net.URISyntaxException 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 |