001: /*
002: * Copyright 1999-2001,2004 The Apache Software Foundation.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016:
017: package org.apache.catalina.core;
018:
019: import java.io.IOException;
020: import javax.servlet.ServletException;
021: import org.apache.catalina.Request;
022: import org.apache.catalina.Response;
023: import org.apache.catalina.Valve;
024: import org.apache.catalina.ValveContext;
025: import org.apache.catalina.util.StringManager;
026:
027: /**
028: * Standard implementation of a <code>ValveContext</code>.
029: *
030: * @author Craig R. McClanahan
031: * @author Remy Maucherat
032: */
033:
034: public final class StandardValveContext implements ValveContext {
035:
036: // ----------------------------------------------------- Instance Variables
037:
038: /**
039: * The string manager for this package.
040: */
041: protected static StringManager sm = StringManager
042: .getManager(Constants.Package);
043:
044: protected String info = "org.apache.catalina.core.StandardValveContext/1.0";
045: protected int stage = 0;
046: protected Valve basic = null;
047: protected Valve valves[] = null;
048:
049: // ------------------------------------------------------------- Properties
050:
051: /**
052: * Return descriptive information about this ValveContext
053: * implementation.
054: */
055: public String getInfo() {
056: return info;
057: }
058:
059: // --------------------------------------------------------- Public Methods
060:
061: /**
062: * Cause the <code>invoke()</code> method of the next Valve that is
063: * part of the Pipeline currently being processed (if any) to be
064: * executed, passing on the specified request and response objects
065: * plus this <code>ValveContext</code> instance. Exceptions thrown by
066: * a subsequently executed Valve (or a Filter or Servlet at the
067: * application level) will be passed on to our caller.
068: *
069: * If there are no more Valves to be executed, an appropriate
070: * ServletException will be thrown by this ValveContext.
071: *
072: * @param request The request currently being processed
073: * @param response The response currently being created
074: *
075: * @exception IOException if thrown by a subsequent Valve, Filter, or
076: * Servlet
077: * @exception ServletException if thrown by a subsequent Valve, Filter,
078: * or Servlet
079: * @exception ServletException if there are no further Valves
080: * configured in the Pipeline currently being processed
081: */
082: public final void invokeNext(Request request, Response response)
083: throws IOException, ServletException {
084:
085: int subscript = stage;
086: stage = stage + 1;
087:
088: // Invoke the requested Valve for the current request thread
089: if (subscript < valves.length) {
090: valves[subscript].invoke(request, response, this );
091: } else if ((subscript == valves.length) && (basic != null)) {
092: basic.invoke(request, response, this );
093: } else {
094: throw new ServletException(sm
095: .getString("standardPipeline.noValve"));
096: }
097:
098: }
099:
100: // -------------------------------------------------------- Package Methods
101:
102: /**
103: * Reset state.
104: */
105: void set(Valve basic, Valve valves[]) {
106: stage = 0;
107: this.basic = basic;
108: this.valves = valves;
109: }
110:
111: }
|