Class StandardWrapper

All Implemented Interfaces:
MBeanRegistration, NotificationBroadcaster, NotificationEmitter, ServletConfig, Container, JmxEnabled, Lifecycle, Wrapper
Direct Known Subclasses:
Tomcat.ExistingStandardWrapper

public class StandardWrapper extends ContainerBase implements ServletConfig, Wrapper, NotificationEmitter
Standard implementation of the Wrapper interface that represents an individual servlet definition. No child Containers are allowed, and the parent Container must be a Context.
Author:
Craig R. McClanahan, Remy Maucherat
  • Field Details

    • DEFAULT_SERVLET_METHODS

      protected static final String[] DEFAULT_SERVLET_METHODS
    • available

      protected long available
      The date and time at which this servlet will become available (in milliseconds since the epoch), or zero if the servlet is available. If this value equals Long.MAX_VALUE, the unavailability of this servlet is considered permanent.
    • broadcaster

      protected final NotificationBroadcasterSupport broadcaster
      The broadcaster that sends j2ee notifications.
    • countAllocated

      protected final AtomicInteger countAllocated
      The count of allocations that are currently active (even if they are for the same instance, as will be true on a non-STM servlet).
    • facade

      protected final StandardWrapperFacade facade
      The facade associated with this wrapper.
    • instance

      protected volatile Servlet instance
      The (single) possibly uninitialized instance of this servlet.
    • instanceInitialized

      protected volatile boolean instanceInitialized
      Flag that indicates if this instance has been initialized
    • loadOnStartup

      protected int loadOnStartup
      The load-on-startup order value (negative value means load on first call) for this servlet.
    • mappings

      protected final ArrayList<String> mappings
      Mappings associated with the wrapper.
    • parameters

      protected HashMap<String,String> parameters
      The initialization parameters for this servlet, keyed by parameter name.
    • references

      protected HashMap<String,String> references
      The security role references for this servlet, keyed by role name used in the servlet. The corresponding value is the role name of the web application itself.
    • runAs

      protected String runAs
      The run-as identity for this servlet.
    • sequenceNumber

      protected long sequenceNumber
      The notification sequence number.
    • servletClass

      protected String servletClass
      The fully qualified servlet class name for this servlet.
    • singleThreadModel

      @Deprecated protected volatile boolean singleThreadModel
      Deprecated.
      This will be removed in Tomcat 10.1 onwards.
      Does this servlet implement the SingleThreadModel interface?
    • unloading

      protected volatile boolean unloading
      Are we unloading our servlet instance at the moment?
    • maxInstances

      @Deprecated protected int maxInstances
      Deprecated.
      This will be removed in Tomcat 10.1 onwards.
      Maximum number of STM instances.
    • nInstances

      @Deprecated protected int nInstances
      Deprecated.
      This will be removed in Tomcat 10.1 onwards.
      Number of instances currently loaded for a STM servlet.
    • instancePool

      @Deprecated protected Stack<Servlet> instancePool
      Deprecated.
      This will be removed in Tomcat 10.1 onwards.
      Stack containing the STM instances.
    • unloadDelay

      protected long unloadDelay
      Wait time for servlet unload in ms.
    • isJspServlet

      protected boolean isJspServlet
      True if this StandardWrapper is for the JspServlet
    • jspMonitorON

      protected ObjectName jspMonitorON
      The ObjectName of the JSP monitoring mbean
    • swallowOutput

      protected boolean swallowOutput
      Should we swallow System.out
    • swValve

      protected org.apache.catalina.core.StandardWrapperValve swValve
    • loadTime

      protected long loadTime
    • classLoadTime

      protected int classLoadTime
    • multipartConfigElement

      protected MultipartConfigElement multipartConfigElement
      Multipart config
    • asyncSupported

      protected boolean asyncSupported
      Async support
    • enabled

      protected boolean enabled
      Enabled
    • classType

      protected static Class<?>[] classType
      Static class array used when the SecurityManager is turned on and Servlet.init is invoked.
    • notificationInfo

      protected MBeanNotificationInfo[] notificationInfo
  • Constructor Details

    • StandardWrapper

      public StandardWrapper()
      Create a new StandardWrapper component with the default basic Valve.
  • Method Details

    • isOverridable

      public boolean isOverridable()
      Description copied from interface: Wrapper
      Is the Servlet overridable by a ServletContainerInitializer?
      Specified by:
      isOverridable in interface Wrapper
      Returns:
      true if the Servlet can be overridden in a ServletContainerInitializer
    • setOverridable

      public void setOverridable(boolean overridable)
      Description copied from interface: Wrapper
      Sets the overridable attribute for this Servlet.
      Specified by:
      setOverridable in interface Wrapper
      Parameters:
      overridable - the new value
    • getAvailable

      public long getAvailable()
      Return the available date/time for this servlet, in milliseconds since the epoch. If this date/time is Long.MAX_VALUE, it is considered to mean that unavailability is permanent and any request for this servlet will return an SC_NOT_FOUND error. If this date/time is in the future, any request for this servlet will return an SC_SERVICE_UNAVAILABLE error. If it is zero, the servlet is currently available.
      Specified by:
      getAvailable in interface Wrapper
      Returns:
      the available date/time for this servlet, in milliseconds since the epoch. If this date/time is in the future, any request for this servlet will return an SC_SERVICE_UNAVAILABLE error. If it is zero, the servlet is currently available. A value equal to Long.MAX_VALUE is considered to mean that unavailability is permanent.
    • setAvailable

      public void setAvailable(long available)
      Set the available date/time for this servlet, in milliseconds since the epoch. If this date/time is Long.MAX_VALUE, it is considered to mean that unavailability is permanent and any request for this servlet will return an SC_NOT_FOUND error. If this date/time is in the future, any request for this servlet will return an SC_SERVICE_UNAVAILABLE error.
      Specified by:
      setAvailable in interface Wrapper
      Parameters:
      available - The new available date/time
    • getCountAllocated

      public int getCountAllocated()
      Returns:
      the number of active allocations of this servlet, even if they are all for the same instance (as will be true for servlets that do not implement SingleThreadModel.
    • getLoadOnStartup

      public int getLoadOnStartup()
      Specified by:
      getLoadOnStartup in interface Wrapper
      Returns:
      the load-on-startup order value (negative value means load on first call).
    • setLoadOnStartup

      public void setLoadOnStartup(int value)
      Set the load-on-startup order value (negative value means load on first call).
      Specified by:
      setLoadOnStartup in interface Wrapper
      Parameters:
      value - New load-on-startup value
    • setLoadOnStartupString

      public void setLoadOnStartupString(String value)
      Set the load-on-startup order value from a (possibly null) string. Per the specification, any missing or non-numeric value is converted to a zero, so that this servlet will still be loaded at startup time, but in an arbitrary order.
      Parameters:
      value - New load-on-startup value
    • getLoadOnStartupString

      public String getLoadOnStartupString()
      Returns:
      the load-on-startup value that was parsed
    • getMaxInstances

      @Deprecated public int getMaxInstances()
      Deprecated.
      This will be removed in Tomcat 10.1 onwards.
      Returns:
      maximum number of instances that will be allocated when a single thread model servlet is used.
    • setMaxInstances

      @Deprecated public void setMaxInstances(int maxInstances)
      Deprecated.
      This will be removed in Tomcat 10.1 onwards.
      Set the maximum number of instances that will be allocated when a single thread model servlet is used.
      Parameters:
      maxInstances - New value of maxInstances
    • setParent

      public void setParent(Container container)
      Set the parent Container of this Wrapper, but only if it is a Context.
      Specified by:
      setParent in interface Container
      Overrides:
      setParent in class ContainerBase
      Parameters:
      container - Proposed parent Container
    • getRunAs

      public String getRunAs()
      Specified by:
      getRunAs in interface Wrapper
      Returns:
      the run-as identity for this servlet.
    • setRunAs

      public void setRunAs(String runAs)
      Set the run-as identity for this servlet.
      Specified by:
      setRunAs in interface Wrapper
      Parameters:
      runAs - New run-as identity value
    • getServletClass

      public String getServletClass()
      Specified by:
      getServletClass in interface Wrapper
      Returns:
      the fully qualified servlet class name for this servlet.
    • setServletClass

      public void setServletClass(String servletClass)
      Set the fully qualified servlet class name for this servlet.
      Specified by:
      setServletClass in interface Wrapper
      Parameters:
      servletClass - Servlet class name
    • setServletName

      public void setServletName(String name)
      Set the name of this servlet. This is an alias for the normal Container.setName() method, and complements the getServletName() method required by the ServletConfig interface.
      Parameters:
      name - The new name of this servlet
    • isSingleThreadModel

      @Deprecated public Boolean isSingleThreadModel()
      Deprecated.
      This will be removed in Tomcat 10.1 onwards.
      Does the servlet class represented by this component implement the SingleThreadModel interface? This can only be determined once the class is loaded. Calling this method will not trigger loading the class since that may cause the application to behave unexpectedly.
      Returns:
      null if the class has not been loaded, otherwise true if the servlet does implement SingleThreadModel and false if it does not.
    • isUnavailable

      public boolean isUnavailable()
      Specified by:
      isUnavailable in interface Wrapper
      Returns:
      true if the Servlet has been marked unavailable.
    • getServletMethods

      public String[] getServletMethods() throws ServletException
      Description copied from interface: Wrapper
      Gets the names of the methods supported by the underlying servlet. This is the same set of methods included in the Allow response header in response to an OPTIONS request method processed by the underlying servlet.
      Specified by:
      getServletMethods in interface Wrapper
      Returns:
      Array of names of the methods supported by the underlying servlet
      Throws:
      ServletException - If the target servlet cannot be loaded
    • getServlet

      public Servlet getServlet()
      Specified by:
      getServlet in interface Wrapper
      Returns:
      the associated servlet instance.
    • setServlet

      public void setServlet(Servlet servlet)
      Set the associated servlet instance.
      Specified by:
      setServlet in interface Wrapper
      Parameters:
      servlet - The associated Servlet
    • backgroundProcess

      public void backgroundProcess()
      Execute a periodic task, such as reloading, etc. This method will be invoked inside the classloading context of this container. Unexpected throwables will be caught and logged.
      Specified by:
      backgroundProcess in interface Container
      Overrides:
      backgroundProcess in class ContainerBase
    • getRootCause

      public static Throwable getRootCause(ServletException e)
      Extract the root cause from a servlet exception.
      Parameters:
      e - The servlet exception
      Returns:
      the root cause of the Servlet exception
    • addChild

      public void addChild(Container child)
      Refuse to add a child Container, because Wrappers are the lowest level of the Container hierarchy.
      Specified by:
      addChild in interface Container
      Overrides:
      addChild in class ContainerBase
      Parameters:
      child - Child container to be added
    • addInitParameter

      public void addInitParameter(String name, String value)
      Add a new servlet initialization parameter for this servlet.
      Specified by:
      addInitParameter in interface Wrapper
      Parameters:
      name - Name of this initialization parameter to add
      value - Value of this initialization parameter to add
    • addMapping

      public void addMapping(String mapping)
      Add a mapping associated with the Wrapper.
      Specified by:
      addMapping in interface Wrapper
      Parameters:
      mapping - The new wrapper mapping
    • addSecurityReference

      public void addSecurityReference(String name, String link)
      Add a new security role reference record to the set of records for this servlet.
      Specified by:
      addSecurityReference in interface Wrapper
      Parameters:
      name - Role name used within this servlet
      link - Role name used within the web application
    • allocate

      public Servlet allocate() throws ServletException
      Allocate an initialized instance of this Servlet that is ready to have its service() method called. If the servlet class does not implement SingleThreadModel, the (only) initialized instance may be returned immediately. If the servlet class implements SingleThreadModel, the Wrapper implementation must ensure that this instance is not allocated again until it is deallocated by a call to deallocate().
      Specified by:
      allocate in interface Wrapper
      Returns:
      a new Servlet instance
      Throws:
      ServletException - if the servlet init() method threw an exception
      ServletException - if a loading error occurs
    • deallocate

      public void deallocate(Servlet servlet) throws ServletException
      Return this previously allocated servlet to the pool of available instances. If this servlet class does not implement SingleThreadModel, no action is actually required.
      Specified by:
      deallocate in interface Wrapper
      Parameters:
      servlet - The servlet to be returned
      Throws:
      ServletException - if a deallocation error occurs
    • findInitParameter

      public String findInitParameter(String name)
      Return the value for the specified initialization parameter name, if any; otherwise return null.
      Specified by:
      findInitParameter in interface Wrapper
      Parameters:
      name - Name of the requested initialization parameter
      Returns:
      the value for the specified initialization parameter name, if any; otherwise return null.
    • findInitParameters

      public String[] findInitParameters()
      Return the names of all defined initialization parameters for this servlet.
      Specified by:
      findInitParameters in interface Wrapper
      Returns:
      the names of all defined initialization parameters for this servlet.
    • findMappings

      public String[] findMappings()
      Return the mappings associated with this wrapper.
      Specified by:
      findMappings in interface Wrapper
      Returns:
      the mappings associated with this wrapper.
    • findSecurityReference

      public String findSecurityReference(String name)
      Return the security role link for the specified security role reference name, if any; otherwise return null.
      Specified by:
      findSecurityReference in interface Wrapper
      Parameters:
      name - Security role reference used within this servlet
      Returns:
      the security role link for the specified security role reference name, if any; otherwise return null.
    • findSecurityReferences

      public String[] findSecurityReferences()
      Return the set of security role reference names associated with this servlet, if any; otherwise return a zero-length array.
      Specified by:
      findSecurityReferences in interface Wrapper
      Returns:
      the set of security role reference names associated with this servlet, if any; otherwise return a zero-length array.
    • load

      public void load() throws ServletException
      Load and initialize an instance of this servlet, if there is not already at least one initialized instance. This can be used, for example, to load servlets that are marked in the deployment descriptor to be loaded at server startup time.

      IMPLEMENTATION NOTE: Servlets whose classnames begin with org.apache.catalina. (so-called "container" servlets) are loaded by the same classloader that loaded this class, rather than the classloader for the current web application. This gives such classes access to Catalina internals, which are prevented for classes loaded for web applications.

      Specified by:
      load in interface Wrapper
      Throws:
      ServletException - if the servlet init() method threw an exception
      ServletException - if some other loading problem occurs
    • loadServlet

      public Servlet loadServlet() throws ServletException
      Load and initialize an instance of this servlet, if there is not already at least one initialized instance. This can be used, for example, to load servlets that are marked in the deployment descriptor to be loaded at server startup time.
      Returns:
      the loaded Servlet instance
      Throws:
      ServletException - for a Servlet load error
    • removeInitParameter

      public void removeInitParameter(String name)
      Remove the specified initialization parameter from this servlet.
      Specified by:
      removeInitParameter in interface Wrapper
      Parameters:
      name - Name of the initialization parameter to remove
    • removeMapping

      public void removeMapping(String mapping)
      Remove a mapping associated with the wrapper.
      Specified by:
      removeMapping in interface Wrapper
      Parameters:
      mapping - The pattern to remove
    • removeSecurityReference

      public void removeSecurityReference(String name)
      Remove any security role reference for the specified role name.
      Specified by:
      removeSecurityReference in interface Wrapper
      Parameters:
      name - Security role used within this servlet to be removed
    • unavailable

      public void unavailable(UnavailableException unavailable)
      Process an UnavailableException, marking this servlet as unavailable for the specified amount of time.
      Specified by:
      unavailable in interface Wrapper
      Parameters:
      unavailable - The exception that occurred, or null to mark this servlet as permanently unavailable
    • unload

      public void unload() throws ServletException
      Unload all initialized instances of this servlet, after calling the destroy() method for each instance. This can be used, for example, prior to shutting down the entire servlet engine, or prior to reloading all of the classes from the Loader associated with our Loader's repository.
      Specified by:
      unload in interface Wrapper
      Throws:
      ServletException - if an exception is thrown by the destroy() method
    • getInitParameter

      public String getInitParameter(String name)
      Description copied from interface: javax.servlet.ServletConfig
      Returns a String containing the value of the named initialization parameter, or null if the parameter does not exist.
      Specified by:
      getInitParameter in interface ServletConfig
      Parameters:
      name - Name of the initialization parameter to retrieve
      Returns:
      the initialization parameter value for the specified name, if any; otherwise return null.
    • getInitParameterNames

      public Enumeration<String> getInitParameterNames()
      Description copied from interface: javax.servlet.ServletConfig
      Returns the names of the servlet's initialization parameters as an Enumeration of String objects, or an empty Enumeration if the servlet has no initialization parameters.
      Specified by:
      getInitParameterNames in interface ServletConfig
      Returns:
      the set of initialization parameter names defined for this servlet. If none are defined, an empty Enumeration is returned.
    • getServletContext

      public ServletContext getServletContext()
      Description copied from interface: javax.servlet.ServletConfig
      Returns a reference to the ServletContext in which the caller is executing.
      Specified by:
      getServletContext in interface ServletConfig
      Returns:
      the servlet context with which this servlet is associated.
      See Also:
    • getServletName

      public String getServletName()
      Description copied from interface: javax.servlet.ServletConfig
      Returns the name of this servlet instance. The name may be provided via server administration, assigned in the web application deployment descriptor, or for an unregistered (and thus unnamed) servlet instance it will be the servlet's class name.
      Specified by:
      getServletName in interface ServletConfig
      Returns:
      the name of this servlet.
    • getProcessingTime

      public long getProcessingTime()
    • getMaxTime

      public long getMaxTime()
    • getMinTime

      public long getMinTime()
    • getRequestCount

      public int getRequestCount()
    • getErrorCount

      public int getErrorCount()
    • incrementErrorCount

      public void incrementErrorCount()
      Increment the error count used for monitoring.
      Specified by:
      incrementErrorCount in interface Wrapper
    • getLoadTime

      public long getLoadTime()
    • getClassLoadTime

      public int getClassLoadTime()
    • getMultipartConfigElement

      public MultipartConfigElement getMultipartConfigElement()
      Specified by:
      getMultipartConfigElement in interface Wrapper
      Returns:
      the multi-part configuration for the associated Servlet. If no multi-part configuration has been defined, then null will be returned.
    • setMultipartConfigElement

      public void setMultipartConfigElement(MultipartConfigElement multipartConfigElement)
      Description copied from interface: Wrapper
      Set the multi-part configuration for the associated Servlet. To clear the multi-part configuration specify null as the new value.
      Specified by:
      setMultipartConfigElement in interface Wrapper
      Parameters:
      multipartConfigElement - The configuration associated with the Servlet
    • isAsyncSupported

      public boolean isAsyncSupported()
      Description copied from interface: Wrapper
      Does the associated Servlet support async processing? Defaults to false.
      Specified by:
      isAsyncSupported in interface Wrapper
      Returns:
      true if the Servlet supports async
    • setAsyncSupported

      public void setAsyncSupported(boolean asyncSupported)
      Description copied from interface: Wrapper
      Set the async support for the associated Servlet.
      Specified by:
      setAsyncSupported in interface Wrapper
      Parameters:
      asyncSupported - the new value
    • isEnabled

      public boolean isEnabled()
      Description copied from interface: Wrapper
      Is the associated Servlet enabled? Defaults to true.
      Specified by:
      isEnabled in interface Wrapper
      Returns:
      true if the Servlet is enabled
    • setEnabled

      public void setEnabled(boolean enabled)
      Description copied from interface: Wrapper
      Sets the enabled attribute for the associated servlet.
      Specified by:
      setEnabled in interface Wrapper
      Parameters:
      enabled - the new value
    • getAllDeclaredMethods

      protected Method[] getAllDeclaredMethods(Class<?> c)
    • startInternal

      protected void startInternal() throws LifecycleException
      Start this component and implement the requirements of LifecycleBase.startInternal().
      Overrides:
      startInternal in class ContainerBase
      Throws:
      LifecycleException - if this component detects a fatal error that prevents this component from being used
    • stopInternal

      protected void stopInternal() throws LifecycleException
      Stop this component and implement the requirements of LifecycleBase.stopInternal().
      Overrides:
      stopInternal in class ContainerBase
      Throws:
      LifecycleException - if this component detects a fatal error that prevents this component from being used
    • getObjectNameKeyProperties

      protected String getObjectNameKeyProperties()
      Description copied from class: LifecycleMBeanBase
      Allow sub-classes to specify the key properties component of the ObjectName that will be used to register this component.
      Specified by:
      getObjectNameKeyProperties in class LifecycleMBeanBase
      Returns:
      The string representation of the key properties component of the desired ObjectName
    • removeNotificationListener

      public void removeNotificationListener(NotificationListener listener, NotificationFilter filter, Object object) throws ListenerNotFoundException
      Remove a JMX notificationListener
      Specified by:
      removeNotificationListener in interface NotificationEmitter
      Throws:
      ListenerNotFoundException
      See Also:
    • getNotificationInfo

      public MBeanNotificationInfo[] getNotificationInfo()
      Get JMX Broadcaster Info
      Specified by:
      getNotificationInfo in interface NotificationBroadcaster
      See Also:
    • addNotificationListener

      public void addNotificationListener(NotificationListener listener, NotificationFilter filter, Object object) throws IllegalArgumentException
      Add a JMX-NotificationListener
      Specified by:
      addNotificationListener in interface NotificationBroadcaster
      Throws:
      IllegalArgumentException
      See Also:
    • removeNotificationListener

      public void removeNotificationListener(NotificationListener listener) throws ListenerNotFoundException
      Remove a JMX-NotificationListener
      Specified by:
      removeNotificationListener in interface NotificationBroadcaster
      Throws:
      ListenerNotFoundException
      See Also: