* 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>
* 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
{
{
annotationIndex.get(xref).addAll(annotationIndex.get(annotation));
}
-
+
}
if (unresolved.size() > 0) throw new CrossReferenceException(unresolved);
}
{
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);
+ }
}
}
}
{
if (intf.startsWith(ignored + "."))
{
- return true;
+ return true;
}
else
{
/**
* 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()
{
/**
* 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()
{
}
-
/**
* Scan a url that represents an "archive" this is a classpath directory or jar file
*
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>
* 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;
-
}
}