Author: rich
Date: Mon Aug 30 22:45:28 2004
New Revision: 37235

Modified:
   
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/FacesBackingBeanFactory.java
   
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/handler/ReloadableClassHandler.java
   
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/internal/DefaultReloadableClassHandler.java
Log:
Fixed to prevent a ClassNotFoundException from being thrown (and caught) on 
every request to a JSP that doesn't have an associated JSF backing class.

DRT: netui (WinXP)
BB: self (linux)



Modified: 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/FacesBackingBeanFactory.java
==============================================================================
--- 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/FacesBackingBeanFactory.java
   (original)
+++ 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/FacesBackingBeanFactory.java
   Mon Aug 30 22:45:28 2004
@@ -48,10 +48,26 @@
             try
             {
                 Class backingClass =
-                    ContextCache.get( servletContext 
).getReloadableClassHandler().loadClass( backingClassName, request );
+                    ContextCache.get( servletContext 
).getReloadableClassHandler().loadCachedClass( backingClassName,
+                                                                               
                     request );
                 
-                if ( backingClass.getAnnotation( Jpf.FacesBacking.class ) != 
null )
+                
+                if ( backingClass == null )
+                {
+                    if ( _log.isTraceEnabled() )
+                    {
+                        _log.trace( "No backing bean class " + 
backingClassName + " found for request "
+                                    + request.getRequestURI() );
+                    }
+                }
+                else if ( backingClass.getAnnotation( Jpf.FacesBacking.class ) 
!= null )
                 {
+                    if ( _log.isDebugEnabled() )
+                    {
+                        _log.debug( "Found backing class " + backingClassName 
+ " for request "
+                                    + request.getRequestURI() + "; creating a 
new instance." );
+                    }
+                    
                     FacesBackingBean bean = ( FacesBackingBean ) 
backingClass.newInstance();
                     bean.create( request, response, servletContext );
                     bean.persistInSession( request, response, servletContext );
@@ -61,20 +77,12 @@
                 {
                     if ( _log.isDebugEnabled() )
                     {
-                        _log.debug( "Found matching backing class " + 
backingClassName + "for request " 
+                        _log.debug( "Found matching backing class " + 
backingClassName + " for request " 
                                     + request.getRequestURI() + ", but it does 
not have the "
                                     + Jpf.FacesBacking.class.getName() + " 
annotation." );
                     }
                 }
             }
-            catch ( ClassNotFoundException e )
-            {
-                if ( _log.isTraceEnabled() )
-                {
-                    _log.trace( "No backing bean class " + backingClassName + 
" found for request "
-                                + request.getRequestURI() );
-                }
-            }
             catch ( InstantiationException e )
             {
                 _log.error( "Could not create backing bean instance of " + 
backingClassName, e );
@@ -94,6 +102,12 @@
         }
         else if ( currentBean != null )
         {
+            if ( _log.isDebugEnabled() )
+            {
+                _log.debug( "Using existing backing bean instance " + 
currentBean + " for request " +
+                            request.getRequestURI() );
+            }
+            
             currentBean.reinitialize( request, response, servletContext );
         }
         

Modified: 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/handler/ReloadableClassHandler.java
==============================================================================
--- 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/handler/ReloadableClassHandler.java
    (original)
+++ 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/handler/ReloadableClassHandler.java
    Mon Aug 30 22:45:28 2004
@@ -32,6 +32,8 @@
     Class loadClass( String className, HttpServletRequest request )
         throws ClassNotFoundException;
 
+    Class loadCachedClass( String className, HttpServletRequest request );
+    
     void reinit( HttpServletRequest request );
 
     ClassLoader getClassLoader();

Modified: 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/internal/DefaultReloadableClassHandler.java
==============================================================================
--- 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/internal/DefaultReloadableClassHandler.java
    (original)
+++ 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/internal/DefaultReloadableClassHandler.java
    Mon Aug 30 22:45:28 2004
@@ -27,6 +27,9 @@
 import javax.servlet.http.HttpSession;
 import javax.servlet.ServletContext;
 import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 import java.io.File;
 
 import org.apache.struts.action.ActionServlet;
@@ -62,6 +65,34 @@
         throws ClassNotFoundException, InstantiationException, 
IllegalAccessException
     {
         return loadClass( className, request ).newInstance();
+    }
+    
+    private static Map< String, Class > _loadedClasses = new 
ConcurrentHashMap< String, Class >();
+    private static class Null {}
+    private static Class NULL_CLASS = Null.class;
+    
+    public Class loadCachedClass( String className, HttpServletRequest request 
)
+    {
+        Class clazz = _loadedClasses.get( className );
+        
+        if ( clazz != null )
+        {
+            return clazz != NULL_CLASS ? clazz : null;
+        }
+        else
+        {
+            try
+            {
+                clazz = loadClass( className, request );
+                _loadedClasses.put( className, clazz );
+                return clazz;
+            }
+            catch ( ClassNotFoundException e )
+            {
+                _loadedClasses.put( className, NULL_CLASS );
+                return null;
+            }
+        }
     }
     
     public Class loadClass( String className, HttpServletRequest request )

Reply via email to