craigmcc 02/03/01 11:37:45 Modified: catalina/src/share/org/apache/catalina/authenticator AuthenticatorBase.java catalina/src/share/org/apache/catalina/session StandardSession.java Log: Use Java reflection to remove cross-package dependencies on org.apache.catalina.core.StandardContext in AuthenticatorBase and StandardSession. There are now no external package dependencies on anything in o.a.c.core except for: - org.apache.catalina.mbeans.* - Creation of the JMX MBeans that correspond to each of the standard implementation classes - org.apache.catalina.startup.* - Initial configuration and startup of the standard implementation clasess. Neither of which is useful in a "minimal Tomcat" scenario. Submitted by: Christopher K.St.John <cks at distributopia.com> Revision Changes Path 1.30 +18 -7 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/authenticator/AuthenticatorBase.java Index: AuthenticatorBase.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/authenticator/AuthenticatorBase.java,v retrieving revision 1.29 retrieving revision 1.30 diff -u -r1.29 -r1.30 --- AuthenticatorBase.java 27 Feb 2002 17:42:36 -0000 1.29 +++ AuthenticatorBase.java 1 Mar 2002 19:37:44 -0000 1.30 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/authenticator/AuthenticatorBase.java,v 1.29 2002/02/27 17:42:36 remm Exp $ - * $Revision: 1.29 $ - * $Date: 2002/02/27 17:42:36 $ + * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/authenticator/AuthenticatorBase.java,v 1.30 2002/03/01 19:37:44 craigmcc Exp $ + * $Revision: 1.30 $ + * $Date: 2002/03/01 19:37:44 $ * * ==================================================================== * @@ -66,6 +66,7 @@ import java.io.IOException; +import java.lang.reflect.Method; import java.net.MalformedURLException; import java.net.URL; import java.security.MessageDigest; @@ -95,7 +96,6 @@ import org.apache.catalina.Session; import org.apache.catalina.Valve; import org.apache.catalina.ValveContext; -import org.apache.catalina.core.StandardContext; import org.apache.catalina.deploy.LoginConfig; import org.apache.catalina.deploy.SecurityConstraint; import org.apache.catalina.util.LifecycleSupport; @@ -121,7 +121,7 @@ * requests. Requests of any other type will simply be passed through. * * @author Craig R. McClanahan - * @version $Revision: 1.29 $ $Date: 2002/02/27 17:42:36 $ + * @version $Revision: 1.30 $ $Date: 2002/03/01 19:37:44 $ */ @@ -1068,8 +1068,19 @@ throw new LifecycleException (sm.getString("authenticator.alreadyStarted")); lifecycle.fireLifecycleEvent(START_EVENT, null); - if (context instanceof StandardContext) - setDebug(((StandardContext) context).getDebug()); + if ("org.apache.catalina.core.StandardContext".equals + (context.getClass().getName())) { + try { + Class paramTypes[] = new Class[0]; + Object paramValues[] = new Object[0]; + Method method = + context.getClass().getMethod("getDebug", paramTypes); + Integer result = (Integer) method.invoke(context, paramValues); + setDebug(result.intValue()); + } catch (Exception e) { + log("Exception getting debug value", e); + } + } started = true; // Look up the SingleSignOn implementation in our request processing 1.28 +124 -41 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/session/StandardSession.java Index: StandardSession.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/session/StandardSession.java,v retrieving revision 1.27 retrieving revision 1.28 diff -u -r1.27 -r1.28 --- StandardSession.java 19 Jan 2002 01:58:24 -0000 1.27 +++ StandardSession.java 1 Mar 2002 19:37:45 -0000 1.28 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/session/StandardSession.java,v 1.27 2002/01/19 01:58:24 craigmcc Exp $ - * $Revision: 1.27 $ - * $Date: 2002/01/19 01:58:24 $ + * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/session/StandardSession.java,v 1.28 2002/03/01 19:37:45 craigmcc Exp $ + * $Revision: 1.28 $ + * $Date: 2002/03/01 19:37:45 $ * * ==================================================================== * @@ -72,6 +72,7 @@ import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; +import java.lang.reflect.Method; import java.security.Principal; import java.util.ArrayList; import java.util.Enumeration; @@ -92,7 +93,6 @@ import org.apache.catalina.Session; import org.apache.catalina.SessionEvent; import org.apache.catalina.SessionListener; -import org.apache.catalina.core.StandardContext; import org.apache.catalina.util.Enumerator; import org.apache.catalina.util.StringManager; @@ -115,7 +115,7 @@ * @author Craig R. McClanahan * @author Sean Legassick * @author <a href="mailto:[EMAIL PROTECTED]">Jon S. Stevens</a> - * @version $Revision: 1.27 $ $Date: 2002/01/19 01:58:24 $ + * @version $Revision: 1.28 $ $Date: 2002/03/01 19:37:45 $ */ class StandardSession @@ -166,6 +166,24 @@ /** + * The <code>java.lang.Method</code> for the + * <code>fireContainerEvent()</code> method of the + * <code>org.apache.catalina.core.StandardContext</code> method, + * if our Context implementation is of this class. This value is + * computed dynamically the first time it is needed, or after + * a session reload (since it is declared transient). + */ + private transient Method containerEventMethod = null; + + + /** + * The method signature for the <code>fireContainerEvent</code> method. + */ + private static final Class containerEventTypes[] = + { String.class, Object.class }; + + + /** * The time this session was created, in milliseconds since midnight, * January 1, 1970 GMT. */ @@ -360,7 +378,7 @@ fireSessionEvent(Session.SESSION_CREATED_EVENT, null); // Notify interested application event listeners - StandardContext context = (StandardContext) manager.getContainer(); + Context context = (Context) manager.getContainer(); Object listeners[] = context.getApplicationListeners(); if (listeners != null) { HttpSessionEvent event = @@ -371,14 +389,21 @@ HttpSessionListener listener = (HttpSessionListener) listeners[i]; try { - context.fireContainerEvent("beforeSessionCreated", - listener); + fireContainerEvent(context, + "beforeSessionCreated", + listener); listener.sessionCreated(event); - context.fireContainerEvent("afterSessionCreated", - listener); + fireContainerEvent(context, + "afterSessionCreated", + listener); } catch (Throwable t) { - context.fireContainerEvent("afterSessionCreated", - listener); + try { + fireContainerEvent(context, + "afterSessionCreated", + listener); + } catch (Exception e) { + ; + } // FIXME - should we do anything besides log these? log(sm.getString("standardSession.sessionEvent"), t); } @@ -616,7 +641,7 @@ // Notify interested application event listeners // FIXME - Assumes we call listeners in reverse order - StandardContext context = (StandardContext) manager.getContainer(); + Context context = (Context) manager.getContainer(); Object listeners[] = context.getApplicationListeners(); if (notify && (listeners != null)) { HttpSessionEvent event = @@ -628,14 +653,21 @@ HttpSessionListener listener = (HttpSessionListener) listeners[j]; try { - context.fireContainerEvent("beforeSessionDestroyed", - listener); + fireContainerEvent(context, + "beforeSessionDestroyed", + listener); listener.sessionDestroyed(event); - context.fireContainerEvent("afterSessionDestroyed", - listener); + fireContainerEvent(context, + "afterSessionDestroyed", + listener); } catch (Throwable t) { - context.fireContainerEvent("afterSessionDestroyed", - listener); + try { + fireContainerEvent(context, + "afterSessionDestroyed", + listener); + } catch (Exception e) { + ; + } // FIXME - should we do anything besides log these? log(sm.getString("standardSession.sessionEvent"), t); } @@ -1117,7 +1149,7 @@ ((HttpSessionBindingListener) value).valueUnbound(event); // Notify interested application event listeners - StandardContext context = (StandardContext) manager.getContainer(); + Context context = (Context) manager.getContainer(); Object listeners[] = context.getApplicationListeners(); if (listeners == null) return; @@ -1127,14 +1159,21 @@ HttpSessionAttributeListener listener = (HttpSessionAttributeListener) listeners[i]; try { - context.fireContainerEvent("beforeSessionAttributeRemoved", - listener); + fireContainerEvent(context, + "beforeSessionAttributeRemoved", + listener); listener.attributeRemoved(event); - context.fireContainerEvent("afterSessionAttributeRemoved", - listener); + fireContainerEvent(context, + "afterSessionAttributeRemoved", + listener); } catch (Throwable t) { - context.fireContainerEvent("afterSessionAttributeRemoved", - listener); + try { + fireContainerEvent(context, + "afterSessionAttributeRemoved", + listener); + } catch (Exception e) { + ; + } // FIXME - should we do anything besides log these? log(sm.getString("standardSession.attributeEvent"), t); } @@ -1232,7 +1271,7 @@ ((HttpSessionBindingListener) value).valueBound(event); // Notify interested application event listeners - StandardContext context = (StandardContext) manager.getContainer(); + Context context = (Context) manager.getContainer(); Object listeners[] = context.getApplicationListeners(); if (listeners == null) return; @@ -1243,25 +1282,36 @@ (HttpSessionAttributeListener) listeners[i]; try { if (unbound != null) { - context.fireContainerEvent("beforeSessionAttributeReplaced", - listener); + fireContainerEvent(context, + "beforeSessionAttributeReplaced", + listener); listener.attributeReplaced(event); - context.fireContainerEvent("afterSessionAttributeReplaced", - listener); + fireContainerEvent(context, + "afterSessionAttributeReplaced", + listener); } else { - context.fireContainerEvent("beforeSessionAttributeAdded", - listener); + fireContainerEvent(context, + "beforeSessionAttributeAdded", + listener); listener.attributeAdded(event); - context.fireContainerEvent("afterSessionAttributeAdded", - listener); + fireContainerEvent(context, + "afterSessionAttributeAdded", + listener); } } catch (Throwable t) { - if (unbound != null) - context.fireContainerEvent("afterSessionAttributeReplaced", - listener); - else - context.fireContainerEvent("afterSessionAttributeAdded", - listener); + try { + if (unbound != null) { + fireContainerEvent(context, + "afterSessionAttributeReplaced", + listener); + } else { + fireContainerEvent(context, + "afterSessionAttributeAdded", + listener); + } + } catch (Exception e) { + ; + } // FIXME - should we do anything besides log these? log(sm.getString("standardSession.attributeEvent"), t); } @@ -1398,6 +1448,39 @@ // -------------------------------------------------------- Private Methods + + + /** + * Fire container events if the Context implementation is the + * <code>org.apache.catalina.core.StandardContext</code>. + * + * @param context Context for which to fire events + * @param type Event type + * @param data Event data + * + * @exception Exception occurred during event firing + */ + private void fireContainerEvent(Context context, + String type, Object data) + throws Exception { + + if (!"org.apache.catalina.core.StandardContext".equals + (context.getClass().getName())) { + return; // Container events are not supported + } + // NOTE: Race condition is harmless, so do not synchronize + if (containerEventMethod == null) { + containerEventMethod = + context.getClass().getMethod("fireContainerEvent", + containerEventTypes); + } + Object containerEventParams[] = new Object[2]; + containerEventParams[0] = type; + containerEventParams[1] = data; + containerEventMethod.invoke(context, containerEventParams); + + } + /**
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>