1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.discovery.resource.names;
18
19 import java.io.BufferedReader;
20 import java.io.IOException;
21 import java.io.InputStream;
22 import java.io.InputStreamReader;
23 import java.util.ArrayList;
24 import java.util.List;
25
26 import org.apache.commons.discovery.Resource;
27 import org.apache.commons.discovery.ResourceDiscover;
28 import org.apache.commons.discovery.ResourceIterator;
29 import org.apache.commons.discovery.ResourceNameDiscover;
30 import org.apache.commons.discovery.ResourceNameIterator;
31 import org.apache.commons.discovery.resource.ClassLoaders;
32 import org.apache.commons.discovery.resource.DiscoverResources;
33 import org.apache.commons.logging.Log;
34 import org.apache.commons.logging.LogFactory;
35
36
37
38
39
40
41
42
43
44
45
46
47
48 public class DiscoverNamesInFile extends ResourceNameDiscoverImpl implements ResourceNameDiscover {
49
50 private static Log log = LogFactory.getLog(DiscoverNamesInFile.class);
51
52
53
54
55
56
57
58 @Deprecated
59 public static void setLog(Log _log) {
60 log = _log;
61 }
62
63 private ResourceDiscover _discoverResources;
64
65 private final String _prefix;
66
67 private final String _suffix;
68
69
70
71
72 public DiscoverNamesInFile() {
73 _discoverResources = new DiscoverResources();
74 _prefix = null;
75 _suffix = null;
76 }
77
78
79
80
81
82
83
84 public DiscoverNamesInFile(String prefix, String suffix) {
85 _discoverResources = new DiscoverResources();
86 _prefix = prefix;
87 _suffix = suffix;
88 }
89
90
91
92
93
94
95 public DiscoverNamesInFile(ClassLoaders loaders) {
96 _discoverResources = new DiscoverResources(loaders);
97 _prefix = null;
98 _suffix = null;
99 }
100
101
102
103
104
105
106
107
108 public DiscoverNamesInFile(ClassLoaders loaders, String prefix, String suffix) {
109 _discoverResources = new DiscoverResources(loaders);
110 _prefix = prefix;
111 _suffix = suffix;
112 }
113
114
115
116
117
118
119 public DiscoverNamesInFile(ResourceDiscover discoverer) {
120 _discoverResources = discoverer;
121 _prefix = null;
122 _suffix = null;
123 }
124
125
126
127
128
129
130
131
132 public DiscoverNamesInFile(ResourceDiscover discoverer, String prefix, String suffix) {
133 _discoverResources = discoverer;
134 _prefix = prefix;
135 _suffix = suffix;
136 }
137
138
139
140
141
142
143 public void setDiscoverer(ResourceDiscover discover) {
144 _discoverResources = discover;
145 }
146
147
148
149
150
151
152
153
154 public ResourceDiscover getDiscover() {
155 return _discoverResources;
156 }
157
158
159
160
161 @Override
162 public ResourceNameIterator findResourceNames(final String serviceName) {
163 String fileName;
164 if (_prefix != null && _prefix.length() > 0) {
165 fileName = _prefix + serviceName;
166 } else {
167 fileName = serviceName;
168 }
169
170 if (_suffix != null && _suffix.length() > 0) {
171 fileName = fileName + _suffix;
172 }
173
174 if (log.isDebugEnabled()) {
175 if (_prefix != null && _suffix != null) {
176 log.debug("find: serviceName='" + serviceName + "' as '" + fileName + "'");
177 } else {
178 log.debug("find: serviceName = '" + fileName + "'");
179 }
180 }
181
182
183 final ResourceIterator files =
184 getDiscover().findResources(fileName);
185
186 return new ResourceNameIterator() {
187
188 private int idx = 0;
189
190 private List<String> classNames = null;
191
192 private String resource = null;
193
194 public boolean hasNext() {
195 if (resource == null) {
196 resource = getNextClassName();
197 }
198 return resource != null;
199 }
200
201 public String nextResourceName() {
202 String element = resource;
203 resource = null;
204 return element;
205 }
206
207 private String getNextClassName() {
208 if (classNames == null || idx >= classNames.size()) {
209 classNames = getNextClassNames();
210 idx = 0;
211 if (classNames == null) {
212 return null;
213 }
214 }
215
216 String className = classNames.get(idx++);
217
218 if (log.isDebugEnabled()) {
219 log.debug("getNextClassResource: next class='" + className + "'");
220 }
221
222 return className;
223 }
224
225 private List<String> getNextClassNames() {
226 while (files.hasNext()) {
227 List<String> results = readServices(files.nextResource());
228 if (results != null && results.size() > 0) {
229 return results;
230 }
231 }
232 return null;
233 }
234 };
235 }
236
237
238
239
240
241
242
243 private List<String> readServices(final Resource info) {
244 List<String> results = new ArrayList<String>();
245
246 InputStream is = info.getResourceAsStream();
247
248 if (is != null) {
249 try {
250 try {
251
252
253
254 BufferedReader rd;
255 try {
256 rd = new BufferedReader(new InputStreamReader(is, "UTF-8"));
257 } catch (java.io.UnsupportedEncodingException e) {
258 rd = new BufferedReader(new InputStreamReader(is));
259 }
260
261 try {
262 String serviceImplName;
263 while( (serviceImplName = rd.readLine()) != null) {
264 int idx = serviceImplName.indexOf('#');
265 if (idx >= 0) {
266 serviceImplName = serviceImplName.substring(0, idx);
267 }
268 serviceImplName = serviceImplName.trim();
269
270 if (serviceImplName.length() != 0) {
271 results.add(serviceImplName);
272 }
273 }
274 } finally {
275 rd.close();
276 }
277 } finally {
278 is.close();
279 }
280 } catch (IOException e) {
281
282 }
283 }
284
285 return results;
286 }
287
288 }