reapath must be used to determine WEB-INF/classes
authorpatriot1burke <patriot1burke@sourceforge.net>
Mon, 11 Feb 2008 22:05:27 +0000 (22:05 +0000)
committerKai Moritz <kai@juplo.de>
Tue, 12 May 2015 19:26:04 +0000 (21:26 +0200)
pom.xml
src/main/java/org/scannotation/AnnotationDB.java
src/main/java/org/scannotation/WarUrlFinder.java

diff --git a/pom.xml b/pom.xml
index 1c1141b..027958f 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
     <groupId>org.scannotation</groupId>
     <artifactId>scannotation</artifactId>
     <packaging>jar</packaging>
-    <version>1.0.1</version>
+    <version>1.0.2</version>
     <name>scannotation</name>
     <url>http://maven.apache.org</url>
     <repositories>
index 92e28c6..6eb4afe 100644 (file)
@@ -28,11 +28,11 @@ import java.util.Set;
  * The class allows you to scan an arbitrary set of "archives" for .class files.  These class files
  * are parsed to see what annotations they use.  Two indexes are created.  The javax, java, sun, com.sun, and javassist
  * packages will not be scanned by default.
- *
+ * <p/>
  * One is a map of annotations and what classes
  * use those annotations.   This could be used, for example, by an EJB deployer to find all the EJBs contained
  * in the archive
- *
+ * <p/>
  * Another is a mpa of classes and what annotations those classes use.
  *
  * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
@@ -92,16 +92,13 @@ public class AnnotationDB implements Serializable
     * This method will cross reference annotations in the annotation index with any meta-annotations that they have
     * and create additional entries as needed.  For example:
     *
-    * @HttpMethod("GET")
-    * public @interface GET {}
-    *
+    * @HttpMethod("GET") public @interface GET {}
+    * <p/>
     * The HttpMethod index will have additional classes added to it for any classes annotated with annotations that
     * have the HttpMethod meta-annotation.
-    *
+    * <p/>
     * WARNING: If the annotation class has not already been scaned, this method will load all annotation classes indexed
-    *  as a resource so they must be in your classpath
-    *
-    *
+    * as a resource so they must be in your classpath
     */
    public void crossReferenceMetaAnnotations() throws CrossReferenceException
    {
@@ -142,7 +139,7 @@ public class AnnotationDB implements Serializable
          {
             annotationIndex.get(xref).addAll(annotationIndex.get(annotation));
          }
-         
+
       }
       if (unresolved.size() > 0) throw new CrossReferenceException(unresolved);
    }
@@ -171,12 +168,19 @@ public class AnnotationDB implements Serializable
             {
                unresolved.add(intf);
             }
-            Set<String> classAnnotations = classIndex.get(clazz);
-            classAnnotations.addAll(xrefAnnotations);
-            for (String annotation : xrefAnnotations)
+            else
             {
-               Set<String> classes = annotationIndex.get(annotation);
-               classes.add(clazz);
+               Set<String> classAnnotations = classIndex.get(clazz);
+               if (classAnnotations == null)
+               {
+                  classIndex.put(clazz, xrefAnnotations);
+               }
+               else classAnnotations.addAll(xrefAnnotations);
+               for (String annotation : xrefAnnotations)
+               {
+                  Set<String> classes = annotationIndex.get(annotation);
+                  classes.add(clazz);
+               }
             }
          }
       }
@@ -190,7 +194,7 @@ public class AnnotationDB implements Serializable
       {
          if (intf.startsWith(ignored + "."))
          {
-            return  true;
+            return true;
          }
          else
          {
@@ -203,7 +207,6 @@ public class AnnotationDB implements Serializable
    /**
     * returns a map keyed by the fully qualified string name of a annotation class.  The Set returne is
     * a list of classes that use that annotation somehow.
-    *
     */
    public Map<String, Set<String>> getAnnotationIndex()
    {
@@ -213,7 +216,6 @@ public class AnnotationDB implements Serializable
    /**
     * returns a map keyed by the list of classes scanned.  The value set returned is a list of annotations
     * used by that class.
-    *
     */
    public Map<String, Set<String>> getClassIndex()
    {
@@ -262,7 +264,6 @@ public class AnnotationDB implements Serializable
    }
 
 
-
    /**
     * Scan a url that represents an "archive"  this is a classpath directory or jar file
     *
index f253764..a158c3c 100644 (file)
@@ -6,6 +6,7 @@ import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Set;
+import java.io.File;
 
 /**
  * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
@@ -48,27 +49,21 @@ public class WarUrlFinder
     * if your servlet container does not extract the /WEB-INF/classes into a real file-based directory
     *
     * @param servletContext
-    * @return
+    * @return null if cannot determin /WEB-INF/classes
     */
    public static URL findWebInfClassesPath(ServletContext servletContext)
    {
-      Set libJars = servletContext.getResourcePaths("/WEB-INF/classes");
-      for (Object jar : libJars)
+      String path = servletContext.getRealPath("/WEB-INF/classes");
+      if (path == null) return null;
+      File fp = new File(path);
+      if (fp.exists() == false) return null;
+      try
       {
-         try
-         {
-            URL url = servletContext.getResource((String) jar);
-            String urlString = url.toString();
-            int index = urlString.lastIndexOf("/WEB-INF/classes/");
-            urlString = urlString.substring(0, index + "/WEB-INF/classes/".length());
-            return new URL(urlString);
-         }
-         catch (MalformedURLException e)
-         {
-            throw new RuntimeException(e);
-         }
+         return fp.toURL();
+      }
+      catch (MalformedURLException e)
+      {
+         throw new RuntimeException(e);
       }
-      return null;
-
    }
 }