| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.apache.catalina.valves; |
| |
| import org.apache.catalina.Contained; |
| import org.apache.catalina.Container; |
| import org.apache.catalina.LifecycleException; |
| import org.apache.catalina.LifecycleState; |
| import org.apache.catalina.Pipeline; |
| import org.apache.catalina.Valve; |
| import org.apache.catalina.util.LifecycleMBeanBase; |
| import org.apache.catalina.util.ToStringUtil; |
| import org.apache.juli.logging.Log; |
| import org.apache.tomcat.util.res.StringManager; |
| |
| /** |
| * Convenience base class for implementations of the <b>Valve</b> interface. A subclass <strong>MUST</strong> implement |
| * an <code>invoke()</code> method to provide the required functionality, and <strong>MAY</strong> implement the |
| * <code>Lifecycle</code> interface to provide configuration management and lifecycle support. |
| */ |
| public abstract class ValveBase extends LifecycleMBeanBase implements Contained, Valve { |
| |
| /** |
| * StringManager for internationalized strings. |
| */ |
| protected static final StringManager sm = StringManager.getManager(ValveBase.class); |
| |
| |
| // ------------------------------------------------------ Constructor |
| |
| /** |
| * Constructs a new ValveBase with async support disabled. |
| */ |
| public ValveBase() { |
| this(false); |
| } |
| |
| |
| /** |
| * Constructs a new ValveBase. |
| * |
| * @param asyncSupported Whether this valve supports async requests |
| */ |
| public ValveBase(boolean asyncSupported) { |
| this.asyncSupported = asyncSupported; |
| } |
| |
| |
| // ------------------------------------------------------ Instance Variables |
| |
| /** |
| * Does this valve support Servlet 3+ async requests? |
| */ |
| protected boolean asyncSupported; |
| |
| |
| /** |
| * The Container whose pipeline this Valve is a component of. |
| */ |
| protected Container container = null; |
| |
| |
| /** |
| * Container log |
| */ |
| protected Log containerLog = null; |
| |
| |
| /** |
| * The next Valve in the pipeline this Valve is a component of. |
| */ |
| protected Valve next = null; |
| |
| |
| // -------------------------------------------------------------- Properties |
| |
| @Override |
| public Container getContainer() { |
| return container; |
| } |
| |
| |
| @Override |
| public void setContainer(Container container) { |
| this.container = container; |
| } |
| |
| |
| @Override |
| public boolean isAsyncSupported() { |
| return asyncSupported; |
| } |
| |
| |
| /** |
| * Sets whether this valve supports Servlet 3+ async requests. |
| * |
| * @param asyncSupported Whether this valve supports async requests |
| */ |
| public void setAsyncSupported(boolean asyncSupported) { |
| this.asyncSupported = asyncSupported; |
| } |
| |
| |
| @Override |
| public Valve getNext() { |
| return next; |
| } |
| |
| |
| @Override |
| public void setNext(Valve valve) { |
| this.next = valve; |
| } |
| |
| |
| // ---------------------------------------------------------- Public Methods |
| |
| /** |
| * {@inheritDoc} |
| * <p> |
| * The default implementation is NO-OP. |
| */ |
| @Override |
| public void backgroundProcess() { |
| // NOOP by default |
| } |
| |
| |
| @Override |
| protected void initInternal() throws LifecycleException { |
| Container container = getContainer(); |
| if (container == null) { |
| throw new IllegalStateException(sm.getString("valveBase.noContainer")); |
| } |
| super.initInternal(); |
| containerLog = container.getLogger(); |
| } |
| |
| |
| /** |
| * Start this component and implement the requirements of |
| * {@link org.apache.catalina.util.LifecycleBase#startInternal()}. |
| * |
| * @exception LifecycleException if this component detects a fatal error that prevents this component from being |
| * used |
| */ |
| @Override |
| protected void startInternal() throws LifecycleException { |
| setState(LifecycleState.STARTING); |
| } |
| |
| |
| /** |
| * Stop this component and implement the requirements of |
| * {@link org.apache.catalina.util.LifecycleBase#stopInternal()}. |
| * |
| * @exception LifecycleException if this component detects a fatal error that prevents this component from being |
| * used |
| */ |
| @Override |
| protected void stopInternal() throws LifecycleException { |
| setState(LifecycleState.STOPPING); |
| } |
| |
| |
| @Override |
| public String toString() { |
| return ToStringUtil.toString(this); |
| } |
| |
| |
| // -------------------- JMX and Registration -------------------- |
| |
| @Override |
| public String getObjectNameKeyProperties() { |
| StringBuilder name = new StringBuilder("type=Valve"); |
| |
| Container container = getContainer(); |
| |
| name.append(container.getMBeanKeyProperties()); |
| |
| int seq = 0; |
| |
| // Pipeline may not be present in unit testing |
| Pipeline p = container.getPipeline(); |
| if (p != null) { |
| for (Valve valve : p.getValves()) { |
| // Skip null valves |
| if (valve == null) { |
| continue; |
| } |
| // Only compare valves in pipeline until we find this valve |
| if (valve == this) { |
| break; |
| } |
| if (valve.getClass() == this.getClass()) { |
| // Duplicate valve earlier in pipeline |
| // increment sequence number |
| seq++; |
| } |
| } |
| } |
| |
| if (seq > 0) { |
| name.append(",seq="); |
| name.append(seq); |
| } |
| |
| String className = this.getClass().getName(); |
| int period = className.lastIndexOf('.'); |
| if (period >= 0) { |
| className = className.substring(period + 1); |
| } |
| name.append(",name="); |
| name.append(className); |
| |
| return name.toString(); |
| } |
| |
| |
| @Override |
| public String getDomainInternal() { |
| Container c = getContainer(); |
| if (c == null) { |
| return null; |
| } else { |
| return c.getDomain(); |
| } |
| } |
| } |