You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lu...@apache.org on 2010/10/06 04:35:58 UTC

svn commit: r1004881 - in /myfaces/core/trunk/impl/src/main/java/org/apache/myfaces: application/ApplicationImpl.java context/RequestViewContext.java

Author: lu4242
Date: Wed Oct  6 02:35:57 2010
New Revision: 1004881

URL: http://svn.apache.org/viewvc?rev=1004881&view=rev
Log:
MYFACES-2922 [PERF] Improvements for @ResourceDependency handling (Thanks to Martin Koci for provide this patch)

Modified:
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/context/RequestViewContext.java

Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java?rev=1004881&r1=1004880&r2=1004881&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java Wed Oct  6 02:35:57 2010
@@ -1952,6 +1952,17 @@ public class ApplicationImpl extends App
 
     private void _handleResourceDependencyAnnotations(FacesContext context, Class<?> inspectedClass, UIComponent component, boolean isProduction)
     {
+        // This and only this method handles @ResourceDependency and @ResourceDependencies annotations
+        // The source of these annotations is Class<?> inspectedClass. Because Class<?> and its annotations cannot change 
+        // during request/response, it is sufficient to process Class<?> only once per view.
+        RequestViewContext rvc = RequestViewContext.getCurrentInstance(context);
+        if (rvc.isClassAlreadyProcessed(inspectedClass))
+        {
+            return;
+        }
+        boolean classAlreadyProcessed = false;
+
+        
         List<ResourceDependency> dependencyList = null;
         boolean isCachedList = false;
         
@@ -1985,7 +1996,6 @@ public class ApplicationImpl extends App
         {
             for (ResourceDependency dependency : dependencyList)
             {
-                RequestViewContext rvc = RequestViewContext.getCurrentInstance(context);
                 if (!rvc.isResourceDependencyAlreadyProcessed(dependency))
                 {
                     _handleResourceDependency(context, component, dependency);
@@ -1996,6 +2006,10 @@ public class ApplicationImpl extends App
         
         if(isProduction && !isCachedList)   //if we're in production and the list is not yet cached, store it
             _classToResourceDependencyMap.put(inspectedClass, dependencyList);  //null value stored for dependencyList means no annotations were found
+        
+        if (!classAlreadyProcessed) { 
+            rvc.setClassProcessed(inspectedClass);
+        }
     }
     
     private void _handleResourceDependency(FacesContext context, UIComponent component, ResourceDependency annotation)

Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/context/RequestViewContext.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/context/RequestViewContext.java?rev=1004881&r1=1004880&r2=1004881&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/context/RequestViewContext.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/context/RequestViewContext.java Wed Oct  6 02:35:57 2010
@@ -36,7 +36,9 @@ public class RequestViewContext
 
     public static final String VIEW_CONTEXT_KEY = "oam.VIEW_CONTEXT";
     
-    private Map<ResourceDependency, Boolean> addedResources = new HashMap<ResourceDependency,Boolean>(); 
+    private Map<ResourceDependency, Boolean> addedResources = new HashMap<ResourceDependency,Boolean>();
+    
+    private Map<Class<?>, Boolean> processedClasses = new HashMap<Class<?>,Boolean>();
 
     static public RequestViewContext getCurrentInstance()
     {
@@ -83,4 +85,14 @@ public class RequestViewContext
     {
         addedResources.put(dependency, true);
     }
+
+    public boolean isClassAlreadyProcessed(Class<?> inspectedClass)
+    {
+        return processedClasses.containsKey(inspectedClass);
+    }
+
+    public void setClassProcessed(Class<?> inspectedClass)
+    {
+        processedClasses.put(inspectedClass, Boolean.TRUE);
+    }
 }