commons-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From simonetrip...@apache.org
Subject svn commit: r897990 - /commons/sandbox/at-digester/trunk/src/java/org/apache/commons/digester/annotations/DigesterLoader.java
Date Mon, 11 Jan 2010 18:24:53 GMT
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);
         }
     }
 



Mime
View raw message