1
2
3
4
5
6
7
8
9
10
11 package org.mule.util;
12
13 import java.io.IOException;
14 import java.io.InputStream;
15 import java.security.AccessController;
16 import java.security.PrivilegedAction;
17 import java.util.Properties;
18
19 import org.apache.commons.discovery.DiscoveryException;
20 import org.apache.commons.discovery.resource.ClassLoaders;
21 import org.apache.commons.discovery.tools.DiscoverClass;
22 import org.apache.commons.logging.Log;
23 import org.apache.commons.logging.LogFactory;
24
25
26 public final class SpiUtils
27 {
28 private static final Log logger = LogFactory.getLog(SpiUtils.class);
29
30 public static final String SERVICE_ROOT = "META-INF/services/";
31
32
33 private SpiUtils ()
34 {
35
36 }
37
38
39
40
41
42
43
44
45
46
47
48
49 public static Class findService(Class spi, String propertyFileName, String defaultImpl, Class currentClass)
50 {
51 ClassLoaders loaders = ClassLoaders.getAppLoaders(spi, currentClass, false);
52 DiscoverClass discover = new DiscoverClass(loaders);
53 try
54 {
55 return discover.find(spi, propertyFileName, defaultImpl);
56 }
57 catch (DiscoveryException e)
58 {
59
60 logger.warn("Failed to find service for spi: " + spi.getName());
61 return null;
62 }
63 }
64
65
66
67
68
69
70
71
72
73
74
75
76 public static Class findService(final Class spi, final String defaultImpl, final Class currentClass)
77 {
78 ClassLoaders loaders = (ClassLoaders) AccessController.doPrivileged(new PrivilegedAction()
79 {
80 public Object run()
81 {
82 return ClassLoaders.getAppLoaders(spi, currentClass, false);
83 }
84 });
85 DiscoverClass discover = new DiscoverClass(loaders);
86 try
87 {
88 return discover.find(spi, System.getProperties(), defaultImpl);
89 }
90 catch (DiscoveryException e)
91 {
92
93 logger.warn("Failed to find service for spi: " + spi.getName());
94 return null;
95 }
96 }
97
98
99
100
101
102
103
104
105
106
107 public static Class findService(Class spi, Class currentClass)
108 {
109 ClassLoaders loaders = ClassLoaders.getAppLoaders(spi, currentClass, false);
110 DiscoverClass discover = new DiscoverClass(loaders);
111 try
112 {
113 return discover.find(spi, System.getProperties());
114 }
115 catch (DiscoveryException e)
116 {
117
118 logger.warn("Failed to find service for spi: " + spi.getName());
119 return null;
120 }
121 }
122
123
124
125
126
127
128
129
130
131
132
133
134 public static Class findService(Class spi, Properties props, Class currentClass)
135 {
136 ClassLoaders loaders = ClassLoaders.getAppLoaders(spi, currentClass, false);
137 DiscoverClass discover = new DiscoverClass(loaders);
138 try
139 {
140 return discover.find(spi, props);
141 }
142 catch (DiscoveryException e)
143 {
144
145 logger.warn("Failed to find service for spi: " + spi.getName());
146 return null;
147 }
148 }
149
150 public static InputStream findServiceDescriptor(String path, String name, Class currentClass)
151 {
152 if (path.startsWith("/"))
153 {
154 path = path.substring(1);
155 }
156 if (!path.endsWith("/"))
157 {
158 path += "/";
159 }
160 if (path.startsWith(SERVICE_ROOT))
161 {
162 path += name;
163 }
164 else
165 {
166 path = SERVICE_ROOT + path + name;
167 }
168 try
169 {
170 return IOUtils.getResourceAsStream(path, currentClass, false, false);
171 }
172 catch (IOException e)
173 {
174 return null;
175 }
176 }
177 }