[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