1 42 43 package org.jfree.xml.generator; 44 45 import java.io.File ; 46 import java.io.FileFilter ; 47 import java.lang.reflect.Modifier ; 48 import java.util.ArrayList ; 49 50 import org.jfree.ui.ExtensionFileFilter; 51 import org.jfree.util.Log; 52 import org.jfree.util.ObjectUtilities; 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 } 273
| Popular Tags
|