1:
42:
43: package ;
44:
45: import ;
46: import ;
47: import ;
48: import ;
49:
50: import ;
51: import ;
52: import ;
53:
54:
58: public class JavaSourceCollector implements SourceCollector {
59:
60:
63: private static class CollectorFileFilter extends ExtensionFileFilter implements FileFilter {
64:
70: public CollectorFileFilter(final String description, final String extension) {
71: super(description, extension);
72: }
73: }
74:
75:
76: private CollectorFileFilter eff;
77:
78:
79: private ArrayList fileList;
80:
81:
82: private ArrayList ignoredPackages;
83:
84:
85: private ArrayList ignoredBaseClasses;
86:
87:
88: private File startDirectory;
89:
90:
91: private String initialPackageName;
92:
93:
98: public JavaSourceCollector(final File startDirectory) {
99: this(startDirectory, "");
100: }
101:
102:
108: public JavaSourceCollector(final File startDirectory, final String packageName) {
109: this.eff = new CollectorFileFilter("<ignore>", ".java");
110: this.fileList = new ArrayList();
111: this.startDirectory = startDirectory;
112: this.initialPackageName = packageName;
113: this.ignoredPackages = new ArrayList();
114: this.ignoredBaseClasses = new ArrayList();
115: }
116:
117:
122: public void addIgnoredPackage(final String pkg) {
123: Log.debug (new Log.SimpleMessage("Added IgnPackage: " , pkg));
124: this.ignoredPackages.add(pkg);
125: }
126:
127:
132: public void addIgnoredBaseClass(final String baseClass) {
133: final Class loadedClass = loadClass(baseClass);
134: if (loadedClass != null) {
135: Log.debug (new Log.SimpleMessage("Added IgnClass: " , baseClass));
136: this.ignoredBaseClasses.add(loadedClass);
137: }
138: }
139:
140:
145: public void addIgnoredBaseClass(final Class baseClass) {
146: this.ignoredBaseClasses.add(baseClass);
147: }
148:
149:
157: protected boolean isIgnoredPackage(final String classname) {
158: for (int i = 0; i < this.ignoredPackages.size(); i++) {
159: final String ignoredPackage = (String) this.ignoredPackages.get(i);
160: if (classname.startsWith(ignoredPackage)) {
161: return true;
162: }
163: }
164: return false;
165: }
166:
167:
175: protected boolean isIgnoredBaseClass(final Class c) {
176: for (int i = 0; i < this.ignoredBaseClasses.size(); i++) {
177: final Class ignoredClass = (Class) this.ignoredBaseClasses.get(i);
178: if (ignoredClass.isAssignableFrom(c)) {
179: return true;
180: }
181: }
182: return false;
183: }
184:
185:
188: public void collectFiles() {
189: collectFiles(this.startDirectory, this.initialPackageName);
190: }
191:
192:
198: protected void collectFiles(final File directory, final String packageName) {
199: final File[] files = directory.listFiles(this.eff);
200: for (int i = 0; i < files.length; i++) {
201: if (files[i].isDirectory()) {
202: collectFiles(files[i], buildJavaName(packageName, files[i].getName()));
203: }
204: else {
205: final String fname = files[i].getName();
206: final String className = fname.substring(0, fname.length() - 5);
207: final String fullName = buildJavaName(packageName, className);
208: if (isIgnoredPackage(fullName)) {
209: Log.debug (new Log.SimpleMessage("Do not process: Ignored: ", className));
210: continue;
211: }
212: final Class jclass = loadClass(fullName);
213: if (jclass == null || isIgnoredBaseClass(jclass)) {
214: continue;
215: }
216: if (jclass.isInterface() || Modifier.isAbstract(jclass.getModifiers())) {
217: Log.debug (new Log.SimpleMessage("Do not process: Abstract: ", className));
218: continue;
219: }
220: if (!Modifier.isPublic(jclass.getModifiers())) {
221: Log.debug (new Log.SimpleMessage("Do not process: Not public: ", className));
222: continue;
223: }
224: this.fileList.add(jclass);
225: }
226: }
227: }
228:
229:
236: protected Class loadClass(final String name) {
237: try {
238: return ObjectUtilities.getClassLoader(JavaSourceCollector.class).loadClass(name);
239: }
240: catch (Exception e) {
241: Log.warn (new Log.SimpleMessage("Do not process: Failed to load class:", name));
242: return null;
243: }
244: }
245:
246:
254: protected String buildJavaName(final String packageName, final String newPackage) {
255: if (packageName.length() == 0) {
256: return newPackage;
257: }
258: else {
259: return packageName + "." + newPackage;
260: }
261: }
262:
263:
268: public Class[] getClasses() {
269: return (Class[]) this.fileList.toArray(new Class[0]);
270: }
271:
272: }