Author: simonetripodi Date: Mon Jan 11 18:24:52 2010 New Revision: 897990 URL: http://svn.apache.org/viewvc?rev=897990&view=rev Log: added 'handle()' implementation using handlers created at run-time and cached into an in-memory LRU cache
Modified: commons/sandbox/at-digester/trunk/src/java/org/apache/commons/digester/annotations/DigesterLoader.java Modified: commons/sandbox/at-digester/trunk/src/java/org/apache/commons/digester/annotations/DigesterLoader.java URL: http://svn.apache.org/viewvc/commons/sandbox/at-digester/trunk/src/java/org/apache/commons/digester/annotations/DigesterLoader.java?rev=897990&r1=897989&r2=897990&view=diff ============================================================================== --- commons/sandbox/at-digester/trunk/src/java/org/apache/commons/digester/annotations/DigesterLoader.java (original) +++ commons/sandbox/at-digester/trunk/src/java/org/apache/commons/digester/annotations/DigesterLoader.java Mon Jan 11 18:24:52 2010 @@ -48,6 +48,13 @@ new InMemoryLRUCache<Class<?>, FromAnnotationsRuleSet>(); /** + * In-memory LRU cache that stores already analyzed instantiated handlers + * and relative instance. + */ + private static final InMemoryLRUCache<Class<? extends DigesterLoaderHandler<? extends Annotation, ? extends AnnotatedElement>>, DigesterLoaderHandler<Annotation, AnnotatedElement>> CACHED_HANDLERS = + new InMemoryLRUCache<Class<? extends DigesterLoaderHandler<? extends Annotation, ? extends AnnotatedElement>>, DigesterLoaderHandler<Annotation,AnnotatedElement>>(); + + /** * This class can't be instantiated. */ private DigesterLoader() { @@ -145,8 +152,10 @@ } /** - * - * @param element + * Executes an analysis for each annotation present in the element. + * + * @param element the current element under analysis. + * @param ruleSet the ruleSet where add providers. */ private static void handle(AnnotatedElement element, FromAnnotationsRuleSet ruleSet) { for (Annotation annotation : element.getAnnotations()) { @@ -161,6 +170,7 @@ * @param annotation the current visited annotation. * @param element the current visited element. */ + @SuppressWarnings("unchecked") private static void handle(Annotation annotation, AnnotatedElement element, FromAnnotationsRuleSet ruleSet) { Class<?> annotationType = annotation.annotationType(); @@ -175,7 +185,25 @@ } } else if (annotationType.isAnnotationPresent(DigesterRule.class)) { DigesterRule digesterRule = annotationType.getAnnotation(DigesterRule.class); - // TODO add missing code + DigesterLoaderHandler<Annotation,AnnotatedElement> handler = null; + + // retrieves the handler from the cache if it is present + if (CACHED_HANDLERS.containsKey(digesterRule.handledBy())) { + handler = CACHED_HANDLERS.get(digesterRule.handledBy()); + } else { + // create the handler and stores it to the cache for future reuse + try { + handler = (DigesterLoaderHandler<Annotation, AnnotatedElement>) digesterRule.handledBy().newInstance(); + CACHED_HANDLERS.put(digesterRule.handledBy(), handler); + } catch (Throwable t) { + throw new RuntimeException("Impossible to instance handler of type '" + + digesterRule.handledBy().getName() + + "', see nested exceptions", t); + } + } + + // run! + handler.handle(annotation, element, ruleSet); } }