You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by jw...@apache.org on 2007/11/15 22:23:40 UTC

svn commit: r595463 - /myfaces/trinidad/trunk/trinidad/trinidad-api/src/main/java/org/apache/myfaces/trinidad/bean/FacesBeanFactory.java

Author: jwaldman
Date: Thu Nov 15 13:23:38 2007
New Revision: 595463

URL: http://svn.apache.org/viewvc?rev=595463&view=rev
Log:
TRINIDAD-773 Inefficient way to create faces ben in FacesBeanFactory
used Stevan's idea of caching the FacesBean class to improve performance.

Modified:
    myfaces/trinidad/trunk/trinidad/trinidad-api/src/main/java/org/apache/myfaces/trinidad/bean/FacesBeanFactory.java

Modified: myfaces/trinidad/trunk/trinidad/trinidad-api/src/main/java/org/apache/myfaces/trinidad/bean/FacesBeanFactory.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad/trinidad-api/src/main/java/org/apache/myfaces/trinidad/bean/FacesBeanFactory.java?rev=595463&r1=595462&r2=595463&view=diff
==============================================================================
--- myfaces/trinidad/trunk/trinidad/trinidad-api/src/main/java/org/apache/myfaces/trinidad/bean/FacesBeanFactory.java (original)
+++ myfaces/trinidad/trunk/trinidad/trinidad-api/src/main/java/org/apache/myfaces/trinidad/bean/FacesBeanFactory.java Thu Nov 15 13:23:38 2007
@@ -54,10 +54,16 @@
     FacesBean bean = createFacesBean(className, rendererType);
 
     if (bean == null && rendererType != null)
+    {
       bean = createFacesBean(className, null);
-
+      _cacheFacesBeanClass(bean, className, rendererType);
+    }
+    
     if (bean == null)
+    {
       bean = createFacesBean(ownerClass.getSuperclass(), rendererType);
+      _cacheFacesBeanClass(bean, className, rendererType);
+    }
 
     return bean;
   }
@@ -66,32 +72,44 @@
     String beanType,
     String rendererType)
   {
-    String typeKey = (rendererType != null)
-                        ? beanType + "|" + rendererType
-                        : beanType;
-
-    String className = (String) _TYPES_MAP.get(typeKey);
-    if (className == null)
-      return null;
+    String typeKey = _buildTypeKey(beanType, rendererType);
 
+    Class<?> type = _TYPES_CLASS.get(typeKey);
+      
+    if(type == null)
+    {
+      String className = (String) _TYPES_MAP.get(typeKey);
+      if (className == null)
+        return null;
+      
+      // At this point we did not have a cached FacesBean class for the
+      // typeKey, but we did have a cached className for the typeKey.
+      //  Get the FacesBean class from the className and cache.
+      // This will improve performance based on tests.
+      try
+      {
+        type = _getClassLoader().loadClass(className);
+        _TYPES_CLASS.put(typeKey, type);
+      }
+      catch (ClassNotFoundException cnfe)
+      {
+        _LOG.severe("CANNOT_FIND_FACESBEAN", className);
+        _LOG.severe(cnfe);
+      }
+    }
+  
     try
     {
-      Class<?> type = _getClassLoader().loadClass(className);
       return (FacesBean) type.newInstance();
     }
-    catch (ClassNotFoundException cnfe)
-    {
-      _LOG.severe("CANNOT_FIND_FACESBEAN", className);
-      _LOG.severe(cnfe);
-    }
     catch (IllegalAccessException iae)
     {
-      _LOG.severe("CANNOT_CREATE_FACESBEAN_INSTANCE", className);
+      _LOG.severe("CANNOT_CREATE_FACESBEAN_INSTANCE", type.getName());
       _LOG.severe(iae);
     }
     catch (InstantiationException ie)
     {
-      _LOG.severe("CANNOT_CREATE_FACESBEAN_INSTANCE", className);
+      _LOG.severe("CANNOT_CREATE_FACESBEAN_INSTANCE", type.getName());
       _LOG.severe(ie);
     }
 
@@ -167,8 +185,43 @@
     return loader;
   }
 
+  /* given non-null beanType & rendererType, concatenate together with 
+   * a '|' in between
+   */
+  static private String _buildTypeKey(
+    String beanType, 
+    String rendererType)
+  {
+    if (rendererType != null)
+    {
+      int length = beanType.length() + 1 + rendererType.length();
+      StringBuilder typeKeyBuilder = new StringBuilder(length);
+      
+      typeKeyBuilder.append(beanType).append('|').append(rendererType);
+      
+      return typeKeyBuilder.toString();
+    }
+    else
+      return beanType;
+    
+  }
+  
+  static private void _cacheFacesBeanClass(
+    FacesBean bean,
+    String beanType, 
+    String rendererType)
+  {
+    // cache the typeKey and the bean's class, for performance
+    if(bean != null)
+    {
+      String typeKey = _buildTypeKey(beanType, rendererType);
+      _TYPES_CLASS.put(typeKey, bean.getClass());
+    }
+  }
+
   static private final TrinidadLogger _LOG = TrinidadLogger.createTrinidadLogger(FacesBeanFactory.class);
-  static private       Map<Object, Object> _TYPES_MAP;
+  static private Map<Object, Object> _TYPES_MAP;
+  static private Map<String, Class<?>> _TYPES_CLASS = new HashMap<String, Class<?>>();
 
   static
   {