Changeset 982 for AnalyzerBeans/trunk/src/main/java/org/eobjects/analyzer/descriptors/ClasspathScanDescriptorProvider.java
- Timestamp:
- 08/28/10 21:55:08 (21 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
AnalyzerBeans/trunk/src/main/java/org/eobjects/analyzer/descriptors/ClasspathScanDescriptorProvider.java
r978 r982 6 6 import java.io.FilenameFilter; 7 7 import java.io.IOException; 8 import java.io.InputStream; 9 import java.net.JarURLConnection; 8 10 import java.net.URL; 11 import java.net.URLConnection; 9 12 import java.util.Collection; 10 13 import java.util.Collections; … … 12 15 import java.util.HashMap; 13 16 import java.util.Map; 17 import java.util.jar.JarEntry; 18 import java.util.jar.JarFile; 14 19 15 20 import org.eobjects.analyzer.beans.Analyzer; … … 20 25 import org.slf4j.LoggerFactory; 21 26 22 public final class ClasspathScanDescriptorProvider implements23 DescriptorProvider {27 public final class ClasspathScanDescriptorProvider extends 28 AbstractDescriptorProvider { 24 29 25 30 private static final Logger logger = LoggerFactory 26 31 .getLogger(ClasspathScanDescriptorProvider.class); 32 27 33 private Map<Class<? extends Analyzer<?>>, AnalyzerBeanDescriptor<?>> _analyzerBeanDescriptors = new HashMap<Class<? extends Analyzer<?>>, AnalyzerBeanDescriptor<?>>(); 28 34 private Map<Class<? extends Transformer<?>>, TransformerBeanDescriptor<?>> _transformerBeanDescriptors = new HashMap<Class<? extends Transformer<?>>, TransformerBeanDescriptor<?>>(); 29 35 private Map<Class<? extends Renderer<?, ?>>, RendererBeanDescriptor> _rendererBeanDescriptors = new HashMap<Class<? extends Renderer<?, ?>>, RendererBeanDescriptor>(); 30 36 31 @Override32 public AnalyzerBeanDescriptor<?> getAnalyzerBeanDescriptorByDisplayName(33 String name) {34 Collection<AnalyzerBeanDescriptor<?>> analyzerBeanDescriptors = getAnalyzerBeanDescriptors();35 for (AnalyzerBeanDescriptor<?> analyzerBeanDescriptor : analyzerBeanDescriptors) {36 if (name.equals(analyzerBeanDescriptor.getDisplayName())) {37 return analyzerBeanDescriptor;38 }39 }40 return null;41 }42 43 @Override44 public TransformerBeanDescriptor<?> getTransformerBeanDescriptorByDisplayName(45 String name) {46 Collection<TransformerBeanDescriptor<?>> transformerBeanDescriptors = getTransformerBeanDescriptors();47 for (TransformerBeanDescriptor<?> transformerBeanDescriptor : transformerBeanDescriptors) {48 if (name.equals(transformerBeanDescriptor.getDisplayName())) {49 return transformerBeanDescriptor;50 }51 }52 return null;53 }54 55 37 public ClasspathScanDescriptorProvider scanPackage(String packageName, 56 38 boolean recursive) { 57 39 String packagePath = packageName.replace('.', '/'); 40 logger.debug("Scanning package path: {}", packagePath); 58 41 try { 59 42 Enumeration<URL> resources = ClassLoader … … 62 45 URL resource = resources.nextElement(); 63 46 File dir = new File(resource.getFile()); 64 scanDirectory(dir, recursive); 47 48 if (dir.isDirectory()) { 49 logger.debug("Resource is a file, scanning directory: {}", 50 dir.getAbsolutePath()); 51 scanDirectory(dir, recursive); 52 } else { 53 URLConnection connection = resource.openConnection(); 54 if (connection instanceof JarURLConnection) { 55 JarURLConnection jarUrlConnection = (JarURLConnection) connection; 56 logger.debug("Resource is a JAR file, scanning file: " 57 + jarUrlConnection.getJarFile().getName()); 58 scanJar(jarUrlConnection, packagePath, recursive); 59 } else { 60 throw new IllegalStateException( 61 "Unknown connection type: " + connection); 62 } 63 } 65 64 } 66 65 } catch (IOException e) { … … 69 68 70 69 return this; 70 } 71 72 private void scanJar(JarURLConnection jarUrlConnection, String packagePath, 73 boolean recursive) throws IOException { 74 JarFile jarFile = jarUrlConnection.getJarFile(); 75 Enumeration<JarEntry> entries = jarFile.entries(); 76 77 while (entries.hasMoreElements()) { 78 JarEntry entry = entries.nextElement(); 79 String entryName = entry.getName(); 80 if (entryName.startsWith(packagePath) 81 && entryName.endsWith(".class")) { 82 if (recursive) { 83 InputStream inputStream = jarFile.getInputStream(entry); 84 scanInputStream(inputStream); 85 } else { 86 String trailingPart = entryName.substring(packagePath 87 .length()); 88 if (trailingPart.startsWith("/")) { 89 trailingPart = trailingPart.substring(1); 90 } 91 if (trailingPart.indexOf('/') == -1) { 92 InputStream inputStream = jarFile.getInputStream(entry); 93 scanInputStream(inputStream); 94 } else { 95 logger.info("Omitting recursive JAR file entry: {}", 96 entryName); 97 } 98 } 99 } else { 100 logger.info("Omitting JAR file entry: {}", entryName); 101 } 102 } 71 103 } 72 104 … … 91 123 for (File file : classFiles) { 92 124 try { 93 BeanClassVisitor visitor = new BeanClassVisitor(); 94 ClassReader classReader = new ClassReader(new FileInputStream( 95 file)); 96 classReader.accept(visitor, ClassReader.SKIP_CODE); 97 98 if (visitor.isAnalyzer()) { 99 @SuppressWarnings("unchecked") 100 Class<? extends Analyzer<?>> analyzerClass = (Class<? extends Analyzer<?>>) visitor 101 .getBeanClass(); 102 AnalyzerBeanDescriptor<?> descriptor = _analyzerBeanDescriptors 103 .get(analyzerClass); 104 if (descriptor == null) { 105 descriptor = AnnotationBasedAnalyzerBeanDescriptor 106 .create(analyzerClass); 107 _analyzerBeanDescriptors.put(analyzerClass, descriptor); 108 } 109 } 110 if (visitor.isTransformer()) { 111 @SuppressWarnings("unchecked") 112 Class<? extends Transformer<?>> transformerClass = (Class<? extends Transformer<?>>) visitor 113 .getBeanClass(); 114 TransformerBeanDescriptor<?> descriptor = _transformerBeanDescriptors 115 .get(transformerClass); 116 if (descriptor == null) { 117 descriptor = AnnotationBasedTransformerBeanDescriptor 118 .create(transformerClass); 119 _transformerBeanDescriptors.put(transformerClass, 120 descriptor); 121 } 122 } 123 if (visitor.isRenderer()) { 124 @SuppressWarnings("unchecked") 125 Class<? extends Renderer<?, ?>> rendererClass = (Class<? extends Renderer<?, ?>>) visitor 126 .getBeanClass(); 127 RendererBeanDescriptor descriptor = _rendererBeanDescriptors 128 .get(rendererClass); 129 if (descriptor == null) { 130 descriptor = new AnnotationBasedRendererBeanDescriptor( 131 rendererClass); 132 _rendererBeanDescriptors.put(rendererClass, descriptor); 133 } 134 } 125 InputStream inputStream = new FileInputStream(file); 126 scanInputStream(inputStream); 135 127 } catch (IOException e) { 136 128 logger.error("Could not read file", e); … … 155 147 } 156 148 149 protected void scanInputStream(InputStream inputStream) throws IOException { 150 ClassReader classReader = new ClassReader(inputStream); 151 BeanClassVisitor visitor = new BeanClassVisitor(); 152 classReader.accept(visitor, ClassReader.SKIP_CODE); 153 154 if (visitor.isAnalyzer()) { 155 @SuppressWarnings("unchecked") 156 Class<? extends Analyzer<?>> analyzerClass = (Class<? extends Analyzer<?>>) visitor 157 .getBeanClass(); 158 AnalyzerBeanDescriptor<?> descriptor = _analyzerBeanDescriptors 159 .get(analyzerClass); 160 if (descriptor == null) { 161 descriptor = AnnotationBasedAnalyzerBeanDescriptor 162 .create(analyzerClass); 163 _analyzerBeanDescriptors.put(analyzerClass, descriptor); 164 } 165 } 166 if (visitor.isTransformer()) { 167 @SuppressWarnings("unchecked") 168 Class<? extends Transformer<?>> transformerClass = (Class<? extends Transformer<?>>) visitor 169 .getBeanClass(); 170 TransformerBeanDescriptor<?> descriptor = _transformerBeanDescriptors 171 .get(transformerClass); 172 if (descriptor == null) { 173 descriptor = AnnotationBasedTransformerBeanDescriptor 174 .create(transformerClass); 175 _transformerBeanDescriptors.put(transformerClass, descriptor); 176 } 177 } 178 if (visitor.isRenderer()) { 179 @SuppressWarnings("unchecked") 180 Class<? extends Renderer<?, ?>> rendererClass = (Class<? extends Renderer<?, ?>>) visitor 181 .getBeanClass(); 182 RendererBeanDescriptor descriptor = _rendererBeanDescriptors 183 .get(rendererClass); 184 if (descriptor == null) { 185 descriptor = new AnnotationBasedRendererBeanDescriptor( 186 rendererClass); 187 _rendererBeanDescriptors.put(rendererClass, descriptor); 188 } 189 } 190 } 191 157 192 @Override 158 193 public Collection<AnalyzerBeanDescriptor<?>> getAnalyzerBeanDescriptors() { … … 161 196 } 162 197 163 @SuppressWarnings("unchecked")164 @Override165 public <A extends Analyzer<?>> AnalyzerBeanDescriptor<A> getAnalyzerBeanDescriptorForClass(166 Class<A> analyzerBeanClass) {167 return (AnalyzerBeanDescriptor<A>) _analyzerBeanDescriptors168 .get(analyzerBeanClass);169 }170 171 198 @Override 172 199 public Collection<TransformerBeanDescriptor<?>> getTransformerBeanDescriptors() { … … 175 202 } 176 203 177 @SuppressWarnings("unchecked")178 @Override179 public <T extends Transformer<?>> TransformerBeanDescriptor<T> getTransformerBeanDescriptorForClass(180 Class<T> transformerBeanClass) {181 return (TransformerBeanDescriptor<T>) _transformerBeanDescriptors182 .get(transformerBeanClass);183 }184 185 204 @Override 186 205 public Collection<RendererBeanDescriptor> getRendererBeanDescriptors() { … … 188 207 .values()); 189 208 } 190 191 @Override192 public RendererBeanDescriptor getRendererBeanDescriptorForClass(193 Class<? extends Renderer<?, ?>> rendererBeanClass) {194 return _rendererBeanDescriptors.get(rendererBeanClass);195 }196 209 }
Note: See TracChangeset
for help on using the changeset viewer.
