package com.google.inject; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; /** * Finds all annotation databases. AnnotationDatabase can be generated using RoboGuice annotation compiler. * By default the roboguice annotation database is taken into account, and this can't be modified. * <br/> * You can add custom annotation databases by adding them to your manifest : * <pre> * <meta-data android:name="roboguice.annotations.packages" * android:value="myPackage" /> * </pre> * In that case, RoboGuice will load both <code>roboguice.AnnotationDatabaseImpl</code> and <code>myPackage.AnnotationDatabaseImpl</code>. * More packages containing AnnotationDatabases can be added, separated by commas. * @author SNI */ public class AnnotationDatabaseFinder { private HashSet<String> classesContainingInjectionPointsSet = new HashSet<String>(); private HashMap<String, Map<String, Set<String>>> mapAnnotationToMapClassContainingInjectionToInjectedFieldSet = new HashMap<String, Map<String, Set<String>>>(); private HashMap<String, Map<String, Set<String>>> mapAnnotationToMapClassContainingInjectionToInjectedMethodSet = new HashMap<String, Map<String, Set<String>>>(); private HashMap<String, Map<String, Set<String>>> mapAnnotationToMapClassContainingInjectionToInjectedConstructorSet = new HashMap<String, Map<String, Set<String>>>(); private HashSet<String> bindableClassesSet = new HashSet<String>(); public AnnotationDatabaseFinder(String[] additionalPackageNames) { try { for( String pkg : additionalPackageNames ) { String annotationDatabaseClassName = "AnnotationDatabaseImpl"; if( pkg != null && !"".equals(pkg) ) { annotationDatabaseClassName = pkg + "." + annotationDatabaseClassName; } AnnotationDatabase annotationDatabase = getAnnotationDatabaseInstance(annotationDatabaseClassName); addAnnotationDatabase(annotationDatabase); } } catch (InstantiationException e) { e.printStackTrace(); throw new RuntimeException(e); } catch (IllegalAccessException e) { e.printStackTrace(); throw new RuntimeException(e); } catch (ClassNotFoundException e) { e.printStackTrace(); throw new RuntimeException(e); } } public HashSet<String> getClassesContainingInjectionPointsSet() { return classesContainingInjectionPointsSet; } public HashMap<String, Map<String, Set<String>>> getMapAnnotationToMapClassContainingInjectionToInjectedFieldSet() { return mapAnnotationToMapClassContainingInjectionToInjectedFieldSet; } public HashMap<String, Map<String, Set<String>>> getMapAnnotationToMapClassContainingInjectionToInjectedMethodSet() { return mapAnnotationToMapClassContainingInjectionToInjectedMethodSet; } public HashMap<String, Map<String, Set<String>>> getMapAnnotationToMapClassContainingInjectionToInjectedConstructorSet() { return mapAnnotationToMapClassContainingInjectionToInjectedConstructorSet; } public Set<String> getBindableClassesSet() { return bindableClassesSet; } private AnnotationDatabase getAnnotationDatabaseInstance(String annotationDatabaseClassName) throws ClassNotFoundException, InstantiationException, IllegalAccessException { Class<?> annotationDatabaseClass = Class.forName( annotationDatabaseClassName); AnnotationDatabase annotationDatabase = (AnnotationDatabase) annotationDatabaseClass.newInstance(); return annotationDatabase; } private void addAnnotationDatabase(AnnotationDatabase annotationDatabase) { annotationDatabase.fillAnnotationClassesAndFieldsNames(mapAnnotationToMapClassContainingInjectionToInjectedFieldSet); annotationDatabase.fillAnnotationClassesAndMethods(mapAnnotationToMapClassContainingInjectionToInjectedMethodSet); annotationDatabase.fillAnnotationClassesAndConstructors(mapAnnotationToMapClassContainingInjectionToInjectedConstructorSet); annotationDatabase.fillClassesContainingInjectionPointSet(classesContainingInjectionPointsSet); annotationDatabase.fillBindableClasses(bindableClassesSet); //System.out.println(mapAnnotationToMapClassWithInjectionNameToMethodSet.toString()); } }