1
2
3
4
5
6
7
8
9
10 package org.mule.module.ibeans.config;
11
12 import org.mule.config.AnnotationsConfigurationBuilder;
13 import org.mule.util.ClassUtils;
14 import org.mule.util.StringMessageUtils;
15 import org.mule.util.scan.ClasspathScanner;
16
17 import java.io.IOException;
18 import java.net.URL;
19 import java.util.ArrayList;
20 import java.util.Arrays;
21 import java.util.Enumeration;
22 import java.util.List;
23 import java.util.Properties;
24 import java.util.StringTokenizer;
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 public abstract class AbstractAnnotationConfigurationBuilder extends AnnotationsConfigurationBuilder
40 {
41 public static final String IBEANS_PROPERTIES = "META-INF/ibeans-app.properties";
42
43 public static final String[] DEFAULT_BASE_PACKAGE = new String[]{""};
44
45
46 protected ClassLoader classLoader;
47 protected String[] basepackages;
48
49 public AbstractAnnotationConfigurationBuilder()
50 {
51 this(DEFAULT_BASE_PACKAGE);
52 }
53
54 public AbstractAnnotationConfigurationBuilder(String... basepackages)
55 {
56 this.classLoader = Thread.currentThread().getContextClassLoader();
57 this.basepackages = basepackages;
58 }
59
60 public AbstractAnnotationConfigurationBuilder(ClassLoader classLoader)
61 {
62 this(classLoader, DEFAULT_BASE_PACKAGE);
63 }
64
65 public AbstractAnnotationConfigurationBuilder(ClassLoader classLoader, String... basepackages)
66 {
67 this.classLoader = classLoader;
68 this.basepackages = basepackages;
69 }
70
71 protected ClasspathScanner createClasspathScanner() throws IOException
72 {
73 if (Arrays.equals(DEFAULT_BASE_PACKAGE, basepackages))
74 {
75 basepackages = findPackages();
76 }
77
78 String[] paths = convertPackagesToPaths(basepackages);
79 if(logger.isInfoEnabled())
80 {
81 logger.info("Scanning for annotations using the following paths: " + StringMessageUtils.toString(paths));
82 }
83 return new ClasspathScanner(classLoader, paths);
84 }
85
86 protected abstract String getScanPackagesProperty();
87
88 protected String[] convertPackagesToPaths(String[] packages)
89 {
90 String[] paths = new String[packages.length];
91 for (int i = 0; i < packages.length; i++)
92 {
93 paths[i] = packages[i].replaceAll("[.]", "/");
94 }
95 return paths;
96 }
97
98 protected String[] findPackages() throws IOException
99 {
100 List<String> paths = new ArrayList<String>();
101 Properties p = new Properties();
102 Enumeration e = ClassUtils.getResources(IBEANS_PROPERTIES, getClass());
103 boolean scanAll = false;
104 while (e.hasMoreElements())
105 {
106 URL url = (URL) e.nextElement();
107
108 if(logger.isInfoEnabled()) logger.info("reading packages from: " + url);
109 p.load(url.openStream());
110 String path = p.getProperty(getScanPackagesProperty());
111 if (path != null)
112 {
113 for (StringTokenizer tokenizer = new StringTokenizer(path, ","); tokenizer.hasMoreTokens();)
114 {
115 String s = tokenizer.nextToken();
116 if("*".equals(s)) {
117 scanAll=true;
118 break;
119 }
120 paths.add(s.trim());
121 }
122 }
123 }
124
125 if (paths.size() == 0 || scanAll)
126 {
127 return DEFAULT_BASE_PACKAGE;
128 }
129 return paths.toArray(new String[]{});
130 }
131 }