You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by we...@apache.org on 2010/01/15 17:43:20 UTC

svn commit: r899695 - in /myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting: jsf/dynamicdecorators/implemetations/ jsf2/annotation/

Author: werpu
Date: Fri Jan 15 16:43:19 2010
New Revision: 899695

URL: http://svn.apache.org/viewvc?rev=899695&view=rev
Log:
https://issues.apache.org/jira/browse/EXTSCRIPT-46

removing the complexity of the annotation scan workflow

Modified:
    myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/ApplicationProxy.java
    myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/RenderkitProxy.java
    myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/BehaviorImplementationListener.java
    myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/BehaviorRendererImplementationListener.java
    myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/ComponentImplementationListener.java
    myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/ConverterImplementationListener.java
    myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/GenericAnnotationScanner.java
    myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/RendererImplementationListener.java

Modified: myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/ApplicationProxy.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/ApplicationProxy.java?rev=899695&r1=899694&r2=899695&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/ApplicationProxy.java (original)
+++ myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/ApplicationProxy.java Fri Jan 15 16:43:19 2010
@@ -336,7 +336,7 @@
 
     public void addConverter(String converterId, String converterClass) {
         weaveDelegate();
-        if (converterClass.equals(PurgedConverter.class.getName())) {
+       /* if (converterClass.equals(PurgedConverter.class.getName())) {
             //purged case we do a full rescane
             WeavingContext.getWeaver().fullClassScan();
             Converter componentToChange = _delegate.createConverter(converterId);
@@ -346,7 +346,7 @@
                 _delegate.addConverter(converterId, PurgedConverter.class.getName());
             }
             return;
-        }
+        }*/
 
         _delegate.addConverter(converterId, converterClass);
     }

Modified: myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/RenderkitProxy.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/RenderkitProxy.java?rev=899695&r1=899694&r2=899695&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/RenderkitProxy.java (original)
+++ myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/RenderkitProxy.java Fri Jan 15 16:43:19 2010
@@ -79,9 +79,11 @@
         return rendr;
     }
 
