001 package com.khubla.pragmatach.framework.scanner;
002
003 import java.lang.annotation.Annotation;
004 import java.lang.reflect.Method;
005 import java.net.URL;
006 import java.util.HashSet;
007 import java.util.Set;
008
009 import javax.servlet.ServletContext;
010
011 import org.scannotation.AnnotationDB;
012 import org.scannotation.ClasspathUrlFinder;
013 import org.scannotation.WarUrlFinder;
014 import org.slf4j.Logger;
015 import org.slf4j.LoggerFactory;
016
017 import com.khubla.pragmatach.framework.api.PragmatachException;
018
019 /**
020 * @author tome
021 */
022 public class AnnotationScanner {
023 /**
024 * logger
025 */
026 private static final Logger logger = LoggerFactory.getLogger(AnnotationScanner.class);
027 /**
028 * the DB
029 */
030 private static AnnotationDB annotationDB = new AnnotationDB();
031
032 /**
033 * get classes with annotation
034 */
035 public static Set<Class<?>> getAllClasses(Class<?> annotationClass) throws PragmatachException {
036 try {
037 final Set<Class<?>> ret = new HashSet<Class<?>>();
038 final Set<String> classNames = annotationDB.getAnnotationIndex().get(annotationClass.getCanonicalName());
039 if (null != classNames) {
040 for (final String name : classNames) {
041 final Class<?> clazz = Class.forName(name);
042 ret.add(clazz);
043 }
044 }
045 return ret;
046 } catch (final Exception e) {
047 throw new PragmatachException("Exception in getAllClasses", e);
048 }
049 }
050
051 /**
052 * get classes with annotation
053 */
054 public static Set<Method> getAllMethods(Class<?> annotationClass) throws PragmatachException {
055 try {
056 final Set<Method> ret = new HashSet<Method>();
057 final Set<String> classNames = annotationDB.getAnnotationIndex().get(annotationClass.getCanonicalName());
058 if (null != classNames) {
059 for (final String name : classNames) {
060 final Class<?> clazz = Class.forName(name);
061 for (final Method method : clazz.getMethods()) {
062 for (final Annotation annotation : method.getDeclaredAnnotations()) {
063 if (0 == annotation.getClass().getCanonicalName().compareTo(annotationClass.getCanonicalName())) {
064 ret.add(method);
065 }
066 }
067 }
068 }
069 }
070 return ret;
071 } catch (final Exception e) {
072 throw new PragmatachException("Exception in getAllMethods", e);
073 }
074 }
075
076 public static AnnotationDB getAnnotationDB() {
077 return annotationDB;
078 }
079
080 /**
081 * do the scan
082 */
083 public static void scan(ServletContext servletContext) throws PragmatachException {
084 scanClassPath();
085 scanWar(servletContext);
086 }
087
088 private static void scanClassPath() throws PragmatachException {
089 try {
090 final URL[] urls = ClasspathUrlFinder.findClassPaths();
091 annotationDB.scanArchives(urls);
092 } catch (final Exception e) {
093 throw new PragmatachException("Exception in scanClassPath", e);
094 }
095 }
096
097 private static void scanWar(ServletContext servletContext) throws PragmatachException {
098 try {
099 if (null != servletContext) {
100 final URL[] libURLs = WarUrlFinder.findWebInfLibClasspaths(servletContext);
101 final URL classesURL = WarUrlFinder.findWebInfClassesPath(servletContext);
102 if ((null != libURLs) && (libURLs.length > 0)) {
103 annotationDB.scanArchives(libURLs);
104 } else {
105 logger.error("Unable to get WebInfLibClasspaths");
106 }
107 if (null != classesURL) {
108 annotationDB.scanArchives(classesURL);
109 } else {
110 logger.error("Unable to get WebInfClassesPath");
111 }
112 }
113 } catch (final Exception e) {
114 throw new PragmatachException("Exception in scanWar", e);
115 }
116 }
117 }