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 )