1 10 package org.mmbase.util.xml; 11 12 import javax.xml.transform.*; 13 import javax.xml.transform.stream.*; 14 import java.io.*; 15 import java.net.*; 16 import java.util.*; 17 18 import org.mmbase.util.SizeMeasurable; 19 import org.mmbase.util.ResourceLoader; 20 import org.mmbase.util.logging.Logger; 21 import org.mmbase.util.logging.Logging; 22 23 46 47 public class URIResolver implements javax.xml.transform.URIResolver , SizeMeasurable, Serializable { 48 49 50 private static final long serialVersionUID = 1L; private static final Logger log = Logging.getLoggerInstance(URIResolver.class); 52 53 private EntryList dirs; private int hashCode; 55 56 57 71 72 public URIResolver(URL c, boolean overhead) { 73 hashCode = c.hashCode(); 74 } 75 79 80 public URIResolver(URL c) { 81 this(c, null); 82 } 83 84 87 private static URL toURL(File f) { 88 try { 89 return f.toURL(); 90 } catch (Exception e) { 91 return null; 92 } 93 } 94 97 public URIResolver(File f) { 98 this(toURL(f), null); 99 } 100 101 104 public URIResolver() { 105 this((URL) null, null); 106 } 107 108 111 public URIResolver(File f, EntryList extraDirs) { 112 this(toURL(f), extraDirs); 113 } 114 115 126 public URIResolver(URL c, EntryList extraDirs) { 127 if (log.isDebugEnabled()) log.debug("Creating URI Resolver for " + c); 128 URL cwd; 129 if (c == null) { 130 File[] roots = File.listRoots(); 131 if (roots != null && roots.length > 0) { 132 try { 133 cwd = roots[0].toURL(); 134 } catch (Exception e) { 135 cwd = null; 136 } 137 } else { 138 log.warn("No filesystem root available, trying with 'null'"); 139 cwd = null; 140 } 143 } else { 144 cwd = c; 145 } 146 dirs = new EntryList(); 147 dirs.add(new Entry("", cwd)); 148 if (extraDirs != null) { 149 dirs.addAll(extraDirs); 150 } 151 dirs.add(new Entry("mm:", ResourceLoader.getConfigurationRoot())); 152 154 if (extraDirs == null || extraDirs.size() == 0) { if (log.isDebugEnabled()) log.debug("getting hashCode " + cwd.hashCode()); 156 hashCode = cwd.hashCode(); 157 } else { 160 hashCode = dirs.hashCode(); } 162 } 163 164 169 public URL getCwd() { 170 return ((Entry) dirs.get(0)).getDir(); 171 } 172 173 178 public String getPath() { 179 StringBuffer result = new StringBuffer (); 180 Iterator i = dirs.iterator(); 181 while (i.hasNext()) { 182 Entry entry = (Entry) i.next(); 183 result.append(File.pathSeparatorChar); 184 result.append(entry.getDir().toString()); 185 } 186 return result.toString(); 187 } 188 189 194 public List getPrefixPath() { 195 List result = new ArrayList(); 196 Iterator i = dirs.iterator(); 197 while (i.hasNext()) { 198 Entry entry = (Entry) i.next(); 199 result.add(entry.getPrefix() + entry.getDir().toString()); 200 } 201 return result; 202 } 203 204 207 public File resolveToFile(String href) { 208 return resolveToFile(href, null); 209 } 210 213 public File resolveToFile(String href, String base) { 214 try { 215 return new File(resolveToURL(href, base).getFile()); 216 } catch (Exception e) { 217 return null; 218 } 219 } 220 221 222 223 224 225 public URL resolveToURL(final String href, final String base) throws TransformerException { 226 if (log.isDebugEnabled()) { 227 log.debug("Using resolver " + this + " to resolve href: " + href + " base: " + base); 228 } 229 try { 230 URL baseURL; 231 if (base == null || base.endsWith("javax.xml.transform.stream.StreamSource")) { 233 baseURL = getCwd(); 234 } else { 235 baseURL = resolveToURL(base, null); } 237 238 URL path = null; 239 { Iterator i = dirs.iterator(); 241 while (i.hasNext()) { 242 Entry entry = (Entry) i.next(); 243 String pref = entry.getPrefix(); 244 if (! "".equals(pref) && href.startsWith(pref)) { path = entry.getPath(href.substring(entry.getPrefixLength())); 246 if (log.isTraceEnabled()) { 247 log.trace("href matches " + entry + " returning " + path); 248 } 249 break; 250 } 251 try { 252 URL u = entry.getPath(href); 253 if (log.isTraceEnabled()) { 254 log.trace("Trying " + u + " " + u.getClass()); 255 } 256 if (u.openConnection().getInputStream() != null) { 258 log.trace("Ok, breaking"); 259 path = u; 260 break; 261 } 262 } catch (MalformedURLException mfe) { 263 log.debug(mfe); 264 } catch (java.io.IOException io) { 266 log.debug(io); 267 } 269 } 270 } 271 272 if (path == null) { 274 if (href.startsWith("file:")) { path = new URL(baseURL, href.substring(5)); 276 } else { 277 path = new URL(baseURL, href); 278 } 279 try { 280 if (path.openConnection().getInputStream() == null) { 281 path = null; 282 } 283 } catch (Exception e) { 284 path = null; 285 } 286 287 } 288 if (log.isDebugEnabled()) { 289 log.debug("Returning " + path); 290 } 291 return path; 292 293 } catch (Exception e) { 294 throw new TransformerException(e); 295 } 296 } 297 298 303 304 public Source resolve(String href, String base) throws TransformerException { 305 try { 306 URL u = resolveToURL(href, base); 307 if (u == null) return null; 308 Source source = new StreamSource(u.openStream()); 309 source.setSystemId(u.toString()); 310 return source; 311 } catch (Exception e) { 312 throw new TransformerException(e); 313 } 314 } 315 316 317 320 public int hashCode() { 321 return hashCode; 322 } 323 324 327 public boolean equals(Object o) { 328 if (o != null && (o instanceof URIResolver)) { 329 URIResolver res = (URIResolver) o; 330 return (dirs == null ? (res.dirs == null || res.dirs.size() == 1) : dirs.equals(res.dirs)); 331 } 335 return false; 336 } 337 338 339 public int getByteSize() { 340 return getByteSize(new org.mmbase.util.SizeOf()); 341 } 342 343 public int getByteSize(org.mmbase.util.SizeOf sizeof) { 344 return sizeof.sizeof(dirs); 345 } 346 public String toString() { 347 return getPrefixPath().toString(); 348 } 349 350 353 354 static public class EntryList extends ArrayList { 355 public EntryList() { 356 } 357 358 361 public boolean add(Object o) { 362 if (!(o instanceof Entry)) { 363 throw new IllegalArgumentException ("object must be of type Entry"); 364 } 365 return super.add(o); 366 } 367 368 374 public EntryList add(String p, File d) { 375 try { 376 add(new Entry(p, d.toURI().toURL())); 377 return this; 378 } catch (Exception e) { 379 return this; 380 } 381 } 382 public EntryList add(String p, URL u) { 383 try { 384 add(new Entry(p, u)); 385 return this; 386 } catch (Exception e) { 387 return this; 388 } 389 } 390 393 public EntryList add(String p, ClassLoader cl) { 394 try { 395 add(new Entry(p, cl)); 396 return this; 397 } catch (Exception e) { 398 return this; 399 } 400 } 401 } 402 403 409 410 static class Entry implements java.io.Serializable { 411 private static final long serialVersionUID = 1L; 412 private String prefix; 413 private URL dir; 414 private ClassLoader classLoader; 415 private int prefixLength; 416 417 Entry(String p, URL u) { 418 prefix = p; 419 dir = u; 420 classLoader = null; 421 prefixLength = prefix.length(); } 423 Entry(String p, ClassLoader cl) { 424 prefix = p; 425 dir = null; 426 classLoader = cl; 427 prefixLength = prefix.length(); } 429 430 private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException { 431 try { 432 out.writeUTF(prefix); 433 if (dir == null) { 434 out.writeObject("mm"); 435 } else { 436 out.writeObject(dir); 437 } 438 } catch (Throwable t) { 439 log.warn(t); 440 } 441 } 442 private void readObject(java.io.ObjectInputStream in) throws java.io.IOException , ClassNotFoundException { 443 try { 444 prefix = in.readUTF(); 445 Object o = in.readObject(); 446 if ("mm".equals(o)) { 447 classLoader = ResourceLoader.getConfigurationRoot(); 448 dir = null; 449 } else { 450 dir = (URL) o; 451 classLoader = null; 452 } 453 log.info("dir " + dir + " claddLoader " + classLoader); 454 } catch (Throwable t) { 455 log.warn(t); 456 } 457 prefixLength = prefix.length(); 458 } 459 460 String getPrefix() { 461 return prefix; 462 } 463 URL getDir() { 464 if (dir != null) { 465 return dir; 466 } else { 467 return classLoader.getResource(""); 468 } 469 } 470 471 475 URL getPath(String href) throws MalformedURLException { 476 if (dir != null) { 477 return new URL(dir, href); 478 } else { 479 return classLoader.getResource(href); 480 } 481 } 482 int getPrefixLength() { 483 return prefixLength; 484 } 485 public String toString() { 486 return prefix + ":" + (dir != null ? dir.toString() : classLoader.toString()); 487 } 488 public boolean equals(Object o) { 489 if (o instanceof File) { 490 return dir != null && dir.equals(o); 491 } else if (o instanceof Entry) { 492 Entry e = (Entry) o; 493 return dir != null ? 494 dir.equals(e.dir) : 495 classLoader.equals(e.classLoader); 496 } else { 497 return false; 498 } 499 } 500 501 public int hashCode() { 502 if (dir != null) { 503 return dir.hashCode(); 504 } else { 505 return classLoader.hashCode(); 506 } 507 } 508 509 } 510 511 515 public static void main(String argv[]) throws Exception { 516 517 URIResolver resolver = new URIResolver(new URL("file:///tmp/")); 518 System.out.println("Resolving with " + resolver); 519 String href, base; 520 521 href = "xsl/list.xsl"; base = null; 522 System.out.println("href: " + href + " base: " + base + " --> " + resolver.resolveToURL(href, base)); 523 href = "xsl/prompts.xsl"; base = "file:///home/mmbase/mmbase17/mmbase/edit/wizard/data/xsl/base.xsl"; 524 System.out.println("href: " + href + " base: " + base + " --> " + resolver.resolveToURL(href, base)); 525 526 FileOutputStream fos = new FileOutputStream("/tmp/uriresolver.ser"); 527 ObjectOutputStream oos = new ObjectOutputStream(fos); 528 oos.writeObject(resolver); 529 oos.close(); 530 531 FileInputStream fis = new FileInputStream("/tmp/uriresolver.ser"); 532 ObjectInputStream ois = new ObjectInputStream(fis); 533 URIResolver resolver2 = (URIResolver) ois.readObject(); 534 ois.close(); 535 536 System.out.println("r " + resolver2.resolveToURL("mm:hoi", null).getProtocol()); 537 538 href = "xsl/list.xsl"; base = null; 539 System.out.println("href: " + href + " base: " + base + " --> " + resolver2.resolveToURL(href, base)); 540 href = "xsl/prompts.xsl"; base = "file:///home/mmbase/mmbase17/mmbase/edit/wizard/data/xsl/base.xsl"; 541 System.out.println("href: " + href + " base: " + base + " --> " + resolver2.resolveToURL(href, base)); 542 543 544 545 } 546 547 } 548 | Popular Tags |