You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by cr...@apache.org on 2001/01/23 03:51:17 UTC
cvs commit: jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core StandardPipeline.java ContainerBase.java LocalStrings.properties StandardContext.java StandardContextValve.java StandardEngine.java StandardEngineValve.java StandardHost.java StandardHostValve.java StandardWrapper.java StandardWrapperValve.java
craigmcc 01/01/22 18:51:17
Modified: catalina/src/share/org/apache/catalina/core
ContainerBase.java LocalStrings.properties
StandardContext.java StandardContextValve.java
StandardEngine.java StandardEngineValve.java
StandardHost.java StandardHostValve.java
StandardWrapper.java StandardWrapperValve.java
Added: catalina/src/share/org/apache/catalina/core
StandardPipeline.java
Log:
Second of four check-ins for the Valve API change.
Add a StandardPipeline implementation of the Pipeline interface. Make
ContainerBase (and therefore all containers that inherit from it)
reference a Pipeline as a separate object to which valve management is
delegated, rather than implementing Pipeline directly.
Revision Changes Path
1.7 +43 -194 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/ContainerBase.java
Index: ContainerBase.java
===================================================================
RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/ContainerBase.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- ContainerBase.java 2001/01/04 20:05:36 1.6
+++ ContainerBase.java 2001/01/23 02:51:14 1.7
@@ -1,13 +1,13 @@
/*
- * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/ContainerBase.java,v 1.6 2001/01/04 20:05:36 craigmcc Exp $
- * $Revision: 1.6 $
- * $Date: 2001/01/04 20:05:36 $
+ * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/ContainerBase.java,v 1.7 2001/01/23 02:51:14 craigmcc Exp $
+ * $Revision: 1.7 $
+ * $Date: 2001/01/23 02:51:14 $
*
* ====================================================================
*
* The Apache Software License, Version 1.1
*
- * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * Copyright (c) 1999-2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -99,11 +99,12 @@
* this base class must implement <code>getInfo()</code>, and may implement
* a replacement for <code>invoke()</code>.
* <p>
- * If a subclass prefers to use the default version of <code>invoke()</code>
- * with pipeline support, it should instantiate a Valve instance containing
- * the default behavior desired, and assign it with <code>setBasic()</code>
- * in a constructor. In that way, any and all configured Valves added to the
- * pipeline will preceed the basic Valve.
+ * All subclasses of this abstract base class will include support for a
+ * Pipeline object that defines the processing to be performed for each request
+ * received by the <code>invoke()</code> method of this class, utilizig the
+ * "Chain of Responsibility" design pattern. A subclass should encapsulate its
+ * own processing functionality as a <code>Valve</code>, and configure this
+ * Valve into the pipeline by calling <code>setBasic()</code>.
* <p>
* This implementation fires property change events, per the JavaBeans design
* pattern, for changes in singleton properties. In addition, it fires the
@@ -150,23 +151,17 @@
* class comments of the implementation class.
*
* @author Craig R. McClanahan
- * @version $Revision: 1.6 $ $Date: 2001/01/04 20:05:36 $
+ * @version $Revision: 1.7 $ $Date: 2001/01/23 02:51:14 $
*/
public abstract class ContainerBase
- implements Container, Lifecycle, Pipeline {
+ implements Container, Lifecycle {
// ----------------------------------------------------- Instance Variables
/**
- * The Valve that implements the basic behavior of this Container, if any.
- */
- protected Valve basic = null;
-
-
- /**
* The child Containers belonging to this Container, keyed by name.
*/
protected HashMap children = new HashMap();
@@ -179,12 +174,6 @@
/**
- * The first Valve in the pipeline associated with this Container.
- */
- protected Valve first = null;
-
-
- /**
* The lifecycle event support for this component.
*/
protected LifecycleSupport lifecycle = new LifecycleSupport(this);
@@ -246,8 +235,14 @@
/**
* The parent class loader to be configured when we install a Loader.
+ */
+ protected ClassLoader parentClassLoader = null;
+
+
+ /**
+ * The Pipeline object with which this Container is associated.
*/
- private ClassLoader parentClassLoader = null;
+ protected Pipeline pipeline = new StandardPipeline(this);
/**
@@ -285,70 +280,6 @@
/**
- * Return the Valve that provides the basic functionality for this
- * Container, if any.
- */
- public Valve getBasic() {
-
- return (basic);
-
- }
-
-
- /**
- * Set the Valve that provides the basic functionality for this
- * Container, if any.
- *
- * @param valve The new basic Valve
- */
- public synchronized void setBasic(Valve valve) {
-
- // Change components if necessary
- Valve oldBasic = this.basic;
- if (oldBasic == valve)
- return;
- this.basic = valve;
-
- // Stop the old component if necessary and remove it from the pipeline
- if (oldBasic != null) {
- Valve previous = getLast();
- if (previous != null)
- previous.setNext(null);
- oldBasic.setContainer(null);
- }
- if (started && (oldBasic != null) && (oldBasic instanceof Lifecycle)) {
- try {
- ((Lifecycle) oldBasic).stop();
- } catch (LifecycleException e) {
- log("ContainerBase.setBasic: stop: ", e);
- }
- }
-
- // Start the new component if necessary and link it into the pipeline
- if (this.basic != null) {
- this.basic.setContainer((Container) this);
- this.basic.setNext(null);
- }
- if (started && (valve != null) && (valve instanceof Lifecycle)) {
- try {
- ((Lifecycle) valve).start();
- } catch (LifecycleException e) {
- log("ContainerBase.setBasic: start: ", e);
- }
- }
- if (this.basic != null) {
- Valve previous = getLast();
- if (previous != null)
- previous.setNext(this.basic);
- }
-
- // Report this property change to interested listeners
- support.firePropertyChange("basic", oldBasic, this.basic);
-
- }
-
-
- /**
* Return the debugging detail level for this component.
*/
public int getDebug() {
@@ -382,23 +313,6 @@
/**
- * Return the last configured Valve (other than the basic Valve, if any)
- * configured in the pipeline for this Container, if any; otherwise
- * return <code>null</code>.
- */
- public Valve getLast() {
-
- if (first == null)
- return (null);
- Valve next = first;
- while ((next.getNext() != null) && (next.getNext() != basic))
- next = next.getNext();
- return (next);
-
- }
-
-
- /**
* Return the Loader with which this Container is associated. If there is
* no associated Loader, return the Loader associated with our parent
* Container (if any); otherwise, return <code>null</code>.
@@ -668,6 +582,17 @@
/**
+ * Return the Pipeline object that manages the Valves associated with
+ * this Container.
+ */
+ public Pipeline getPipeline() {
+
+ return (this.pipeline);
+
+ }
+
+
+ /**
* Return the Realm with which this Container is associated. If there is
* no associated Realm, return the Realm associated with our parent
* Container (if any); otherwise return <code>null</code>.
@@ -971,13 +896,7 @@
public void invoke(Request request, Response response)
throws IOException, ServletException {
- if (first != null)
- first.invoke(request, response);
- else if (basic != null)
- basic.invoke(request, response);
- else
- throw new IllegalStateException
- (sm.getString("containerBase.notConfigured"));
+ pipeline.invoke(request, response);
}
@@ -1161,12 +1080,8 @@
}
// Start the Valves in our pipeline (including the basic), if any
- Valve current = first;
- while (current != null) {
- if (current instanceof Lifecycle)
- ((Lifecycle) current).start();
- current = current.getNext();
- }
+ if (pipeline instanceof Lifecycle)
+ ((Lifecycle) pipeline).start();
// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(START_EVENT, null);
@@ -1193,14 +1108,8 @@
started = false;
// Stop the Valves in our pipeline (including the basic), if any
- Valve current = basic;
- if (current == null)
- current = getLast();
- while (current != null) {
- if (current instanceof Lifecycle)
- ((Lifecycle) current).stop();
- current = current.getPrevious();
- }
+ if (pipeline instanceof Lifecycle)
+ ((Lifecycle) pipeline).stop();
// Stop our child containers, if any
Container children[] = findChildren();
@@ -1253,53 +1162,21 @@
* associated with a different Container
*/
public synchronized void addValve(Valve valve) {
-
- // Start the new component if necessary
- valve.setContainer((Container) this);
- valve.setNext(basic);
- if (started && (valve != null) && (valve instanceof Lifecycle)) {
- try {
- ((Lifecycle) valve).start();
- } catch (LifecycleException e) {
- log("ContainerBase.addValve: start: ", e);
- }
- }
-
- // Link the new component into the pipeline
- if (basic == null) {
- Valve last = getLast();
- if (last == null) {
- valve.setPrevious(null);
- first = valve;
- } else {
- valve.setPrevious(last);
- last.setNext(valve);
- }
- } else {
- Valve previous = basic.getPrevious();
- if (previous == null) {
- valve.setPrevious(null);
- first = valve;
- } else {
- valve.setPrevious(previous);
- previous.setNext(valve);
- }
- basic.setPrevious(valve);
- }
- // Report this pipeline change to interested listeners
+ pipeline.addValve(valve);
fireContainerEvent(ADD_VALVE_EVENT, valve);
}
/**
- * Return the first Valve in the pipeline associated with this Container.
- * If there are no such Valves, <code>null</code> is returned.
+ * Return the set of Valves in the pipeline associated with this
+ * Container, including the basic Valve (if any). If there are no
+ * such Valves, a zero-length array is returned.
*/
- public Valve findValves() {
+ public Valve[] getValves() {
- return (first);
+ return (pipeline.getValves());
}
@@ -1312,36 +1189,8 @@
*/
public synchronized void removeValve(Valve valve) {
- Valve current = first;
- while (current != null) {
- if (current != valve) {
- current = current.getNext();
- continue;
- }
- Valve previous = current.getPrevious();
- Valve next = current.getNext();
- if (previous == null) {
- if (next == null) {
- first = null;
- } else {
- next.setPrevious(null);
- first = next;
- }
- } else {
- previous.setNext(next);
- if (next != null)
- next.setPrevious(previous);
- }
- if (started && (valve != null) && (valve instanceof Lifecycle)) {
- try {
- ((Lifecycle) valve).stop();
- } catch (LifecycleException e) {
- log("ContainerBase.removeValve: stop: ", e);
- }
- }
- fireContainerEvent(REMOVE_VALVE_EVENT, valve);
- break;
- }
+ pipeline.removeValve(valve);
+ fireContainerEvent(REMOVE_VALVE_EVENT, valve);
}
1.23 +3 -0 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/LocalStrings.properties
Index: LocalStrings.properties
===================================================================
RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/LocalStrings.properties,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -r1.22 -r1.23
--- LocalStrings.properties 2000/12/23 19:00:31 1.22
+++ LocalStrings.properties 2001/01/23 02:51:14 1.23
@@ -95,6 +95,9 @@
standardHost.unfoundContext=Cannot find context for request URI {0}
standardHost.warRequired=URL to web application archive is required
standardHost.warURL=Invalid URL for web application archive: {0}
+standardPipeline.alreadyStarted=Pipeline has already been started
+standardPipeline.notStarted=Pipeline has not been started
+standardPipeline.noValve=No more Valves in the Pipeline processing this request
standardServer.addContainer.ise=No connectors available to associate this container with
standardServer.start.connectors=At least one connector is not associated with any container
standardServer.start.started=This server has already been started
1.34 +6 -6 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardContext.java
Index: StandardContext.java
===================================================================
RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardContext.java,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -r1.33 -r1.34
--- StandardContext.java 2000/12/23 19:00:32 1.33
+++ StandardContext.java 2001/01/23 02:51:14 1.34
@@ -1,13 +1,13 @@
/*
- * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardContext.java,v 1.33 2000/12/23 19:00:32 craigmcc Exp $
- * $Revision: 1.33 $
- * $Date: 2000/12/23 19:00:32 $
+ * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardContext.java,v 1.34 2001/01/23 02:51:14 craigmcc Exp $
+ * $Revision: 1.34 $
+ * $Date: 2001/01/23 02:51:14 $
*
* ====================================================================
*
* The Apache Software License, Version 1.1
*
- * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * Copyright (c) 1999-2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -133,7 +133,7 @@
*
* @author Craig R. McClanahan
* @author Remy Maucherat
- * @version $Revision: 1.33 $ $Date: 2000/12/23 19:00:32 $
+ * @version $Revision: 1.34 $ $Date: 2001/01/23 02:51:14 $
*/
public class StandardContext
@@ -150,7 +150,7 @@
public StandardContext() {
super();
- setBasic(new StandardContextValve());
+ pipeline.setBasic(new StandardContextValve());
}
1.6 +9 -6 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardContextValve.java
Index: StandardContextValve.java
===================================================================
RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardContextValve.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- StandardContextValve.java 2000/12/01 02:11:22 1.5
+++ StandardContextValve.java 2001/01/23 02:51:15 1.6
@@ -1,13 +1,13 @@
/*
- * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardContextValve.java,v 1.5 2000/12/01 02:11:22 craigmcc Exp $
- * $Revision: 1.5 $
- * $Date: 2000/12/01 02:11:22 $
+ * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardContextValve.java,v 1.6 2001/01/23 02:51:15 craigmcc Exp $
+ * $Revision: 1.6 $
+ * $Date: 2001/01/23 02:51:15 $
*
* ====================================================================
*
* The Apache Software License, Version 1.1
*
- * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * Copyright (c) 1999-2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -75,6 +75,7 @@
import org.apache.catalina.Container;
import org.apache.catalina.Request;
import org.apache.catalina.Response;
+import org.apache.catalina.ValveContext;
import org.apache.catalina.Wrapper;
import org.apache.catalina.util.StringManager;
import org.apache.catalina.valves.ValveBase;
@@ -88,7 +89,7 @@
* when processing HTTP requests.
*
* @author Craig R. McClanahan
- * @version $Revision: 1.5 $ $Date: 2000/12/01 02:11:22 $
+ * @version $Revision: 1.6 $ $Date: 2001/01/23 02:51:15 $
*/
final class StandardContextValve
@@ -135,11 +136,13 @@
*
* @param request Request to be processed
* @param response Response to be produced
+ * @param valveContext Valve context used to forward to the next Valve
*
* @exception IOException if an input/output error occurred
* @exception ServletException if a servlet error occurred
*/
- public void invoke(Request request, Response response)
+ public void invoke(Request request, Response response,
+ ValveContext valveContext)
throws IOException, ServletException {
// Validate the request and response object types
1.5 +6 -6 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardEngine.java
Index: StandardEngine.java
===================================================================
RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardEngine.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- StandardEngine.java 2000/12/17 02:34:25 1.4
+++ StandardEngine.java 2001/01/23 02:51:15 1.5
@@ -1,13 +1,13 @@
/*
- * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardEngine.java,v 1.4 2000/12/17 02:34:25 craigmcc Exp $
- * $Revision: 1.4 $
- * $Date: 2000/12/17 02:34:25 $
+ * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardEngine.java,v 1.5 2001/01/23 02:51:15 craigmcc Exp $
+ * $Revision: 1.5 $
+ * $Date: 2001/01/23 02:51:15 $
*
* ====================================================================
*
* The Apache Software License, Version 1.1
*
- * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * Copyright (c) 1999-2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -84,7 +84,7 @@
* fully qualified host name of that virtual host.
*
* @author Craig R. McClanahan
- * @version $Revision: 1.4 $ $Date: 2000/12/17 02:34:25 $
+ * @version $Revision: 1.5 $ $Date: 2001/01/23 02:51:15 $
*/
public class StandardEngine
@@ -101,7 +101,7 @@
public StandardEngine() {
super();
- setBasic(new StandardEngineValve());
+ pipeline.setBasic(new StandardEngineValve());
}
1.3 +10 -7 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardEngineValve.java
Index: StandardEngineValve.java
===================================================================
RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardEngineValve.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- StandardEngineValve.java 2000/09/09 03:20:50 1.2
+++ StandardEngineValve.java 2001/01/23 02:51:15 1.3
@@ -1,13 +1,13 @@
/*
- * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardEngineValve.java,v 1.2 2000/09/09 03:20:50 craigmcc Exp $
- * $Revision: 1.2 $
- * $Date: 2000/09/09 03:20:50 $
+ * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardEngineValve.java,v 1.3 2001/01/23 02:51:15 craigmcc Exp $
+ * $Revision: 1.3 $
+ * $Date: 2001/01/23 02:51:15 $
*
* ====================================================================
*
* The Apache Software License, Version 1.1
*
- * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * Copyright (c) 1999-2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -73,6 +73,7 @@
import org.apache.catalina.Host;
import org.apache.catalina.Request;
import org.apache.catalina.Response;
+import org.apache.catalina.ValveContext;
import org.apache.catalina.util.StringManager;
import org.apache.catalina.valves.ValveBase;
@@ -85,7 +86,7 @@
* when processing HTTP requests.
*
* @author Craig R. McClanahan
- * @version $Revision: 1.2 $ $Date: 2000/09/09 03:20:50 $
+ * @version $Revision: 1.3 $ $Date: 2001/01/23 02:51:15 $
*/
final class StandardEngineValve
@@ -131,12 +132,14 @@
* be found, return an appropriate HTTP error.
*
* @param request Request to be processed
- * @param update Update request to reflect this mapping?
+ * @param response Response to be produced
+ * @param valveContext Valve context used to forward to the next Valve
*
* @exception IOException if an input/output error occurred
* @exception ServletException if a servlet error occurred
*/
- public void invoke(Request request, Response response)
+ public void invoke(Request request, Response response,
+ ValveContext valveContext)
throws IOException, ServletException {
// Validate the request and response object types
1.7 +6 -6 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardHost.java
Index: StandardHost.java
===================================================================
RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardHost.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- StandardHost.java 2000/12/07 19:37:41 1.6
+++ StandardHost.java 2001/01/23 02:51:15 1.7
@@ -1,13 +1,13 @@
/*
- * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardHost.java,v 1.6 2000/12/07 19:37:41 pier Exp $
- * $Revision: 1.6 $
- * $Date: 2000/12/07 19:37:41 $
+ * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardHost.java,v 1.7 2001/01/23 02:51:15 craigmcc Exp $
+ * $Revision: 1.7 $
+ * $Date: 2001/01/23 02:51:15 $
*
* ====================================================================
*
* The Apache Software License, Version 1.1
*
- * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * Copyright (c) 1999-2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -97,7 +97,7 @@
* requests directed to a particular web application.
*
* @author Craig R. McClanahan
- * @version $Revision: 1.6 $ $Date: 2000/12/07 19:37:41 $
+ * @version $Revision: 1.7 $ $Date: 2001/01/23 02:51:15 $
*/
public class StandardHost
@@ -114,7 +114,7 @@
public StandardHost() {
super();
- setBasic(new StandardHostValve());
+ pipeline.setBasic(new StandardHostValve());
}
1.4 +9 -6 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardHostValve.java
Index: StandardHostValve.java
===================================================================
RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardHostValve.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- StandardHostValve.java 2000/09/09 03:20:50 1.3
+++ StandardHostValve.java 2001/01/23 02:51:15 1.4
@@ -1,13 +1,13 @@
/*
- * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardHostValve.java,v 1.3 2000/09/09 03:20:50 craigmcc Exp $
- * $Revision: 1.3 $
- * $Date: 2000/09/09 03:20:50 $
+ * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardHostValve.java,v 1.4 2001/01/23 02:51:15 craigmcc Exp $
+ * $Revision: 1.4 $
+ * $Date: 2001/01/23 02:51:15 $
*
* ====================================================================
*
* The Apache Software License, Version 1.1
*
- * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * Copyright (c) 1999-2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -73,6 +73,7 @@
import org.apache.catalina.Context;
import org.apache.catalina.Request;
import org.apache.catalina.Response;
+import org.apache.catalina.ValveContext;
import org.apache.catalina.util.StringManager;
import org.apache.catalina.valves.ValveBase;
@@ -85,7 +86,7 @@
* when processing HTTP requests.
*
* @author Craig R. McClanahan
- * @version $Revision: 1.3 $ $Date: 2000/09/09 03:20:50 $
+ * @version $Revision: 1.4 $ $Date: 2001/01/23 02:51:15 $
*/
final class StandardHostValve
@@ -132,11 +133,13 @@
*
* @param request Request to be processed
* @param response Response to be produced
+ * @param valveContext Valve context used to forward to the next Valve
*
* @exception IOException if an input/output error occurred
* @exception ServletException if a servlet error occurred
*/
- public void invoke(Request request, Response response)
+ public void invoke(Request request, Response response,
+ ValveContext valveContext)
throws IOException, ServletException {
// Validate the request and response object types
1.12 +5 -5 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardWrapper.java
Index: StandardWrapper.java
===================================================================
RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardWrapper.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- StandardWrapper.java 2000/11/25 00:57:24 1.11
+++ StandardWrapper.java 2001/01/23 02:51:15 1.12
@@ -1,7 +1,7 @@
/*
- * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardWrapper.java,v 1.11 2000/11/25 00:57:24 craigmcc Exp $
- * $Revision: 1.11 $
- * $Date: 2000/11/25 00:57:24 $
+ * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardWrapper.java,v 1.12 2001/01/23 02:51:15 craigmcc Exp $
+ * $Revision: 1.12 $
+ * $Date: 2001/01/23 02:51:15 $
*
* ====================================================================
*
@@ -101,7 +101,7 @@
* make them efficient are counter-productive.
*
* @author Craig R. McClanahan
- * @version $Revision: 1.11 $ $Date: 2000/11/25 00:57:24 $
+ * @version $Revision: 1.12 $ $Date: 2001/01/23 02:51:15 $
*/
public final class StandardWrapper
@@ -118,7 +118,7 @@
public StandardWrapper() {
super();
- setBasic(new StandardWrapperValve());
+ pipeline.setBasic(new StandardWrapperValve());
}
1.16 +9 -6 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardWrapperValve.java
Index: StandardWrapperValve.java
===================================================================
RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardWrapperValve.java,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- StandardWrapperValve.java 2001/01/04 19:49:22 1.15
+++ StandardWrapperValve.java 2001/01/23 02:51:16 1.16
@@ -1,13 +1,13 @@
/*
- * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardWrapperValve.java,v 1.15 2001/01/04 19:49:22 remm Exp $
- * $Revision: 1.15 $
- * $Date: 2001/01/04 19:49:22 $
+ * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardWrapperValve.java,v 1.16 2001/01/23 02:51:16 craigmcc Exp $
+ * $Revision: 1.16 $
+ * $Date: 2001/01/23 02:51:16 $
*
* ====================================================================
*
* The Apache Software License, Version 1.1
*
- * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * Copyright (c) 1999-2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -87,6 +87,7 @@
import org.apache.catalina.Logger;
import org.apache.catalina.Request;
import org.apache.catalina.Response;
+import org.apache.catalina.ValveContext;
import org.apache.catalina.Wrapper;
import org.apache.catalina.deploy.ErrorPage;
import org.apache.catalina.deploy.FilterDef;
@@ -101,7 +102,7 @@
* <code>StandardWrapper</code> container implementation.
*
* @author Craig R. McClanahan
- * @version $Revision: 1.15 $ $Date: 2001/01/04 19:49:22 $
+ * @version $Revision: 1.16 $ $Date: 2001/01/23 02:51:16 $
*/
final class StandardWrapperValve
@@ -159,11 +160,13 @@
*
* @param request Request to be processed
* @param response Response to be produced
+ * @param valveContext Valve context used to forward to the next Valve
*
* @exception IOException if an input/output error occurred
* @exception ServletException if a servlet error occurred
*/
- public void invoke(Request request, Response response)
+ public void invoke(Request request, Response response,
+ ValveContext valveContext)
throws IOException, ServletException {
// Initialize local variables we may need
1.1 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardPipeline.java
Index: StandardPipeline.java
===================================================================
/*
* $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardPipeline.java,v 1.1 2001/01/23 02:51:15 craigmcc Exp $
* $Revision: 1.1 $
* $Date: 2001/01/23 02:51:15 $
*
* ====================================================================
*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999-2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
* [Additional notices, if required by prior licensing conditions]
*
*/
package org.apache.catalina.core;
import java.io.IOException;
import javax.servlet.ServletException;
import org.apache.catalina.Contained;
import org.apache.catalina.Container;
import org.apache.catalina.Lifecycle;
import org.apache.catalina.LifecycleEvent;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.LifecycleListener;
import org.apache.catalina.Logger;
import org.apache.catalina.Pipeline;
import org.apache.catalina.Request;
import org.apache.catalina.Response;
import org.apache.catalina.Valve;
import org.apache.catalina.ValveContext;
import org.apache.catalina.util.LifecycleSupport;
import org.apache.catalina.util.StringManager;
/**
* Standard implementation of a processing <b>Pipeline</b> that will invoke
* a series of Valves that have been configured to be called in order. This
* implementation can be used for any type of Container.
*
* <b>IMPLEMENTATION WARNING</b> - This implementation assumes that no
* calls to <code>addValve()</code> or <code>removeValve</code> are allowed
* while a request is currently being processed. Otherwise, the mechanism
* by which per-thread state is maintained will need to be modified.
*
* @author Craig R. McClanahan
*/
public class StandardPipeline
implements Pipeline, Contained, Lifecycle, ValveContext {
// ----------------------------------------------------------- Constructors
/**
* Construct a new StandardPipeline instance with no associated Container.
*/
public StandardPipeline() {
this(null);
}
/**
* Construct a new StandardPipeline instance that is associated with the
* specified Container.
*
* @param container The container we should be associated with
*/
public StandardPipeline(Container container) {
super();
setContainer(container);
}
// ----------------------------------------------------- Instance Variables
/**
* The basic Valve (if any) associated with this Pipeline.
*/
protected Valve basic = null;
/**
* The Container with which this Pipeline is associated.
*/
protected Container container = null;
/**
* The debugging detail level for this component.
*/
protected int debug = 0;
/**
* Descriptive information about this implementation.
*/
protected String info = "org.apache.catalina.core.StandardPipeline/1.0";
/**
* The lifecycle event support for this component.
*/
protected LifecycleSupport lifecycle = new LifecycleSupport(this);
/**
* The string manager for this package.
*/
protected static StringManager sm =
StringManager.getManager(Constants.Package);
/**
* Has this component been started yet?
*/
protected boolean started = false;
/**
* The per-thread execution state for processing through this pipeline.
* The actual value is a java.lang.Integer object containing the subscript
* into the <code>values</code> array, or a subscript equal to
* <code>values.length</code> if the basic Valve is currently being
* processed.
*/
protected ThreadLocal state = new ThreadLocal();
/**
* The set of Valves (not including the Basic one, if any) associated with
* this Pipeline.
*/
protected Valve valves[] = new Valve[0];
// --------------------------------------------------------- Public Methods
/**
* Return descriptive information about this implementation class.
*/
public String getInfo() {
return (this.info);
}
// ------------------------------------------------------ Contained Methods
/**
* Return the Container with which this Pipeline is associated.
*/
public Container getContainer() {
return (this.container);
}
/**
* Set the Container with which this Pipeline is associated.
*
* @param container The new associated container
*/
public void setContainer(Container container) {
this.container = container;
}
// ------------------------------------------------------ Lifecycle Methods
/**
* Add a lifecycle event listener to this component.
*
* @param listener The listener to add
*/
public void addLifecycleListener(LifecycleListener listener) {
lifecycle.addLifecycleListener(listener);
}
/**
* Remove a lifecycle event listener from this component.
*
* @param listener The listener to remove
*/
public void removeLifecycleListener(LifecycleListener listener) {
lifecycle.removeLifecycleListener(listener);
}
/**
* Prepare for active use of the public methods of this Component.
*
* @exception IllegalStateException if this component has already been
* started
* @exception LifecycleException if this component detects a fatal error
* that prevents it from being started
*/
public synchronized void start() throws LifecycleException {
// Validate and update our current component state
if (started)
throw new LifecycleException
(sm.getString("standardPipeline.alreadyStarted"));
started = true;
// Start the Valves in our pipeline (including the basic), if any
for (int i = 0; i < valves.length; i++) {
if (valves[i] instanceof Lifecycle)
((Lifecycle) valves[i]).start();
}
if ((basic != null) && (basic instanceof Lifecycle))
((Lifecycle) basic).start();
// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(START_EVENT, null);
}
/**
* Gracefully shut down active use of the public methods of this Component.
*
* @exception IllegalStateException if this component has not been started
* @exception LifecycleException if this component detects a fatal error
* that needs to be reported
*/
public synchronized void stop() throws LifecycleException {
// Validate and update our current component state
if (!started)
throw new LifecycleException
(sm.getString("standardPipeline.notStarted"));
// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(STOP_EVENT, null);
started = false;
// Stop the Valves in our pipeline (including the basic), if any
if ((basic != null) && (basic instanceof Lifecycle))
((Lifecycle) basic).stop();
for (int i = 0; i < valves.length; i++) {
if (valves[i] instanceof Lifecycle)
((Lifecycle) valves[i]).stop();
}
}
// ------------------------------------------------------- Pipeline Methods
/**
* <p>Return the Valve instance that has been distinguished as the basic
* Valve for this Pipeline (if any).
*/
public Valve getBasic() {
return (this.basic);
}
/**
* <p>Set the Valve instance that has been distinguished as the basic
* Valve for this Pipeline (if any). Prioer to setting the basic Valve,
* the Valve's <code>setContainer()</code> will be called, if it
* implements <code>Contained</code>, with the owning Container as an
* argument. The method may throw an <code>IllegalArgumentException</code>
* if this Valve chooses not to be associated with this Container, or
* <code>IllegalStateException</code> if it is already associated with
* a different Container.</p>
*
* @param valve Valve to be distinguished as the basic Valve
*/
public void setBasic(Valve valve) {
// Change components if necessary
Valve oldBasic = this.basic;
if (oldBasic == valve)
return;
// Stop the old component if necessary
if (oldBasic != null) {
if (started && (oldBasic instanceof Lifecycle)) {
try {
((Lifecycle) oldBasic).stop();
} catch (LifecycleException e) {
log("StandardPipeline.setBasic: stop", e);
}
}
if (oldBasic instanceof Contained) {
try {
((Contained) oldBasic).setContainer(null);
} catch (Throwable t) {
;
}
}
}
// Start the new component if necessary
if (valve == null)
return;
if (valve instanceof Contained) {
((Contained) valve).setContainer(this.container);
}
if (valve instanceof Lifecycle) {
try {
((Lifecycle) valve).start();
} catch (LifecycleException e) {
log("StandardPipeline.setBasic: start", e);
return;
}
}
this.basic = valve;
}
/**
* <p>Add a new Valve to the end of the pipeline associated with this
* Container. Prior to adding the Valve, the Valve's
* <code>setContainer()</code> method will be called, if it implements
* <code>Contained</code>, with the owning Container as an argument.
* The method may throw an
* <code>IllegalArgumentException</code> if this Valve chooses not to
* be associated with this Container, or <code>IllegalStateException</code>
* if it is already associated with a different Container.</p>
*
* @param valve Valve to be added
*
* @exception IllegalArgumentException if this Container refused to
* accept the specified Valve
* @exception IllegalArgumentException if the specifie Valve refuses to be
* associated with this Container
* @exception IllegalStateException if the specified Valve is already
* associated with a different Container
*/
public void addValve(Valve valve) {
// Validate that we can add this Valve
if (valve instanceof Contained)
((Contained) valve).setContainer(this.container);
// Start the new component if necessary
if (started && (valve instanceof Lifecycle)) {
try {
((Lifecycle) valve).start();
} catch (LifecycleException e) {
log("StandardPipeline.addValve: start: ", e);
}
}
// Add this Valve to the set associated with this Pipeline
synchronized (valves) {
Valve results[] = new Valve[valves.length +1];
System.arraycopy(valves, 0, results, 0, valves.length);
results[valves.length] = valve;
valves = results;
}
}
/**
* Return the set of Valves in the pipeline associated with this
* Container, including the basic Valve (if any). If there are no
* such Valves, a zero-length array is returned.
*/
public Valve[] getValves() {
if (basic == null)
return (valves);
synchronized (valves) {
Valve results[] = new Valve[valves.length + 1];
System.arraycopy(valves, 0, results, 0, valves.length);
results[valves.length] = basic;
return (results);
}
}
/**
* Cause the specified request and response to be processed by the Valves
* associated with this pipeline, until one of these valves causes the
* response to be created and returned. The implementation must ensure
* that multiple simultaneous requests (on different threads) can be
* processed through the same Pipeline without interfering with each
* other's control flow.
*
* @param request The servlet request we are processing
* @param response The servlet response we are creating
*
* @exception IOException if an input/output error occurs
* @exception ServletException if a servlet exception is thrown
*/
public void invoke(Request request, Response response)
throws IOException, ServletException {
// Initialize the per-thread state for this thread
state.set(new Integer(0));
// Invoke the first Valve in this pipeline for this request
invokeNext(request, response);
}
/**
* Remove the specified Valve from the pipeline associated with this
* Container, if it is found; otherwise, do nothing. If the Valve is
* found and removed, the Valve's <code>setContainer(null)</code> method
* will be called if it implements <code>Contained</code>.
*
* @param valve Valve to be removed
*/
public void removeValve(Valve valve) {
synchronized (valves) {
// Locate this Valve in our list
int j = -1;
for (int i = 0; i < valves.length; i++) {
if (valve == valves[i]) {
j = i;
break;
}
}
if (j < 0)
return;
// Remove this valve from our list
Valve results[] = new Valve[valves.length - 1];
int n = 0;
for (int i = 0; i < valves.length; i++) {
if (i == j)
continue;
results[n++] = valves[i];
}
valves = results;
try {
if (valve instanceof Contained)
((Contained) valve).setContainer(null);
} catch (Throwable t) {
;
}
}
// Stop this valve if necessary
if (started && (valve instanceof Lifecycle)) {
try {
((Lifecycle) valve).stop();
} catch (LifecycleException e) {
log("StandardPipeline.removeValve: stop: ", e);
}
}
}
// --------------------------------------------------- ValveContext Methods
/**
* Cause the <code>invoke()</code> method of the next Valve that is part of
* the Pipeline currently being processed (if any) to be executed, passing
* on the specified request and response objects plus this
* <code>ValveContext</code> instance. Exceptions thrown by a subsequently
* executed Valve (or a Filter or Servlet at the application level) will be
* passed on to our caller.
*
* If there are no more Valves to be executed, an appropriate
* ServletException will be thrown by this ValveContext.
*
* @param request The request currently being processed
* @param response The response currently being created
*
* @exception IOException if thrown by a subsequent Valve, Filter, or
* Servlet
* @exception ServletException if thrown by a subsequent Valve, Filter,
* or Servlet
* @exception ServletException if there are no further Valves configured
* in the Pipeline currently being processed
*/
public void invokeNext(Request request, Response response)
throws IOException, ServletException {
// Identify the current subscript for the current request thread
Integer current = (Integer) state.get();
int subscript = current.intValue();
state.set(new Integer(subscript + 1));
// Invoke the requested Valve for the current request thread
if (subscript < valves.length) {
valves[subscript].invoke(request, response, this);
} else if ((subscript == valves.length) && (basic != null)) {
basic.invoke(request, response, this);
} else {
throw new ServletException
(sm.getString("standardPipeline.noValve"));
}
}
// ------------------------------------------------------ Protected Methods
/**
* Log a message on the Logger associated with our Container (if any).
*
* @param message Message to be logged
*/
protected void log(String message) {
Logger logger = null;
if (container != null)
logger = container.getLogger();
if (logger != null)
logger.log("StandardPipeline[" + container.getName() + "]: " +
message);
else
System.out.println("StandardPipeline[" + container.getName() +
"]: " + message);
}
/**
* Log a message on the Logger associated with our Container (if any).
*
* @param message Message to be logged
* @param throwable Associated exception
*/
protected void log(String message, Throwable throwable) {
Logger logger = null;
if (container != null)
logger = container.getLogger();
if (logger != null)
logger.log("StandardPipeline[" + container.getName() + "]: " +
message, throwable);
else {
System.out.println("StandardPipeline[" + container.getName() +
"]: " + message);
throwable.printStackTrace(System.out);
}
}
}