+    //TODO probably not needed anymore
     private ClientBehaviorRenderer handleAnnotationChangeBehaviorRenderer(String s) {
         ClientBehaviorRenderer rendr2;
-        WeavingContext.getWeaver().fullClassScan();
+        //WeavingContext.getWeaver().fullClassScan();
+
         rendr2 = _delegate.getClientBehaviorRenderer(s);
         if (rendr2 instanceof PurgedClientBehaviorRenderer) {
             throw new FacesException("Renderer not found");
@@ -90,10 +92,11 @@
         return rendr2;
     }
 
-
+    //TODO probably not needed anymore
     private Renderer handleAnnotationChange(String s, String s1) {
         Renderer rendr2;
-        WeavingContext.getWeaver().fullClassScan();
+
+        //WeavingContext.getWeaver().fullClassScan();
         rendr2 = _delegate.getRenderer(s, s1);
         if (rendr2 instanceof PurgedRenderer) {
             throw new FacesException("Renderer not found");

Modified: myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/BehaviorImplementationListener.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/BehaviorImplementationListener.java?rev=899695&r1=899694&r2=899695&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/BehaviorImplementationListener.java (original)
+++ myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/BehaviorImplementationListener.java Fri Jan 15 16:43:19 2010
@@ -53,6 +53,10 @@
     @Override
     public void purge(String className) {
         super.purge(className);
+        if(!_alreadyRegistered.containsKey(className)) {
+            return;
+        }
+
         String val = (String) _alreadyRegistered.remove(className);
         if (val != null) {
             getApplication().addBehavior(val, PurgedBehavior.class.getName());

Modified: myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/BehaviorRendererImplementationListener.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/BehaviorRendererImplementationListener.java?rev=899695&r1=899694&r2=899695&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/BehaviorRendererImplementationListener.java (original)
+++ myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/BehaviorRendererImplementationListener.java Fri Jan 15 16:43:19 2010
@@ -19,12 +19,14 @@
 package org.apache.myfaces.scripting.jsf2.annotation;
 
 import org.apache.myfaces.scripting.jsf2.annotation.purged.PurgedClientBehaviorRenderer;
+import org.apache.myfaces.scripting.jsf2.annotation.purged.PurgedRenderer;
 
 import javax.faces.FactoryFinder;
 import javax.faces.context.FacesContext;
 import javax.faces.render.FacesBehaviorRenderer;
 import javax.faces.render.RenderKit;
 import javax.faces.render.RenderKitFactory;
+import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -39,6 +41,9 @@
     private static final String PAR_RENDERERTYPE = "rendererType";
     private static final String PAR_RENDERKITID = "renderKitId";
 
+    Map<AnnotationEntry, String> _inverseIndex = new HashMap<AnnotationEntry, String>();
+
+
     class AnnotationEntry {
         String rendererType;
         String renderKitId;
@@ -64,6 +69,15 @@
             return firstEquals && secondEquals;
         }
 
+        @Override
+        public int hashCode() {
+            return (checkForNull(rendererType)+"_"+checkForNull(renderKitId)).hashCode();    //To change body of overridden methods use File | Settings | File Templates.
+        }
+
+        private String checkForNull(String in) {
+            return (in == null)? "":in; 
+        }
+
         protected boolean compareValuePair(Object val1, Object val2) {
             boolean retVal = false;
             if (val1 == null) {
@@ -97,7 +111,8 @@
 
         AnnotationEntry entry = new AnnotationEntry(value, renderKitId);
         _alreadyRegistered.put(clazz.getName(), entry);
-
+        _inverseIndex.put(entry, clazz.getName());
+        
         getApplication().addConverter(entry.getRendererType(), clazz.getName());
     }
 
@@ -145,7 +160,11 @@
 
         RenderKit renderKit = getRenderkit(entry.getRenderKitId());
         try {
-            renderKit.addClientBehaviorRenderer(entry.getRendererType(), PurgedClientBehaviorRenderer.class.newInstance());
+            String rendererClass = _inverseIndex.get(entry);
+            if (rendererClass != null && rendererClass.equals(className)) {
+                _inverseIndex.put(entry, PurgedClientBehaviorRenderer.class.getName());
+                renderKit.addClientBehaviorRenderer(entry.getRendererType(), PurgedClientBehaviorRenderer.class.newInstance());
+            }   
         } catch (InstantiationException e) {
             log.error(e);
         } catch (IllegalAccessException e) {

Modified: myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/ComponentImplementationListener.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/ComponentImplementationListener.java?rev=899695&r1=899694&r2=899695&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/ComponentImplementationListener.java (original)
+++ myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/ComponentImplementationListener.java Fri Jan 15 16:43:19 2010
@@ -57,6 +57,11 @@
     @Override
     public void purge(String className) {
         super.purge(className);
+        //no purge needed we already have a different class
+        //registered
+        if(!_alreadyRegistered.containsKey(className)) {
+            return;
+        }
         String val = (String) _alreadyRegistered.remove(className);
         if (val != null) {
             getApplication().addComponent(val, PurgedComponent.class.getName());

Modified: myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/ConverterImplementationListener.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/ConverterImplementationListener.java?rev=899695&r1=899694&r2=899695&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/ConverterImplementationListener.java (original)
+++ myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/ConverterImplementationListener.java Fri Jan 15 16:43:19 2010
@@ -23,6 +23,7 @@
 
 import javax.faces.application.Application;
 import javax.faces.convert.FacesConverter;
+import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -35,6 +36,8 @@
     private static final String PAR_VALUE = "value";
     private static final String PAR_DEFAULT = "forClass";
 
+    Map<AnnotationEntry, String> _inverseIndex = new HashMap<AnnotationEntry, String>();
+    
     class AnnotationEntry {
         String value;
         Class forClass;
@@ -46,14 +49,16 @@
         }
 
         public boolean equals(Object incoming) {
-            if (!(incoming instanceof AnnotationEntry)) {
+            if (incoming == null) {
                 return false;
             }
-            AnnotationEntry toCompare = (AnnotationEntry) incoming;
 
-            if (incoming == null) {
+            if (!(incoming instanceof AnnotationEntry)) {
                 return false;
             }
+            AnnotationEntry toCompare = (AnnotationEntry) incoming;
+
+
 
             boolean firstEquals = compareValuePair(value, toCompare.getValue());
             boolean secondEquals = compareValuePair(forClass, toCompare.getForClass());
@@ -61,6 +66,17 @@
             return firstEquals && secondEquals;
         }
 
+        @Override
+        public int hashCode() {
+            String retVal = checkForNull(value) + "_";
+            retVal += ((forClass != null) ? forClass.getName() : "");
+            return retVal.hashCode();
+        }
+
+        private String checkForNull(String in) {
+            return (in == null) ? "" : in;
+        }
+
         protected boolean compareValuePair(Object val1, Object val2) {
             boolean retVal = false;
             if (val1 == null) {
@@ -94,11 +110,11 @@
 
         AnnotationEntry entry = new AnnotationEntry(value, forClass);
         _alreadyRegistered.put(clazz.getName(), entry);
-
+        _inverseIndex.put(entry, clazz.getName());
+        
         getApplication().addConverter(entry.getValue(), clazz.getName());
     }
 
-
     @Override
     protected boolean hasToReregister(Map params, Class clazz) {
         String value = (String) params.get(PAR_VALUE);
@@ -107,14 +123,10 @@
         AnnotationEntry entry = new AnnotationEntry(value, forClass);
 
         AnnotationEntry alreadyRegistered = (AnnotationEntry) _alreadyRegistered.get(clazz.getName());
-        if (alreadyRegistered == null) {
-            return true;
-        }
-
-        return alreadyRegistered.equals(entry);
+       
+        return (alreadyRegistered == null) || alreadyRegistered.equals(entry);
     }
 
-
     public boolean supportsAnnotation(String annotation) {
         return annotation.equals(FacesConverter.class.getName());
     }
@@ -126,9 +138,12 @@
         if (entry == null) {
             return;
         }
-
-        Application application = getApplication();
-        application.addConverter(entry.getValue(), PurgedConverter.class.getName());
+        String _oldConverterClass = _inverseIndex.get(entry);
+        if(_oldConverterClass.equals(className)) {
+            Application application = getApplication();
+            application.addConverter(entry.getValue(), PurgedConverter.class.getName());
+            _inverseIndex.put(entry, className);
+        }
     }
 
 }

Modified: myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/GenericAnnotationScanner.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/GenericAnnotationScanner.java?rev=899695&r1=899694&r2=899695&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/GenericAnnotationScanner.java (original)
+++ myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/GenericAnnotationScanner.java Fri Jan 15 16:43:19 2010
@@ -126,7 +126,7 @@
             //hence we do not have the annotations yet scanned
             //in groovy we have the initial scan not done hence
             //the annotations are scanned on the fly!
-            if (clazz != null && !(_weaver instanceof GroovyScriptingWeaver)) {
+            if (clazz != null ) {
                 java.lang.annotation.Annotation[] anns = clazz.getAnnotations();
                 if (anns != null && anns.length > 0) {
                     addOrMoveAnnotations(clazz);

Modified: myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/RendererImplementationListener.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/RendererImplementationListener.java?rev=899695&r1=899694&r2=899695&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/RendererImplementationListener.java (original)
+++ myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/RendererImplementationListener.java Fri Jan 15 16:43:19 2010
@@ -27,7 +27,9 @@
 import javax.faces.render.RenderKit;
 import javax.faces.render.RenderKitFactory;
 import javax.faces.render.Renderer;
+import java.util.HashMap;
 import java.util.Map;
+import java.util.TreeMap;
 
 /**
  * @author Werner Punz (latest modification by $Author$)
@@ -39,11 +41,12 @@
     private static final String PAR_RENDERERTYPE = "rendererType";
     private static final String PAR_RENDERKITID = "renderKitId";
 
+    Map<AnnotationEntry, String> _inverseIndex = new HashMap<AnnotationEntry, String>();
+
     public RendererImplementationListener() {
         super(PAR_FAMILY, PAR_RENDERERTYPE, PAR_RENDERKITID);
     }
 
-
     class AnnotationEntry {
         String componentFamily;
         String rendererType;
@@ -74,12 +77,24 @@
                     renderKitId == null && toCompare.getRenderKitId() == null) {
                 return true;
             }
-
+            //TODO a simple hash compare should be enough for almost if not all cases since the hashes have a very low propability to be the same
             return componentFamily.equals(toCompare.getComponentFamily()) &&
-                    rendererType.equals(toCompare.getComponentFamily()) &&
+                    rendererType.equals(toCompare.getRendererType()) &&
                     renderKitId.equals(toCompare.getRenderKitId());
         }
 
+        @Override
+        public int hashCode() {
+            /*we calculate the hashcoide to avoid double entries*/
+            return (((componentFamily != null) ? componentFamily : "")
+                    + "_" +
+                    ((rendererType != null) ? rendererType : "")
+                    + "_" +
+                    ((renderKitId != null) ? renderKitId : "")
+
+            ).hashCode();
+        }
+
         public String getComponentFamily() {
             return componentFamily;
         }
@@ -93,12 +108,10 @@
         }
     }
 
-
     public boolean supportsAnnotation(String annotation) {
         return annotation.equals(FacesRenderer.class.getName());
     }
 
-
     @Override
     protected void addEntity(Class clazz, Map<String, Object> params) {
         String value = (String) params.get(PAR_FAMILY);
@@ -108,6 +121,7 @@
         RenderKit renderKit = getRenderkit(renderKitId);
 
         AnnotationEntry entry = new AnnotationEntry(value, theDefault, renderKitId);
+        _inverseIndex.put(entry, clazz.getName());
         _alreadyRegistered.put(clazz.getName(), entry);
 
         if (log.isTraceEnabled()) {
@@ -129,7 +143,6 @@
         return (RenderKitFactory) FactoryFinder.getFactory(FactoryFinder.RENDER_KIT_FACTORY);
     }
 
-
     @Override
     protected boolean hasToReregister(Map params, Class clazz) {
         String value = (String) params.get(PAR_FAMILY);
@@ -146,7 +159,6 @@
         return alreadyRegistered.equals(entry);
     }
 
-
     private String getRenderKitId(Map<String, Object> params) {
         String renderKitId = (String) params.get(PAR_RENDERKITID);
         renderKitId = (renderKitId == null) ? getApplication().getDefaultRenderKitId() : renderKitId;
@@ -159,7 +171,6 @@
         return renderKit;
     }
 
-
     @Override
     public void purge(String className) {
         super.purge(className);
@@ -168,13 +179,14 @@
             return;
         }
 
-        //TODO handle the changed renderer params, but annotation on same
-        //class case (remove and add case on the same class)
-
         RenderKit renderKit = getRenderkit(entry.getRenderKitId());
         try {
-
-            renderKit.addRenderer(entry.getComponentFamily(), entry.getRendererType(), PurgedRenderer.class.newInstance());
+            //by fetching the changed renderer we save a full rescan
+            String rendererClass = _inverseIndex.get(entry);
+            if (rendererClass != null && rendererClass.equals(className)) {
+                _inverseIndex.put(entry, PurgedRenderer.class.getName());
+                renderKit.addRenderer(entry.getComponentFamily(), entry.getRendererType(), PurgedRenderer.class.newInstance());
+            }
         } catch (InstantiationException e) {
             log.error(e);
         } catch (IllegalAccessException e) {