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 private static final String HANDLER_PKGS_SYSTEM_PROPERTY = "java.protocol.handler.pkgs";
38 private static final Log log = LogFactory.getLog(MuleUrlStreamHandlerFactory.class);
39
40 private static Map registry = Collections.synchronizedMap(new HashMap());
41
42
43
44
45
46
47
48
49 public static synchronized void installUrlStreamHandlerFactory()
50 {
51
52
53
54
55
56
57
58
59
60 try
61 {
62 URL.setURLStreamHandlerFactory(new MuleUrlStreamHandlerFactory());
63 }
64 catch (Error err)
65 {
66 if (log.isDebugEnabled())
67 {
68 log.debug("Custom MuleUrlStreamHandlerFactory already registered", err);
69 }
70 }
71 }
72
73 public static void registerHandler(String protocol, URLStreamHandler handler)
74 {
75 registry.put(protocol, handler);
76 }
77
78 public URLStreamHandler createURLStreamHandler(String protocol)
79 {
80 URLStreamHandler handler = (URLStreamHandler) registry.get(protocol);
81 if (handler == null)
82 {
83 handler = this.defaultHandlerCreateStrategy(protocol);
84 }
85 return handler;
86 }
87
88 private URLStreamHandler defaultHandlerCreateStrategy(String protocol)
89 {
90 String packagePrefixList = System.getProperty(HANDLER_PKGS_SYSTEM_PROPERTY, "");
91
92 if (packagePrefixList.endsWith("|") == false)
93 {
94 packagePrefixList += "|sun.net.www.protocol";
95 }
96
97 StringTokenizer tokenizer = new StringTokenizer(packagePrefixList, "|");
98
99 URLStreamHandler handler = null;
100 while (handler == null && tokenizer.hasMoreTokens())
101 {
102 String packagePrefix = tokenizer.nextToken().trim();
103 String className = packagePrefix + "." + protocol + ".Handler";
104 try
105 {
106 handler = (URLStreamHandler) ClassUtils.instanciateClass(className, null);
107 }
108 catch (Exception ex)
109 {
110
111 }
112 }
113
114 return handler;
115 }
116 }