You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by ja...@apache.org on 2010/08/23 17:17:25 UTC

svn commit: r988148 - /myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java

Author: jakobk
Date: Mon Aug 23 15:17:24 2010
New Revision: 988148

URL: http://svn.apache.org/viewvc?rev=988148&view=rev
Log:
MYFACES-2879 Cache introspection information about converters (fix for 1.2.x)

Modified:
    myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java

Modified: myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java?rev=988148&r1=988147&r2=988148&view=diff
==============================================================================
--- myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java (original)
+++ myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java Mon Aug 23 15:17:24 2010
@@ -23,6 +23,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.MissingResourceException;
@@ -122,6 +123,9 @@ public class ApplicationImpl extends App
 
     private ELResolverBuilder resolverBuilderForFaces;
 
+    private List<Class<? extends Converter>> _noArgConstructorConverterClasses
+            = new ArrayList<Class<? extends Converter>>();
+
     // ~ Constructors
     // -------------------------------------------------------------------------------
 
@@ -789,21 +793,37 @@ public class ApplicationImpl extends App
         {
             try
             {
-                final Class converterClass = ClassUtils.simpleClassForName(converterClassName);
-
+                Class<? extends Converter> converterClass = ClassUtils.simpleClassForName(converterClassName);
                 Converter converter = null;
-                try
+
+                // check cached constructor information
+                if (!_noArgConstructorConverterClasses.contains(converterClass))
                 {
-                    // look for a constructor that takes a single Class object
-                    // See JSF 1.2 javadoc for Converter
-                    final Constructor constructor = converterClass.getConstructor(new Class[] { Class.class });
-                    converter = (Converter) constructor.newInstance(new Object[] { targetClass });
+                    // the converter class either supports the one-arg constructor
+                    // or has never been processed before
+                    try
+                    {
+                        // look for a constructor that takes a single Class object
+                        // See JSF 1.2 javadoc for Converter
+                        Constructor<? extends Converter> constructor = converterClass
+                                .getConstructor(new Class[] { Class.class });
+
+                        converter = constructor.newInstance(new Object[] { targetClass });
+                    }
+                    catch (Exception e)
+                    {
+                        // the constructor does not exist
+                        // add the class to the no-arg constructor classes cache
+                        _noArgConstructorConverterClasses.add(converterClass);
+
+                        // use no-arg constructor
+                        converter = converterClass.newInstance();
+                    }
                 }
-                catch (Exception e)
+                else
                 {
-                    // if there is no matching constructor use no-arg
-                    // constructor
-                    converter = (Converter) converterClass.newInstance();
+                    // use no-arg constructor
+                    converter = converterClass.newInstance();
                 }
 
                 setConverterProperties(converterClass, converter);