[jboss-cvs] JBossAS SVN: r93489 - in projects/annotations/trunk: core/src/main/java/org/jboss/papaki/javalangreflect and 3 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Mon Sep 14 13:39:33 EDT 2009
Author: jesper.pedersen
Date: 2009-09-14 13:39:33 -0400 (Mon, 14 Sep 2009)
New Revision: 93489
Modified:
projects/annotations/trunk/core/src/main/java/org/jboss/papaki/impl/AbstractAnnotationScanner.java
projects/annotations/trunk/core/src/main/java/org/jboss/papaki/javalangreflect/JavaClass.java
projects/annotations/trunk/core/src/main/java/org/jboss/papaki/javalangreflect/SecurityActions.java
projects/annotations/trunk/core/src/main/java/org/jboss/papaki/javassistclasspool/JavassistClassPool.java
projects/annotations/trunk/core/src/main/java/org/jboss/papaki/javassistclasspool/SecurityActions.java
projects/annotations/trunk/core/src/main/java/org/jboss/papaki/javassistinputstream/JavassistInputStream.java
projects/annotations/trunk/core/src/main/java/org/jboss/papaki/javassistinputstream/SecurityActions.java
projects/annotations/trunk/doc/userguide/en/modules/introduction.xml
projects/annotations/trunk/doc/userguide/en/modules/usage.xml
Log:
[JBANN-36] Support scanning directories
Modified: projects/annotations/trunk/core/src/main/java/org/jboss/papaki/impl/AbstractAnnotationScanner.java
===================================================================
--- projects/annotations/trunk/core/src/main/java/org/jboss/papaki/impl/AbstractAnnotationScanner.java 2009-09-14 16:47:04 UTC (rev 93488)
+++ projects/annotations/trunk/core/src/main/java/org/jboss/papaki/impl/AbstractAnnotationScanner.java 2009-09-14 17:39:33 UTC (rev 93489)
@@ -31,7 +31,9 @@
import org.jboss.papaki.util.ClassScanner;
import org.jboss.papaki.util.JarScanner;
+import java.io.BufferedInputStream;
import java.io.File;
+import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Modifier;
@@ -100,24 +102,27 @@
if (log.isLoggable(Level.FINE))
start = System.currentTimeMillis();
- File f = new File(url.getFile());
+ File f = new File(url.toURI());
List<String> classFiles = null;
- if (url.getPath().endsWith("/"))
+ if (f.exists())
{
- classFiles = ClassScanner.scan(f);
+ if (f.isDirectory())
+ {
+ classFiles = ClassScanner.scan(f);
+ }
+ else
+ {
+ classFiles = JarScanner.scan(f);
+ }
}
- else if (url.getPath().endsWith(".jar"))
- {
- classFiles = JarScanner.scan(f);
- }
if (classFiles != null)
{
result.addAll(classFiles);
}
-
+
if (log.isLoggable(Level.FINE))
{
long end = System.currentTimeMillis();
@@ -182,6 +187,49 @@
}
/**
+ * Check a directory for metadata
+ * @param directory The directory
+ * @return The annotation repository implementation; <code>null</code> if no metadata is found
+ */
+ protected AnnotationRepositoryImpl getScan(File directory)
+ {
+ AnnotationRepositoryImpl result = null;
+
+ InputStream binaryIS = null;
+
+ try
+ {
+ File binary = new File(directory, "META-INF/" + PAPAKI_METADATA_BINARY);
+ if (binary != null && binary.exists())
+ {
+ binaryIS = new BufferedInputStream(new FileInputStream(binary));
+ result = BinaryLoader.loadJBossAnnotation(binaryIS);
+ }
+ }
+ catch (Throwable t)
+ {
+ if (trace)
+ log.finest(t.getMessage());
+ }
+ finally
+ {
+ if (binaryIS != null)
+ {
+ try
+ {
+ binaryIS.close();
+ }
+ catch (IOException ioe)
+ {
+ // Ignore
+ }
+ }
+ }
+
+ return result;
+ }
+
+ /**
* Include class in the scan
* @param modifiers The modifiers
* @return True if include; otherwise false
Modified: projects/annotations/trunk/core/src/main/java/org/jboss/papaki/javalangreflect/JavaClass.java
===================================================================
--- projects/annotations/trunk/core/src/main/java/org/jboss/papaki/javalangreflect/JavaClass.java 2009-09-14 16:47:04 UTC (rev 93488)
+++ projects/annotations/trunk/core/src/main/java/org/jboss/papaki/javalangreflect/JavaClass.java 2009-09-14 17:39:33 UTC (rev 93489)
@@ -83,7 +83,7 @@
if (urls != null)
{
- URLClassLoader cl = SecurityActions.createURLCLassLoader(urls, null);
+ URLClassLoader cl = SecurityActions.createURLClassLoader(urls, null);
for (URL u : urls)
{
@@ -91,10 +91,20 @@
try
{
File jarFile = new File(u.toURI());
- jar = new JarFile(jarFile);
-
- ari = getScan(jar);
+ if (!jarFile.exists())
+ continue;
+
+ if (jarFile.isFile())
+ {
+ jar = new JarFile(jarFile);
+ ari = getScan(jar);
+ }
+ else
+ {
+ ari = getScan(jarFile);
+ }
+
if (ari != null && ari.getSize() == 0)
continue;
@@ -105,7 +115,7 @@
{
try
{
- Class clz = Class.forName(className, false, cl);
+ Class clz = Class.forName(className, true, cl);
if (trace)
log.finest("Class=" + clz.getName());
Modified: projects/annotations/trunk/core/src/main/java/org/jboss/papaki/javalangreflect/SecurityActions.java
===================================================================
--- projects/annotations/trunk/core/src/main/java/org/jboss/papaki/javalangreflect/SecurityActions.java 2009-09-14 16:47:04 UTC (rev 93488)
+++ projects/annotations/trunk/core/src/main/java/org/jboss/papaki/javalangreflect/SecurityActions.java 2009-09-14 17:39:33 UTC (rev 93489)
@@ -126,7 +126,7 @@
* @param parent The parent class loader
* @return The class loader
*/
- static URLClassLoader createURLCLassLoader(final URL[] urls, final ClassLoader parent)
+ static URLClassLoader createURLClassLoader(final URL[] urls, final ClassLoader parent)
{
return (URLClassLoader)AccessController.doPrivileged(new PrivilegedAction<Object>()
{
Modified: projects/annotations/trunk/core/src/main/java/org/jboss/papaki/javassistclasspool/JavassistClassPool.java
===================================================================
--- projects/annotations/trunk/core/src/main/java/org/jboss/papaki/javassistclasspool/JavassistClassPool.java 2009-09-14 16:47:04 UTC (rev 93488)
+++ projects/annotations/trunk/core/src/main/java/org/jboss/papaki/javassistclasspool/JavassistClassPool.java 2009-09-14 17:39:33 UTC (rev 93489)
@@ -82,7 +82,7 @@
if (urls != null)
{
- URLClassLoader cl = SecurityActions.createURLCLassLoader(urls, null);
+ URLClassLoader cl = SecurityActions.createURLClassLoader(urls, null);
ClassPool cp = new ClassPool();
cp.appendClassPath(new LoaderClassPath(cl));
@@ -101,10 +101,20 @@
try
{
File jarFile = new File(u.toURI());
- jar = new JarFile(jarFile);
-
- ari = getScan(jar);
+ if (!jarFile.exists())
+ continue;
+
+ if (jarFile.isFile())
+ {
+ jar = new JarFile(jarFile);
+ ari = getScan(jar);
+ }
+ else
+ {
+ ari = getScan(jarFile);
+ }
+
if (ari != null && ari.getSize() == 0)
continue;
Modified: projects/annotations/trunk/core/src/main/java/org/jboss/papaki/javassistclasspool/SecurityActions.java
===================================================================
--- projects/annotations/trunk/core/src/main/java/org/jboss/papaki/javassistclasspool/SecurityActions.java 2009-09-14 16:47:04 UTC (rev 93488)
+++ projects/annotations/trunk/core/src/main/java/org/jboss/papaki/javassistclasspool/SecurityActions.java 2009-09-14 17:39:33 UTC (rev 93489)
@@ -126,7 +126,7 @@
* @param parent The parent class loader
* @return The class loader
*/
- static URLClassLoader createURLCLassLoader(final URL[] urls, final ClassLoader parent)
+ static URLClassLoader createURLClassLoader(final URL[] urls, final ClassLoader parent)
{
return (URLClassLoader)AccessController.doPrivileged(new PrivilegedAction<Object>()
{
Modified: projects/annotations/trunk/core/src/main/java/org/jboss/papaki/javassistinputstream/JavassistInputStream.java
===================================================================
--- projects/annotations/trunk/core/src/main/java/org/jboss/papaki/javassistinputstream/JavassistInputStream.java 2009-09-14 16:47:04 UTC (rev 93488)
+++ projects/annotations/trunk/core/src/main/java/org/jboss/papaki/javassistinputstream/JavassistInputStream.java 2009-09-14 17:39:33 UTC (rev 93489)
@@ -27,8 +27,10 @@
import org.jboss.papaki.impl.AnnotationRepositoryImpl;
import org.jboss.papaki.impl.ClassInfo;
+import java.io.BufferedInputStream;
import java.io.Closeable;
import java.io.File;
+import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
@@ -37,6 +39,7 @@
import java.util.Collection;
import java.util.Enumeration;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
@@ -83,7 +86,7 @@
if (urls != null)
{
- URLClassLoader cl = SecurityActions.createURLCLassLoader(urls, null);
+ URLClassLoader cl = SecurityActions.createURLClassLoader(urls, null);
ClassPool cp = new ClassPool();
cp.appendClassPath(new LoaderClassPath(cl));
@@ -102,42 +105,87 @@
{
Boolean isJava5 = null;
File jarFile = new File(u.toURI());
- jar = new JarFile(jarFile);
- ari = getScan(jar);
+ if (!jarFile.exists())
+ continue;
+ if (jarFile.isFile())
+ {
+ jar = new JarFile(jarFile);
+ ari = getScan(jar);
+ }
+ else
+ {
+ ari = getScan(jarFile);
+ }
+
if (ari != null && ari.getSize() == 0)
continue;
- Enumeration<JarEntry> entries = jar.entries();
-
- while ((isJava5 == null || isJava5.booleanValue()) && entries.hasMoreElements())
+ if (jar != null)
{
- JarEntry je = entries.nextElement();
- String name = je.getName();
+ Enumeration<JarEntry> entries = jar.entries();
- if (je.getName().endsWith(".class"))
+ while ((isJava5 == null || isJava5.booleanValue()) && entries.hasMoreElements())
{
- InputStream is = jar.getInputStream(je);
+ JarEntry je = entries.nextElement();
+ String name = je.getName();
- CtClass ctClass = cp.makeClass(is);
- is.close();
+ if (je.getName().endsWith(".class"))
+ {
+ InputStream is = jar.getInputStream(je);
- if (isJava5 == null)
- {
- if (ctClass.getClassFile2().getMajorVersion() >= ClassFile.JAVA_5)
+ CtClass ctClass = cp.makeClass(is);
+ is.close();
+
+ if (isJava5 == null)
{
- isJava5 = Boolean.TRUE;
+ if (ctClass.getClassFile2().getMajorVersion() >= ClassFile.JAVA_5)
+ {
+ isJava5 = Boolean.TRUE;
+ }
+ else
+ {
+ isJava5 = Boolean.FALSE;
+ }
}
- else
+
+ if (isJava5.booleanValue() && !ctClass.isAnnotation())
{
- isJava5 = Boolean.FALSE;
+ processClass(ctClass, ari, annotationToClasses, classInfo);
}
}
+ }
+ }
+ else
+ {
+ List<String> classes = getClassNames(new URL[] {u});
+ if (classes != null)
+ {
+ for (int i = 0; (isJava5 == null || isJava5.booleanValue()) && i < classes.size(); i++)
+ {
+ String className = classes.get(i);
+ File clz = new File(jarFile, className.replace('.', '/') + ".class");
+ InputStream is = new BufferedInputStream(new FileInputStream(clz));
+ CtClass ctClass = cp.makeClass(is);
+ is.close();
- if (isJava5.booleanValue() && !ctClass.isAnnotation())
- {
- processClass(ctClass, ari, annotationToClasses, classInfo);
+ if (isJava5 == null)
+ {
+ if (ctClass.getClassFile2().getMajorVersion() >= ClassFile.JAVA_5)
+ {
+ isJava5 = Boolean.TRUE;
+ }
+ else
+ {
+ isJava5 = Boolean.FALSE;
+ }
+ }
+
+ if (isJava5.booleanValue() && !ctClass.isAnnotation())
+ {
+ processClass(ctClass, ari, annotationToClasses, classInfo);
+ }
}
}
}
Modified: projects/annotations/trunk/core/src/main/java/org/jboss/papaki/javassistinputstream/SecurityActions.java
===================================================================
--- projects/annotations/trunk/core/src/main/java/org/jboss/papaki/javassistinputstream/SecurityActions.java 2009-09-14 16:47:04 UTC (rev 93488)
+++ projects/annotations/trunk/core/src/main/java/org/jboss/papaki/javassistinputstream/SecurityActions.java 2009-09-14 17:39:33 UTC (rev 93489)
@@ -126,7 +126,7 @@
* @param parent The parent class loader
* @return The class loader
*/
- static URLClassLoader createURLCLassLoader(final URL[] urls, final ClassLoader parent)
+ static URLClassLoader createURLClassLoader(final URL[] urls, final ClassLoader parent)
{
return (URLClassLoader)AccessController.doPrivileged(new PrivilegedAction<Object>()
{
Modified: projects/annotations/trunk/doc/userguide/en/modules/introduction.xml
===================================================================
--- projects/annotations/trunk/doc/userguide/en/modules/introduction.xml 2009-09-14 16:47:04 UTC (rev 93488)
+++ projects/annotations/trunk/doc/userguide/en/modules/introduction.xml 2009-09-14 17:39:33 UTC (rev 93489)
@@ -2,7 +2,7 @@
<chapter id="introduction">
<title>Introduction</title>
- <para>Papaki is a project that will scan for annotations in .jar files
+ <para>Papaki is a project that will scan for annotations in .jar files or directories
and let the developer interact with the generated annotation repository.</para>
<para>The project is split into various areas:</para>
Modified: projects/annotations/trunk/doc/userguide/en/modules/usage.xml
===================================================================
--- projects/annotations/trunk/doc/userguide/en/modules/usage.xml 2009-09-14 16:47:04 UTC (rev 93488)
+++ projects/annotations/trunk/doc/userguide/en/modules/usage.xml 2009-09-14 17:39:33 UTC (rev 93489)
@@ -18,7 +18,7 @@
// Create an annotation scanner instance (default strategy)
AnnotationScanner as = AnnotationScannerFactory.getDefault();
-// URLs which points to .jar files
+// URLs which points to .jar or directories files
URL[] urls = ...;
// Scan the urls
@@ -74,7 +74,7 @@
as.configure().parameterLevel(false).classVisibility(Visibility.PUBLIC);
-// URLs which points to .jar files
+// URLs which points to .jar or directories files
URL[] urls = ...;
// Scan the urls
More information about the jboss-cvs-commits
mailing list