01: package org.objectweb.celtix.tools.utils;
02:
03: import java.net.MalformedURLException;
04: import java.net.URL;
05: import java.net.URLStreamHandler;
06: import java.util.StringTokenizer;
07:
08: public final class URLFactory {
09: public static final String PROTOCOL_HANDLER_PKGS = "java.protocol.handler.pkgs";
10: public static final String UNKNOWN_PROPTOCL_EX_MSG = "unknown protocol: ";
11:
12: private URLFactory() {
13:
14: }
15:
16: public static URL createURL(String spec)
17: throws MalformedURLException {
18: return createURL(null, spec);
19: }
20:
21: public static URL createURL(URL context, String spec)
22: throws MalformedURLException {
23: URL url = null;
24: try {
25: url = new URL(context, spec);
26: } catch (MalformedURLException mue) {
27:
28: String msg = mue.getMessage();
29: if (msg.indexOf(UNKNOWN_PROPTOCL_EX_MSG) != -1) {
30: URLStreamHandler handler = findHandler(msg
31: .substring(UNKNOWN_PROPTOCL_EX_MSG.length()));
32: if (handler != null) {
33: url = new URL(context, spec, handler);
34: }
35: }
36: if (url == null) {
37: throw mue;
38: }
39: }
40: return url;
41: }
42:
43: public static URLStreamHandler findHandler(String protocol) {
44:
45: URLStreamHandler handler = null;
46: String packagePrefixList = System.getProperty(
47: PROTOCOL_HANDLER_PKGS, "");
48: StringTokenizer packagePrefixIter = new StringTokenizer(
49: packagePrefixList, "|");
50: while (handler == null && packagePrefixIter.hasMoreTokens()) {
51: String packagePrefix = packagePrefixIter.nextToken().trim();
52: try {
53: String clsName = packagePrefix + "." + protocol
54: + ".Handler";
55: Class cls = null;
56: try {
57: cls = Class.forName(clsName);
58: } catch (ClassNotFoundException e) {
59: ClassLoader cl = Thread.currentThread()
60: .getContextClassLoader();
61: if (cl != null) {
62: cls = cl.loadClass(clsName);
63: }
64: }
65: if (cls != null) {
66: handler = (URLStreamHandler) cls.newInstance();
67: }
68: } catch (Exception ignored) {
69: ignored.getMessage();
70: }
71: }
72: return handler;
73: }
74: }
|