1
2
3
4
5
6
7
8
9
10
11 package org.mule.util;
12
13 import java.net.URL;
14 import java.net.URLStreamHandler;
15 import java.net.URLStreamHandlerFactory;
16 import java.util.Collections;
17 import java.util.HashMap;
18 import java.util.Map;
19 import java.util.StringTokenizer;
20
21 import org.apache.commons.logging.Log;
22 import org.apache.commons.logging.LogFactory;
23
24
25
26
27
28
29
30
31
32
33
34
35 public class MuleUrlStreamHandlerFactory extends Object implements URLStreamHandlerFactory
36 {
37
38 private static final String HANDLER_PKGS_SYSTEM_PROPERTY = "java.protocol.handler.pkgs";
39 private static final Log log = LogFactory.getLog(MuleUrlStreamHandlerFactory.class);
40
41 private static Map registry = Collections.synchronizedMap(new HashMap());
42
43
44
45
46
47
48
49
50 public static synchronized void installUrlStreamHandlerFactory()
51 {
52
53
54
55
56
57
58
59
60
61 try
62 {
63 URL.setURLStreamHandlerFactory(new MuleUrlStreamHandlerFactory());
64 }
65 catch (Error err)
66 {
67 if (log.isDebugEnabled())
68 {
69 log.debug("Custom MuleUrlStreamHandlerFactory already registered", err);
70 }
71 }
72 }
73
74 public static void registerHandler(String protocol, URLStreamHandler handler)
75 {
76 registry.put(protocol, handler);
77 }
78
79 public URLStreamHandler createURLStreamHandler(String protocol)
80 {
81 URLStreamHandler handler = (URLStreamHandler) registry.get(protocol);
82 if (handler == null)
83 {
84 handler = this.defaultHandlerCreateStrategy(protocol);
85 }
86 return handler;
87 }
88
89 private URLStreamHandler defaultHandlerCreateStrategy(String protocol)
90 {
91 String packagePrefixList = System.getProperty(HANDLER_PKGS_SYSTEM_PROPERTY, "");
92
93 if (packagePrefixList.endsWith("|") == false)
94 {
95 packagePrefixList += "|sun.net.www.protocol";
96 }
97
98 StringTokenizer tokenizer = new StringTokenizer(packagePrefixList, "|");
99
100 URLStreamHandler handler = null;
101 while (handler == null && tokenizer.hasMoreTokens())
102 {
103 String packagePrefix = tokenizer.nextToken().trim();
104 String className = packagePrefix + "." + protocol + ".Handler";
105 try
106 {
107 handler = (URLStreamHandler) ClassUtils.instanciateClass(className);
108 }
109 catch (Exception ex)
110 {
111
112 }
113 }
114
115 return handler;
116 }
117 }