[jboss-cvs] JBossAS SVN: r61984 - in projects/javaee/trunk: jboss-servlet-api and 6 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Mon Apr 2 09:42:12 EDT 2007


Author: wolfc
Date: 2007-04-02 09:42:12 -0400 (Mon, 02 Apr 2007)
New Revision: 61984

Added:
   projects/javaee/trunk/jboss-servlet-api/
   projects/javaee/trunk/jboss-servlet-api/.classpath
   projects/javaee/trunk/jboss-servlet-api/.project
   projects/javaee/trunk/jboss-servlet-api/.settings/
   projects/javaee/trunk/jboss-servlet-api/.settings/org.eclipse.jdt.core.prefs
   projects/javaee/trunk/jboss-servlet-api/pom.xml
   projects/javaee/trunk/jboss-servlet-api/src/
   projects/javaee/trunk/jboss-servlet-api/src/main/
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/Filter.java
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/FilterChain.java
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/FilterConfig.java
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/GenericServlet.java
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/LocalStrings.properties
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/LocalStrings_fr.properties
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/LocalStrings_ja.properties
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/RequestDispatcher.java
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/Servlet.java
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletConfig.java
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletContext.java
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletContextAttributeEvent.java
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletContextAttributeListener.java
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletContextEvent.java
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletContextListener.java
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletException.java
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletInputStream.java
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletOutputStream.java
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletRequest.java
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletRequestAttributeEvent.java
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletRequestAttributeListener.java
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletRequestEvent.java
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletRequestListener.java
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletRequestWrapper.java
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletResponse.java
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletResponseWrapper.java
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/SingleThreadModel.java
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/UnavailableException.java
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/Cookie.java
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpServlet.java
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpServletRequest.java
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpServletRequestWrapper.java
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpServletResponse.java
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpServletResponseWrapper.java
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpSession.java
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpSessionActivationListener.java
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpSessionAttributeListener.java
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpSessionBindingEvent.java
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpSessionBindingListener.java
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpSessionContext.java
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpSessionEvent.java
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpSessionListener.java
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpUtils.java
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/LocalStrings.properties
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/LocalStrings_es.properties
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/LocalStrings_fr.properties
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/LocalStrings_ja.properties
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/package.html
   projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/package.html
Log:
Java Servlet 2.5


Property changes on: projects/javaee/trunk/jboss-servlet-api
___________________________________________________________________
Name: svn:ignore
   + target


Added: projects/javaee/trunk/jboss-servlet-api/.classpath
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/.classpath	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/.classpath	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,5 @@
+<classpath>
+  <classpathentry kind="src" path="src/main"/>
+  <classpathentry kind="output" path="target/eclipse-classes"/>
+  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+</classpath>
\ No newline at end of file

Added: projects/javaee/trunk/jboss-servlet-api/.project
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/.project	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/.project	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,13 @@
+<projectDescription>
+  <name>jboss-servlet-api</name>
+  <comment>The Java Servlet 2.5 API classes</comment>
+  <projects/>
+  <buildSpec>
+    <buildCommand>
+      <name>org.eclipse.jdt.core.javabuilder</name>
+    </buildCommand>
+  </buildSpec>
+  <natures>
+    <nature>org.eclipse.jdt.core.javanature</nature>
+  </natures>
+</projectDescription>
\ No newline at end of file

Added: projects/javaee/trunk/jboss-servlet-api/.settings/org.eclipse.jdt.core.prefs
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/.settings/org.eclipse.jdt.core.prefs	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/.settings/org.eclipse.jdt.core.prefs	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,5 @@
+#Mon Apr 02 14:16:56 CEST 2007
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5

Added: projects/javaee/trunk/jboss-servlet-api/pom.xml
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/pom.xml	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/pom.xml	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <parent>
+    <groupId>jboss</groupId>
+    <artifactId>jboss-javaee</artifactId>
+    <version>5.0.0-SNAPSHOT</version>
+    <relativePath>../build/pom.xml</relativePath>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>jboss</groupId>
+  <artifactId>jboss-servlet-api</artifactId>
+  <version>2.5-SNAPSHOT</version>
+  <packaging>jar</packaging>
+  <name>JBoss Java Servlet 2.5 API</name>
+  <url>http://www.jboss.org</url>
+  <description>The Java Servlet 2.5 API classes</description>
+  <reporting>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-javadoc-plugin</artifactId>
+        <configuration>
+          <doctitle>Java Servlet ${project.version} API Documentation</doctitle>
+          <links>
+            <link>http://java.sun.com/j2se/1.5/docs/api</link>
+          </links>
+          <windowtitle>Java Servlet ${project.version} API Documentation</windowtitle>
+        </configuration>
+      </plugin>
+    </plugins>
+  </reporting>
+</project>

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/Filter.java
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/Filter.java	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/Filter.java	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,113 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package javax.servlet;
+
+import java.io.IOException;
+
+/**
+ * A filter is an object that performs filtering tasks on either the request to
+ * a resource (a servlet or static content), or on the response from a resource,
+ * or both. <br>
+ * <br>
+ * Filters perform filtering in the <code>doFilter</code> method. Every Filter
+ * has access to a FilterConfig object from which it can obtain its
+ * initialization parameters, a reference to the ServletContext which it can
+ * use, for example, to load resources needed for filtering tasks.
+ * <p>
+ * Filters are configured in the deployment descriptor of a web application
+ * <p>
+ * Examples that have been identified for this design are<br>
+ * <ol>
+ * <li>Authentication Filters</li>
+ * <li>Logging and Auditing Filters</li>
+ * <li>Image conversion Filters</li>
+ * <li>Data compression Filters</li>
+ * <li>Encryption Filters</li>
+ * <li>Tokenizing Filters</li>
+ * <li>Filters that trigger resource access events</li>
+ * <li>XSL/T filters</li>
+ * <li>Mime-type chain Filter</li>
+ * </ol>
+ * 
+ * @since Servlet 2.3
+ */
+
+public interface Filter
+{
+
+   /**
+    * Called by the web container to indicate to a filter that it is being
+    * placed into service. The servlet container calls the init method exactly
+    * once after instantiating the filter. The init method must complete
+    * successfully before the filter is asked to do any filtering work. <br>
+    * <br>
+    * 
+    * The web container cannot place the filter into service if the init method
+    * either<br>
+    * <ol>
+    * <li>Throws a ServletException</li>
+    * <li>Does not return within a time period defined by the web container</li>
+    * </ol>
+    */
+   public void init(FilterConfig filterConfig) throws ServletException;
+
+   /**
+    * The <code>doFilter</code> method of the Filter is called by the
+    * container each time a request/response pair is passed through the chain
+    * due to a client request for a resource at the end of the chain. The
+    * FilterChain passed in to this method allows the Filter to pass on the
+    * request and response to the next entity in the chain.
+    * <p>
+    * A typical implementation of this method would follow the following
+    * pattern:- <br>
+    * <ol>
+    * <li>Examine the request</li>
+    * <li>Optionally wrap the request object with a custom implementation to
+    * filter content or headers for input filtering</li>
+    * <li>Optionally wrap the response object with a custom implementation to
+    * filter content or headers for output filtering</li>
+    * <li>a) <strong>Either</strong> invoke the next entity in the chain using
+    * the FilterChain object (<code>chain.doFilter()</code>), <br>
+    * b) <strong>or</strong> not pass on the request/response pair to the
+    * next entity in the filter chain to block the request processing</li>
+    * <li> Directly set headers on the response after invocation of the next
+    * entity in the filter chain.</li>
+    * </ol>
+    */
+   public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;
+
+   /**
+    * Called by the web container to indicate to a filter that it is being taken
+    * out of service. This method is only called once all threads within the
+    * filter's doFilter method have exited or after a timeout period has passed.
+    * After the web container calls this method, it will not call the doFilter
+    * method again on this instance of the filter. <br>
+    * <br>
+    * 
+    * This method gives the filter an opportunity to clean up any resources that
+    * are being held (for example, memory, file handles, threads) and make sure
+    * that any persistent state is synchronized with the filter's current state
+    * in memory.
+    */
+   public void destroy();
+
+}

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/FilterChain.java
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/FilterChain.java	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/FilterChain.java	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,49 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package javax.servlet;
+
+import java.io.IOException;
+
+/**
+ * A FilterChain is an object provided by the servlet container to the developer
+ * giving a view into the invocation chain of a filtered request for a resource. Filters
+ * use the FilterChain to invoke the next filter in the chain, or if the calling filter
+ * is the last filter in the chain, to invoke the resource at the end of the chain.
+ *
+ * @see     Filter
+ * @since   Servlet 2.3
+ **/
+public interface FilterChain
+{
+
+   /**
+    * Causes the next filter in the chain to be invoked, or if the calling filter is the last filter
+    * in the chain, causes the resource at the end of the chain to be invoked.
+    *
+    * @param    request the request to pass along the chain.
+    * @param    response the response to pass along the chain.
+    *
+    * @since    2.3
+    */
+   public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException;
+
+}

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/FilterConfig.java
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/FilterConfig.java	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/FilterConfig.java	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,79 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package javax.servlet;
+
+import java.util.Enumeration;
+
+/**
+ * 
+ * A filter configuration object used by a servlet container to pass information
+ * to a filter during initialization.
+ * 
+ * @see Filter
+ * @since Servlet 2.3
+ * 
+ */
+public interface FilterConfig
+{
+
+   /**
+    * Returns the filter-name of this filter as defined in the deployment
+    * descriptor.
+    */
+   public String getFilterName();
+
+   /**
+    * Returns a reference to the {@link ServletContext} in which the caller is
+    * executing.
+    * 
+    * @return a {@link ServletContext} object, used by the caller to interact
+    *         with its servlet container
+    * 
+    * @see ServletContext
+    */
+   public ServletContext getServletContext();
+
+   /**
+    * Returns a <code>String</code> containing the value of the named
+    * initialization parameter, or <code>null</code> if the parameter does not
+    * exist.
+    * 
+    * @param name
+    *           a <code>String</code> specifying the name of the
+    *           initialization parameter
+    * 
+    * @return a <code>String</code> containing the value of the initialization
+    *         parameter
+    */
+   public String getInitParameter(String name);
+
+   /**
+    * Returns the names of the filter's initialization parameters as an
+    * <code>Enumeration</code> of <code>String</code> objects, or an empty
+    * <code>Enumeration</code> if the filter has no initialization parameters.
+    * 
+    * @return an <code>Enumeration</code> of <code>String</code> objects
+    *         containing the names of the filter's initialization parameters
+    */
+   public Enumeration getInitParameterNames();
+
+}

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/GenericServlet.java
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/GenericServlet.java	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/GenericServlet.java	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,272 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package javax.servlet;
+
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.ResourceBundle;
+
+/**
+ * Defines a generic, protocol-independent servlet. To write an HTTP servlet for
+ * use on the Web, extend {@link javax.servlet.http.HttpServlet} instead.
+ * <p>
+ * <code>GenericServlet</code> implements the <code>Servlet</code> and
+ * <code>ServletConfig</code> interfaces. <code>GenericServlet</code> may be
+ * directly extended by a servlet, although it's more common to extend a
+ * protocol-specific subclass such as <code>HttpServlet</code>.
+ * <p>
+ * <code>GenericServlet</code> makes writing servlets easier. It provides
+ * simple versions of the lifecycle methods <code>init</code> and
+ * <code>destroy</code> and of the methods in the <code>ServletConfig</code>
+ * interface. <code>GenericServlet</code> also implements the <code>log</code>
+ * method, declared in the <code>ServletContext</code> interface.
+ * <p>
+ * To write a generic servlet, you need only override the abstract
+ * <code>service</code> method.
+ * 
+ * @author Various
+ */
+
+public abstract class GenericServlet implements Servlet, ServletConfig, java.io.Serializable
+{
+   private static final String LSTRING_FILE = "javax.servlet.LocalStrings";
+
+   private static ResourceBundle lStrings = ResourceBundle.getBundle(LSTRING_FILE);
+
+   private transient ServletConfig config;
+
+   /**
+    * Does nothing. All of the servlet initialization is done by one of the
+    * <code>init</code> methods.
+    */
+   public GenericServlet()
+   {
+   }
+
+   /**
+    * Called by the servlet container to indicate to a servlet that the servlet
+    * is being taken out of service. See {@link Servlet#destroy}.
+    */
+   public void destroy()
+   {
+   }
+
+   /**
+    * Returns a <code>String</code> containing the value of the named
+    * initialization parameter, or <code>null</code> if the parameter does not
+    * exist. See {@link ServletConfig#getInitParameter}.
+    * <p>
+    * This method is supplied for convenience. It gets the value of the named
+    * parameter from the servlet's <code>ServletConfig</code> object.
+    * 
+    * @param name
+    *           a <code>String</code> specifying the name of the
+    *           initialization parameter
+    * @return String a <code>String</code> containing the value of the
+    *         initialization parameter
+    */
+   public String getInitParameter(String name)
+   {
+      ServletConfig sc = getServletConfig();
+      if (sc == null)
+      {
+         throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));
+      }
+
+      return sc.getInitParameter(name);
+   }
+
+   /**
+    * Returns the names of the servlet's initialization parameters as an
+    * <code>Enumeration</code> of <code>String</code> objects, or an empty
+    * <code>Enumeration</code> if the servlet has no initialization
+    * parameters. See {@link ServletConfig#getInitParameterNames}.
+    * <p>
+    * This method is supplied for convenience. It gets the parameter names from
+    * the servlet's <code>ServletConfig</code> object.
+    * 
+    * @return Enumeration an enumeration of <code>String</code> objects
+    *         containing the names of the servlet's initialization parameters
+    */
+   public Enumeration getInitParameterNames()
+   {
+      ServletConfig sc = getServletConfig();
+      if (sc == null)
+      {
+         throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));
+      }
+
+      return sc.getInitParameterNames();
+   }
+
+   /**
+    * Returns this servlet's {@link ServletConfig} object.
+    * 
+    * @return ServletConfig the <code>ServletConfig</code> object that
+    *         initialized this servlet
+    */
+   public ServletConfig getServletConfig()
+   {
+      return config;
+   }
+
+   /**
+    * Returns a reference to the {@link ServletContext} in which this servlet is
+    * running. See {@link ServletConfig#getServletContext}.
+    * <p>
+    * This method is supplied for convenience. It gets the context from the
+    * servlet's <code>ServletConfig</code> object.
+    * 
+    * @return ServletContext the <code>ServletContext</code> object passed to
+    *         this servlet by the <code>init</code> method
+    */
+   public ServletContext getServletContext()
+   {
+      ServletConfig sc = getServletConfig();
+      if (sc == null)
+      {
+         throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));
+      }
+
+      return sc.getServletContext();
+   }
+
+   /**
+    * Returns information about the servlet, such as author, version, and
+    * copyright. By default, this method returns an empty string. Override this
+    * method to have it return a meaningful value. See {@link
+    * Servlet#getServletInfo}.
+    * 
+    * @return String information about this servlet, by default an empty string
+    */
+   public String getServletInfo()
+   {
+      return "";
+   }
+
+   /**
+    * Called by the servlet container to indicate to a servlet that the servlet
+    * is being placed into service. See {@link Servlet#init}.
+    * <p>
+    * This implementation stores the {@link ServletConfig} object it receives
+    * from the servlet container for later use. When overriding this form of the
+    * method, call <code>super.init(config)</code>.
+    * 
+    * @param config
+    *           the <code>ServletConfig</code> object that contains
+    *           configutation information for this servlet
+    * @exception ServletException
+    *               if an exception occurs that interrupts the servlet's normal
+    *               operation
+    * @see UnavailableException
+    */
+   public void init(ServletConfig config) throws ServletException
+   {
+      this.config = config;
+      this.init();
+   }
+
+   /**
+    * A convenience method which can be overridden so that there's no need to
+    * call <code>super.init(config)</code>.
+    * <p>
+    * Instead of overriding {@link #init(ServletConfig)}, simply override this
+    * method and it will be called by
+    * <code>GenericServlet.init(ServletConfig config)</code>. The
+    * <code>ServletConfig</code> object can still be retrieved via {@link
+    * #getServletConfig}.
+    * 
+    * @exception ServletException
+    *               if an exception occurs that interrupts the servlet's normal
+    *               operation
+    */
+   public void init() throws ServletException
+   {
+
+   }
+
+   /**
+    * Writes the specified message to a servlet log file, prepended by the
+    * servlet's name. See {@link ServletContext#log(String)}.
+    * 
+    * @param msg
+    *           a <code>String</code> specifying the message to be written to
+    *           the log file
+    */
+   public void log(String msg)
+   {
+      getServletContext().log(getServletName() + ": " + msg);
+   }
+
+   /**
+    * Writes an explanatory message and a stack trace for a given
+    * <code>Throwable</code> exception to the servlet log file, prepended by
+    * the servlet's name. See {@link ServletContext#log(String, Throwable)}.
+    * 
+    * @param message
+    *           a <code>String</code> that describes the error or exception
+    * @param t
+    *           the <code>java.lang.Throwable</code> error or exception
+    */
+   public void log(String message, Throwable t)
+   {
+      getServletContext().log(getServletName() + ": " + message, t);
+   }
+
+   /**
+    * Called by the servlet container to allow the servlet to respond to a
+    * request. See {@link Servlet#service}.
+    * <p>
+    * This method is declared abstract so subclasses, such as
+    * <code>HttpServlet</code>, must override it.
+    * 
+    * @param req
+    *           the <code>ServletRequest</code> object that contains the
+    *           client's request
+    * @param res
+    *           the <code>ServletResponse</code> object that will contain the
+    *           servlet's response
+    * @exception ServletException
+    *               if an exception occurs that interferes with the servlet's
+    *               normal operation occurred
+    * @exception IOException
+    *               if an input or output exception occurs
+    */
+   public abstract void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
+
+   /**
+    * Returns the name of this servlet instance. See
+    * {@link ServletConfig#getServletName}.
+    * 
+    * @return the name of this servlet instance
+    */
+   public String getServletName()
+   {
+      ServletConfig sc = getServletConfig();
+      if (sc == null)
+      {
+         throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));
+      }
+
+      return sc.getServletName();
+   }
+}

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/LocalStrings.properties
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/LocalStrings.properties	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/LocalStrings.properties	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,7 @@
+# Default localized string information
+# Localized for Locale en_US
+
+err.not_iso8859_1=Not an ISO 8859-1 character: {0}
+err.servlet_config_not_initialized=ServletConfig has not been initialized
+value.true=true
+value.false=false

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/LocalStrings_fr.properties
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/LocalStrings_fr.properties	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/LocalStrings_fr.properties	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,8 @@
+# Default localized string information
+# Localized for Locale fr_FR
+
+err.not_iso8859_1={0} n''est pas un caractère ISO 8859-1
+value.true=true
+value.false=false 
+
+

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/LocalStrings_ja.properties
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/LocalStrings_ja.properties	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/LocalStrings_ja.properties	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,6 @@
+# Default localized string information
+# Localized for Locale ja_JP
+
+err.not_iso8859_1=ISO 8859-1 \u306e\u6587\u5b57\u3067\u306f\u3042\u308a\u307e\u305b\u3093: {0}
+value.true=true
+value.false=false

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/RequestDispatcher.java
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/RequestDispatcher.java	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/RequestDispatcher.java	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,111 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package javax.servlet;
+
+import java.io.IOException;
+
+/**
+ * Defines an object that receives requests from the client and sends them to
+ * any resource (such as a servlet, HTML file, or JSP file) on the server. The
+ * servlet container creates the <code>RequestDispatcher</code> object, which
+ * is used as a wrapper around a server resource located at a particular path or
+ * given by a particular name.
+ * <p>
+ * This interface is intended to wrap servlets, but a servlet container can
+ * create <code>RequestDispatcher</code> objects to wrap any type of resource.
+ * 
+ * @author Various
+ * @see ServletContext#getRequestDispatcher(java.lang.String)
+ * @see ServletContext#getNamedDispatcher(java.lang.String)
+ * @see ServletRequest#getRequestDispatcher(java.lang.String)
+ */
+
+public interface RequestDispatcher
+{
+
+   /**
+    * Forwards a request from a servlet to another resource (servlet, JSP file,
+    * or HTML file) on the server. This method allows one servlet to do
+    * preliminary processing of a request and another resource to generate the
+    * response.
+    * <p>
+    * For a <code>RequestDispatcher</code> obtained via
+    * <code>getRequestDispatcher()</code>, the <code>ServletRequest</code>
+    * object has its path elements and parameters adjusted to match the path of
+    * the target resource.
+    * <p>
+    * <code>forward</code> should be called before the response has been
+    * committed to the client (before response body output has been flushed). If
+    * the response already has been committed, this method throws an
+    * <code>IllegalStateException</code>. Uncommitted output in the response
+    * buffer is automatically cleared before the forward.
+    * <p>
+    * The request and response parameters must be either the same objects as
+    * were passed to the calling servlet's service method or be subclasses of
+    * the {@link ServletRequestWrapper} or {@link ServletResponseWrapper}
+    * classes that wrap them.
+    * 
+    * @param request
+    *           a {@link ServletRequest} object that represents the request the
+    *           client makes of the servlet
+    * @param response
+    *           a {@link ServletResponse} object that represents the response
+    *           the servlet returns to the client
+    * @exception ServletException
+    *               if the target resource throws this exception
+    * @exception IOException
+    *               if the target resource throws this exception
+    * @exception IllegalStateException
+    *               if the response was already committed
+    */
+
+   public void forward(ServletRequest request, ServletResponse response) throws ServletException, IOException;
+
+   /**
+    * Includes the content of a resource (servlet, JSP page, HTML file) in the
+    * response. In essence, this method enables programmatic server-side
+    * includes.
+    * <p>
+    * The {@link ServletResponse} object has its path elements and parameters
+    * remain unchanged from the caller's. The included servlet cannot change the
+    * response status code or set headers; any attempt to make a change is
+    * ignored.
+    * <p>
+    * The request and response parameters must be either the same objects as
+    * were passed to the calling servlet's service method or be subclasses of
+    * the {@link ServletRequestWrapper} or {@link ServletResponseWrapper}
+    * classes that wrap them.
+    * 
+    * @param request
+    *           a {@link ServletRequest} object that contains the client's
+    *           request
+    * @param response
+    *           a {@link ServletResponse} object that contains the servlet's
+    *           response
+    * @exception ServletException
+    *               if the included resource throws this exception
+    * @exception IOException
+    *               if the included resource throws this exception
+    */
+
+   public void include(ServletRequest request, ServletResponse response) throws ServletException, IOException;
+}

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/Servlet.java
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/Servlet.java	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/Servlet.java	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,165 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package javax.servlet;
+
+import java.io.IOException;
+
+/**
+ * Defines methods that all servlets must implement.
+ * <p>
+ * A servlet is a small Java program that runs within a Web server. Servlets
+ * receive and respond to requests from Web clients, usually across HTTP, the
+ * HyperText Transfer Protocol.
+ * <p>
+ * To implement this interface, you can write a generic servlet that extends
+ * <code>javax.servlet.GenericServlet</code> or an HTTP servlet that extends
+ * <code>javax.servlet.http.HttpServlet</code>.
+ * <p>
+ * This interface defines methods to initialize a servlet, to service requests,
+ * and to remove a servlet from the server. These are known as life-cycle
+ * methods and are called in the following sequence:
+ * <ol>
+ * <li>The servlet is constructed, then initialized with the <code>init</code>
+ * method.</li>
+ * <li>Any calls from clients to the <code>service</code> method are handled.</li>
+ * <li>The servlet is taken out of service, then destroyed with the
+ * <code>destroy</code> method, then garbage collected and finalized.</li>
+ * </ol>
+ * <p>
+ * In addition to the life-cycle methods, this interface provides the
+ * <code>getServletConfig</code> method, which the servlet can use to get any
+ * startup information, and the <code>getServletInfo</code> method, which
+ * allows the servlet to return basic information about itself, such as author,
+ * version, and copyright.
+ * 
+ * @author Various
+ * @see GenericServlet
+ * @see javax.servlet.http.HttpServlet
+ */
+
+public interface Servlet
+{
+
+   /**
+    * Called by the servlet container to indicate to a servlet that the servlet
+    * is being placed into service.
+    * <p>
+    * The servlet container calls the <code>init</code> method exactly once
+    * after instantiating the servlet. The <code>init</code> method must
+    * complete successfully before the servlet can receive any requests.
+    * <p>
+    * The servlet container cannot place the servlet into service if the
+    * <code>init</code> method
+    * <ol>
+    * <li>Throws a <code>ServletException</code></li>
+    * <li>Does not return within a time period defined by the Web server</li>
+    * </ol>
+    * 
+    * @param config
+    *           a <code>ServletConfig</code> object containing the servlet's
+    *           configuration and initialization parameters
+    * @exception ServletException
+    *               if an exception has occurred that interferes with the
+    *               servlet's normal operation
+    * @see UnavailableException
+    * @see #getServletConfig
+    */
+
+   public void init(ServletConfig config) throws ServletException;
+
+   /**
+    * Returns a {@link ServletConfig} object, which contains initialization and
+    * startup parameters for this servlet. The <code>ServletConfig</code>
+    * object returned is the one passed to the <code>init</code> method.
+    * <p>
+    * Implementations of this interface are responsible for storing the
+    * <code>ServletConfig</code> object so that this method can return it. The
+    * {@link GenericServlet} class, which implements this interface, already
+    * does this.
+    * 
+    * @return the <code>ServletConfig</code> object that initializes this
+    *         servlet
+    * @see #init
+    */
+
+   public ServletConfig getServletConfig();
+
+   /**
+    * Called by the servlet container to allow the servlet to respond to a
+    * request.
+    * <p>
+    * This method is only called after the servlet's <code>init()</code>
+    * method has completed successfully.
+    * <p>
+    * The status code of the response always should be set for a servlet that
+    * throws or sends an error.
+    * <p>
+    * Servlets typically run inside multithreaded servlet containers that can
+    * handle multiple requests concurrently. Developers must be aware to
+    * synchronize access to any shared resources such as files, network
+    * connections, and as well as the servlet's class and instance variables.
+    * More information on multithreaded programming in Java is available in <a
+    * href="http://java.sun.com/Series/Tutorial/java/threads/multithreaded.html">
+    * the Java tutorial on multi-threaded programming</a>.
+    * 
+    * @param req
+    *           the <code>ServletRequest</code> object that contains the
+    *           client's request
+    * @param res
+    *           the <code>ServletResponse</code> object that contains the
+    *           servlet's response
+    * @exception ServletException
+    *               if an exception occurs that interferes with the servlet's
+    *               normal operation
+    * @exception IOException
+    *               if an input or output exception occurs
+    */
+
+   public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
+
+   /**
+    * Returns information about the servlet, such as author, version, and
+    * copyright.
+    * <p>
+    * The string that this method returns should be plain text and not markup of
+    * any kind (such as HTML, XML, etc.).
+    * 
+    * @return a <code>String</code> containing servlet information
+    */
+
+   public String getServletInfo();
+
+   /**
+    * Called by the servlet container to indicate to a servlet that the servlet
+    * is being taken out of service. This method is only called once all threads
+    * within the servlet's <code>service</code> method have exited or after a
+    * timeout period has passed. After the servlet container calls this method,
+    * it will not call the <code>service</code> method again on this servlet.
+    * <p>
+    * This method gives the servlet an opportunity to clean up any resources
+    * that are being held (for example, memory, file handles, threads) and make
+    * sure that any persistent state is synchronized with the servlet's current
+    * state in memory.
+    */
+
+   public void destroy();
+}

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletConfig.java
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletConfig.java	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletConfig.java	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,82 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package javax.servlet;
+
+import java.util.Enumeration;
+
+/**
+ * A servlet configuration object used by a servlet container to pass
+ * information to a servlet during initialization.
+ */
+
+public interface 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.
+    * 
+    * @return the name of the servlet instance
+    */
+
+   public String getServletName();
+
+   /**
+    * Returns a reference to the {@link ServletContext} in which the caller is
+    * executing.
+    * 
+    * @return a {@link ServletContext} object, used by the caller to interact
+    *         with its servlet container
+    * @see ServletContext
+    */
+
+   public ServletContext getServletContext();
+
+   /**
+    * Returns a <code>String</code> containing the value of the named
+    * initialization parameter, or <code>null</code> if the parameter does not
+    * exist.
+    * 
+    * @param name
+    *           a <code>String</code> specifying the name of the
+    *           initialization parameter
+    * @return a <code>String</code> containing the value of the initialization
+    *         parameter
+    */
+
+   public String getInitParameter(String name);
+
+   /**
+    * Returns the names of the servlet's initialization parameters as an
+    * <code>Enumeration</code> of <code>String</code> objects, or an empty
+    * <code>Enumeration</code> if the servlet has no initialization
+    * parameters.
+    * 
+    * @return an <code>Enumeration</code> of <code>String</code> objects
+    *         containing the names of the servlet's initialization parameters
+    */
+
+   public Enumeration getInitParameterNames();
+
+}

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletContext.java
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletContext.java	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletContext.java	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,520 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package javax.servlet;
+
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.Set;
+
+/**
+ * Defines a set of methods that a servlet uses to communicate with its servlet
+ * container, for example, to get the MIME type of a file, dispatch requests, or
+ * write to a log file.
+ * <p>
+ * There is one context per "web application" per Java Virtual Machine. (A "web
+ * application" is a collection of servlets and content installed under a
+ * specific subset of the server's URL namespace such as <code>/catalog</code>
+ * and possibly installed via a <code>.war</code> file.)
+ * <p>
+ * In the case of a web application marked "distributed" in its deployment
+ * descriptor, there will be one context instance for each virtual machine. In
+ * this situation, the context cannot be used as a location to share global
+ * information (because the information won't be truly global). Use an external
+ * resource like a database instead.
+ * <p>
+ * The <code>ServletContext</code> object is contained within the
+ * {@link ServletConfig} object, which the Web server provides the servlet when
+ * the servlet is initialized.
+ * 
+ * @author Various
+ * @see Servlet#getServletConfig
+ * @see ServletConfig#getServletContext
+ */
+
+public interface ServletContext
+{
+
+   /**
+    * Returns the context path of the web application.
+    * <p>
+    * The context path is the portion of the request URI that is used to select
+    * the context of the request. The context path always comes first in a
+    * request URI. The path starts with a "/" character but does not end with a
+    * "/" character. For servlets in the default (root) context, this method
+    * returns "".
+    * <p>
+    * It is possible that a servlet container may match a context by more than
+    * one context path. In such cases the
+    * {@link javax.servlet.http.HttpServletRequest#getContextPath()} will return
+    * the actual context path used by the request and it may differ from the
+    * path returned by this method. The context path returned by this method
+    * should be considered as the prime or preferred context path of the
+    * application.
+    * 
+    * @return The context path of the web application, or "" for the default
+    *         (root) context
+    * @see javax.servlet.http.HttpServletRequest#getContextPath()
+    * @since Servlet 2.5
+    */
+   public String getContextPath();
+
+   /**
+    * Returns a <code>ServletContext</code> object that corresponds to a
+    * specified URL on the server.
+    * <p>
+    * This method allows servlets to gain access to the context for various
+    * parts of the server, and as needed obtain {@link RequestDispatcher}
+    * objects from the context. The given path must be begin with "/", is
+    * interpreted relative to the server's document root and is matched against
+    * the context roots of other web applications hosted on this container.
+    * <p>
+    * In a security conscious environment, the servlet container may return
+    * <code>null</code> for a given URL.
+    * 
+    * @param uripath
+    *           a <code>String</code> specifying the context path of another
+    *           web application in the container.
+    * @return the <code>ServletContext</code> object that corresponds to the
+    *         named URL, or null if either none exists or the container wishes
+    *         to restrict this access.
+    * @see RequestDispatcher
+    */
+
+   public ServletContext getContext(String uripath);
+
+   /**
+    * Returns the major version of the Java Servlet API that this servlet
+    * container supports. All implementations that comply with Version 2.5 must
+    * have this method return the integer 2.
+    * 
+    * @return 2
+    */
+
+   public int getMajorVersion();
+
+   /**
+    * Returns the minor version of the Servlet API that this servlet container
+    * supports. All implementations that comply with Version 2.5 must have this
+    * method return the integer 5.
+    * 
+    * @return 5
+    */
+
+   public int getMinorVersion();
+
+   /**
+    * Returns the MIME type of the specified file, or <code>null</code> if the
+    * MIME type is not known. The MIME type is determined by the configuration
+    * of the servlet container, and may be specified in a web application
+    * deployment descriptor. Common MIME types are <code>"text/html"</code>
+    * and <code>"image/gif"</code>.
+    * 
+    * @param file
+    *           a <code>String</code> specifying the name of a file
+    * @return a <code>String</code> specifying the file's MIME type
+    */
+
+   public String getMimeType(String file);
+
+   /**
+    * Returns a directory-like listing of all the paths to resources within the
+    * web application whose longest sub-path matches the supplied path argument.
+    * Paths indicating subdirectory paths end with a '/'. The returned paths are
+    * all relative to the root of the web application and have a leading '/'.
+    * For example, for a web application containing<br>
+    * <br>
+    * /welcome.html<br>
+    * /catalog/index.html<br>
+    * /catalog/products.html<br>
+    * /catalog/offers/books.html<br>
+    * /catalog/offers/music.html<br>
+    * /customer/login.jsp<br>
+    * /WEB-INF/web.xml<br>
+    * /WEB-INF/classes/com.acme.OrderServlet.class,<br>
+    * <br>
+    * getResourcePaths("/") returns {"/welcome.html", "/catalog/", "/customer/",
+    * "/WEB-INF/"}<br>
+    * getResourcePaths("/catalog/") returns {"/catalog/index.html",
+    * "/catalog/products.html", "/catalog/offers/"}.<br>
+    * 
+    * @param path
+    *           the partial path used to match the resources, which must start
+    *           with a /
+    * @return a Set containing the directory listing, or null if there are no
+    *         resources in the web application whose path begins with the
+    *         supplied path.
+    * @since Servlet 2.3
+    */
+
+   public Set getResourcePaths(String path);
+
+   /**
+    * Returns a URL to the resource that is mapped to a specified path. The path
+    * must begin with a "/" and is interpreted as relative to the current
+    * context root.
+    * <p>
+    * This method allows the servlet container to make a resource available to
+    * servlets from any source. Resources can be located on a local or remote
+    * file system, in a database, or in a <code>.war</code> file.
+    * <p>
+    * The servlet container must implement the URL handlers and
+    * <code>URLConnection</code> objects that are necessary to access the
+    * resource.
+    * <p>
+    * This method returns <code>null</code> if no resource is mapped to the
+    * pathname.
+    * <p>
+    * Some containers may allow writing to the URL returned by this method using
+    * the methods of the URL class.
+    * <p>
+    * The resource content is returned directly, so be aware that requesting a
+    * <code>.jsp</code> page returns the JSP source code. Use a
+    * <code>RequestDispatcher</code> instead to include results of an
+    * execution.
+    * <p>
+    * This method has a different purpose than
+    * <code>java.lang.Class.getResource</code>, which looks up resources
+    * based on a class loader. This method does not use class loaders.
+    * 
+    * @param path
+    *           a <code>String</code> specifying the path to the resource
+    * @return the resource located at the named path, or <code>null</code> if
+    *         there is no resource at that path
+    * @exception MalformedURLException
+    *               if the pathname is not given in the correct form
+    */
+
+   public URL getResource(String path) throws MalformedURLException;
+
+   /**
+    * Returns the resource located at the named path as an
+    * <code>InputStream</code> object.
+    * <p>
+    * The data in the <code>InputStream</code> can be of any type or length.
+    * The path must be specified according to the rules given in
+    * <code>getResource</code>. This method returns <code>null</code> if no
+    * resource exists at the specified path.
+    * <p>
+    * Meta-information such as content length and content type that is available
+    * via <code>getResource</code> method is lost when using this method.
+    * <p>
+    * The servlet container must implement the URL handlers and
+    * <code>URLConnection</code> objects necessary to access the resource.
+    * <p>
+    * This method is different from
+    * <code>java.lang.Class.getResourceAsStream</code>, which uses a class
+    * loader. This method allows servlet containers to make a resource available
+    * to a servlet from any location, without using a class loader.
+    * 
+    * @param path
+    *           a <code>String</code> specifying the path to the resource
+    * @return the <code>InputStream</code> returned to the servlet, or
+    *         <code>null</code> if no resource exists at the specified path
+    */
+
+   public InputStream getResourceAsStream(String path);
+
+   /**
+    * Returns a {@link RequestDispatcher} object that acts as a wrapper for the
+    * resource located at the given path. A <code>RequestDispatcher</code>
+    * object can be used to forward a request to the resource or to include the
+    * resource in a response. The resource can be dynamic or static.
+    * <p>
+    * The pathname must begin with a "/" and is interpreted as relative to the
+    * current context root. Use <code>getContext</code> to obtain a
+    * <code>RequestDispatcher</code> for resources in foreign contexts. This
+    * method returns <code>null</code> if the <code>ServletContext</code>
+    * cannot return a <code>RequestDispatcher</code>.
+    * 
+    * @param path
+    *           a <code>String</code> specifying the pathname to the resource
+    * @return a <code>RequestDispatcher</code> object that acts as a wrapper
+    *         for the resource at the specified path, or <code>null</code> if
+    *         the <code>ServletContext</code> cannot return a
+    *         <code>RequestDispatcher</code>
+    * @see RequestDispatcher
+    * @see ServletContext#getContext
+    */
+
+   public RequestDispatcher getRequestDispatcher(String path);
+
+   /**
+    * Returns a {@link RequestDispatcher} object that acts as a wrapper for the
+    * named servlet.
+    * <p>
+    * Servlets (and JSP pages also) may be given names via server administration
+    * or via a web application deployment descriptor. A servlet instance can
+    * determine its name using {@link ServletConfig#getServletName}.
+    * <p>
+    * This method returns <code>null</code> if the <code>ServletContext</code>
+    * cannot return a <code>RequestDispatcher</code> for any reason.
+    * 
+    * @param name
+    *           a <code>String</code> specifying the name of a servlet to wrap
+    * @return a <code>RequestDispatcher</code> object that acts as a wrapper
+    *         for the named servlet, or <code>null</code> if the
+    *         <code>ServletContext</code> cannot return a
+    *         <code>RequestDispatcher</code>
+    * @see RequestDispatcher
+    * @see ServletContext#getContext
+    * @see ServletConfig#getServletName
+    */
+
+   public RequestDispatcher getNamedDispatcher(String name);
+
+   /**
+    * @deprecated As of Java Servlet API 2.1, with no direct replacement.
+    *             <p>
+    *             This method was originally defined to retrieve a servlet from
+    *             a <code>ServletContext</code>. In this version, this method
+    *             always returns <code>null</code> and remains only to
+    *             preserve binary compatibility. This method will be permanently
+    *             removed in a future version of the Java Servlet API.
+    *             <p>
+    *             In lieu of this method, servlets can share information using
+    *             the <code>ServletContext</code> class and can perform shared
+    *             business logic by invoking methods on common non-servlet
+    *             classes.
+    */
+   @Deprecated
+   public Servlet getServlet(String name) throws ServletException;
+
+   /**
+    * @deprecated As of Java Servlet API 2.0, with no replacement.
+    *             <p>
+    *             This method was originally defined to return an
+    *             <code>Enumeration</code> of all the servlets known to this
+    *             servlet context. In this version, this method always returns
+    *             an empty enumeration and remains only to preserve binary
+    *             compatibility. This method will be permanently removed in a
+    *             future version of the Java Servlet API.
+    */
+   @Deprecated
+   public Enumeration getServlets();
+
+   /**
+    * @deprecated As of Java Servlet API 2.1, with no replacement.
+    *             <p>
+    *             This method was originally defined to return an
+    *             <code>Enumeration</code> of all the servlet names known to
+    *             this context. In this version, this method always returns an
+    *             empty <code>Enumeration</code> and remains only to preserve
+    *             binary compatibility. This method will be permanently removed
+    *             in a future version of the Java Servlet API.
+    */
+
+   public Enumeration getServletNames();
+
+   /**
+    * Writes the specified message to a servlet log file, usually an event log.
+    * The name and type of the servlet log file is specific to the servlet
+    * container.
+    * 
+    * @param msg
+    *           a <code>String</code> specifying the message to be written to
+    *           the log file
+    */
+
+   public void log(String msg);
+
+   /**
+    * @deprecated As of Java Servlet API 2.1, use
+    *             {@link #log(String message, Throwable throwable)} instead.
+    *             <p>
+    *             This method was originally defined to write an exception's
+    *             stack trace and an explanatory error message to the servlet
+    *             log file.
+    */
+   @Deprecated
+   public void log(Exception exception, String msg);
+
+   /**
+    * Writes an explanatory message and a stack trace for a given
+    * <code>Throwable</code> exception to the servlet log file. The name and
+    * type of the servlet log file is specific to the servlet container, usually
+    * an event log.
+    * 
+    * @param message
+    *           a <code>String</code> that describes the error or exception
+    * @param throwable
+    *           the <code>Throwable</code> error or exception
+    */
+
+   public void log(String message, Throwable throwable);
+
+   /**
+    * Returns a <code>String</code> containing the real path for a given
+    * virtual path. For example, the path "/index.html" returns the absolute
+    * file path on the server's filesystem would be served by a request for
+    * "http://host/contextPath/index.html", where contextPath is the context
+    * path of this ServletContext..
+    * <p>
+    * The real path returned will be in a form appropriate to the computer and
+    * operating system on which the servlet container is running, including the
+    * proper path separators. This method returns <code>null</code> if the
+    * servlet container cannot translate the virtual path to a real path for any
+    * reason (such as when the content is being made available from a
+    * <code>.war</code> archive).
+    * 
+    * @param path
+    *           a <code>String</code> specifying a virtual path
+    * @return a <code>String</code> specifying the real path, or null if the
+    *         translation cannot be performed
+    */
+
+   public String getRealPath(String path);
+
+   /**
+    * Returns the name and version of the servlet container on which the servlet
+    * is running.
+    * <p>
+    * The form of the returned string is <i>servername</i>/<i>versionnumber</i>.
+    * For example, the JavaServer Web Development Kit may return the string
+    * <code>JavaServer Web Dev Kit/1.0</code>.
+    * <p>
+    * The servlet container may return other optional information after the
+    * primary string in parentheses, for example,
+    * <code>JavaServer Web Dev Kit/1.0 (JDK 1.1.6; Windows NT 4.0 x86)</code>.
+    * 
+    * @return a <code>String</code> containing at least the servlet container
+    *         name and version number
+    */
+
+   public String getServerInfo();
+
+   /**
+    * Returns a <code>String</code> containing the value of the named
+    * context-wide initialization parameter, or <code>null</code> if the
+    * parameter does not exist.
+    * <p>
+    * This method can make available configuration information useful to an
+    * entire "web application". For example, it can provide a webmaster's email
+    * address or the name of a system that holds critical data.
+    * 
+    * @param name
+    *           a <code>String</code> containing the name of the parameter
+    *           whose value is requested
+    * @return a <code>String</code> containing at least the servlet container
+    *         name and version number
+    * @see ServletConfig#getInitParameter
+    */
+
+   public String getInitParameter(String name);
+
+   /**
+    * Returns the names of the context's initialization parameters as an
+    * <code>Enumeration</code> of <code>String</code> objects, or an empty
+    * <code>Enumeration</code> if the context has no initialization
+    * parameters.
+    * 
+    * @return an <code>Enumeration</code> of <code>String</code> objects
+    *         containing the names of the context's initialization parameters
+    * @see ServletConfig#getInitParameter
+    */
+
+   public Enumeration getInitParameterNames();
+
+   /**
+    * Returns the servlet container attribute with the given name, or
+    * <code>null</code> if there is no attribute by that name. An attribute
+    * allows a servlet container to give the servlet additional information not
+    * already provided by this interface. See your server documentation for
+    * information about its attributes. A list of supported attributes can be
+    * retrieved using <code>getAttributeNames</code>.
+    * <p>
+    * The attribute is returned as a <code>java.lang.Object</code> or some
+    * subclass. Attribute names should follow the same convention as package
+    * names. The Java Servlet API specification reserves names matching
+    * <code>java.*</code>, <code>javax.*</code>, and <code>sun.*</code>.
+    * 
+    * @param name
+    *           a <code>String</code> specifying the name of the attribute
+    * @return an <code>Object</code> containing the value of the attribute, or
+    *         <code>null</code> if no attribute exists matching the given name
+    * @see ServletContext#getAttributeNames
+    */
+
+   public Object getAttribute(String name);
+
+   /**
+    * Returns an <code>Enumeration</code> containing the attribute names
+    * available within this servlet context. Use the {@link #getAttribute}
+    * method with an attribute name to get the value of an attribute.
+    * 
+    * @return an <code>Enumeration</code> of attribute names
+    * @see #getAttribute
+    */
+
+   public Enumeration getAttributeNames();
+
+   /**
+    * Binds an object to a given attribute name in this servlet context. If the
+    * name specified is already used for an attribute, this method will replace
+    * the attribute with the new to the new attribute.
+    * <p>
+    * If listeners are configured on the <code>ServletContext</code> the
+    * container notifies them accordingly.
+    * <p>
+    * If a null value is passed, the effect is the same as calling
+    * <code>removeAttribute()</code>.
+    * <p>
+    * Attribute names should follow the same convention as package names. The
+    * Java Servlet API specification reserves names matching <code>java.*</code>,
+    * <code>javax.*</code>, and <code>sun.*</code>.
+    * 
+    * @param name
+    *           a <code>String</code> specifying the name of the attribute
+    * @param object
+    *           an <code>Object</code> representing the attribute to be bound
+    */
+
+   public void setAttribute(String name, Object object);
+
+   /**
+    * Removes the attribute with the given name from the servlet context. After
+    * removal, subsequent calls to {@link #getAttribute} to retrieve the
+    * attribute's value will return <code>null</code>.
+    * <p>
+    * If listeners are configured on the <code>ServletContext</code> the
+    * container notifies them accordingly.
+    * 
+    * @param name
+    *           a <code>String</code> specifying the name of the attribute to
+    *           be removed
+    */
+
+   public void removeAttribute(String name);
+
+   /**
+    * Returns the name of this web application corresponding to this
+    * ServletContext as specified in the deployment descriptor for this web
+    * application by the display-name element.
+    * 
+    * @return The name of the web application or null if no name has been
+    *         declared in the deployment descriptor.
+    * @since Servlet 2.3
+    */
+
+   public String getServletContextName();
+}

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletContextAttributeEvent.java
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletContextAttributeEvent.java	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletContextAttributeEvent.java	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,68 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package javax.servlet;
+
+/**
+ * This is the event class for notifications about changes to the attributes of
+ * the servlet context of a web application.
+ * 
+ * @see ServletContextAttributeListener
+ * @since v 2.3
+ */
+
+public class ServletContextAttributeEvent extends ServletContextEvent
+{
+   private String name;
+
+   private Object value;
+
+   /**
+    * Construct a ServletContextAttributeEvent from the given context for the *
+    * given attribute name and attribute value.
+    */
+   public ServletContextAttributeEvent(ServletContext source, String name, Object value)
+   {
+      super(source);
+      this.name = name;
+      this.value = value;
+   }
+
+   /**
+    * Return the name of the attribute that changed on the ServletContext.
+    */
+   public String getName()
+   {
+      return this.name;
+   }
+
+   /**
+    * Returns the value of the attribute that has been added, removed, or
+    * replaced. If the attribute was added, this is the value of the attribute.
+    * If the attribute was removed, this is the value of the removed attribute.
+    * If the attribute was replaced, this is the old value of the attribute.
+    */
+
+   public Object getValue()
+   {
+      return this.value;
+   }
+}

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletContextAttributeListener.java
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletContextAttributeListener.java	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletContextAttributeListener.java	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,56 @@
+/*
+ * The contents of this file are subject to the terms
+ * of the Common Development and Distribution License
+ * (the "License").  You may not use this file except
+ * in compliance with the License.
+ *
+ * You can obtain a copy of the license at
+ * glassfish/bootstrap/legal/CDDLv1.0.txt or
+ * https://glassfish.dev.java.net/public/CDDLv1.0.html.
+ * See the License for the specific language governing
+ * permissions and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL
+ * HEADER in each file and include the License file at
+ * glassfish/bootstrap/legal/CDDLv1.0.txt.  If applicable,
+ * add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your
+ * own identifying information: Portions Copyright [yyyy]
+ * [name of copyright owner]
+ *
+ * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ */
+package javax.servlet;
+
+import java.util.EventListener;
+
+/**
+ * Implementations of this interface receive notifications of * changes to the
+ * attribute list on the servlet context of a web application. To receive
+ * notification events, the implementation class must be configured in the
+ * deployment descriptor for the web application.
+ * 
+ * @see ServletContextAttributeEvent
+ * @since v 2.3
+ */
+
+public interface ServletContextAttributeListener extends EventListener
+{
+   /**
+    * Notification that a new attribute was added to the servlet context. Called
+    * after the attribute is added.
+    */
+   public void attributeAdded(ServletContextAttributeEvent scab);
+
+   /**
+    * Notification that an existing attribute has been removed from the servlet
+    * context. Called after the attribute is removed.
+    */
+   public void attributeRemoved(ServletContextAttributeEvent scab);
+
+   /**
+    * Notification that an attribute on the servlet context has been replaced.
+    * Called after the attribute is replaced.
+    */
+   public void attributeReplaced(ServletContextAttributeEvent scab);
+}

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletContextEvent.java
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletContextEvent.java	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletContextEvent.java	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,56 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package javax.servlet;
+
+/**
+ * This is the event class for notifications about changes to the servlet
+ * context of a web application.
+ * 
+ * @see ServletContextListener
+ * @since v 2.3
+ */
+
+public class ServletContextEvent extends java.util.EventObject
+{
+
+   /**
+    * Construct a ServletContextEvent from the given context.
+    * 
+    * @param source -
+    *           the ServletContext that is sending the event.
+    */
+   public ServletContextEvent(ServletContext source)
+   {
+      super(source);
+   }
+
+   /**
+    * Return the ServletContext that changed.
+    * 
+    * @return the ServletContext that sent the event.
+    */
+   public ServletContext getServletContext()
+   {
+      return (ServletContext) super.getSource();
+   }
+
+}

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletContextListener.java
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletContextListener.java	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletContextListener.java	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,53 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package javax.servlet;
+
+import java.util.EventListener;
+
+/**
+ * Implementations of this interface receive notifications about changes to the
+ * servlet context of the web application they are part of. To receive
+ * notification events, the implementation class must be configured in the
+ * deployment descriptor for the web application.
+ * 
+ * @see ServletContextEvent
+ * @since v 2.3
+ */
+
+public interface ServletContextListener extends EventListener
+{
+   /**
+    * * Notification that the web application initialization * process is
+    * starting. * All ServletContextListeners are notified of context *
+    * initialization before any filter or servlet in the web * application is
+    * initialized.
+    */
+
+   public void contextInitialized(ServletContextEvent sce);
+
+   /**
+    * * Notification that the servlet context is about to be shut down. * All
+    * servlets and filters have been destroy()ed before any *
+    * ServletContextListeners are notified of context * destruction.
+    */
+   public void contextDestroyed(ServletContextEvent sce);
+}

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletException.java
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletException.java	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletException.java	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,112 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package javax.servlet;
+
+/**
+ * Defines a general exception a servlet can throw when it encounters
+ * difficulty.
+ * 
+ * @author Various
+ */
+
+public class ServletException extends Exception
+{
+
+   private Throwable rootCause;
+
+   /**
+    * Constructs a new servlet exception.
+    */
+
+   public ServletException()
+   {
+      super();
+   }
+
+   /**
+    * Constructs a new servlet exception with the specified message. The message
+    * can be written to the server log and/or displayed for the user.
+    * 
+    * @param message
+    *           a <code>String</code> specifying the text of the exception
+    *           message
+    */
+
+   public ServletException(String message)
+   {
+      super(message);
+   }
+
+   /**
+    * Constructs a new servlet exception when the servlet needs to throw an
+    * exception and include a message about the "root cause" exception that
+    * interfered with its normal operation, including a description message.
+    * 
+    * @param message
+    *           a <code>String</code> containing the text of the exception
+    *           message
+    * @param rootCause
+    *           the <code>Throwable</code> exception that interfered with the
+    *           servlet's normal operation, making this servlet exception
+    *           necessary
+    */
+
+   public ServletException(String message, Throwable rootCause)
+   {
+      super(message, rootCause);
+      this.rootCause = rootCause;
+   }
+
+   /**
+    * Constructs a new servlet exception when the servlet needs to throw an
+    * exception and include a message about the "root cause" exception that
+    * interfered with its normal operation. The exception's message is based on
+    * the localized message of the underlying exception.
+    * <p>
+    * This method calls the <code>getLocalizedMessage</code> method on the
+    * <code>Throwable</code> exception to get a localized exception message.
+    * When subclassing <code>ServletException</code>, this method can be
+    * overridden to create an exception message designed for a specific locale.
+    * 
+    * @param rootCause
+    *           the <code>Throwable</code> exception that interfered with the
+    *           servlet's normal operation, making the servlet exception
+    *           necessary
+    */
+
+   public ServletException(Throwable rootCause)
+   {
+      super(rootCause);
+      this.rootCause = rootCause;
+   }
+
+   /**
+    * Returns the exception that caused this servlet exception.
+    * 
+    * @return the <code>Throwable</code> that caused this servlet exception
+    */
+
+   public Throwable getRootCause()
+   {
+      return rootCause;
+   }
+}

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletInputStream.java
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletInputStream.java	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletInputStream.java	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,97 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package javax.servlet;
+
+import java.io.InputStream;
+import java.io.IOException;
+
+/**
+ * Provides an input stream for reading binary data from a client request,
+ * including an efficient <code>readLine</code> method for reading data one
+ * line at a time. With some protocols, such as HTTP POST and PUT, a
+ * <code>ServletInputStream</code> object can be used to read data sent from
+ * the client.
+ * <p>
+ * A <code>ServletInputStream</code> object is normally retrieved via the
+ * {@link ServletRequest#getInputStream} method.
+ * <p>
+ * This is an abstract class that a servlet container implements. Subclasses of
+ * this class must implement the <code>java.io.InputStream.read()</code>
+ * method.
+ * 
+ * @author Various
+ * @see ServletRequest
+ */
+
+public abstract class ServletInputStream extends InputStream
+{
+
+   /**
+    * Does nothing, because this is an abstract class.
+    */
+
+   protected ServletInputStream()
+   {
+   }
+
+   /**
+    * Reads the input stream, one line at a time. Starting at an offset, reads
+    * bytes into an array, until it reads a certain number of bytes or reaches a
+    * newline character, which it reads into the array as well.
+    * <p>
+    * This method returns -1 if it reaches the end of the input stream before
+    * reading the maximum number of bytes.
+    * 
+    * @param b
+    *           an array of bytes into which data is read
+    * @param off
+    *           an integer specifying the character at which this method begins
+    *           reading
+    * @param len
+    *           an integer specifying the maximum number of bytes to read
+    * @return an integer specifying the actual number of bytes read, or -1 if
+    *         the end of the stream is reached
+    * @exception IOException
+    *               if an input or output exception has occurred
+    */
+
+   public int readLine(byte[] b, int off, int len) throws IOException
+   {
+
+      if (len <= 0)
+      {
+         return 0;
+      }
+      int count = 0, c;
+
+      while ((c = read()) != -1)
+      {
+         b[off++] = (byte) c;
+         count++;
+         if (c == '\n' || count == len)
+         {
+            break;
+         }
+      }
+      return count > 0 ? count : -1;
+   }
+}

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletOutputStream.java
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletOutputStream.java	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletOutputStream.java	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,317 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package javax.servlet;
+
+import java.io.OutputStream;
+import java.io.IOException;
+import java.io.CharConversionException;
+import java.text.MessageFormat;
+import java.util.ResourceBundle;
+
+/**
+ * Provides an output stream for sending binary data to the client. A
+ * <code>ServletOutputStream</code> object is normally retrieved via the
+ * {@link ServletResponse#getOutputStream} method.
+ * <p>
+ * This is an abstract class that the servlet container implements. Subclasses
+ * of this class must implement the <code>java.io.OutputStream.write(int)</code>
+ * method.
+ * 
+ * @author Various
+ * @see ServletResponse
+ */
+
+public abstract class ServletOutputStream extends OutputStream
+{
+
+   private static final String LSTRING_FILE = "javax.servlet.LocalStrings";
+
+   private static ResourceBundle lStrings = ResourceBundle.getBundle(LSTRING_FILE);
+
+   /**
+    * Does nothing, because this is an abstract class.
+    */
+
+   protected ServletOutputStream()
+   {
+   }
+
+   /**
+    * Writes a <code>String</code> to the client, without a carriage
+    * return-line feed (CRLF) character at the end.
+    * 
+    * @param s
+    *           the <code>String</code> to send to the client
+    * @exception IOException
+    *               if an input or output exception occurred
+    */
+
+   public void print(String s) throws IOException
+   {
+      if (s == null)
+         s = "null";
+      int len = s.length();
+      for (int i = 0; i < len; i++)
+      {
+         char c = s.charAt(i);
+
+         //
+         // XXX NOTE: This is clearly incorrect for many strings,
+         // but is the only consistent approach within the current
+         // servlet framework. It must suffice until servlet output
+         // streams properly encode their output.
+         //
+         if ((c & 0xff00) != 0)
+         { // high order byte must be zero
+            String errMsg = lStrings.getString("err.not_iso8859_1");
+            Object[] errArgs = new Object[1];
+            errArgs[0] = new Character(c);
+            errMsg = MessageFormat.format(errMsg, errArgs);
+            throw new CharConversionException(errMsg);
+         }
+         write(c);
+      }
+   }
+
+   /**
+    * Writes a <code>boolean</code> value to the client, with no carriage
+    * return-line feed (CRLF) character at the end.
+    * 
+    * @param b
+    *           the <code>boolean</code> value to send to the client
+    * @exception IOException
+    *               if an input or output exception occurred
+    */
+
+   public void print(boolean b) throws IOException
+   {
+      String msg;
+      if (b)
+      {
+         msg = lStrings.getString("value.true");
+      }
+      else
+      {
+         msg = lStrings.getString("value.false");
+      }
+      print(msg);
+   }
+
+   /**
+    * Writes a character to the client, with no carriage return-line feed (CRLF)
+    * at the end.
+    * 
+    * @param c
+    *           the character to send to the client
+    * @exception IOException
+    *               if an input or output exception occurred
+    */
+
+   public void print(char c) throws IOException
+   {
+      print(String.valueOf(c));
+   }
+
+   /**
+    * Writes an int to the client, with no carriage return-line feed (CRLF) at
+    * the end.
+    * 
+    * @param i
+    *           the int to send to the client
+    * @exception IOException
+    *               if an input or output exception occurred
+    */
+
+   public void print(int i) throws IOException
+   {
+      print(String.valueOf(i));
+   }
+
+   /**
+    * Writes a <code>long</code> value to the client, with no carriage
+    * return-line feed (CRLF) at the end.
+    * 
+    * @param l
+    *           the <code>long</code> value to send to the client
+    * @exception IOException
+    *               if an input or output exception occurred
+    */
+
+   public void print(long l) throws IOException
+   {
+      print(String.valueOf(l));
+   }
+
+   /**
+    * Writes a <code>float</code> value to the client, with no carriage
+    * return-line feed (CRLF) at the end.
+    * 
+    * @param f
+    *           the <code>float</code> value to send to the client
+    * @exception IOException
+    *               if an input or output exception occurred
+    */
+
+   public void print(float f) throws IOException
+   {
+      print(String.valueOf(f));
+   }
+
+   /**
+    * Writes a <code>double</code> value to the client, with no carriage
+    * return-line feed (CRLF) at the end.
+    * 
+    * @param d
+    *           the <code>double</code> value to send to the client
+    * @exception IOException
+    *               if an input or output exception occurred
+    */
+
+   public void print(double d) throws IOException
+   {
+      print(String.valueOf(d));
+   }
+
+   /**
+    * Writes a carriage return-line feed (CRLF) to the client.
+    * 
+    * @exception IOException
+    *               if an input or output exception occurred
+    */
+
+   public void println() throws IOException
+   {
+      print("\r\n");
+   }
+
+   /**
+    * Writes a <code>String</code> to the client, followed by a carriage
+    * return-line feed (CRLF).
+    * 
+    * @param s
+    *           the <code>String</code> to write to the client
+    * @exception IOException
+    *               if an input or output exception occurred
+    */
+
+   public void println(String s) throws IOException
+   {
+      print(s);
+      println();
+   }
+
+   /**
+    * Writes a <code>boolean</code> value to the client, followed by a
+    * carriage return-line feed (CRLF).
+    * 
+    * @param b
+    *           the <code>boolean</code> value to write to the client
+    * @exception IOException
+    *               if an input or output exception occurred
+    */
+
+   public void println(boolean b) throws IOException
+   {
+      print(b);
+      println();
+   }
+
+   /**
+    * Writes a character to the client, followed by a carriage return-line feed
+    * (CRLF).
+    * 
+    * @param c
+    *           the character to write to the client
+    * @exception IOException
+    *               if an input or output exception occurred
+    */
+
+   public void println(char c) throws IOException
+   {
+      print(c);
+      println();
+   }
+
+   /**
+    * Writes an int to the client, followed by a carriage return-line feed
+    * (CRLF) character.
+    * 
+    * @param i
+    *           the int to write to the client
+    * @exception IOException
+    *               if an input or output exception occurred
+    */
+
+   public void println(int i) throws IOException
+   {
+      print(i);
+      println();
+   }
+
+   /**
+    * Writes a <code>long</code> value to the client, followed by a carriage
+    * return-line feed (CRLF).
+    * 
+    * @param l
+    *           the <code>long</code> value to write to the client
+    * @exception IOException
+    *               if an input or output exception occurred
+    */
+
+   public void println(long l) throws IOException
+   {
+      print(l);
+      println();
+   }
+
+   /**
+    * Writes a <code>float</code> value to the client, followed by a carriage
+    * return-line feed (CRLF).
+    * 
+    * @param f
+    *           the <code>float</code> value to write to the client
+    * @exception IOException
+    *               if an input or output exception occurred
+    */
+
+   public void println(float f) throws IOException
+   {
+      print(f);
+      println();
+   }
+
+   /**
+    * Writes a <code>double</code> value to the client, followed by a carriage
+    * return-line feed (CRLF).
+    * 
+    * @param d
+    *           the <code>double</code> value to write to the client
+    * @exception IOException
+    *               if an input or output exception occurred
+    */
+
+   public void println(double d) throws IOException
+   {
+      print(d);
+      println();
+   }
+}

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletRequest.java
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletRequest.java	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletRequest.java	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,457 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package javax.servlet;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.Locale;
+import java.util.Map;
+
+/**
+ * Defines an object to provide client request information to a servlet. The
+ * servlet container creates a <code>ServletRequest</code> object and passes
+ * it as an argument to the servlet's <code>service</code> method.
+ * <p>
+ * A <code>ServletRequest</code> object provides data including parameter name
+ * and values, attributes, and an input stream. Interfaces that extend
+ * <code>ServletRequest</code> can provide additional protocol-specific data
+ * (for example, HTTP data is provided by
+ * {@link javax.servlet.http.HttpServletRequest}.
+ * 
+ * @author Various
+ * @see javax.servlet.http.HttpServletRequest
+ */
+
+public interface ServletRequest
+{
+
+   /**
+    * Returns the value of the named attribute as an <code>Object</code>, or
+    * <code>null</code> if no attribute of the given name exists.
+    * <p>
+    * Attributes can be set two ways. The servlet container may set attributes
+    * to make available custom information about a request. For example, for
+    * requests made using HTTPS, the attribute
+    * <code>javax.servlet.request.X509Certificate</code> can be used to
+    * retrieve information on the certificate of the client. Attributes can also
+    * be set programatically using {@link ServletRequest#setAttribute}. This
+    * allows information to be embedded into a request before a
+    * {@link RequestDispatcher} call.
+    * <p>
+    * Attribute names should follow the same conventions as package names. This
+    * specification reserves names matching <code>java.*</code>,
+    * <code>javax.*</code>, and <code>sun.*</code>.
+    * 
+    * @param name
+    *           a <code>String</code> specifying the name of the attribute
+    * @return an <code>Object</code> containing the value of the attribute, or
+    *         <code>null</code> if the attribute does not exist
+    */
+
+   public Object getAttribute(String name);
+
+   /**
+    * Returns an <code>Enumeration</code> containing the names of the
+    * attributes available to this request. This method returns an empty
+    * <code>Enumeration</code> if the request has no attributes available to
+    * it.
+    * 
+    * @return an <code>Enumeration</code> of strings containing the names of
+    *         the request's attributes
+    */
+
+   public Enumeration getAttributeNames();
+
+   /**
+    * Returns the name of the character encoding used in the body of this
+    * request. This method returns <code>null</code> if the request does not
+    * specify a character encoding
+    * 
+    * @return a <code>String</code> containing the name of the character
+    *         encoding, or <code>null</code> if the request does not specify a
+    *         character encoding
+    */
+
+   public String getCharacterEncoding();
+
+   /**
+    * Overrides the name of the character encoding used in the body of this
+    * request. This method must be called prior to reading request parameters or
+    * reading input using getReader(). Otherwise, it has no effect.
+    * 
+    * @param env
+    *           <code>String</code> containing the name of the character
+    *           encoding.
+    * @throws java.io.UnsupportedEncodingException
+    *            if this ServletRequest is still in a state where a character
+    *            encoding may be set, but the specified encoding is invalid
+    */
+   public void setCharacterEncoding(String env) throws java.io.UnsupportedEncodingException;
+
+   /**
+    * Returns the length, in bytes, of the request body and made available by
+    * the input stream, or -1 if the length is not known. For HTTP servlets,
+    * same as the value of the CGI variable CONTENT_LENGTH.
+    * 
+    * @return an integer containing the length of the request body or -1 if the
+    *         length is not known
+    */
+
+   public int getContentLength();
+
+   /**
+    * Returns the MIME type of the body of the request, or <code>null</code>
+    * if the type is not known. For HTTP servlets, same as the value of the CGI
+    * variable CONTENT_TYPE.
+    * 
+    * @return a <code>String</code> containing the name of the MIME type of
+    *         the request, or null if the type is not known
+    */
+
+   public String getContentType();
+
+   /**
+    * Retrieves the body of the request as binary data using a
+    * {@link ServletInputStream}. Either this method or {@link #getReader} may
+    * be called to read the body, not both.
+    * 
+    * @return a {@link ServletInputStream} object containing the body of the
+    *         request
+    * @exception IllegalStateException
+    *               if the {@link #getReader} method has already been called for
+    *               this request
+    * @exception IOException
+    *               if an input or output exception occurred
+    */
+
+   public ServletInputStream getInputStream() throws IOException;
+
+   /**
+    * Returns the value of a request parameter as a <code>String</code>, or
+    * <code>null</code> if the parameter does not exist. Request parameters
+    * are extra information sent with the request. For HTTP servlets, parameters
+    * are contained in the query string or posted form data.
+    * <p>
+    * You should only use this method when you are sure the parameter has only
+    * one value. If the parameter might have more than one value, use
+    * {@link #getParameterValues}.
+    * <p>
+    * If you use this method with a multivalued parameter, the value returned is
+    * equal to the first value in the array returned by
+    * <code>getParameterValues</code>.
+    * <p>
+    * If the parameter data was sent in the request body, such as occurs with an
+    * HTTP POST request, then reading the body directly via {@link
+    * #getInputStream} or {@link #getReader} can interfere with the execution of
+    * this method.
+    * 
+    * @param name
+    *           a <code>String</code> specifying the name of the parameter
+    * @return a <code>String</code> representing the single value of the
+    *         parameter
+    * @see #getParameterValues
+    */
+
+   public String getParameter(String name);
+
+   /**
+    * Returns an <code>Enumeration</code> of <code>String</code> objects
+    * containing the names of the parameters contained in this request. If the
+    * request has no parameters, the method returns an empty
+    * <code>Enumeration</code>.
+    * 
+    * @return an <code>Enumeration</code> of <code>String</code> objects,
+    *         each <code>String</code> containing the name of a request
+    *         parameter; or an empty <code>Enumeration</code> if the request
+    *         has no parameters
+    */
+
+   public Enumeration getParameterNames();
+
+   /**
+    * Returns an array of <code>String</code> objects containing all of the
+    * values the given request parameter has, or <code>null</code> if the
+    * parameter does not exist.
+    * <p>
+    * If the parameter has a single value, the array has a length of 1.
+    * 
+    * @param name
+    *           a <code>String</code> containing the name of the parameter
+    *           whose value is requested
+    * @return an array of <code>String</code> objects containing the
+    *         parameter's values
+    * @see #getParameter
+    */
+
+   public String[] getParameterValues(String name);
+
+   /**
+    * Returns a java.util.Map of the parameters of this request. Request
+    * parameters are extra information sent with the request. For HTTP servlets,
+    * parameters are contained in the query string or posted form data.
+    * 
+    * @return an immutable java.util.Map containing parameter names as keys and
+    *         parameter values as map values. The keys in the parameter map are
+    *         of type String. The values in the parameter map are of type String
+    *         array.
+    */
+
+   public Map getParameterMap();
+
+   /**
+    * Returns the name and version of the protocol the request uses in the form
+    * <i>protocol/majorVersion.minorVersion</i>, for example, HTTP/1.1. For
+    * HTTP servlets, the value returned is the same as the value of the CGI
+    * variable <code>SERVER_PROTOCOL</code>.
+    * 
+    * @return a <code>String</code> containing the protocol name and version
+    *         number
+    */
+
+   public String getProtocol();
+
+   /**
+    * Returns the name of the scheme used to make this request, for example,
+    * <code>http</code>, <code>https</code>, or <code>ftp</code>.
+    * Different schemes have different rules for constructing URLs, as noted in
+    * RFC 1738.
+    * 
+    * @return a <code>String</code> containing the name of the scheme used to
+    *         make this request
+    */
+
+   public String getScheme();
+
+   /**
+    * Returns the host name of the server to which the request was sent. It is
+    * the value of the part before ":" in the <code>Host</code> header value,
+    * if any, or the resolved server name, or the server IP address.
+    * 
+    * @return a <code>String</code> containing the name of the server
+    */
+
+   public String getServerName();
+
+   /**
+    * Returns the port number to which the request was sent. It is the value of
+    * the part after ":" in the <code>Host</code> header value, if any, or the
+    * server port where the client connection was accepted on.
+    * 
+    * @return an integer specifying the port number
+    */
+
+   public int getServerPort();
+
+   /**
+    * Retrieves the body of the request as character data using a
+    * <code>BufferedReader</code>. The reader translates the character data
+    * according to the character encoding used on the body. Either this method
+    * or {@link #getInputStream} may be called to read the body, not both.
+    * 
+    * @return a <code>BufferedReader</code> containing the body of the request
+    * @exception UnsupportedEncodingException
+    *               if the character set encoding used is not supported and the
+    *               text cannot be decoded
+    * @exception IllegalStateException
+    *               if {@link #getInputStream} method has been called on this
+    *               request
+    * @exception IOException
+    *               if an input or output exception occurred
+    * @see #getInputStream
+    */
+
+   public BufferedReader getReader() throws IOException;
+
+   /**
+    * Returns the Internet Protocol (IP) address of the client or last proxy
+    * that sent the request. For HTTP servlets, same as the value of the CGI
+    * variable <code>REMOTE_ADDR</code>.
+    * 
+    * @return a <code>String</code> containing the IP address of the client
+    *         that sent the request
+    */
+
+   public String getRemoteAddr();
+
+   /**
+    * Returns the fully qualified name of the client or the last proxy that sent
+    * the request. If the engine cannot or chooses not to resolve the hostname
+    * (to improve performance), this method returns the dotted-string form of
+    * the IP address. For HTTP servlets, same as the value of the CGI variable
+    * <code>REMOTE_HOST</code>.
+    * 
+    * @return a <code>String</code> containing the fully qualified name of the
+    *         client
+    */
+
+   public String getRemoteHost();
+
+   /**
+    * Stores an attribute in this request. Attributes are reset between
+    * requests. This method is most often used in conjunction with
+    * {@link RequestDispatcher}.
+    * <p>
+    * Attribute names should follow the same conventions as package names. Names
+    * beginning with <code>java.*</code>, <code>javax.*</code>, and
+    * <code>com.sun.*</code>, are reserved for use by Sun Microsystems. <br>
+    * If the object passed in is null, the effect is the same as calling
+    * {@link #removeAttribute}. <br>
+    * It is warned that when the request is dispatched from the servlet resides
+    * in a different web application by <code>RequestDispatcher</code>, the
+    * object set by this method may not be correctly retrieved in the caller
+    * servlet.
+    * 
+    * @param name
+    *           a <code>String</code> specifying the name of the attribute
+    * @param o
+    *           the <code>Object</code> to be stored
+    */
+
+   public void setAttribute(String name, Object o);
+
+   /**
+    * Removes an attribute from this request. This method is not generally
+    * needed as attributes only persist as long as the request is being handled.
+    * <p>
+    * Attribute names should follow the same conventions as package names. Names
+    * beginning with <code>java.*</code>, <code>javax.*</code>, and
+    * <code>com.sun.*</code>, are reserved for use by Sun Microsystems.
+    * 
+    * @param name
+    *           a <code>String</code> specifying the name of the attribute to
+    *           remove
+    */
+
+   public void removeAttribute(String name);
+
+   /**
+    * Returns the preferred <code>Locale</code> that the client will accept
+    * content in, based on the Accept-Language header. If the client request
+    * doesn't provide an Accept-Language header, this method returns the default
+    * locale for the server.
+    * 
+    * @return the preferred <code>Locale</code> for the client
+    */
+
+   public Locale getLocale();
+
+   /**
+    * Returns an <code>Enumeration</code> of <code>Locale</code> objects
+    * indicating, in decreasing order starting with the preferred locale, the
+    * locales that are acceptable to the client based on the Accept-Language
+    * header. If the client request doesn't provide an Accept-Language header,
+    * this method returns an <code>Enumeration</code> containing one
+    * <code>Locale</code>, the default locale for the server.
+    * 
+    * @return an <code>Enumeration</code> of preferred <code>Locale</code>
+    *         objects for the client
+    */
+
+   public Enumeration getLocales();
+
+   /**
+    * Returns a boolean indicating whether this request was made using a secure
+    * channel, such as HTTPS.
+    * 
+    * @return a boolean indicating if the request was made using a secure
+    *         channel
+    */
+
+   public boolean isSecure();
+
+   /**
+    * Returns a {@link RequestDispatcher} object that acts as a wrapper for the
+    * resource located at the given path. A <code>RequestDispatcher</code>
+    * object can be used to forward a request to the resource or to include the
+    * resource in a response. The resource can be dynamic or static.
+    * <p>
+    * The pathname specified may be relative, although it cannot extend outside
+    * the current servlet context. If the path begins with a "/" it is
+    * interpreted as relative to the current context root. This method returns
+    * <code>null</code> if the servlet container cannot return a
+    * <code>RequestDispatcher</code>.
+    * <p>
+    * The difference between this method and {@link
+    * ServletContext#getRequestDispatcher} is that this method can take a
+    * relative path.
+    * 
+    * @param path
+    *           a <code>String</code> specifying the pathname to the resource.
+    *           If it is relative, it must be relative against the current
+    *           servlet.
+    * @return a <code>RequestDispatcher</code> object that acts as a wrapper
+    *         for the resource at the specified path, or <code>null</code> if
+    *         the servlet container cannot return a
+    *         <code>RequestDispatcher</code>
+    * @see RequestDispatcher
+    * @see ServletContext#getRequestDispatcher
+    */
+
+   public RequestDispatcher getRequestDispatcher(String path);
+
+   /**
+    * @deprecated As of Version 2.1 of the Java Servlet API, use
+    *             {@link ServletContext#getRealPath} instead.
+    */
+
+   public String getRealPath(String path);
+
+   /**
+    * Returns the Internet Protocol (IP) source port of the client or last proxy
+    * that sent the request.
+    * 
+    * @return an integer specifying the port number
+    * @since 2.4
+    */
+   public int getRemotePort();
+
+   /**
+    * Returns the host name of the Internet Protocol (IP) interface on which the
+    * request was received.
+    * 
+    * @return a <code>String</code> containing the host name of the IP on
+    *         which the request was received.
+    * @since 2.4
+    */
+   public String getLocalName();
+
+   /**
+    * Returns the Internet Protocol (IP) address of the interface on which the
+    * request was received.
+    * 
+    * @return a <code>String</code> containing the IP address on which the
+    *         request was received.
+    * @since 2.4
+    */
+   public String getLocalAddr();
+
+   /**
+    * Returns the Internet Protocol (IP) port number of the interface on which
+    * the request was received.
+    * 
+    * @return an integer specifying the port number
+    * @since 2.4
+    */
+   public int getLocalPort();
+
+}

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletRequestAttributeEvent.java
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletRequestAttributeEvent.java	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletRequestAttributeEvent.java	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,81 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package javax.servlet;
+
+/**
+ * This is the event class for notifications of changes to the attributes of the
+ * servlet request in an application.
+ * 
+ * @see ServletRequestAttributeListener
+ * @since Servlet 2.4
+ */
+
+public class ServletRequestAttributeEvent extends ServletRequestEvent
+{
+   private String name;
+
+   private Object value;
+
+   /**
+    * Construct a ServletRequestAttributeEvent giving the servlet context of
+    * this web application, the ServletRequest whose attributes are changing and
+    * the name and value of the attribute.
+    * 
+    * @param sc
+    *           the ServletContext that is sending the event.
+    * @param request
+    *           the ServletRequest that is sending the event.
+    * @param name
+    *           the name of the request attribute.
+    * @param value
+    *           the value of the request attribute.
+    */
+   public ServletRequestAttributeEvent(ServletContext sc, ServletRequest request, String name, Object value)
+   {
+      super(sc, request);
+      this.name = name;
+      this.value = value;
+   }
+
+   /**
+    * Return the name of the attribute that changed on the ServletRequest.
+    * 
+    * @return the name of the changed request attribute
+    */
+   public String getName()
+   {
+      return this.name;
+   }
+
+   /**
+    * Returns the value of the attribute that has been added, removed or
+    * replaced. If the attribute was added, this is the value of the attribute.
+    * If the attribute was removed, this is the value of the removed attribute.
+    * If the attribute was replaced, this is the old value of the attribute.
+    * 
+    * @return the value of the changed request attribute
+    */
+   public Object getValue()
+   {
+      return this.value;
+   }
+}

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletRequestAttributeListener.java
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletRequestAttributeListener.java	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletRequestAttributeListener.java	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,57 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package javax.servlet;
+
+import java.util.EventListener;
+
+/**
+ * A ServletRequestAttributeListener can be implemented by the developer
+ * interested in being notified of request attribute changes. Notifications will
+ * be generated while the request is within the scope of the web application in
+ * which the listener is registered. A request is defined as coming into scope
+ * when it is about to enter the first servlet or filter in each web
+ * application, as going out of scope when it exits the last servlet or the
+ * first filter in the chain.
+ * 
+ * @since Servlet 2.4
+ */
+
+public interface ServletRequestAttributeListener extends EventListener
+{
+   /**
+    * Notification that a new attribute was added to the * servlet request.
+    * Called after the attribute is added.
+    */
+   public void attributeAdded(ServletRequestAttributeEvent srae);
+
+   /**
+    * Notification that an existing attribute has been removed from the *
+    * servlet request. Called after the attribute is removed.
+    */
+   public void attributeRemoved(ServletRequestAttributeEvent srae);
+
+   /**
+    * Notification that an attribute was replaced on the * servlet request.
+    * Called after the attribute is replaced.
+    */
+   public void attributeReplaced(ServletRequestAttributeEvent srae);
+}

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletRequestEvent.java
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletRequestEvent.java	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletRequestEvent.java	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,66 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package javax.servlet;
+
+/**
+ * Events of this kind indicate lifecycle events for a ServletRequest. The
+ * source of the event is the ServletContext of this web application.
+ * 
+ * @see ServletRequestListener
+ * @since Servlet 2.4
+ */
+
+public class ServletRequestEvent extends java.util.EventObject
+{
+   private ServletRequest request;
+
+   /**
+    * Construct a ServletRequestEvent for the given ServletContext and
+    * ServletRequest.
+    * 
+    * @param sc
+    *           the ServletContext of the web application.
+    * @param request
+    *           the ServletRequest that is sending the event.
+    */
+   public ServletRequestEvent(ServletContext sc, ServletRequest request)
+   {
+      super(sc);
+      this.request = request;
+   }
+
+   /**
+    * Returns the ServletRequest that is changing.
+    */
+   public ServletRequest getServletRequest()
+   {
+      return this.request;
+   }
+
+   /**
+    * Returns the ServletContext of this web application.
+    */
+   public ServletContext getServletContext()
+   {
+      return (ServletContext) super.getSource();
+   }
+}

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletRequestListener.java
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletRequestListener.java	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletRequestListener.java	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,44 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package javax.servlet;
+
+import java.util.EventListener;
+
+/**
+ * A ServletRequestListener can be implemented by the developer interested in
+ * being notified of requests coming in and out of scope in a web component. A
+ * request is defined as coming into scope when it is about to enter the first
+ * servlet or filter in each web application, as going out of scope when it
+ * exits the last servlet or the first filter in the chain.
+ * 
+ * @since Servlet 2.4
+ */
+
+public interface ServletRequestListener extends EventListener
+{
+
+   /** The request is about to go out of scope of the web application. */
+   public void requestDestroyed(ServletRequestEvent sre);
+
+   /** The request is about to come into scope of the web application. */
+   public void requestInitialized(ServletRequestEvent sre);
+}

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletRequestWrapper.java
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletRequestWrapper.java	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletRequestWrapper.java	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,376 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package javax.servlet;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.Locale;
+import java.util.Map;
+
+/**
+ * Provides a convenient implementation of the ServletRequest interface that can
+ * be subclassed by developers wishing to adapt the request to a Servlet. This
+ * class implements the Wrapper or Decorator pattern. Methods default to calling
+ * through to the wrapped request object.
+ * 
+ * @since v 2.3
+ * @see javax.servlet.ServletRequest
+ */
+
+public class ServletRequestWrapper implements ServletRequest
+{
+   private ServletRequest request;
+
+   /**
+    * Creates a ServletRequest adaptor wrapping the given request object.
+    * 
+    * @throws java.lang.IllegalArgumentException
+    *            if the request is null
+    */
+
+   public ServletRequestWrapper(ServletRequest request)
+   {
+      if (request == null)
+      {
+         throw new IllegalArgumentException("Request cannot be null");
+      }
+      this.request = request;
+   }
+
+   /**
+    * Return the wrapped request object.
+    */
+   public ServletRequest getRequest()
+   {
+      return this.request;
+   }
+
+   /**
+    * Sets the request object being wrapped.
+    * 
+    * @throws java.lang.IllegalArgumentException
+    *            if the request is null.
+    */
+
+   public void setRequest(ServletRequest request)
+   {
+      if (request == null)
+      {
+         throw new IllegalArgumentException("Request cannot be null");
+      }
+      this.request = request;
+   }
+
+   /**
+    * The default behavior of this method is to call getAttribute(String name)
+    * on the wrapped request object.
+    */
+
+   public Object getAttribute(String name)
+   {
+      return this.request.getAttribute(name);
+   }
+
+   /**
+    * The default behavior of this method is to return getAttributeNames() on
+    * the wrapped request object.
+    */
+
+   public Enumeration getAttributeNames()
+   {
+      return this.request.getAttributeNames();
+   }
+
+   /**
+    * The default behavior of this method is to return getCharacterEncoding() on
+    * the wrapped request object.
+    */
+
+   public String getCharacterEncoding()
+   {
+      return this.request.getCharacterEncoding();
+   }
+
+   /**
+    * The default behavior of this method is to set the character encoding on
+    * the wrapped request object.
+    */
+
+   public void setCharacterEncoding(String enc) throws java.io.UnsupportedEncodingException
+   {
+      this.request.setCharacterEncoding(enc);
+   }
+
+   /**
+    * The default behavior of this method is to return getContentLength() on the
+    * wrapped request object.
+    */
+
+   public int getContentLength()
+   {
+      return this.request.getContentLength();
+   }
+
+   /**
+    * The default behavior of this method is to return getContentType() on the
+    * wrapped request object.
+    */
+   public String getContentType()
+   {
+      return this.request.getContentType();
+   }
+
+   /**
+    * The default behavior of this method is to return getInputStream() on the
+    * wrapped request object.
+    */
+
+   public ServletInputStream getInputStream() throws IOException
+   {
+      return this.request.getInputStream();
+   }
+
+   /**
+    * The default behavior of this method is to return getParameter(String name)
+    * on the wrapped request object.
+    */
+
+   public String getParameter(String name)
+   {
+      return this.request.getParameter(name);
+   }
+
+   /**
+    * The default behavior of this method is to return getParameterMap() on the
+    * wrapped request object.
+    */
+   public Map getParameterMap()
+   {
+      return this.request.getParameterMap();
+   }
+
+   /**
+    * The default behavior of this method is to return getParameterNames() on
+    * the wrapped request object.
+    */
+
+   public Enumeration getParameterNames()
+   {
+      return this.request.getParameterNames();
+   }
+
+   /**
+    * The default behavior of this method is to return getParameterValues(String
+    * name) on the wrapped request object.
+    */
+   public String[] getParameterValues(String name)
+   {
+      return this.request.getParameterValues(name);
+   }
+
+   /**
+    * The default behavior of this method is to return getProtocol() on the
+    * wrapped request object.
+    */
+
+   public String getProtocol()
+   {
+      return this.request.getProtocol();
+   }
+
+   /**
+    * The default behavior of this method is to return getScheme() on the
+    * wrapped request object.
+    */
+
+   public String getScheme()
+   {
+      return this.request.getScheme();
+   }
+
+   /**
+    * The default behavior of this method is to return getServerName() on the
+    * wrapped request object.
+    */
+   public String getServerName()
+   {
+      return this.request.getServerName();
+   }
+
+   /**
+    * The default behavior of this method is to return getServerPort() on the
+    * wrapped request object.
+    */
+
+   public int getServerPort()
+   {
+      return this.request.getServerPort();
+   }
+
+   /**
+    * The default behavior of this method is to return getReader() on the
+    * wrapped request object.
+    */
+
+   public BufferedReader getReader() throws IOException
+   {
+      return this.request.getReader();
+   }
+
+   /**
+    * The default behavior of this method is to return getRemoteAddr() on the
+    * wrapped request object.
+    */
+
+   public String getRemoteAddr()
+   {
+      return this.request.getRemoteAddr();
+   }
+
+   /**
+    * The default behavior of this method is to return getRemoteHost() on the
+    * wrapped request object.
+    */
+
+   public String getRemoteHost()
+   {
+      return this.request.getRemoteHost();
+   }
+
+   /**
+    * The default behavior of this method is to return setAttribute(String name,
+    * Object o) on the wrapped request object.
+    */
+
+   public void setAttribute(String name, Object o)
+   {
+      this.request.setAttribute(name, o);
+   }
+
+   /**
+    * The default behavior of this method is to call removeAttribute(String
+    * name) on the wrapped request object.
+    */
+   public void removeAttribute(String name)
+   {
+      this.request.removeAttribute(name);
+   }
+
+   /**
+    * The default behavior of this method is to return getLocale() on the
+    * wrapped request object.
+    */
+
+   public Locale getLocale()
+   {
+      return this.request.getLocale();
+   }
+
+   /**
+    * The default behavior of this method is to return getLocales() on the
+    * wrapped request object.
+    */
+
+   public Enumeration getLocales()
+   {
+      return this.request.getLocales();
+   }
+
+   /**
+    * The default behavior of this method is to return isSecure() on the wrapped
+    * request object.
+    */
+
+   public boolean isSecure()
+   {
+      return this.request.isSecure();
+   }
+
+   /**
+    * The default behavior of this method is to return
+    * getRequestDispatcher(String path) on the wrapped request object.
+    */
+
+   public RequestDispatcher getRequestDispatcher(String path)
+   {
+      return this.request.getRequestDispatcher(path);
+   }
+
+   /**
+    * The default behavior of this method is to return getRealPath(String path)
+    * on the wrapped request object.
+    * 
+    * @deprecated As of Version 2.1 of the Java Servlet API, use
+    *             {@link ServletContext#getRealPath} instead.
+    */
+   @Deprecated
+   public String getRealPath(String path)
+   {
+      return this.request.getRealPath(path);
+   }
+
+   /**
+    * The default behavior of this method is to return getRemotePort() on the
+    * wrapped request object.
+    * 
+    * @since 2.4
+    */
+   public int getRemotePort()
+   {
+      return this.request.getRemotePort();
+   }
+
+   /**
+    * The default behavior of this method is to return getLocalName() on the
+    * wrapped request object.
+    * 
+    * @since 2.4
+    */
+   public String getLocalName()
+   {
+      return this.request.getLocalName();
+   }
+
+   /**
+    * The default behavior of this method is to return getLocalAddr() on the
+    * wrapped request object.
+    * 
+    * @since 2.4
+    */
+   public String getLocalAddr()
+   {
+      return this.request.getLocalAddr();
+   }
+
+   /**
+    * The default behavior of this method is to return getLocalPort() on the
+    * wrapped request object.
+    * 
+    * @since 2.4
+    */
+   public int getLocalPort()
+   {
+      return this.request.getLocalPort();
+   }
+
+}

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletResponse.java
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletResponse.java	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletResponse.java	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,360 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package javax.servlet;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Locale;
+
+/**
+ * Defines an object to assist a servlet in sending a response to the client.
+ * The servlet container creates a <code>ServletResponse</code> object and
+ * passes it as an argument to the servlet's <code>service</code> method.
+ * <p>
+ * To send binary data in a MIME body response, use the
+ * {@link ServletOutputStream} returned by {@link #getOutputStream}. To send
+ * character data, use the <code>PrintWriter</code> object returned by
+ * {@link #getWriter}. To mix binary and text data, for example, to create a
+ * multipart response, use a <code>ServletOutputStream</code> and manage the
+ * character sections manually.
+ * <p>
+ * The charset for the MIME body response can be specified explicitly using the
+ * {@link #setCharacterEncoding} and {@link #setContentType} methods, or
+ * implicitly using the {@link #setLocale} method. Explicit specifications take
+ * precedence over implicit specifications. If no charset is specified,
+ * ISO-8859-1 will be used. The <code>setCharacterEncoding</code>,
+ * <code>setContentType</code>, or <code>setLocale</code> method must be
+ * called before <code>getWriter</code> and before committing the response for
+ * the character encoding to be used.
+ * <p>
+ * See the Internet RFCs such as <a href="http://www.ietf.org/rfc/rfc2045.txt">
+ * RFC 2045</a> for more information on MIME. Protocols such as SMTP and HTTP
+ * define profiles of MIME, and those standards are still evolving.
+ * 
+ * @author Various
+ * @see ServletOutputStream
+ */
+
+public interface ServletResponse
+{
+
+   /**
+    * Returns the name of the character encoding (MIME charset) used for the
+    * body sent in this response. The character encoding may have been specified
+    * explicitly using the {@link #setCharacterEncoding} or
+    * {@link #setContentType} methods, or implicitly using the
+    * {@link #setLocale} method. Explicit specifications take precedence over
+    * implicit specifications. Calls made to these methods after
+    * <code>getWriter</code> has been called or after the response has been
+    * committed have no effect on the character encoding. If no character
+    * encoding has been specified, <code>ISO-8859-1</code> is returned.
+    * <p>
+    * See RFC 2047 (http://www.ietf.org/rfc/rfc2047.txt) for more information
+    * about character encoding and MIME.
+    * 
+    * @return a <code>String</code> specifying the name of the character
+    *         encoding, for example, <code>UTF-8</code>
+    */
+
+   public String getCharacterEncoding();
+
+   /**
+    * Returns the content type used for the MIME body sent in this response. The
+    * content type proper must have been specified using {@link #setContentType}
+    * before the response is committed. If no content type has been specified,
+    * this method returns null. If a content type has been specified, and a
+    * character encoding has been explicitly or implicitly specified as
+    * described in {@link #getCharacterEncoding} or {@link #getWriter} has been
+    * called, the charset parameter is included in the string returned. If no
+    * character encoding has been specified, the charset parameter is omitted.
+    * 
+    * @return a <code>String</code> specifying the content type, for example,
+    *         <code>text/html; charset=UTF-8</code>, or null
+    * @since 2.4
+    */
+
+   public String getContentType();
+
+   /**
+    * Returns a {@link ServletOutputStream} suitable for writing binary data in
+    * the response. The servlet container does not encode the binary data.
+    * <p>
+    * Calling flush() on the ServletOutputStream commits the response. Either
+    * this method or {@link #getWriter} may be called to write the body, not
+    * both.
+    * 
+    * @return a {@link ServletOutputStream} for writing binary data
+    * @exception IllegalStateException
+    *               if the <code>getWriter</code> method has been called on
+    *               this response
+    * @exception IOException
+    *               if an input or output exception occurred
+    * @see #getWriter
+    */
+
+   public ServletOutputStream getOutputStream() throws IOException;
+
+   /**
+    * Returns a <code>PrintWriter</code> object that can send character text
+    * to the client. The <code>PrintWriter</code> uses the character encoding
+    * returned by {@link #getCharacterEncoding}. If the response's character
+    * encoding has not been specified as described in
+    * <code>getCharacterEncoding</code> (i.e., the method just returns the
+    * default value <code>ISO-8859-1</code>), <code>getWriter</code>
+    * updates it to <code>ISO-8859-1</code>.
+    * <p>
+    * Calling flush() on the <code>PrintWriter</code> commits the response.
+    * <p>
+    * Either this method or {@link #getOutputStream} may be called to write the
+    * body, not both.
+    * 
+    * @return a <code>PrintWriter</code> object that can return character data
+    *         to the client
+    * @exception UnsupportedEncodingException
+    *               if the character encoding returned by
+    *               <code>getCharacterEncoding</code> cannot be used
+    * @exception IllegalStateException
+    *               if the <code>getOutputStream</code> method has already
+    *               been called for this response object
+    * @exception IOException
+    *               if an input or output exception occurred
+    * @see #getOutputStream
+    * @see #setCharacterEncoding
+    */
+
+   public PrintWriter getWriter() throws IOException;
+
+   /**
+    * Sets the character encoding (MIME charset) of the response being sent to
+    * the client, for example, to UTF-8. If the character encoding has already
+    * been set by {@link #setContentType} or {@link #setLocale}, this method
+    * overrides it. Calling {@link #setContentType} with the <code>String</code>
+    * of <code>text/html</code> and calling this method with the
+    * <code>String</code> of <code>UTF-8</code> is equivalent with calling
+    * <code>setContentType</code> with the <code>String</code> of
+    * <code>text/html; charset=UTF-8</code>.
+    * <p>
+    * This method can be called repeatedly to change the character encoding.
+    * This method has no effect if it is called after <code>getWriter</code>
+    * has been called or after the response has been committed.
+    * <p>
+    * Containers must communicate the character encoding used for the servlet
+    * response's writer to the client if the protocol provides a way for doing
+    * so. In the case of HTTP, the character encoding is communicated as part of
+    * the <code>Content-Type</code> header for text media types. Note that the
+    * character encoding cannot be communicated via HTTP headers if the servlet
+    * does not specify a content type; however, it is still used to encode text
+    * written via the servlet response's writer.
+    * 
+    * @param charset
+    *           a String specifying only the character set defined by IANA
+    *           Character Sets (http://www.iana.org/assignments/character-sets)
+    * @see #setContentType
+    * @see #setLocale
+    * @since 2.4
+    */
+
+   public void setCharacterEncoding(String charset);
+
+   /**
+    * Sets the length of the content body in the response In HTTP servlets, this
+    * method sets the HTTP Content-Length header.
+    * 
+    * @param len
+    *           an integer specifying the length of the content being returned
+    *           to the client; sets the Content-Length header
+    */
+
+   public void setContentLength(int len);
+
+   /**
+    * Sets the content type of the response being sent to the client, if the
+    * response has not been committed yet. The given content type may include a
+    * character encoding specification, for example,
+    * <code>text/html;charset=UTF-8</code>. The response's character encoding
+    * is only set from the given content type if this method is called before
+    * <code>getWriter</code> is called.
+    * <p>
+    * This method may be called repeatedly to change content type and character
+    * encoding. This method has no effect if called after the response has been
+    * committed. It does not set the response's character encoding if it is
+    * called after <code>getWriter</code> has been called or after the
+    * response has been committed.
+    * <p>
+    * Containers must communicate the content type and the character encoding
+    * used for the servlet response's writer to the client if the protocol
+    * provides a way for doing so. In the case of HTTP, the
+    * <code>Content-Type</code> header is used.
+    * 
+    * @param type
+    *           a <code>String</code> specifying the MIME type of the content
+    * @see #setLocale
+    * @see #setCharacterEncoding
+    * @see #getOutputStream
+    * @see #getWriter
+    */
+
+   public void setContentType(String type);
+
+   /**
+    * Sets the preferred buffer size for the body of the response. The servlet
+    * container will use a buffer at least as large as the size requested. The
+    * actual buffer size used can be found using <code>getBufferSize</code>.
+    * <p>
+    * A larger buffer allows more content to be written before anything is
+    * actually sent, thus providing the servlet with more time to set
+    * appropriate status codes and headers. A smaller buffer decreases server
+    * memory load and allows the client to start receiving data more quickly.
+    * <p>
+    * This method must be called before any response body content is written; if
+    * content has been written or the response object has been committed, this
+    * method throws an <code>IllegalStateException</code>.
+    * 
+    * @param size
+    *           the preferred buffer size
+    * @exception IllegalStateException
+    *               if this method is called after content has been written
+    * @see #getBufferSize
+    * @see #flushBuffer
+    * @see #isCommitted
+    * @see #reset
+    */
+
+   public void setBufferSize(int size);
+
+   /**
+    * Returns the actual buffer size used for the response. If no buffering is
+    * used, this method returns 0.
+    * 
+    * @return the actual buffer size used
+    * @see #setBufferSize
+    * @see #flushBuffer
+    * @see #isCommitted
+    * @see #reset
+    */
+
+   public int getBufferSize();
+
+   /**
+    * Forces any content in the buffer to be written to the client. A call to
+    * this method automatically commits the response, meaning the status code
+    * and headers will be written.
+    * 
+    * @see #setBufferSize
+    * @see #getBufferSize
+    * @see #isCommitted
+    * @see #reset
+    */
+
+   public void flushBuffer() throws IOException;
+
+   /**
+    * Clears the content of the underlying buffer in the response without
+    * clearing headers or status code. If the response has been committed, this
+    * method throws an <code>IllegalStateException</code>.
+    * 
+    * @see #setBufferSize
+    * @see #getBufferSize
+    * @see #isCommitted
+    * @see #reset
+    * @since 2.3
+    */
+
+   public void resetBuffer();
+
+   /**
+    * Returns a boolean indicating if the response has been committed. A
+    * committed response has already had its status code and headers written.
+    * 
+    * @return a boolean indicating if the response has been committed
+    * @see #setBufferSize
+    * @see #getBufferSize
+    * @see #flushBuffer
+    * @see #reset
+    */
+
+   public boolean isCommitted();
+
+   /**
+    * Clears any data that exists in the buffer as well as the status code and
+    * headers. If the response has been committed, this method throws an
+    * <code>IllegalStateException</code>.
+    * 
+    * @exception IllegalStateException
+    *               if the response has already been committed
+    * @see #setBufferSize
+    * @see #getBufferSize
+    * @see #flushBuffer
+    * @see #isCommitted
+    */
+
+   public void reset();
+
+   /**
+    * Sets the locale of the response, if the response has not been committed
+    * yet. It also sets the response's character encoding appropriately for the
+    * locale, if the character encoding has not been explicitly set using
+    * {@link #setContentType} or {@link #setCharacterEncoding},
+    * <code>getWriter</code> hasn't been called yet, and the response hasn't
+    * been committed yet. If the deployment descriptor contains a
+    * <code>locale-encoding-mapping-list</code> element, and that element
+    * provides a mapping for the given locale, that mapping is used. Otherwise,
+    * the mapping from locale to character encoding is container dependent.
+    * <p>
+    * This method may be called repeatedly to change locale and character
+    * encoding. The method has no effect if called after the response has been
+    * committed. It does not set the response's character encoding if it is
+    * called after {@link #setContentType} has been called with a charset
+    * specification, after {@link #setCharacterEncoding} has been called, after
+    * <code>getWriter</code> has been called, or after the response has been
+    * committed.
+    * <p>
+    * Containers must communicate the locale and the character encoding used for
+    * the servlet response's writer to the client if the protocol provides a way
+    * for doing so. In the case of HTTP, the locale is communicated via the
+    * <code>Content-Language</code> header, the character encoding as part of
+    * the <code>Content-Type</code> header for text media types. Note that the
+    * character encoding cannot be communicated via HTTP headers if the servlet
+    * does not specify a content type; however, it is still used to encode text
+    * written via the servlet response's writer.
+    * 
+    * @param loc
+    *           the locale of the response
+    * @see #getLocale
+    * @see #setContentType
+    * @see #setCharacterEncoding
+    */
+
+   public void setLocale(Locale loc);
+
+   /**
+    * Returns the locale specified for this response using the
+    * {@link #setLocale} method. Calls made to <code>setLocale</code> after
+    * the response is committed have no effect. If no locale has been specified,
+    * the container's default locale is returned.
+    * 
+    * @see #setLocale
+    */
+
+   public Locale getLocale();
+
+}

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletResponseWrapper.java
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletResponseWrapper.java	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/ServletResponseWrapper.java	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,234 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package javax.servlet;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Locale;
+
+/**
+ * Provides a convenient implementation of the ServletResponse interface that
+ * can be subclassed by developers wishing to adapt the response from a Servlet.
+ * This class implements the Wrapper or Decorator pattern. Methods default to
+ * calling through to the wrapped response object.
+ * 
+ * @author Various
+ * @since v 2.3
+ * @see javax.servlet.ServletResponse
+ */
+
+public class ServletResponseWrapper implements ServletResponse
+{
+   private ServletResponse response;
+
+   /**
+    * Creates a ServletResponse adaptor wrapping the given response object.
+    * 
+    * @throws java.lang.IllegalArgumentException
+    *            if the response is null.
+    */
+
+   public ServletResponseWrapper(ServletResponse response)
+   {
+      if (response == null)
+      {
+         throw new IllegalArgumentException("Response cannot be null");
+      }
+      this.response = response;
+   }
+
+   /**
+    * Return the wrapped ServletResponse object.
+    */
+
+   public ServletResponse getResponse()
+   {
+      return this.response;
+   }
+
+   /**
+    * Sets the response being wrapped.
+    * 
+    * @throws java.lang.IllegalArgumentException
+    *            if the response is null.
+    */
+
+   public void setResponse(ServletResponse response)
+   {
+      if (response == null)
+      {
+         throw new IllegalArgumentException("Response cannot be null");
+      }
+      this.response = response;
+   }
+
+   /**
+    * The default behavior of this method is to call setCharacterEncoding(String
+    * charset) on the wrapped response object.
+    * 
+    * @since 2.4
+    */
+
+   public void setCharacterEncoding(String charset)
+   {
+      this.response.setCharacterEncoding(charset);
+   }
+
+   /**
+    * The default behavior of this method is to return getCharacterEncoding() on
+    * the wrapped response object.
+    */
+
+   public String getCharacterEncoding()
+   {
+      return this.response.getCharacterEncoding();
+   }
+
+   /**
+    * The default behavior of this method is to return getOutputStream() on the
+    * wrapped response object.
+    */
+
+   public ServletOutputStream getOutputStream() throws IOException
+   {
+      return this.response.getOutputStream();
+   }
+
+   /**
+    * The default behavior of this method is to return getWriter() on the
+    * wrapped response object.
+    */
+
+   public PrintWriter getWriter() throws IOException
+   {
+      return this.response.getWriter();
+   }
+
+   /**
+    * The default behavior of this method is to call setContentLength(int len)
+    * on the wrapped response object.
+    */
+
+   public void setContentLength(int len)
+   {
+      this.response.setContentLength(len);
+   }
+
+   /**
+    * The default behavior of this method is to call setContentType(String type)
+    * on the wrapped response object.
+    */
+
+   public void setContentType(String type)
+   {
+      this.response.setContentType(type);
+   }
+
+   /**
+    * The default behavior of this method is to return getContentType() on the
+    * wrapped response object.
+    * 
+    * @since 2.4
+    */
+
+   public String getContentType()
+   {
+      return this.response.getContentType();
+   }
+
+   /**
+    * The default behavior of this method is to call setBufferSize(int size) on
+    * the wrapped response object.
+    */
+   public void setBufferSize(int size)
+   {
+      this.response.setBufferSize(size);
+   }
+
+   /**
+    * The default behavior of this method is to return getBufferSize() on the
+    * wrapped response object.
+    */
+   public int getBufferSize()
+   {
+      return this.response.getBufferSize();
+   }
+
+   /**
+    * The default behavior of this method is to call flushBuffer() on the
+    * wrapped response object.
+    */
+
+   public void flushBuffer() throws IOException
+   {
+      this.response.flushBuffer();
+   }
+
+   /**
+    * The default behavior of this method is to return isCommitted() on the
+    * wrapped response object.
+    */
+   public boolean isCommitted()
+   {
+      return this.response.isCommitted();
+   }
+
+   /**
+    * The default behavior of this method is to call reset() on the wrapped
+    * response object.
+    */
+
+   public void reset()
+   {
+      this.response.reset();
+   }
+
+   /**
+    * The default behavior of this method is to call resetBuffer() on the
+    * wrapped response object.
+    */
+
+   public void resetBuffer()
+   {
+      this.response.resetBuffer();
+   }
+
+   /**
+    * The default behavior of this method is to call setLocale(Locale loc) on
+    * the wrapped response object.
+    */
+
+   public void setLocale(Locale loc)
+   {
+      this.response.setLocale(loc);
+   }
+
+   /**
+    * The default behavior of this method is to return getLocale() on the
+    * wrapped response object.
+    */
+   public Locale getLocale()
+   {
+      return this.response.getLocale();
+   }
+
+}

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/SingleThreadModel.java
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/SingleThreadModel.java	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/SingleThreadModel.java	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,49 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package javax.servlet;
+
+/**
+ * Ensures that servlets handle only one request at a time. This interface has
+ * no methods.
+ * <p>
+ * If a servlet implements this interface, you are <i>guaranteed</i> that no
+ * two threads will execute concurrently in the servlet's <code>service</code>
+ * method. The servlet container can make this guarantee by synchronizing access
+ * to a single instance of the servlet, or by maintaining a pool of servlet
+ * instances and dispatching each new request to a free servlet.
+ * <p>
+ * Note that SingleThreadModel does not solve all thread safety issues. For
+ * example, session attributes and static variables can still be accessed by
+ * multiple requests on multiple threads at the same time, even when
+ * SingleThreadModel servlets are used. It is recommended that a developer take
+ * other means to resolve those issues instead of implementing this interface,
+ * such as avoiding the usage of an instance variable or synchronizing the block
+ * of the code accessing those resources. This interface is deprecated in
+ * Servlet API version 2.4.
+ * 
+ * @author Various
+ * @deprecated As of Java Servlet API 2.4, with no direct replacement.
+ */
+ at Deprecated
+public interface SingleThreadModel
+{
+}

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/UnavailableException.java
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/UnavailableException.java	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/UnavailableException.java	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,191 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package javax.servlet;
+
+/**
+ * Defines an exception that a servlet or filter throws to indicate that it is
+ * permanently or temporarily unavailable.
+ * <p>
+ * When a servlet or filter is permanently unavailable, something is wrong with
+ * it, and it cannot handle requests until some action is taken. For example, a
+ * servlet might be configured incorrectly, or a filter's state may be
+ * corrupted. The component should log both the error and the corrective action
+ * that is needed.
+ * <p>
+ * A servlet or filter is temporarily unavailable if it cannot handle requests
+ * momentarily due to some system-wide problem. For example, a third-tier server
+ * might not be accessible, or there may be insufficient memory or disk storage
+ * to handle requests. A system administrator may need to take corrective
+ * action.
+ * <p>
+ * Servlet containers can safely treat both types of unavailable exceptions in
+ * the same way. However, treating temporary unavailability effectively makes
+ * the servlet container more robust. Specifically, the servlet container might
+ * block requests to the servlet or filter for a period of time suggested by the
+ * exception, rather than rejecting them until the servlet container restarts.
+ * 
+ * @author Various
+ */
+
+public class UnavailableException extends ServletException
+{
+
+   private Servlet servlet; // what's unavailable
+
+   private boolean permanent; // needs admin action?
+
+   private int seconds; // unavailability estimate
+
+   /**
+    * @deprecated As of Java Servlet API 2.2, use {@link
+    *             #UnavailableException(String)} instead.
+    * @param servlet
+    *           the <code>Servlet</code> instance that is unavailable
+    * @param msg
+    *           a <code>String</code> specifying the descriptive message
+    */
+   @Deprecated
+   public UnavailableException(Servlet servlet, String msg)
+   {
+      super(msg);
+      this.servlet = servlet;
+      permanent = true;
+   }
+
+   /**
+    * @deprecated As of Java Servlet API 2.2, use {@link
+    *             #UnavailableException(String, int)} instead.
+    * @param seconds
+    *           an integer specifying the number of seconds the servlet expects
+    *           to be unavailable; if zero or negative, indicates that the
+    *           servlet can't make an estimate
+    * @param servlet
+    *           the <code>Servlet</code> that is unavailable
+    * @param msg
+    *           a <code>String</code> specifying the descriptive message,
+    *           which can be written to a log file or displayed for the user.
+    */
+   @Deprecated
+   public UnavailableException(int seconds, Servlet servlet, String msg)
+   {
+      super(msg);
+      this.servlet = servlet;
+      if (seconds <= 0)
+         this.seconds = -1;
+      else
+         this.seconds = seconds;
+      permanent = false;
+   }
+
+   /**
+    * Constructs a new exception with a descriptive message indicating that the
+    * servlet is permanently unavailable.
+    * 
+    * @param msg
+    *           a <code>String</code> specifying the descriptive message
+    */
+
+   public UnavailableException(String msg)
+   {
+      super(msg);
+
+      permanent = true;
+   }
+
+   /**
+    * Constructs a new exception with a descriptive message indicating that the
+    * servlet is temporarily unavailable and giving an estimate of how long it
+    * will be unavailable.
+    * <p>
+    * In some cases, the servlet cannot make an estimate. For example, the
+    * servlet might know that a server it needs is not running, but not be able
+    * to report how long it will take to be restored to functionality. This can
+    * be indicated with a negative or zero value for the <code>seconds</code>
+    * argument.
+    * 
+    * @param msg
+    *           a <code>String</code> specifying the descriptive message,
+    *           which can be written to a log file or displayed for the user.
+    * @param seconds
+    *           an integer specifying the number of seconds the servlet expects
+    *           to be unavailable; if zero or negative, indicates that the
+    *           servlet can't make an estimate
+    */
+
+   public UnavailableException(String msg, int seconds)
+   {
+      super(msg);
+
+      if (seconds <= 0)
+         this.seconds = -1;
+      else
+         this.seconds = seconds;
+
+      permanent = false;
+   }
+
+   /**
+    * Returns a <code>boolean</code> indicating whether the servlet is
+    * permanently unavailable. If so, something is wrong with the servlet, and
+    * the system administrator must take some corrective action.
+    * 
+    * @return <code>true</code> if the servlet is permanently unavailable;
+    *         <code>false</code> if the servlet is available or temporarily
+    *         unavailable
+    */
+
+   public boolean isPermanent()
+   {
+      return permanent;
+   }
+
+   /**
+    * @deprecated As of Java Servlet API 2.2, with no replacement. Returns the
+    *             servlet that is reporting its unavailability.
+    * @return the <code>Servlet</code> object that is throwing the
+    *         <code>UnavailableException</code>
+    */
+   @Deprecated
+   public Servlet getServlet()
+   {
+      return servlet;
+   }
+
+   /**
+    * Returns the number of seconds the servlet expects to be temporarily
+    * unavailable.
+    * <p>
+    * If this method returns a negative number, the servlet is permanently
+    * unavailable or cannot provide an estimate of how long it will be
+    * unavailable. No effort is made to correct for the time elapsed since the
+    * exception was first reported.
+    * 
+    * @return an integer specifying the number of seconds the servlet will be
+    *         temporarily unavailable, or a negative number if the servlet is
+    *         permanently unavailable or cannot make an estimate
+    */
+
+   public int getUnavailableSeconds()
+   {
+      return permanent ? -1 : seconds;
+   }
+}

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/Cookie.java
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/Cookie.java	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/Cookie.java	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,437 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package javax.servlet.http;
+
+import java.text.MessageFormat;
+import java.util.ResourceBundle;
+
+/**
+ * Creates a cookie, a small amount of information sent by a servlet to a Web
+ * browser, saved by the browser, and later sent back to the server. A cookie's
+ * value can uniquely identify a client, so cookies are commonly used for
+ * session management.
+ * <p>
+ * A cookie has a name, a single value, and optional attributes such as a
+ * comment, path and domain qualifiers, a maximum age, and a version number.
+ * Some Web browsers have bugs in how they handle the optional attributes, so
+ * use them sparingly to improve the interoperability of your servlets.
+ * <p>
+ * The servlet sends cookies to the browser by using the
+ * {@link HttpServletResponse#addCookie} method, which adds fields to HTTP
+ * response headers to send cookies to the browser, one at a time. The browser
+ * is expected to support 20 cookies for each Web server, 300 cookies total, and
+ * may limit cookie size to 4 KB each.
+ * <p>
+ * The browser returns cookies to the servlet by adding fields to HTTP request
+ * headers. Cookies can be retrieved from a request by using the
+ * {@link HttpServletRequest#getCookies} method. Several cookies might have the
+ * same name but different path attributes.
+ * <p>
+ * Cookies affect the caching of the Web pages that use them. HTTP 1.0 does not
+ * cache pages that use cookies created with this class. This class does not
+ * support the cache control defined with HTTP 1.1.
+ * <p>
+ * This class supports both the Version 0 (by Netscape) and Version 1 (by RFC
+ * 2109) cookie specifications. By default, cookies are created using Version 0
+ * to ensure the best interoperability.
+ * 
+ * @author Various
+ */
+
+// XXX would implement java.io.Serializable too, but can't do that
+// so long as sun.servlet.* must run on older JDK 1.02 JVMs which
+// don't include that support.
+public class Cookie implements Cloneable
+{
+
+   private static final String LSTRING_FILE = "javax.servlet.http.LocalStrings";
+
+   private static ResourceBundle lStrings = ResourceBundle.getBundle(LSTRING_FILE);
+
+   //
+   // The value of the cookie itself.
+   //
+
+   private String name; // NAME= ... "$Name" style is reserved
+
+   private String value; // value of NAME
+
+   //
+   // Attributes encoded in the header's cookie fields.
+   //
+
+   private String comment; // ;Comment=VALUE ... describes cookie's use
+
+   // ;Discard ... implied by maxAge < 0
+   private String domain; // ;Domain=VALUE ... domain that sees cookie
+
+   private int maxAge = -1; // ;Max-Age=VALUE ... cookies auto-expire
+
+   private String path; // ;Path=VALUE ... URLs that see the cookie
+
+   private boolean secure; // ;Secure ... e.g. use SSL
+
+   private int version = 0; // ;Version=1 ... means RFC 2109++ style
+
+   /**
+    * Constructs a cookie with a specified name and value.
+    * <p>
+    * The name must conform to RFC 2109. That means it can contain only ASCII
+    * alphanumeric characters and cannot contain commas, semicolons, or white
+    * space or begin with a $ character. The cookie's name cannot be changed
+    * after creation.
+    * <p>
+    * The value can be anything the server chooses to send. Its value is
+    * probably of interest only to the server. The cookie's value can be changed
+    * after creation with the <code>setValue</code> method.
+    * <p>
+    * By default, cookies are created according to the Netscape cookie
+    * specification. The version can be changed with the <code>setVersion</code>
+    * method.
+    * 
+    * @param name
+    *           a <code>String</code> specifying the name of the cookie
+    * @param value
+    *           a <code>String</code> specifying the value of the cookie
+    * @throws IllegalArgumentException
+    *            if the cookie name contains illegal characters (for example, a
+    *            comma, space, or semicolon) or it is one of the tokens reserved
+    *            for use by the cookie protocol
+    * @see #setValue
+    * @see #setVersion
+    */
+
+   public Cookie(String name, String value)
+   {
+      if (!isToken(name) || name.equalsIgnoreCase("Comment") // rfc2019
+            || name.equalsIgnoreCase("Discard") // 2019++
+            || name.equalsIgnoreCase("Domain") || name.equalsIgnoreCase("Expires") // (old
+                                                                                    // cookies)
+            || name.equalsIgnoreCase("Max-Age") // rfc2019
+            || name.equalsIgnoreCase("Path") || name.equalsIgnoreCase("Secure") || name.equalsIgnoreCase("Version") || name.startsWith("$"))
+      {
+         String errMsg = lStrings.getString("err.cookie_name_is_token");
+         Object[] errArgs = new Object[1];
+         errArgs[0] = name;
+         errMsg = MessageFormat.format(errMsg, errArgs);
+         throw new IllegalArgumentException(errMsg);
+      }
+
+      this.name = name;
+      this.value = value;
+   }
+
+   /**
+    * Specifies a comment that describes a cookie's purpose. The comment is
+    * useful if the browser presents the cookie to the user. Comments are not
+    * supported by Netscape Version 0 cookies.
+    * 
+    * @param purpose
+    *           a <code>String</code> specifying the comment to display to the
+    *           user
+    * @see #getComment
+    */
+
+   public void setComment(String purpose)
+   {
+      comment = purpose;
+   }
+
+   /**
+    * Returns the comment describing the purpose of this cookie, or
+    * <code>null</code> if the cookie has no comment.
+    * 
+    * @return a <code>String</code> containing the comment, or
+    *         <code>null</code> if none
+    * @see #setComment
+    */
+
+   public String getComment()
+   {
+      return comment;
+   }
+
+   /**
+    * Specifies the domain within which this cookie should be presented.
+    * <p>
+    * The form of the domain name is specified by RFC 2109. A domain name begins
+    * with a dot (<code>.foo.com</code>) and means that the cookie is
+    * visible to servers in a specified Domain Name System (DNS) zone (for
+    * example, <code>www.foo.com</code>, but not <code>a.b.foo.com</code>).
+    * By default, cookies are only returned to the server that sent them.
+    * 
+    * @param pattern
+    *           a <code>String</code> containing the domain name within which
+    *           this cookie is visible; form is according to RFC 2109
+    * @see #getDomain
+    */
+
+   public void setDomain(String pattern)
+   {
+      domain = pattern.toLowerCase(); // IE allegedly needs this
+   }
+
+   /**
+    * Returns the domain name set for this cookie. The form of the domain name
+    * is set by RFC 2109.
+    * 
+    * @return a <code>String</code> containing the domain name
+    * @see #setDomain
+    */
+
+   public String getDomain()
+   {
+      return domain;
+   }
+
+   /**
+    * Sets the maximum age of the cookie in seconds.
+    * <p>
+    * A positive value indicates that the cookie will expire after that many
+    * seconds have passed. Note that the value is the <i>maximum</i> age when
+    * the cookie will expire, not the cookie's current age.
+    * <p>
+    * A negative value means that the cookie is not stored persistently and will
+    * be deleted when the Web browser exits. A zero value causes the cookie to
+    * be deleted.
+    * 
+    * @param expiry
+    *           an integer specifying the maximum age of the cookie in seconds;
+    *           if negative, means the cookie is not stored; if zero, deletes
+    *           the cookie
+    * @see #getMaxAge
+    */
+
+   public void setMaxAge(int expiry)
+   {
+      maxAge = expiry;
+   }
+
+   /**
+    * Returns the maximum age of the cookie, specified in seconds, By default,
+    * <code>-1</code> indicating the cookie will persist until browser
+    * shutdown.
+    * 
+    * @return an integer specifying the maximum age of the cookie in seconds; if
+    *         negative, means the cookie persists until browser shutdown
+    * @see #setMaxAge
+    */
+
+   public int getMaxAge()
+   {
+      return maxAge;
+   }
+
+   /**
+    * Specifies a path for the cookie to which the client should return the
+    * cookie.
+    * <p>
+    * The cookie is visible to all the pages in the directory you specify, and
+    * all the pages in that directory's subdirectories. A cookie's path must
+    * include the servlet that set the cookie, for example, <i>/catalog</i>,
+    * which makes the cookie visible to all directories on the server under
+    * <i>/catalog</i>.
+    * <p>
+    * Consult RFC 2109 (available on the Internet) for more information on
+    * setting path names for cookies.
+    * 
+    * @param uri
+    *           a <code>String</code> specifying a path
+    * @see #getPath
+    */
+
+   public void setPath(String uri)
+   {
+      path = uri;
+   }
+
+   /**
+    * Returns the path on the server to which the browser returns this cookie.
+    * The cookie is visible to all subpaths on the server.
+    * 
+    * @return a <code>String</code> specifying a path that contains a servlet
+    *         name, for example, <i>/catalog</i>
+    * @see #setPath
+    */
+
+   public String getPath()
+   {
+      return path;
+   }
+
+   /**
+    * Indicates to the browser whether the cookie should only be sent using a
+    * secure protocol, such as HTTPS or SSL.
+    * <p>
+    * The default value is <code>false</code>.
+    * 
+    * @param flag
+    *           if <code>true</code>, sends the cookie from the browser to
+    *           the server only when using a secure protocol; if
+    *           <code>false</code>, sent on any protocol
+    * @see #getSecure
+    */
+
+   public void setSecure(boolean flag)
+   {
+      secure = flag;
+   }
+
+   /**
+    * Returns <code>true</code> if the browser is sending cookies only over a
+    * secure protocol, or <code>false</code> if the browser can send cookies
+    * using any protocol.
+    * 
+    * @return <code>true</code> if the browser uses a secure protocol;
+    *         otherwise, <code>true</code>
+    * @see #setSecure
+    */
+
+   public boolean getSecure()
+   {
+      return secure;
+   }
+
+   /**
+    * Returns the name of the cookie. The name cannot be changed after creation.
+    * 
+    * @return a <code>String</code> specifying the cookie's name
+    */
+
+   public String getName()
+   {
+      return name;
+   }
+
+   /**
+    * Assigns a new value to a cookie after the cookie is created. If you use a
+    * binary value, you may want to use BASE64 encoding.
+    * <p>
+    * With Version 0 cookies, values should not contain white space, brackets,
+    * parentheses, equals signs, commas, double quotes, slashes, question marks,
+    * at signs, colons, and semicolons. Empty values may not behave the same way
+    * on all browsers.
+    * 
+    * @param newValue
+    *           a <code>String</code> specifying the new value
+    * @see #getValue
+    * @see Cookie
+    */
+
+   public void setValue(String newValue)
+   {
+      value = newValue;
+   }
+
+   /**
+    * Returns the value of the cookie.
+    * 
+    * @return a <code>String</code> containing the cookie's present value
+    * @see #setValue
+    * @see Cookie
+    */
+
+   public String getValue()
+   {
+      return value;
+   }
+
+   /**
+    * Returns the version of the protocol this cookie complies with. Version 1
+    * complies with RFC 2109, and version 0 complies with the original cookie
+    * specification drafted by Netscape. Cookies provided by a browser use and
+    * identify the browser's cookie version.
+    * 
+    * @return 0 if the cookie complies with the original Netscape specification;
+    *         1 if the cookie complies with RFC 2109
+    * @see #setVersion
+    */
+
+   public int getVersion()
+   {
+      return version;
+   }
+
+   /**
+    * Sets the version of the cookie protocol this cookie complies with. Version
+    * 0 complies with the original Netscape cookie specification. Version 1
+    * complies with RFC 2109.
+    * <p>
+    * Since RFC 2109 is still somewhat new, consider version 1 as experimental;
+    * do not use it yet on production sites.
+    * 
+    * @param v
+    *           0 if the cookie should comply with the original Netscape
+    *           specification; 1 if the cookie should comply with RFC 2109
+    * @see #getVersion
+    */
+
+   public void setVersion(int v)
+   {
+      version = v;
+   }
+
+   // Note -- disabled for now to allow full Netscape compatibility
+   // from RFC 2068, token special case characters
+   // 
+   // private static final String tspecials = "()<>@,;:\\\"/[]?={} \t";
+
+   private static final String tspecials = ",; ";
+
+   /*
+    * Tests a string and returns true if the string counts as a reserved token
+    * in the Java language. @param value the <code>String</code> to be tested
+    * @return <code>true</code> if the <code>String</code> is a reserved
+    * token; <code>false</code> if it is not
+    */
+
+   private boolean isToken(String value)
+   {
+      int len = value.length();
+
+      for (int i = 0; i < len; i++)
+      {
+         char c = value.charAt(i);
+
+         if (c < 0x20 || c >= 0x7f || tspecials.indexOf(c) != -1)
+            return false;
+      }
+      return true;
+   }
+
+   /**
+    * Overrides the standard <code>java.lang.Object.clone</code> method to
+    * return a copy of this cookie.
+    */
+
+   public Object clone()
+   {
+      try
+      {
+         return super.clone();
+      }
+      catch (CloneNotSupportedException e)
+      {
+         throw new RuntimeException(e.getMessage());
+      }
+   }
+}

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpServlet.java
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpServlet.java	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpServlet.java	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,960 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package javax.servlet.http;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.OutputStreamWriter;
+import java.io.UnsupportedEncodingException;
+import java.lang.reflect.Method;
+import java.text.MessageFormat;
+import java.util.Enumeration;
+import java.util.Locale;
+import java.util.ResourceBundle;
+
+import javax.servlet.GenericServlet;
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+
+/**
+ * Provides an abstract class to be subclassed to create an HTTP servlet
+ * suitable for a Web site. A subclass of <code>HttpServlet</code> must
+ * override at least one method, usually one of these:
+ * <ul>
+ * <li> <code>doGet</code>, if the servlet supports HTTP GET requests
+ * <li> <code>doPost</code>, for HTTP POST requests
+ * <li> <code>doPut</code>, for HTTP PUT requests
+ * <li> <code>doDelete</code>, for HTTP DELETE requests
+ * <li> <code>init</code> and <code>destroy</code>, to manage resources
+ * that are held for the life of the servlet
+ * <li> <code>getServletInfo</code>, which the servlet uses to provide
+ * information about itself
+ * </ul>
+ * <p>
+ * There's almost no reason to override the <code>service</code> method.
+ * <code>service</code> handles standard HTTP requests by dispatching them to
+ * the handler methods for each HTTP request type (the <code>do</code><i>XXX</i>
+ * methods listed above).
+ * <p>
+ * Likewise, there's almost no reason to override the <code>doOptions</code>
+ * and <code>doTrace</code> methods.
+ * <p>
+ * Servlets typically run on multithreaded servers, so be aware that a servlet
+ * must handle concurrent requests and be careful to synchronize access to
+ * shared resources. Shared resources include in-memory data such as instance or
+ * class variables and external objects such as files, database connections, and
+ * network connections. See the <a
+ * href="http://java.sun.com/Series/Tutorial/java/threads/multithreaded.html">
+ * Java Tutorial on Multithreaded Programming</a> for more information on
+ * handling multiple threads in a Java program.
+ * 
+ * @author Various
+ */
+
+public abstract class HttpServlet extends GenericServlet implements java.io.Serializable
+{
+   private static final String METHOD_DELETE = "DELETE";
+
+   private static final String METHOD_HEAD = "HEAD";
+
+   private static final String METHOD_GET = "GET";
+
+   private static final String METHOD_OPTIONS = "OPTIONS";
+
+   private static final String METHOD_POST = "POST";
+
+   private static final String METHOD_PUT = "PUT";
+
+   private static final String METHOD_TRACE = "TRACE";
+
+   private static final String HEADER_IFMODSINCE = "If-Modified-Since";
+
+   private static final String HEADER_LASTMOD = "Last-Modified";
+
+   private static final String LSTRING_FILE = "javax.servlet.http.LocalStrings";
+
+   private static ResourceBundle lStrings = ResourceBundle.getBundle(LSTRING_FILE);
+
+   /**
+    * Does nothing, because this is an abstract class.
+    */
+
+   public HttpServlet()
+   {
+   }
+
+   /**
+    * Called by the server (via the <code>service</code> method) to allow a
+    * servlet to handle a GET request.
+    * <p>
+    * Overriding this method to support a GET request also automatically
+    * supports an HTTP HEAD request. A HEAD request is a GET request that
+    * returns no body in the response, only the request header fields.
+    * <p>
+    * When overriding this method, read the request data, write the response
+    * headers, get the response's writer or output stream object, and finally,
+    * write the response data. It's best to include content type and encoding.
+    * When using a <code>PrintWriter</code> object to return the response, set
+    * the content type before accessing the <code>PrintWriter</code> object.
+    * <p>
+    * The servlet container must write the headers before committing the
+    * response, because in HTTP the headers must be sent before the response
+    * body.
+    * <p>
+    * Where possible, set the Content-Length header (with the
+    * {@link javax.servlet.ServletResponse#setContentLength} method), to allow
+    * the servlet container to use a persistent connection to return its
+    * response to the client, improving performance. The content length is
+    * automatically set if the entire response fits inside the response buffer.
+    * <p>
+    * When using HTTP 1.1 chunked encoding (which means that the response has a
+    * Transfer-Encoding header), do not set the Content-Length header.
+    * <p>
+    * The GET method should be safe, that is, without any side effects for which
+    * users are held responsible. For example, most form queries have no side
+    * effects. If a client request is intended to change stored data, the
+    * request should use some other HTTP method.
+    * <p>
+    * The GET method should also be idempotent, meaning that it can be safely
+    * repeated. Sometimes making a method safe also makes it idempotent. For
+    * example, repeating queries is both safe and idempotent, but buying a
+    * product online or modifying data is neither safe nor idempotent.
+    * <p>
+    * If the request is incorrectly formatted, <code>doGet</code> returns an
+    * HTTP "Bad Request" message.
+    * 
+    * @param req
+    *           an {@link HttpServletRequest} object that contains the request
+    *           the client has made of the servlet
+    * @param resp
+    *           an {@link HttpServletResponse} object that contains the response
+    *           the servlet sends to the client
+    * @exception IOException
+    *               if an input or output error is detected when the servlet
+    *               handles the GET request
+    * @exception ServletException
+    *               if the request for the GET could not be handled
+    * @see javax.servlet.ServletResponse#setContentType
+    */
+
+   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
+   {
+      String protocol = req.getProtocol();
+      String msg = lStrings.getString("http.method_get_not_supported");
+      if (protocol.endsWith("1.1"))
+      {
+         resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);
+      }
+      else
+      {
+         resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);
+      }
+   }
+
+   /**
+    * Returns the time the <code>HttpServletRequest</code> object was last
+    * modified, in milliseconds since midnight January 1, 1970 GMT. If the time
+    * is unknown, this method returns a negative number (the default).
+    * <p>
+    * Servlets that support HTTP GET requests and can quickly determine their
+    * last modification time should override this method. This makes browser and
+    * proxy caches work more effectively, reducing the load on server and
+    * network resources.
+    * 
+    * @param req
+    *           the <code>HttpServletRequest</code> object that is sent to the
+    *           servlet
+    * @return a <code>long</code> integer specifying the time the
+    *         <code>HttpServletRequest</code> object was last modified, in
+    *         milliseconds since midnight, January 1, 1970 GMT, or -1 if the
+    *         time is not known
+    */
+
+   protected long getLastModified(HttpServletRequest req)
+   {
+      return -1;
+   }
+
+   /**
+    * <p>
+    * Receives an HTTP HEAD request from the protected <code>service</code>
+    * method and handles the request. The client sends a HEAD request when it
+    * wants to see only the headers of a response, such as Content-Type or
+    * Content-Length. The HTTP HEAD method counts the output bytes in the
+    * response to set the Content-Length header accurately.
+    * <p>
+    * If you override this method, you can avoid computing the response body and
+    * just set the response headers directly to improve performance. Make sure
+    * that the <code>doHead</code> method you write is both safe and
+    * idempotent (that is, protects itself from being called multiple times for
+    * one HTTP HEAD request).
+    * <p>
+    * If the HTTP HEAD request is incorrectly formatted, <code>doHead</code>
+    * returns an HTTP "Bad Request" message.
+    * 
+    * @param req
+    *           the request object that is passed to the servlet
+    * @param resp
+    *           the response object that the servlet uses to return the headers
+    *           to the clien
+    * @exception IOException
+    *               if an input or output error occurs
+    * @exception ServletException
+    *               if the request for the HEAD could not be handled
+    */
+
+   protected void doHead(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
+   {
+      NoBodyResponse response = new NoBodyResponse(resp);
+
+      doGet(req, response);
+      response.setContentLength();
+   }
+
+   /**
+    * Called by the server (via the <code>service</code> method) to allow a
+    * servlet to handle a POST request. The HTTP POST method allows the client
+    * to send data of unlimited length to the Web server a single time and is
+    * useful when posting information such as credit card numbers.
+    * <p>
+    * When overriding this method, read the request data, write the response
+    * headers, get the response's writer or output stream object, and finally,
+    * write the response data. It's best to include content type and encoding.
+    * When using a <code>PrintWriter</code> object to return the response, set
+    * the content type before accessing the <code>PrintWriter</code> object.
+    * <p>
+    * The servlet container must write the headers before committing the
+    * response, because in HTTP the headers must be sent before the response
+    * body.
+    * <p>
+    * Where possible, set the Content-Length header (with the
+    * {@link javax.servlet.ServletResponse#setContentLength} method), to allow
+    * the servlet container to use a persistent connection to return its
+    * response to the client, improving performance. The content length is
+    * automatically set if the entire response fits inside the response buffer.
+    * <p>
+    * When using HTTP 1.1 chunked encoding (which means that the response has a
+    * Transfer-Encoding header), do not set the Content-Length header.
+    * <p>
+    * This method does not need to be either safe or idempotent. Operations
+    * requested through POST can have side effects for which the user can be
+    * held accountable, for example, updating stored data or buying items
+    * online.
+    * <p>
+    * If the HTTP POST request is incorrectly formatted, <code>doPost</code>
+    * returns an HTTP "Bad Request" message.
+    * 
+    * @param req
+    *           an {@link HttpServletRequest} object that contains the request
+    *           the client has made of the servlet
+    * @param resp
+    *           an {@link HttpServletResponse} object that contains the response
+    *           the servlet sends to the client
+    * @exception IOException
+    *               if an input or output error is detected when the servlet
+    *               handles the request
+    * @exception ServletException
+    *               if the request for the POST could not be handled
+    * @see javax.servlet.ServletOutputStream
+    * @see javax.servlet.ServletResponse#setContentType
+    */
+
+   protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
+   {
+      String protocol = req.getProtocol();
+      String msg = lStrings.getString("http.method_post_not_supported");
+      if (protocol.endsWith("1.1"))
+      {
+         resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);
+      }
+      else
+      {
+         resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);
+      }
+   }
+
+   /**
+    * Called by the server (via the <code>service</code> method) to allow a
+    * servlet to handle a PUT request. The PUT operation allows a client to
+    * place a file on the server and is similar to sending a file by FTP.
+    * <p>
+    * When overriding this method, leave intact any content headers sent with
+    * the request (including Content-Length, Content-Type,
+    * Content-Transfer-Encoding, Content-Encoding, Content-Base,
+    * Content-Language, Content-Location, Content-MD5, and Content-Range). If
+    * your method cannot handle a content header, it must issue an error message
+    * (HTTP 501 - Not Implemented) and discard the request. For more information
+    * on HTTP 1.1, see RFC 2616 <a href="http://www.ietf.org/rfc/rfc2616.txt"></a>.
+    * <p>
+    * This method does not need to be either safe or idempotent. Operations that
+    * <code>doPut</code> performs can have side effects for which the user can
+    * be held accountable. When using this method, it may be useful to save a
+    * copy of the affected URL in temporary storage.
+    * <p>
+    * If the HTTP PUT request is incorrectly formatted, <code>doPut</code>
+    * returns an HTTP "Bad Request" message.
+    * 
+    * @param req
+    *           the {@link HttpServletRequest} object that contains the request
+    *           the client made of the servlet
+    * @param resp
+    *           the {@link HttpServletResponse} object that contains the
+    *           response the servlet returns to the client
+    * @exception IOException
+    *               if an input or output error occurs while the servlet is
+    *               handling the PUT request
+    * @exception ServletException
+    *               if the request for the PUT cannot be handled
+    */
+
+   protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
+   {
+      String protocol = req.getProtocol();
+      String msg = lStrings.getString("http.method_put_not_supported");
+      if (protocol.endsWith("1.1"))
+      {
+         resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);
+      }
+      else
+      {
+         resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);
+      }
+   }
+
+   /**
+    * Called by the server (via the <code>service</code> method) to allow a
+    * servlet to handle a DELETE request. The DELETE operation allows a client
+    * to remove a document or Web page from the server.
+    * <p>
+    * This method does not need to be either safe or idempotent. Operations
+    * requested through DELETE can have side effects for which users can be held
+    * accountable. When using this method, it may be useful to save a copy of
+    * the affected URL in temporary storage.
+    * <p>
+    * If the HTTP DELETE request is incorrectly formatted, <code>doDelete</code>
+    * returns an HTTP "Bad Request" message.
+    * 
+    * @param req
+    *           the {@link HttpServletRequest} object that contains the request
+    *           the client made of the servlet
+    * @param resp
+    *           the {@link HttpServletResponse} object that contains the
+    *           response the servlet returns to the client
+    * @exception IOException
+    *               if an input or output error occurs while the servlet is
+    *               handling the DELETE request
+    * @exception ServletException
+    *               if the request for the DELETE cannot be handled
+    */
+
+   protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
+   {
+      String protocol = req.getProtocol();
+      String msg = lStrings.getString("http.method_delete_not_supported");
+      if (protocol.endsWith("1.1"))
+      {
+         resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);
+      }
+      else
+      {
+         resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);
+      }
+   }
+
+   private Method[] getAllDeclaredMethods(Class c)
+   {
+
+      if (c.equals(javax.servlet.http.HttpServlet.class))
+      {
+         return null;
+      }
+
+      Method[] parentMethods = getAllDeclaredMethods(c.getSuperclass());
+      Method[] thisMethods = c.getDeclaredMethods();
+
+      if ((parentMethods != null) && (parentMethods.length > 0))
+      {
+         Method[] allMethods = new Method[parentMethods.length + thisMethods.length];
+         System.arraycopy(parentMethods, 0, allMethods, 0, parentMethods.length);
+         System.arraycopy(thisMethods, 0, allMethods, parentMethods.length, thisMethods.length);
+
+         thisMethods = allMethods;
+      }
+
+      return thisMethods;
+   }
+
+   /**
+    * Called by the server (via the <code>service</code> method) to allow a
+    * servlet to handle a OPTIONS request. The OPTIONS request determines which
+    * HTTP methods the server supports and returns an appropriate header. For
+    * example, if a servlet overrides <code>doGet</code>, this method returns
+    * the following header:
+    * <p>
+    * <code>Allow: GET, HEAD, TRACE, OPTIONS</code>
+    * <p>
+    * There's no need to override this method unless the servlet implements new
+    * HTTP methods, beyond those implemented by HTTP 1.1.
+    * 
+    * @param req
+    *           the {@link HttpServletRequest} object that contains the request
+    *           the client made of the servlet
+    * @param resp
+    *           the {@link HttpServletResponse} object that contains the
+    *           response the servlet returns to the client
+    * @exception IOException
+    *               if an input or output error occurs while the servlet is
+    *               handling the OPTIONS request
+    * @exception ServletException
+    *               if the request for the OPTIONS cannot be handled
+    */
+
+   protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
+   {
+      Method[] methods = getAllDeclaredMethods(this.getClass());
+
+      boolean ALLOW_GET = false;
+      boolean ALLOW_HEAD = false;
+      boolean ALLOW_POST = false;
+      boolean ALLOW_PUT = false;
+      boolean ALLOW_DELETE = false;
+      boolean ALLOW_TRACE = true;
+      boolean ALLOW_OPTIONS = true;
+
+      for (int i = 0; i < methods.length; i++)
+      {
+         Method m = methods[i];
+
+         if (m.getName().equals("doGet"))
+         {
+            ALLOW_GET = true;
+            ALLOW_HEAD = true;
+         }
+         if (m.getName().equals("doPost"))
+            ALLOW_POST = true;
+         if (m.getName().equals("doPut"))
+            ALLOW_PUT = true;
+         if (m.getName().equals("doDelete"))
+            ALLOW_DELETE = true;
+
+      }
+
+      String allow = null;
+      if (ALLOW_GET)
+         if (allow == null)
+            allow = METHOD_GET;
+      if (ALLOW_HEAD)
+         if (allow == null)
+            allow = METHOD_HEAD;
+         else
+            allow += ", " + METHOD_HEAD;
+      if (ALLOW_POST)
+         if (allow == null)
+            allow = METHOD_POST;
+         else
+            allow += ", " + METHOD_POST;
+      if (ALLOW_PUT)
+         if (allow == null)
+            allow = METHOD_PUT;
+         else
+            allow += ", " + METHOD_PUT;
+      if (ALLOW_DELETE)
+         if (allow == null)
+            allow = METHOD_DELETE;
+         else
+            allow += ", " + METHOD_DELETE;
+      if (ALLOW_TRACE)
+         if (allow == null)
+            allow = METHOD_TRACE;
+         else
+            allow += ", " + METHOD_TRACE;
+      if (ALLOW_OPTIONS)
+         if (allow == null)
+            allow = METHOD_OPTIONS;
+         else
+            allow += ", " + METHOD_OPTIONS;
+
+      resp.setHeader("Allow", allow);
+   }
+
+   /**
+    * Called by the server (via the <code>service</code> method) to allow a
+    * servlet to handle a TRACE request. A TRACE returns the headers sent with
+    * the TRACE request to the client, so that they can be used in debugging.
+    * There's no need to override this method.
+    * 
+    * @param req
+    *           the {@link HttpServletRequest} object that contains the request
+    *           the client made of the servlet
+    * @param resp
+    *           the {@link HttpServletResponse} object that contains the
+    *           response the servlet returns to the client
+    * @exception IOException
+    *               if an input or output error occurs while the servlet is
+    *               handling the TRACE request
+    * @exception ServletException
+    *               if the request for the TRACE cannot be handled
+    */
+
+   protected void doTrace(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
+   {
+
+      int responseLength;
+
+      String CRLF = "\r\n";
+      String responseString = "TRACE " + req.getRequestURI() + " " + req.getProtocol();
+
+      Enumeration reqHeaderEnum = req.getHeaderNames();
+
+      while (reqHeaderEnum.hasMoreElements())
+      {
+         String headerName = (String) reqHeaderEnum.nextElement();
+         responseString += CRLF + headerName + ": " + req.getHeader(headerName);
+      }
+
+      responseString += CRLF;
+
+      responseLength = responseString.length();
+
+      resp.setContentType("message/http");
+      resp.setContentLength(responseLength);
+      ServletOutputStream out = resp.getOutputStream();
+      out.print(responseString);
+      out.close();
+      return;
+   }
+
+   /**
+    * Receives standard HTTP requests from the public <code>service</code>
+    * method and dispatches them to the <code>do</code><i>XXX</i> methods
+    * defined in this class. This method is an HTTP-specific version of the
+    * {@link javax.servlet.Servlet#service} method. There's no need to override
+    * this method.
+    * 
+    * @param req
+    *           the {@link HttpServletRequest} object that contains the request
+    *           the client made of the servlet
+    * @param resp
+    *           the {@link HttpServletResponse} object that contains the
+    *           response the servlet returns to the client
+    * @exception IOException
+    *               if an input or output error occurs while the servlet is
+    *               handling the HTTP request
+    * @exception ServletException
+    *               if the HTTP request cannot be handled
+    * @see javax.servlet.Servlet#service
+    */
+
+   protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
+   {
+      String method = req.getMethod();
+
+      if (method.equals(METHOD_GET))
+      {
+         long lastModified = getLastModified(req);
+         if (lastModified == -1)
+         {
+            // servlet doesn't support if-modified-since, no reason
+            // to go through further expensive logic
+            doGet(req, resp);
+         }
+         else
+         {
+            long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
+            if (ifModifiedSince < (lastModified / 1000 * 1000))
+            {
+               // If the servlet mod time is later, call doGet()
+               // Round down to the nearest second for a proper compare
+               // A ifModifiedSince of -1 will always be less
+               maybeSetLastModified(resp, lastModified);
+               doGet(req, resp);
+            }
+            else
+            {
+               resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
+            }
+         }
+
+      }
+      else if (method.equals(METHOD_HEAD))
+      {
+         long lastModified = getLastModified(req);
+         maybeSetLastModified(resp, lastModified);
+         doHead(req, resp);
+
+      }
+      else if (method.equals(METHOD_POST))
+      {
+         doPost(req, resp);
+
+      }
+      else if (method.equals(METHOD_PUT))
+      {
+         doPut(req, resp);
+
+      }
+      else if (method.equals(METHOD_DELETE))
+      {
+         doDelete(req, resp);
+
+      }
+      else if (method.equals(METHOD_OPTIONS))
+      {
+         doOptions(req, resp);
+
+      }
+      else if (method.equals(METHOD_TRACE))
+      {
+         doTrace(req, resp);
+
+      }
+      else
+      {
+         //
+         // Note that this means NO servlet supports whatever
+         // method was requested, anywhere on this server.
+         //
+
+         String errMsg = lStrings.getString("http.method_not_implemented");
+         Object[] errArgs = new Object[1];
+         errArgs[0] = method;
+         errMsg = MessageFormat.format(errMsg, errArgs);
+
+         resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
+      }
+   }
+
+   /*
+    * Sets the Last-Modified entity header field, if it has not already been set
+    * and if the value is meaningful. Called before doGet, to ensure that
+    * headers are set before response data is written. A subclass might have set
+    * this header already, so we check.
+    */
+
+   private void maybeSetLastModified(HttpServletResponse resp, long lastModified)
+   {
+      if (resp.containsHeader(HEADER_LASTMOD))
+         return;
+      if (lastModified >= 0)
+         resp.setDateHeader(HEADER_LASTMOD, lastModified);
+   }
+
+   /**
+    * Dispatches client requests to the protected <code>service</code> method.
+    * There's no need to override this method.
+    * 
+    * @param req
+    *           the {@link HttpServletRequest} object that contains the request
+    *           the client made of the servlet
+    * @param res
+    *           the {@link HttpServletResponse} object that contains the
+    *           response the servlet returns to the client
+    * @exception IOException
+    *               if an input or output error occurs while the servlet is
+    *               handling the HTTP request
+    * @exception ServletException
+    *               if the HTTP request cannot be handled
+    * @see javax.servlet.Servlet#service
+    */
+
+   public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException
+   {
+      HttpServletRequest request;
+      HttpServletResponse response;
+
+      try
+      {
+         request = (HttpServletRequest) req;
+         response = (HttpServletResponse) res;
+      }
+      catch (ClassCastException e)
+      {
+         throw new ServletException("non-HTTP request or response");
+      }
+      service(request, response);
+   }
+}
+
+/*
+ * A response that includes no body, for use in (dumb) "HEAD" support. This just
+ * swallows that body, counting the bytes in order to set the content length
+ * appropriately. All other methods delegate directly to the HTTP Servlet
+ * Response object used to construct this one.
+ */
+// file private
+class NoBodyResponse implements HttpServletResponse
+{
+   private HttpServletResponse resp;
+
+   private NoBodyOutputStream noBody;
+
+   private PrintWriter writer;
+
+   private boolean didSetContentLength;
+
+   // file private
+   NoBodyResponse(HttpServletResponse r)
+   {
+      resp = r;
+      noBody = new NoBodyOutputStream();
+   }
+
+   // file private
+   void setContentLength()
+   {
+      if (!didSetContentLength)
+         resp.setContentLength(noBody.getContentLength());
+   }
+
+   // SERVLET RESPONSE interface methods
+
+   public void setContentLength(int len)
+   {
+      resp.setContentLength(len);
+      didSetContentLength = true;
+   }
+
+   public void setCharacterEncoding(String charset)
+   {
+      resp.setCharacterEncoding(charset);
+   }
+
+   public void setContentType(String type)
+   {
+      resp.setContentType(type);
+   }
+
+   public String getContentType()
+   {
+      return resp.getContentType();
+   }
+
+   public ServletOutputStream getOutputStream() throws IOException
+   {
+      return noBody;
+   }
+
+   public String getCharacterEncoding()
+   {
+      return resp.getCharacterEncoding();
+   }
+
+   public PrintWriter getWriter() throws UnsupportedEncodingException
+   {
+      if (writer == null)
+      {
+         OutputStreamWriter w;
+
+         w = new OutputStreamWriter(noBody, getCharacterEncoding());
+         writer = new PrintWriter(w);
+      }
+      return writer;
+   }
+
+   public void setBufferSize(int size) throws IllegalStateException
+   {
+      resp.setBufferSize(size);
+   }
+
+   public int getBufferSize()
+   {
+      return resp.getBufferSize();
+   }
+
+   public void reset() throws IllegalStateException
+   {
+      resp.reset();
+   }
+
+   public void resetBuffer() throws IllegalStateException
+   {
+      resp.resetBuffer();
+   }
+
+   public boolean isCommitted()
+   {
+      return resp.isCommitted();
+   }
+
+   public void flushBuffer() throws IOException
+   {
+      resp.flushBuffer();
+   }
+
+   public void setLocale(Locale loc)
+   {
+      resp.setLocale(loc);
+   }
+
+   public Locale getLocale()
+   {
+      return resp.getLocale();
+   }
+
+   // HTTP SERVLET RESPONSE interface methods
+
+   public void addCookie(Cookie cookie)
+   {
+      resp.addCookie(cookie);
+   }
+
+   public boolean containsHeader(String name)
+   {
+      return resp.containsHeader(name);
+   }
+
+   /** @deprecated */
+   public void setStatus(int sc, String sm)
+   {
+      resp.setStatus(sc, sm);
+   }
+
+   public void setStatus(int sc)
+   {
+      resp.setStatus(sc);
+   }
+
+   public void setHeader(String name, String value)
+   {
+      resp.setHeader(name, value);
+   }
+
+   public void setIntHeader(String name, int value)
+   {
+      resp.setIntHeader(name, value);
+   }
+
+   public void setDateHeader(String name, long date)
+   {
+      resp.setDateHeader(name, date);
+   }
+
+   public void sendError(int sc, String msg) throws IOException
+   {
+      resp.sendError(sc, msg);
+   }
+
+   public void sendError(int sc) throws IOException
+   {
+      resp.sendError(sc);
+   }
+
+   public void sendRedirect(String location) throws IOException
+   {
+      resp.sendRedirect(location);
+   }
+
+   public String encodeURL(String url)
+   {
+      return resp.encodeURL(url);
+   }
+
+   public String encodeRedirectURL(String url)
+   {
+      return resp.encodeRedirectURL(url);
+   }
+
+   public void addHeader(String name, String value)
+   {
+      resp.addHeader(name, value);
+   }
+
+   public void addDateHeader(String name, long value)
+   {
+      resp.addDateHeader(name, value);
+   }
+
+   public void addIntHeader(String name, int value)
+   {
+      resp.addIntHeader(name, value);
+   }
+
+   /**
+    * @deprecated As of Version 2.1, replaced by
+    *             {@link HttpServletResponse#encodeURL}.
+    */
+
+   public String encodeUrl(String url)
+   {
+      return this.encodeURL(url);
+   }
+
+   /**
+    * @deprecated As of Version 2.1, replaced by
+    *             {@link HttpServletResponse#encodeRedirectURL}.
+    */
+
+   public String encodeRedirectUrl(String url)
+   {
+      return this.encodeRedirectURL(url);
+   }
+
+}
+
+/*
+ * Servlet output stream that gobbles up all its data.
+ */
+
+// file private
+class NoBodyOutputStream extends ServletOutputStream
+{
+
+   private static final String LSTRING_FILE = "javax.servlet.http.LocalStrings";
+
+   private static ResourceBundle lStrings = ResourceBundle.getBundle(LSTRING_FILE);
+
+   private int contentLength = 0;
+
+   // file private
+   NoBodyOutputStream()
+   {
+   }
+
+   // file private
+   int getContentLength()
+   {
+      return contentLength;
+   }
+
+   public void write(int b)
+   {
+      contentLength++;
+   }
+
+   public void write(byte buf[], int offset, int len) throws IOException
+   {
+      if (len >= 0)
+      {
+         contentLength += len;
+      }
+      else
+      {
+         // XXX
+         // isn't this really an IllegalArgumentException?
+
+         String msg = lStrings.getString("err.io.negativelength");
+         throw new IOException(msg);
+      }
+   }
+}

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpServletRequest.java
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpServletRequest.java	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpServletRequest.java	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,465 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package javax.servlet.http;
+
+import javax.servlet.ServletRequest;
+import java.util.Enumeration;
+
+/**
+ * Extends the {@link javax.servlet.ServletRequest} interface to provide request
+ * information for HTTP servlets.
+ * <p>
+ * The servlet container creates an <code>HttpServletRequest</code> object and
+ * passes it as an argument to the servlet's service methods (<code>doGet</code>,
+ * <code>doPost</code>, etc).
+ * 
+ * @author Various
+ */
+
+public interface HttpServletRequest extends ServletRequest
+{
+
+   /**
+    * String identifier for Basic authentication. Value "BASIC"
+    */
+   public static final String BASIC_AUTH = "BASIC";
+
+   /**
+    * String identifier for Form authentication. Value "FORM"
+    */
+   public static final String FORM_AUTH = "FORM";
+
+   /**
+    * String identifier for Client Certificate authentication. Value
+    * "CLIENT_CERT"
+    */
+   public static final String CLIENT_CERT_AUTH = "CLIENT_CERT";
+
+   /**
+    * String identifier for Digest authentication. Value "DIGEST"
+    */
+   public static final String DIGEST_AUTH = "DIGEST";
+
+   /**
+    * Returns the name of the authentication scheme used to protect the servlet.
+    * All servlet containers support basic, form and client certificate
+    * authentication, and may additionally support digest authentication. If the
+    * servlet is not authenticated <code>null</code> is returned.
+    * <p>
+    * Same as the value of the CGI variable AUTH_TYPE.
+    * 
+    * @return one of the static members BASIC_AUTH, FORM_AUTH, CLIENT_CERT_AUTH,
+    *         DIGEST_AUTH (suitable for == comparison) or the container-specific
+    *         string indicating the authentication scheme, or <code>null</code>
+    *         if the request was not authenticated.
+    */
+
+   public String getAuthType();
+
+   /**
+    * Returns an array containing all of the <code>Cookie</code> objects the
+    * client sent with this request. This method returns <code>null</code> if
+    * no cookies were sent.
+    * 
+    * @return an array of all the <code>Cookies</code> included with this
+    *         request, or <code>null</code> if the request has no cookies
+    */
+
+   public Cookie[] getCookies();
+
+   /**
+    * Returns the value of the specified request header as a <code>long</code>
+    * value that represents a <code>Date</code> object. Use this method with
+    * headers that contain dates, such as <code>If-Modified-Since</code>.
+    * <p>
+    * The date is returned as the number of milliseconds since January 1, 1970
+    * GMT. The header name is case insensitive.
+    * <p>
+    * If the request did not have a header of the specified name, this method
+    * returns -1. If the header can't be converted to a date, the method throws
+    * an <code>IllegalArgumentException</code>.
+    * 
+    * @param name
+    *           a <code>String</code> specifying the name of the header
+    * @return a <code>long</code> value representing the date specified in the
+    *         header expressed as the number of milliseconds since January 1,
+    *         1970 GMT, or -1 if the named header was not included with the
+    *         request
+    * @exception IllegalArgumentException
+    *               If the header value can't be converted to a date
+    */
+
+   public long getDateHeader(String name);
+
+   /**
+    * Returns the value of the specified request header as a <code>String</code>.
+    * If the request did not include a header of the specified name, this method
+    * returns <code>null</code>. If there are multiple headers with the same
+    * name, this method returns the first head in the request. The header name
+    * is case insensitive. You can use this method with any request header.
+    * 
+    * @param name
+    *           a <code>String</code> specifying the header name
+    * @return a <code>String</code> containing the value of the requested
+    *         header, or <code>null</code> if the request does not have a
+    *         header of that name
+    */
+
+   public String getHeader(String name);
+
+   /**
+    * Returns all the values of the specified request header as an
+    * <code>Enumeration</code> of <code>String</code> objects.
+    * <p>
+    * Some headers, such as <code>Accept-Language</code> can be sent by
+    * clients as several headers each with a different value rather than sending
+    * the header as a comma separated list.
+    * <p>
+    * If the request did not include any headers of the specified name, this
+    * method returns an empty <code>Enumeration</code>. The header name is
+    * case insensitive. You can use this method with any request header.
+    * 
+    * @param name
+    *           a <code>String</code> specifying the header name
+    * @return an <code>Enumeration</code> containing the values of the
+    *         requested header. If the request does not have any headers of that
+    *         name return an empty enumeration. If the container does not allow
+    *         access to header information, return null
+    */
+
+   public Enumeration getHeaders(String name);
+
+   /**
+    * Returns an enumeration of all the header names this request contains. If
+    * the request has no headers, this method returns an empty enumeration.
+    * <p>
+    * Some servlet containers do not allow servlets to access headers using this
+    * method, in which case this method returns <code>null</code>
+    * 
+    * @return an enumeration of all the header names sent with this request; if
+    *         the request has no headers, an empty enumeration; if the servlet
+    *         container does not allow servlets to use this method,
+    *         <code>null</code>
+    */
+
+   public Enumeration getHeaderNames();
+
+   /**
+    * Returns the value of the specified request header as an <code>int</code>.
+    * If the request does not have a header of the specified name, this method
+    * returns -1. If the header cannot be converted to an integer, this method
+    * throws a <code>NumberFormatException</code>.
+    * <p>
+    * The header name is case insensitive.
+    * 
+    * @param name
+    *           a <code>String</code> specifying the name of a request header
+    * @return an integer expressing the value of the request header or -1 if the
+    *         request doesn't have a header of this name
+    * @exception NumberFormatException
+    *               If the header value can't be converted to an
+    *               <code>int</code>
+    */
+
+   public int getIntHeader(String name);
+
+   /**
+    * Returns the name of the HTTP method with which this request was made, for
+    * example, GET, POST, or PUT. Same as the value of the CGI variable
+    * REQUEST_METHOD.
+    * 
+    * @return a <code>String</code> specifying the name of the method with
+    *         which this request was made
+    */
+
+   public String getMethod();
+
+   /**
+    * Returns any extra path information associated with the URL the client sent
+    * when it made this request. The extra path information follows the servlet
+    * path but precedes the query string and will start with a "/" character.
+    * <p>
+    * This method returns <code>null</code> if there was no extra path
+    * information.
+    * <p>
+    * Same as the value of the CGI variable PATH_INFO.
+    * 
+    * @return a <code>String</code>, decoded by the web container, specifying
+    *         extra path information that comes after the servlet path but
+    *         before the query string in the request URL; or <code>null</code>
+    *         if the URL does not have any extra path information
+    */
+
+   public String getPathInfo();
+
+   /**
+    * Returns any extra path information after the servlet name but before the
+    * query string, and translates it to a real path. Same as the value of the
+    * CGI variable PATH_TRANSLATED.
+    * <p>
+    * If the URL does not have any extra path information, this method returns
+    * <code>null</code> or the servlet container cannot translate the virtual
+    * path to a real path for any reason (such as when the web application is
+    * executed from an archive). The web container does not decode this string.
+    * 
+    * @return a <code>String</code> specifying the real path, or
+    *         <code>null</code> if the URL does not have any extra path
+    *         information
+    */
+
+   public String getPathTranslated();
+
+   /**
+    * Returns the portion of the request URI that indicates the context of the
+    * request. The context path always comes first in a request URI. The path
+    * starts with a "/" character but does not end with a "/" character. For
+    * servlets in the default (root) context, this method returns "". The
+    * container does not decode this string.
+    * <p>
+    * It is possible that a servlet container may match a context by more than
+    * one context path. In such cases this method will return the actual context
+    * path used by the request and it may differ from the path returned by the
+    * {@link javax.servlet.ServletContext#getContextPath()} method. The context
+    * path returned by {@link javax.servlet.ServletContext#getContextPath()}
+    * should be considered as the prime or preferred context path of the
+    * application.
+    * 
+    * @return a <code>String</code> specifying the portion of the request URI
+    *         that indicates the context of the request
+    * @see javax.servlet.ServletContext#getContextPath()
+    */
+
+   public String getContextPath();
+
+   /**
+    * Returns the query string that is contained in the request URL after the
+    * path. This method returns <code>null</code> if the URL does not have a
+    * query string. Same as the value of the CGI variable QUERY_STRING.
+    * 
+    * @return a <code>String</code> containing the query string or
+    *         <code>null</code> if the URL contains no query string. The value
+    *         is not decoded by the container.
+    */
+
+   public String getQueryString();
+
+   /**
+    * Returns the login of the user making this request, if the user has been
+    * authenticated, or <code>null</code> if the user has not been
+    * authenticated. Whether the user name is sent with each subsequent request
+    * depends on the browser and type of authentication. Same as the value of
+    * the CGI variable REMOTE_USER.
+    * 
+    * @return a <code>String</code> specifying the login of the user making
+    *         this request, or <code>null</code> if the user login is not
+    *         known
+    */
+
+   public String getRemoteUser();
+
+   /**
+    * Returns a boolean indicating whether the authenticated user is included in
+    * the specified logical "role". Roles and role membership can be defined
+    * using deployment descriptors. If the user has not been authenticated, the
+    * method returns <code>false</code>.
+    * 
+    * @param role
+    *           a <code>String</code> specifying the name of the role
+    * @return a <code>boolean</code> indicating whether the user making this
+    *         request belongs to a given role; <code>false</code> if the user
+    *         has not been authenticated
+    */
+
+   public boolean isUserInRole(String role);
+
+   /**
+    * Returns a <code>java.security.Principal</code> object containing the
+    * name of the current authenticated user. If the user has not been
+    * authenticated, the method returns <code>null</code>.
+    * 
+    * @return a <code>java.security.Principal</code> containing the name of
+    *         the user making this request; <code>null</code> if the user has
+    *         not been authenticated
+    */
+
+   public java.security.Principal getUserPrincipal();
+
+   /**
+    * Returns the session ID specified by the client. This may not be the same
+    * as the ID of the current valid session for this request. If the client did
+    * not specify a session ID, this method returns <code>null</code>.
+    * 
+    * @return a <code>String</code> specifying the session ID, or
+    *         <code>null</code> if the request did not specify a session ID
+    * @see #isRequestedSessionIdValid
+    */
+
+   public String getRequestedSessionId();
+
+   /**
+    * Returns the part of this request's URL from the protocol name up to the
+    * query string in the first line of the HTTP request. The web container does
+    * not decode this String. For example: <table summary="Examples of Returned
+    * Values">
+    * <tr align=left>
+    * <th>First line of HTTP request </th>
+    * <th> Returned Value</th>
+    * <tr>
+    * <td>POST /some/path.html HTTP/1.1
+    * <td>
+    * <td>/some/path.html
+    * <tr>
+    * <td>GET http://foo.bar/a.html HTTP/1.0
+    * <td>
+    * <td>/a.html
+    * <tr>
+    * <td>HEAD /xyz?a=b HTTP/1.1
+    * <td>
+    * <td>/xyz </table>
+    * <p>
+    * To reconstruct an URL with a scheme and host, use
+    * {@link HttpUtils#getRequestURL}.
+    * 
+    * @return a <code>String</code> containing the part of the URL from the
+    *         protocol name up to the query string
+    * @see HttpUtils#getRequestURL
+    */
+
+   public String getRequestURI();
+
+   /**
+    * Reconstructs the URL the client used to make the request. The returned URL
+    * contains a protocol, server name, port number, and server path, but it
+    * does not include query string parameters.
+    * <p>
+    * If this request has been forwarded using
+    * {@link javax.servlet.RequestDispatcher#forward}, the server path in the
+    * reconstructed URL must reflect the path used to obtain the
+    * RequestDispatcher, and not the server path specified by the client.
+    * <p>
+    * Because this method returns a <code>StringBuffer</code>, not a string,
+    * you can modify the URL easily, for example, to append query parameters.
+    * <p>
+    * This method is useful for creating redirect messages and for reporting
+    * errors.
+    * 
+    * @return a <code>StringBuffer</code> object containing the reconstructed
+    *         URL
+    */
+   public StringBuffer getRequestURL();
+
+   /**
+    * Returns the part of this request's URL that calls the servlet. This path
+    * starts with a "/" character and includes either the servlet name or a path
+    * to the servlet, but does not include any extra path information or a query
+    * string. Same as the value of the CGI variable SCRIPT_NAME.
+    * <p>
+    * This method will return an empty string ("") if the servlet used to
+    * process this request was matched using the "/*" pattern.
+    * 
+    * @return a <code>String</code> containing the name or path of the servlet
+    *         being called, as specified in the request URL, decoded, or an
+    *         empty string if the servlet used to process the request is matched
+    *         using the "/*" pattern.
+    */
+
+   public String getServletPath();
+
+   /**
+    * Returns the current <code>HttpSession</code> associated with this
+    * request or, if there is no current session and <code>create</code> is
+    * true, returns a new session.
+    * <p>
+    * If <code>create</code> is <code>false</code> and the request has no
+    * valid <code>HttpSession</code>, this method returns <code>null</code>.
+    * <p>
+    * To make sure the session is properly maintained, you must call this method
+    * before the response is committed. If the container is using cookies to
+    * maintain session integrity and is asked to create a new session when the
+    * response is committed, an IllegalStateException is thrown.
+    * 
+    * @param create
+    *           <code>true</code> to create a new session for this request if
+    *           necessary; <code>false</code> to return <code>null</code> if
+    *           there's no current session
+    * @return the <code>HttpSession</code> associated with this request or
+    *         <code>null</code> if <code>create</code> is <code>false</code>
+    *         and the request has no valid session
+    * @see #getSession()
+    */
+
+   public HttpSession getSession(boolean create);
+
+   /**
+    * Returns the current session associated with this request, or if the
+    * request does not have a session, creates one.
+    * 
+    * @return the <code>HttpSession</code> associated with this request
+    * @see #getSession(boolean)
+    */
+
+   public HttpSession getSession();
+
+   /**
+    * Checks whether the requested session ID is still valid.
+    * <p>
+    * If the client did not specify any session ID, this method returns
+    * <code>false</code>.
+    * 
+    * @return <code>true</code> if this request has an id for a valid session
+    *         in the current session context; <code>false</code> otherwise
+    * @see #getRequestedSessionId
+    * @see #getSession
+    * @see HttpSessionContext
+    */
+
+   public boolean isRequestedSessionIdValid();
+
+   /**
+    * Checks whether the requested session ID came in as a cookie.
+    * 
+    * @return <code>true</code> if the session ID came in as a cookie;
+    *         otherwise, <code>false</code>
+    * @see #getSession
+    */
+
+   public boolean isRequestedSessionIdFromCookie();
+
+   /**
+    * Checks whether the requested session ID came in as part of the request
+    * URL.
+    * 
+    * @return <code>true</code> if the session ID came in as part of a URL;
+    *         otherwise, <code>false</code>
+    * @see #getSession
+    */
+
+   public boolean isRequestedSessionIdFromURL();
+
+   /**
+    * @deprecated As of Version 2.1 of the Java Servlet API, use
+    *             {@link #isRequestedSessionIdFromURL} instead.
+    */
+
+   public boolean isRequestedSessionIdFromUrl();
+
+}

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpServletRequestWrapper.java
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpServletRequestWrapper.java	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpServletRequestWrapper.java	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,290 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package javax.servlet.http;
+
+import javax.servlet.ServletRequestWrapper;
+import java.util.Enumeration;
+
+/**
+ * Provides a convenient implementation of the HttpServletRequest interface that
+ * can be subclassed by developers wishing to adapt the request to a Servlet.
+ * This class implements the Wrapper or Decorator pattern. Methods default to
+ * calling through to the wrapped request object.
+ * 
+ * @see javax.servlet.http.HttpServletRequest
+ * @since v 2.3
+ */
+
+public class HttpServletRequestWrapper extends ServletRequestWrapper implements HttpServletRequest
+{
+
+   /**
+    * Constructs a request object wrapping the given request.
+    * 
+    * @throws java.lang.IllegalArgumentException
+    *            if the request is null
+    */
+   public HttpServletRequestWrapper(HttpServletRequest request)
+   {
+      super(request);
+   }
+
+   private HttpServletRequest _getHttpServletRequest()
+   {
+      return (HttpServletRequest) super.getRequest();
+   }
+
+   /**
+    * The default behavior of this method is to return getAuthType() on the
+    * wrapped request object.
+    */
+
+   public String getAuthType()
+   {
+      return this._getHttpServletRequest().getAuthType();
+   }
+
+   /**
+    * The default behavior of this method is to return getCookies() on the
+    * wrapped request object.
+    */
+   public Cookie[] getCookies()
+   {
+      return this._getHttpServletRequest().getCookies();
+   }
+
+   /**
+    * The default behavior of this method is to return getDateHeader(String
+    * name) on the wrapped request object.
+    */
+   public long getDateHeader(String name)
+   {
+      return this._getHttpServletRequest().getDateHeader(name);
+   }
+
+   /**
+    * The default behavior of this method is to return getHeader(String name) on
+    * the wrapped request object.
+    */
+   public String getHeader(String name)
+   {
+      return this._getHttpServletRequest().getHeader(name);
+   }
+
+   /**
+    * The default behavior of this method is to return getHeaders(String name)
+    * on the wrapped request object.
+    */
+   public Enumeration getHeaders(String name)
+   {
+      return this._getHttpServletRequest().getHeaders(name);
+   }
+
+   /**
+    * The default behavior of this method is to return getHeaderNames() on the
+    * wrapped request object.
+    */
+
+   public Enumeration getHeaderNames()
+   {
+      return this._getHttpServletRequest().getHeaderNames();
+   }
+
+   /**
+    * The default behavior of this method is to return getIntHeader(String name)
+    * on the wrapped request object.
+    */
+
+   public int getIntHeader(String name)
+   {
+      return this._getHttpServletRequest().getIntHeader(name);
+   }
+
+   /**
+    * The default behavior of this method is to return getMethod() on the
+    * wrapped request object.
+    */
+   public String getMethod()
+   {
+      return this._getHttpServletRequest().getMethod();
+   }
+
+   /**
+    * The default behavior of this method is to return getPathInfo() on the
+    * wrapped request object.
+    */
+   public String getPathInfo()
+   {
+      return this._getHttpServletRequest().getPathInfo();
+   }
+
+   /**
+    * The default behavior of this method is to return getPathTranslated() on
+    * the wrapped request object.
+    */
+
+   public String getPathTranslated()
+   {
+      return this._getHttpServletRequest().getPathTranslated();
+   }
+
+   /**
+    * The default behavior of this method is to return getContextPath() on the
+    * wrapped request object.
+    */
+   public String getContextPath()
+   {
+      return this._getHttpServletRequest().getContextPath();
+   }
+
+   /**
+    * The default behavior of this method is to return getQueryString() on the
+    * wrapped request object.
+    */
+   public String getQueryString()
+   {
+      return this._getHttpServletRequest().getQueryString();
+   }
+
+   /**
+    * The default behavior of this method is to return getRemoteUser() on the
+    * wrapped request object.
+    */
+   public String getRemoteUser()
+   {
+      return this._getHttpServletRequest().getRemoteUser();
+   }
+
+   /**
+    * The default behavior of this method is to return isUserInRole(String role)
+    * on the wrapped request object.
+    */
+   public boolean isUserInRole(String role)
+   {
+      return this._getHttpServletRequest().isUserInRole(role);
+   }
+
+   /**
+    * The default behavior of this method is to return getUserPrincipal() on the
+    * wrapped request object.
+    */
+   public java.security.Principal getUserPrincipal()
+   {
+      return this._getHttpServletRequest().getUserPrincipal();
+   }
+
+   /**
+    * The default behavior of this method is to return getRequestedSessionId()
+    * on the wrapped request object.
+    */
+   public String getRequestedSessionId()
+   {
+      return this._getHttpServletRequest().getRequestedSessionId();
+   }
+
+   /**
+    * The default behavior of this method is to return getRequestURI() on the
+    * wrapped request object.
+    */
+   public String getRequestURI()
+   {
+      return this._getHttpServletRequest().getRequestURI();
+   }
+
+   /**
+    * The default behavior of this method is to return getRequestURL() on the
+    * wrapped request object.
+    */
+   public StringBuffer getRequestURL()
+   {
+      return this._getHttpServletRequest().getRequestURL();
+   }
+
+   /**
+    * The default behavior of this method is to return getServletPath() on the
+    * wrapped request object.
+    */
+   public String getServletPath()
+   {
+      return this._getHttpServletRequest().getServletPath();
+   }
+
+   /**
+    * The default behavior of this method is to return getSession(boolean
+    * create) on the wrapped request object.
+    */
+   public HttpSession getSession(boolean create)
+   {
+      return this._getHttpServletRequest().getSession(create);
+   }
+
+   /**
+    * The default behavior of this method is to return getSession() on the
+    * wrapped request object.
+    */
+   public HttpSession getSession()
+   {
+      return this._getHttpServletRequest().getSession();
+   }
+
+   /**
+    * The default behavior of this method is to return
+    * isRequestedSessionIdValid() on the wrapped request object.
+    */
+
+   public boolean isRequestedSessionIdValid()
+   {
+      return this._getHttpServletRequest().isRequestedSessionIdValid();
+   }
+
+   /**
+    * The default behavior of this method is to return
+    * isRequestedSessionIdFromCookie() on the wrapped request object.
+    */
+   public boolean isRequestedSessionIdFromCookie()
+   {
+      return this._getHttpServletRequest().isRequestedSessionIdFromCookie();
+   }
+
+   /**
+    * The default behavior of this method is to return
+    * isRequestedSessionIdFromURL() on the wrapped request object.
+    */
+   public boolean isRequestedSessionIdFromURL()
+   {
+      return this._getHttpServletRequest().isRequestedSessionIdFromURL();
+   }
+
+   /**
+    * The default behavior of this method is to return
+    * isRequestedSessionIdFromUrl() on the wrapped request object. *
+    * 
+    * @deprecated As of Version 2.1 of the Java Servlet API, use
+    *             {@link #isRequestedSessionIdFromURL} instead.
+    */
+   @Deprecated
+   public boolean isRequestedSessionIdFromUrl()
+   {
+      return this._getHttpServletRequest().isRequestedSessionIdFromUrl();
+   }
+
+}

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpServletResponse.java
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpServletResponse.java	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpServletResponse.java	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,621 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package javax.servlet.http;
+
+import java.io.IOException;
+
+import javax.servlet.ServletResponse;
+
+/**
+ * Extends the {@link ServletResponse} interface to provide HTTP-specific
+ * functionality in sending a response. For example, it has methods to access
+ * HTTP headers and cookies.
+ * <p>
+ * The servlet container creates an <code>HttpServletResponse</code> object
+ * and passes it as an argument to the servlet's service methods (<code>doGet</code>,
+ * <code>doPost</code>, etc).
+ * 
+ * @author Various
+ * @see javax.servlet.ServletResponse
+ */
+
+public interface HttpServletResponse extends ServletResponse
+{
+
+   /**
+    * Adds the specified cookie to the response. This method can be called
+    * multiple times to set more than one cookie.
+    * 
+    * @param cookie
+    *           the Cookie to return to the client
+    */
+
+   public void addCookie(Cookie cookie);
+
+   /**
+    * Returns a boolean indicating whether the named response header has already
+    * been set.
+    * 
+    * @param name
+    *           the header name
+    * @return <code>true</code> if the named response header has already been
+    *         set; <code>false</code> otherwise
+    */
+
+   public boolean containsHeader(String name);
+
+   /**
+    * Encodes the specified URL by including the session ID in it, or, if
+    * encoding is not needed, returns the URL unchanged. The implementation of
+    * this method includes the logic to determine whether the session ID needs
+    * to be encoded in the URL. For example, if the browser supports cookies, or
+    * session tracking is turned off, URL encoding is unnecessary.
+    * <p>
+    * For robust session tracking, all URLs emitted by a servlet should be run
+    * through this method. Otherwise, URL rewriting cannot be used with browsers
+    * which do not support cookies.
+    * 
+    * @param url
+    *           the url to be encoded.
+    * @return the encoded URL if encoding is needed; the unchanged URL
+    *         otherwise.
+    */
+
+   public String encodeURL(String url);
+
+   /**
+    * Encodes the specified URL for use in the <code>sendRedirect</code>
+    * method or, if encoding is not needed, returns the URL unchanged. The
+    * implementation of this method includes the logic to determine whether the
+    * session ID needs to be encoded in the URL. Because the rules for making
+    * this determination can differ from those used to decide whether to encode
+    * a normal link, this method is separated from the <code>encodeURL</code>
+    * method.
+    * <p>
+    * All URLs sent to the <code>HttpServletResponse.sendRedirect</code>
+    * method should be run through this method. Otherwise, URL rewriting cannot
+    * be used with browsers which do not support cookies.
+    * 
+    * @param url
+    *           the url to be encoded.
+    * @return the encoded URL if encoding is needed; the unchanged URL
+    *         otherwise.
+    * @see #sendRedirect
+    * @see #encodeUrl
+    */
+
+   public String encodeRedirectURL(String url);
+
+   /**
+    * @deprecated As of version 2.1, use encodeURL(String url) instead
+    * @param url
+    *           the url to be encoded.
+    * @return the encoded URL if encoding is needed; the unchanged URL
+    *         otherwise.
+    */
+
+   public String encodeUrl(String url);
+
+   /**
+    * @deprecated As of version 2.1, use encodeRedirectURL(String url) instead
+    * @param url
+    *           the url to be encoded.
+    * @return the encoded URL if encoding is needed; the unchanged URL
+    *         otherwise.
+    */
+
+   public String encodeRedirectUrl(String url);
+
+   /**
+    * Sends an error response to the client using the specified status. The
+    * server defaults to creating the response to look like an HTML-formatted
+    * server error page containing the specified message, setting the content
+    * type to "text/html", leaving cookies and other headers unmodified. If an
+    * error-page declaration has been made for the web application corresponding
+    * to the status code passed in, it will be served back in preference to the
+    * suggested msg parameter.
+    * <p>
+    * If the response has already been committed, this method throws an
+    * IllegalStateException. After using this method, the response should be
+    * considered to be committed and should not be written to.
+    * 
+    * @param sc
+    *           the error status code
+    * @param msg
+    *           the descriptive message
+    * @exception IOException
+    *               If an input or output exception occurs
+    * @exception IllegalStateException
+    *               If the response was committed
+    */
+
+   public void sendError(int sc, String msg) throws IOException;
+
+   /**
+    * Sends an error response to the client using the specified status code and
+    * clearing the buffer.
+    * <p>
+    * If the response has already been committed, this method throws an
+    * IllegalStateException. After using this method, the response should be
+    * considered to be committed and should not be written to.
+    * 
+    * @param sc
+    *           the error status code
+    * @exception IOException
+    *               If an input or output exception occurs
+    * @exception IllegalStateException
+    *               If the response was committed before this method call
+    */
+
+   public void sendError(int sc) throws IOException;
+
+   /**
+    * Sends a temporary redirect response to the client using the specified
+    * redirect location URL. This method can accept relative URLs; the servlet
+    * container must convert the relative URL to an absolute URL before sending
+    * the response to the client. If the location is relative without a leading
+    * '/' the container interprets it as relative to the current request URI. If
+    * the location is relative with a leading '/' the container interprets it as
+    * relative to the servlet container root.
+    * <p>
+    * If the response has already been committed, this method throws an
+    * IllegalStateException. After using this method, the response should be
+    * considered to be committed and should not be written to.
+    * 
+    * @param location
+    *           the redirect location URL
+    * @exception IOException
+    *               If an input or output exception occurs
+    * @exception IllegalStateException
+    *               If the response was committed or if a partial URL is given
+    *               and cannot be converted into a valid URL
+    */
+
+   public void sendRedirect(String location) throws IOException;
+
+   /**
+    * Sets a response header with the given name and date-value. The date is
+    * specified in terms of milliseconds since the epoch. If the header had
+    * already been set, the new value overwrites the previous one. The
+    * <code>containsHeader</code> method can be used to test for the presence
+    * of a header before setting its value.
+    * 
+    * @param name
+    *           the name of the header to set
+    * @param date
+    *           the assigned date value
+    * @see #containsHeader
+    * @see #addDateHeader
+    */
+
+   public void setDateHeader(String name, long date);
+
+   /**
+    * Adds a response header with the given name and date-value. The date is
+    * specified in terms of milliseconds since the epoch. This method allows
+    * response headers to have multiple values.
+    * 
+    * @param name
+    *           the name of the header to set
+    * @param date
+    *           the additional date value
+    * @see #setDateHeader
+    */
+
+   public void addDateHeader(String name, long date);
+
+   /**
+    * Sets a response header with the given name and value. If the header had
+    * already been set, the new value overwrites the previous one. The
+    * <code>containsHeader</code> method can be used to test for the presence
+    * of a header before setting its value.
+    * 
+    * @param name
+    *           the name of the header
+    * @param value
+    *           the header value If it contains octet string, it should be
+    *           encoded according to RFC 2047
+    *           (http://www.ietf.org/rfc/rfc2047.txt)
+    * @see #containsHeader
+    * @see #addHeader
+    */
+
+   public void setHeader(String name, String value);
+
+   /**
+    * Adds a response header with the given name and value. This method allows
+    * response headers to have multiple values.
+    * 
+    * @param name
+    *           the name of the header
+    * @param value
+    *           the additional header value If it contains octet string, it
+    *           should be encoded according to RFC 2047
+    *           (http://www.ietf.org/rfc/rfc2047.txt)
+    * @see #setHeader
+    */
+
+   public void addHeader(String name, String value);
+
+   /**
+    * Sets a response header with the given name and integer value. If the
+    * header had already been set, the new value overwrites the previous one.
+    * The <code>containsHeader</code> method can be used to test for the
+    * presence of a header before setting its value.
+    * 
+    * @param name
+    *           the name of the header
+    * @param value
+    *           the assigned integer value
+    * @see #containsHeader
+    * @see #addIntHeader
+    */
+
+   public void setIntHeader(String name, int value);
+
+   /**
+    * Adds a response header with the given name and integer value. This method
+    * allows response headers to have multiple values.
+    * 
+    * @param name
+    *           the name of the header
+    * @param value
+    *           the assigned integer value
+    * @see #setIntHeader
+    */
+
+   public void addIntHeader(String name, int value);
+
+   /**
+    * Sets the status code for this response. This method is used to set the
+    * return status code when there is no error (for example, for the status
+    * codes SC_OK or SC_MOVED_TEMPORARILY). If there is an error, and the caller
+    * wishes to invoke an error-page defined in the web application, the
+    * <code>sendError</code> method should be used instead.
+    * <p>
+    * The container clears the buffer and sets the Location header, preserving
+    * cookies and other headers.
+    * 
+    * @param sc
+    *           the status code
+    * @see #sendError
+    */
+
+   public void setStatus(int sc);
+
+   /**
+    * @deprecated As of version 2.1, due to ambiguous meaning of the message
+    *             parameter. To set a status code use
+    *             <code>setStatus(int)</code>, to send an error with a
+    *             description use <code>sendError(int, String)</code>. Sets
+    *             the status code and message for this response.
+    * @param sc
+    *           the status code
+    * @param sm
+    *           the status message
+    */
+
+   public void setStatus(int sc, String sm);
+
+   /*
+    * Server status codes; see RFC 2068.
+    */
+
+   /**
+    * Status code (100) indicating the client can continue.
+    */
+
+   public static final int SC_CONTINUE = 100;
+
+   /**
+    * Status code (101) indicating the server is switching protocols according
+    * to Upgrade header.
+    */
+
+   public static final int SC_SWITCHING_PROTOCOLS = 101;
+
+   /**
+    * Status code (200) indicating the request succeeded normally.
+    */
+
+   public static final int SC_OK = 200;
+
+   /**
+    * Status code (201) indicating the request succeeded and created a new
+    * resource on the server.
+    */
+
+   public static final int SC_CREATED = 201;
+
+   /**
+    * Status code (202) indicating that a request was accepted for processing,
+    * but was not completed.
+    */
+
+   public static final int SC_ACCEPTED = 202;
+
+   /**
+    * Status code (203) indicating that the meta information presented by the
+    * client did not originate from the server.
+    */
+
+   public static final int SC_NON_AUTHORITATIVE_INFORMATION = 203;
+
+   /**
+    * Status code (204) indicating that the request succeeded but that there was
+    * no new information to return.
+    */
+
+   public static final int SC_NO_CONTENT = 204;
+
+   /**
+    * Status code (205) indicating that the agent <em>SHOULD</em> reset the
+    * document view which caused the request to be sent.
+    */
+
+   public static final int SC_RESET_CONTENT = 205;
+
+   /**
+    * Status code (206) indicating that the server has fulfilled the partial GET
+    * request for the resource.
+    */
+
+   public static final int SC_PARTIAL_CONTENT = 206;
+
+   /**
+    * Status code (300) indicating that the requested resource corresponds to
+    * any one of a set of representations, each with its own specific location.
+    */
+
+   public static final int SC_MULTIPLE_CHOICES = 300;
+
+   /**
+    * Status code (301) indicating that the resource has permanently moved to a
+    * new location, and that future references should use a new URI with their
+    * requests.
+    */
+
+   public static final int SC_MOVED_PERMANENTLY = 301;
+
+   /**
+    * Status code (302) indicating that the resource has temporarily moved to
+    * another location, but that future references should still use the original
+    * URI to access the resource. This definition is being retained for
+    * backwards compatibility. SC_FOUND is now the preferred definition.
+    */
+
+   public static final int SC_MOVED_TEMPORARILY = 302;
+
+   /**
+    * Status code (302) indicating that the resource reside temporarily under a
+    * different URI. Since the redirection might be altered on occasion, the
+    * client should continue to use the Request-URI for future
+    * requests.(HTTP/1.1) To represent the status code (302), it is recommended
+    * to use this variable.
+    */
+
+   public static final int SC_FOUND = 302;
+
+   /**
+    * Status code (303) indicating that the response to the request can be found
+    * under a different URI.
+    */
+
+   public static final int SC_SEE_OTHER = 303;
+
+   /**
+    * Status code (304) indicating that a conditional GET operation found that
+    * the resource was available and not modified.
+    */
+
+   public static final int SC_NOT_MODIFIED = 304;
+
+   /**
+    * Status code (305) indicating that the requested resource <em>MUST</em>
+    * be accessed through the proxy given by the <code><em>Location</em></code>
+    * field.
+    */
+
+   public static final int SC_USE_PROXY = 305;
+
+   /**
+    * Status code (307) indicating that the requested resource resides
+    * temporarily under a different URI. The temporary URI <em>SHOULD</em> be
+    * given by the <code><em>Location</em></code> field in the response.
+    */
+
+   public static final int SC_TEMPORARY_REDIRECT = 307;
+
+   /**
+    * Status code (400) indicating the request sent by the client was
+    * syntactically incorrect.
+    */
+
+   public static final int SC_BAD_REQUEST = 400;
+
+   /**
+    * Status code (401) indicating that the request requires HTTP
+    * authentication.
+    */
+
+   public static final int SC_UNAUTHORIZED = 401;
+
+   /**
+    * Status code (402) reserved for future use.
+    */
+
+   public static final int SC_PAYMENT_REQUIRED = 402;
+
+   /**
+    * Status code (403) indicating the server understood the request but refused
+    * to fulfill it.
+    */
+
+   public static final int SC_FORBIDDEN = 403;
+
+   /**
+    * Status code (404) indicating that the requested resource is not available.
+    */
+
+   public static final int SC_NOT_FOUND = 404;
+
+   /**
+    * Status code (405) indicating that the method specified in the
+    * <code><em>Request-Line</em></code> is not allowed for the resource
+    * identified by the <code><em>Request-URI</em></code>.
+    */
+
+   public static final int SC_METHOD_NOT_ALLOWED = 405;
+
+   /**
+    * Status code (406) indicating that the resource identified by the request
+    * is only capable of generating response entities which have content
+    * characteristics not acceptable according to the accept headers sent in the
+    * request.
+    */
+
+   public static final int SC_NOT_ACCEPTABLE = 406;
+
+   /**
+    * Status code (407) indicating that the client <em>MUST</em> first
+    * authenticate itself with the proxy.
+    */
+
+   public static final int SC_PROXY_AUTHENTICATION_REQUIRED = 407;
+
+   /**
+    * Status code (408) indicating that the client did not produce a request
+    * within the time that the server was prepared to wait.
+    */
+
+   public static final int SC_REQUEST_TIMEOUT = 408;
+
+   /**
+    * Status code (409) indicating that the request could not be completed due
+    * to a conflict with the current state of the resource.
+    */
+
+   public static final int SC_CONFLICT = 409;
+
+   /**
+    * Status code (410) indicating that the resource is no longer available at
+    * the server and no forwarding address is known. This condition
+    * <em>SHOULD</em> be considered permanent.
+    */
+
+   public static final int SC_GONE = 410;
+
+   /**
+    * Status code (411) indicating that the request cannot be handled without a
+    * defined <code><em>Content-Length</em></code>.
+    */
+
+   public static final int SC_LENGTH_REQUIRED = 411;
+
+   /**
+    * Status code (412) indicating that the precondition given in one or more of
+    * the request-header fields evaluated to false when it was tested on the
+    * server.
+    */
+
+   public static final int SC_PRECONDITION_FAILED = 412;
+
+   /**
+    * Status code (413) indicating that the server is refusing to process the
+    * request because the request entity is larger than the server is willing or
+    * able to process.
+    */
+
+   public static final int SC_REQUEST_ENTITY_TOO_LARGE = 413;
+
+   /**
+    * Status code (414) indicating that the server is refusing to service the
+    * request because the <code><em>Request-URI</em></code> is longer than
+    * the server is willing to interpret.
+    */
+
+   public static final int SC_REQUEST_URI_TOO_LONG = 414;
+
+   /**
+    * Status code (415) indicating that the server is refusing to service the
+    * request because the entity of the request is in a format not supported by
+    * the requested resource for the requested method.
+    */
+
+   public static final int SC_UNSUPPORTED_MEDIA_TYPE = 415;
+
+   /**
+    * Status code (416) indicating that the server cannot serve the requested
+    * byte range.
+    */
+
+   public static final int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
+
+   /**
+    * Status code (417) indicating that the server could not meet the
+    * expectation given in the Expect request header.
+    */
+
+   public static final int SC_EXPECTATION_FAILED = 417;
+
+   /**
+    * Status code (500) indicating an error inside the HTTP server which
+    * prevented it from fulfilling the request.
+    */
+
+   public static final int SC_INTERNAL_SERVER_ERROR = 500;
+
+   /**
+    * Status code (501) indicating the HTTP server does not support the
+    * functionality needed to fulfill the request.
+    */
+
+   public static final int SC_NOT_IMPLEMENTED = 501;
+
+   /**
+    * Status code (502) indicating that the HTTP server received an invalid
+    * response from a server it consulted when acting as a proxy or gateway.
+    */
+
+   public static final int SC_BAD_GATEWAY = 502;
+
+   /**
+    * Status code (503) indicating that the HTTP server is temporarily
+    * overloaded, and unable to handle the request.
+    */
+
+   public static final int SC_SERVICE_UNAVAILABLE = 503;
+
+   /**
+    * Status code (504) indicating that the server did not receive a timely
+    * response from the upstream server while acting as a gateway or proxy.
+    */
+
+   public static final int SC_GATEWAY_TIMEOUT = 504;
+
+   /**
+    * Status code (505) indicating that the server does not support or refuses
+    * to support the HTTP protocol version that was used in the request message.
+    */
+
+   public static final int SC_HTTP_VERSION_NOT_SUPPORTED = 505;
+}

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpServletResponseWrapper.java
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpServletResponseWrapper.java	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpServletResponseWrapper.java	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,227 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package javax.servlet.http;
+
+import java.io.IOException;
+
+import javax.servlet.ServletResponseWrapper;
+
+/**
+ * Provides a convenient implementation of the HttpServletResponse interface
+ * that can be subclassed by developers wishing to adapt the response from a
+ * Servlet. This class implements the Wrapper or Decorator pattern. Methods
+ * default to calling through to the wrapped response object.
+ * 
+ * @author Various
+ * @since v 2.3
+ * @see javax.servlet.http.HttpServletResponse
+ */
+
+public class HttpServletResponseWrapper extends ServletResponseWrapper implements HttpServletResponse
+{
+
+   /**
+    * Constructs a response adaptor wrapping the given response.
+    * 
+    * @throws java.lang.IllegalArgumentException
+    *            if the response is null
+    */
+   public HttpServletResponseWrapper(HttpServletResponse response)
+   {
+      super(response);
+   }
+
+   private HttpServletResponse _getHttpServletResponse()
+   {
+      return (HttpServletResponse) super.getResponse();
+   }
+
+   /**
+    * The default behavior of this method is to call addCookie(Cookie cookie) on
+    * the wrapped response object.
+    */
+   public void addCookie(Cookie cookie)
+   {
+      this._getHttpServletResponse().addCookie(cookie);
+   }
+
+   /**
+    * The default behavior of this method is to call containsHeader(String name)
+    * on the wrapped response object.
+    */
+
+   public boolean containsHeader(String name)
+   {
+      return this._getHttpServletResponse().containsHeader(name);
+   }
+
+   /**
+    * The default behavior of this method is to call encodeURL(String url) on
+    * the wrapped response object.
+    */
+   public String encodeURL(String url)
+   {
+      return this._getHttpServletResponse().encodeURL(url);
+   }
+
+   /**
+    * The default behavior of this method is to return encodeRedirectURL(String
+    * url) on the wrapped response object.
+    */
+   public String encodeRedirectURL(String url)
+   {
+      return this._getHttpServletResponse().encodeRedirectURL(url);
+   }
+
+   /**
+    * The default behavior of this method is to call encodeUrl(String url) on
+    * the wrapped response object. *
+    * 
+    * @deprecated As of version 2.1, use encodeURL(String url) instead
+    */
+   @Deprecated
+   public String encodeUrl(String url)
+   {
+      return this._getHttpServletResponse().encodeUrl(url);
+   }
+
+   /**
+    * The default behavior of this method is to return encodeRedirectUrl(String
+    * url) on the wrapped response object.
+    * 
+    * @deprecated As of version 2.1, use encodeURL(String url) instead
+    */
+   @Deprecated
+   public String encodeRedirectUrl(String url)
+   {
+      return this._getHttpServletResponse().encodeRedirectUrl(url);
+   }
+
+   /**
+    * The default behavior of this method is to call sendError(int sc, String
+    * msg) on the wrapped response object.
+    */
+   public void sendError(int sc, String msg) throws IOException
+   {
+      this._getHttpServletResponse().sendError(sc, msg);
+   }
+
+   /**
+    * The default behavior of this method is to call sendError(int sc) on the
+    * wrapped response object.
+    */
+
+   public void sendError(int sc) throws IOException
+   {
+      this._getHttpServletResponse().sendError(sc);
+   }
+
+   /**
+    * The default behavior of this method is to return sendRedirect(String
+    * location) on the wrapped response object.
+    */
+   public void sendRedirect(String location) throws IOException
+   {
+      this._getHttpServletResponse().sendRedirect(location);
+   }
+
+   /**
+    * The default behavior of this method is to call setDateHeader(String name,
+    * long date) on the wrapped response object.
+    */
+   public void setDateHeader(String name, long date)
+   {
+      this._getHttpServletResponse().setDateHeader(name, date);
+   }
+
+   /**
+    * The default behavior of this method is to call addDateHeader(String name,
+    * long date) on the wrapped response object.
+    */
+   public void addDateHeader(String name, long date)
+   {
+      this._getHttpServletResponse().addDateHeader(name, date);
+   }
+
+   /**
+    * The default behavior of this method is to return setHeader(String name,
+    * String value) on the wrapped response object.
+    */
+   public void setHeader(String name, String value)
+   {
+      this._getHttpServletResponse().setHeader(name, value);
+   }
+
+   /**
+    * The default behavior of this method is to return addHeader(String name,
+    * String value) on the wrapped response object.
+    */
+   public void addHeader(String name, String value)
+   {
+      this._getHttpServletResponse().addHeader(name, value);
+   }
+
+   /**
+    * The default behavior of this method is to call setIntHeader(String name,
+    * int value) on the wrapped response object.
+    */
+   public void setIntHeader(String name, int value)
+   {
+      this._getHttpServletResponse().setIntHeader(name, value);
+   }
+
+   /**
+    * The default behavior of this method is to call addIntHeader(String name,
+    * int value) on the wrapped response object.
+    */
+   public void addIntHeader(String name, int value)
+   {
+      this._getHttpServletResponse().addIntHeader(name, value);
+   }
+
+   /**
+    * The default behavior of this method is to call setStatus(int sc) on the
+    * wrapped response object.
+    */
+
+   public void setStatus(int sc)
+   {
+      this._getHttpServletResponse().setStatus(sc);
+   }
+
+   /**
+    * The default behavior of this method is to call setStatus(int sc, String
+    * sm) on the wrapped response object.
+    * 
+    * @deprecated As of version 2.1, due to ambiguous meaning of the message
+    *             parameter. To set a status code use
+    *             <code>setStatus(int)</code>, to send an error with a
+    *             description use <code>sendError(int, String)</code>. Sets
+    *             the status code and message for this response.
+    */
+   @Deprecated
+   public void setStatus(int sc, String sm)
+   {
+      this._getHttpServletResponse().setStatus(sc, sm);
+   }
+
+}

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpSession.java
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpSession.java	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpSession.java	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,299 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package javax.servlet.http;
+
+import java.util.Enumeration;
+import javax.servlet.ServletContext;
+
+/**
+ * Provides a way to identify a user across more than one page request or visit
+ * to a Web site and to store information about that user.
+ * <p>
+ * The servlet container uses this interface to create a session between an HTTP
+ * client and an HTTP server. The session persists for a specified time period,
+ * across more than one connection or page request from the user. A session
+ * usually corresponds to one user, who may visit a site many times. The server
+ * can maintain a session in many ways such as using cookies or rewriting URLs.
+ * <p>
+ * This interface allows servlets to
+ * <ul>
+ * <li>View and manipulate information about a session, such as the session
+ * identifier, creation time, and last accessed time
+ * <li>Bind objects to sessions, allowing user information to persist across
+ * multiple user connections
+ * </ul>
+ * <p>
+ * When an application stores an object in or removes an object from a session,
+ * the session checks whether the object implements
+ * {@link HttpSessionBindingListener}. If it does, the servlet notifies the
+ * object that it has been bound to or unbound from the session. Notifications
+ * are sent after the binding methods complete. For session that are invalidated
+ * or expire, notifications are sent after the session has been invalidated or
+ * expired.
+ * <p>
+ * When container migrates a session between VMs in a distributed container
+ * setting, all session attributes implementing the
+ * {@link HttpSessionActivationListener} interface are notified.
+ * <p>
+ * A servlet should be able to handle cases in which the client does not choose
+ * to join a session, such as when cookies are intentionally turned off. Until
+ * the client joins the session, <code>isNew</code> returns <code>true</code>.
+ * If the client chooses not to join the session, <code>getSession</code> will
+ * return a different session on each request, and <code>isNew</code> will
+ * always return <code>true</code>.
+ * <p>
+ * Session information is scoped only to the current web application (<code>ServletContext</code>),
+ * so information stored in one context will not be directly visible in another.
+ * 
+ * @author Various
+ * @see HttpSessionBindingListener
+ * @see HttpSessionContext
+ */
+
+public interface HttpSession
+{
+
+   /**
+    * Returns the time when this session was created, measured in milliseconds
+    * since midnight January 1, 1970 GMT.
+    * 
+    * @return a <code>long</code> specifying when this session was created,
+    *         expressed in milliseconds since 1/1/1970 GMT
+    * @exception IllegalStateException
+    *               if this method is called on an invalidated session
+    */
+
+   public long getCreationTime();
+
+   /**
+    * Returns a string containing the unique identifier assigned to this
+    * session. The identifier is assigned by the servlet container and is
+    * implementation dependent.
+    * 
+    * @return a string specifying the identifier assigned to this session
+    */
+
+   public String getId();
+
+   /**
+    * Returns the last time the client sent a request associated with this
+    * session, as the number of milliseconds since midnight January 1, 1970 GMT,
+    * and marked by the time the container received the request.
+    * <p>
+    * Actions that your application takes, such as getting or setting a value
+    * associated with the session, do not affect the access time.
+    * 
+    * @return a <code>long</code> representing the last time the client sent a
+    *         request associated with this session, expressed in milliseconds
+    *         since 1/1/1970 GMT
+    * @exception IllegalStateException
+    *               if this method is called on an invalidated session
+    */
+
+   public long getLastAccessedTime();
+
+   /**
+    * Returns the ServletContext to which this session belongs.
+    * 
+    * @return The ServletContext object for the web application
+    * @since 2.3
+    */
+
+   public ServletContext getServletContext();
+
+   /**
+    * Specifies the time, in seconds, between client requests before the servlet
+    * container will invalidate this session. A negative time indicates the
+    * session should never timeout.
+    * 
+    * @param interval
+    *           An integer specifying the number of seconds
+    */
+
+   public void setMaxInactiveInterval(int interval);
+
+   /**
+    * Returns the maximum time interval, in seconds, that the servlet container
+    * will keep this session open between client accesses. After this interval,
+    * the servlet container will invalidate the session. The maximum time
+    * interval can be set with the <code>setMaxInactiveInterval</code> method.
+    * A negative time indicates the session should never timeout.
+    * 
+    * @return an integer specifying the number of seconds this session remains
+    *         open between client requests
+    * @see #setMaxInactiveInterval
+    */
+
+   public int getMaxInactiveInterval();
+
+   /**
+    * @deprecated As of Version 2.1, this method is deprecated and has no
+    *             replacement. It will be removed in a future version of the
+    *             Java Servlet API.
+    */
+
+   public HttpSessionContext getSessionContext();
+
+   /**
+    * Returns the object bound with the specified name in this session, or
+    * <code>null</code> if no object is bound under the name.
+    * 
+    * @param name
+    *           a string specifying the name of the object
+    * @return the object with the specified name
+    * @exception IllegalStateException
+    *               if this method is called on an invalidated session
+    */
+
+   public Object getAttribute(String name);
+
+   /**
+    * @deprecated As of Version 2.2, this method is replaced by
+    *             {@link #getAttribute}.
+    * @param name
+    *           a string specifying the name of the object
+    * @return the object with the specified name
+    * @exception IllegalStateException
+    *               if this method is called on an invalidated session
+    */
+
+   public Object getValue(String name);
+
+   /**
+    * Returns an <code>Enumeration</code> of <code>String</code> objects
+    * containing the names of all the objects bound to this session.
+    * 
+    * @return an <code>Enumeration</code> of <code>String</code> objects
+    *         specifying the names of all the objects bound to this session
+    * @exception IllegalStateException
+    *               if this method is called on an invalidated session
+    */
+
+   public Enumeration getAttributeNames();
+
+   /**
+    * @deprecated As of Version 2.2, this method is replaced by
+    *             {@link #getAttributeNames}
+    * @return an array of <code>String</code> objects specifying the names of
+    *         all the objects bound to this session
+    * @exception IllegalStateException
+    *               if this method is called on an invalidated session
+    */
+
+   public String[] getValueNames();
+
+   /**
+    * Binds an object to this session, using the name specified. If an object of
+    * the same name is already bound to the session, the object is replaced.
+    * <p>
+    * After this method executes, and if the new object implements
+    * <code>HttpSessionBindingListener</code>, the container calls
+    * <code>HttpSessionBindingListener.valueBound</code>. The container then
+    * notifies any <code>HttpSessionAttributeListener</code>s in the web
+    * application.
+    * <p>
+    * If an object was already bound to this session of this name that
+    * implements <code>HttpSessionBindingListener</code>, its
+    * <code>HttpSessionBindingListener.valueUnbound</code> method is called.
+    * <p>
+    * If the value passed in is null, this has the same effect as calling
+    * <code>removeAttribute()<code>.
+    *
+    *
+    * @param name			the name to which the object is bound;
+    *					cannot be null
+    *
+    * @param value			the object to be bound
+    *
+    * @exception IllegalStateException	if this method is called on an
+    *					invalidated session
+    */
+
+   public void setAttribute(String name, Object value);
+
+   /**
+    * @deprecated As of Version 2.2, this method is replaced by
+    *             {@link #setAttribute}
+    * @param name
+    *           the name to which the object is bound; cannot be null
+    * @param value
+    *           the object to be bound; cannot be null
+    * @exception IllegalStateException
+    *               if this method is called on an invalidated session
+    */
+
+   public void putValue(String name, Object value);
+
+   /**
+    * Removes the object bound with the specified name from this session. If the
+    * session does not have an object bound with the specified name, this method
+    * does nothing.
+    * <p>
+    * After this method executes, and if the object implements
+    * <code>HttpSessionBindingListener</code>, the container calls
+    * <code>HttpSessionBindingListener.valueUnbound</code>. The container
+    * then notifies any <code>HttpSessionAttributeListener</code>s in the web
+    * application.
+    * 
+    * @param name
+    *           the name of the object to remove from this session
+    * @exception IllegalStateException
+    *               if this method is called on an invalidated session
+    */
+
+   public void removeAttribute(String name);
+
+   /**
+    * @deprecated As of Version 2.2, this method is replaced by
+    *             {@link #removeAttribute}
+    * @param name
+    *           the name of the object to remove from this session
+    * @exception IllegalStateException
+    *               if this method is called on an invalidated session
+    */
+
+   public void removeValue(String name);
+
+   /**
+    * Invalidates this session then unbinds any objects bound to it.
+    * 
+    * @exception IllegalStateException
+    *               if this method is called on an already invalidated session
+    */
+
+   public void invalidate();
+
+   /**
+    * Returns <code>true</code> if the client does not yet know about the
+    * session or if the client chooses not to join the session. For example, if
+    * the server used only cookie-based sessions, and the client had disabled
+    * the use of cookies, then a session would be new on each request.
+    * 
+    * @return <code>true</code> if the server has created a session, but the
+    *         client has not yet joined
+    * @exception IllegalStateException
+    *               if this method is called on an already invalidated session
+    */
+
+   public boolean isNew();
+
+}

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpSessionActivationListener.java
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpSessionActivationListener.java	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpSessionActivationListener.java	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,44 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package javax.servlet.http;
+
+import java.util.EventListener;
+
+/**
+ * Objects that are bound to a session may listen to container * events
+ * notifying them that sessions will be passivated and that * session will be
+ * activated. A container that migrates session between VMs * or persists
+ * sessions is required to notify all attributes bound to sessions *
+ * implementing HttpSessionActivationListener. *
+ * 
+ * @since 2.3
+ */
+
+public interface HttpSessionActivationListener extends EventListener
+{
+
+   /** Notification that the session is about to be passivated. */
+   public void sessionWillPassivate(HttpSessionEvent se);
+
+   /** Notification that the session has just been activated. */
+   public void sessionDidActivate(HttpSessionEvent se);
+}

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpSessionAttributeListener.java
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpSessionAttributeListener.java	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpSessionAttributeListener.java	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,53 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package javax.servlet.http;
+
+import java.util.EventListener;
+
+/**
+ * This listener interface can be implemented in order to get notifications of
+ * changes to the attribute lists of sessions within this web application.
+ * 
+ * @since v 2.3
+ */
+
+public interface HttpSessionAttributeListener extends EventListener
+{
+   /**
+    * Notification that an attribute has been added to a session. Called after
+    * the attribute is added.
+    */
+   public void attributeAdded(HttpSessionBindingEvent se);
+
+   /**
+    * Notification that an attribute has been removed from a session. Called
+    * after the attribute is removed.
+    */
+   public void attributeRemoved(HttpSessionBindingEvent se);
+
+   /**
+    * Notification that an attribute has been replaced in a session. Called
+    * after the attribute is replaced.
+    */
+   public void attributeReplaced(HttpSessionBindingEvent se);
+
+}

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpSessionBindingEvent.java
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpSessionBindingEvent.java	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpSessionBindingEvent.java	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,125 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package javax.servlet.http;
+
+/**
+ * Events of this type are either sent to an object that implements
+ * {@link HttpSessionBindingListener} when it is bound or unbound from a
+ * session, or to a {@link HttpSessionAttributeListener} that has been
+ * configured in the deployment descriptor when any attribute is bound, unbound
+ * or replaced in a session.
+ * <p>
+ * The session binds the object by a call to
+ * <code>HttpSession.setAttribute</code> and unbinds the object by a call to
+ * <code>HttpSession.removeAttribute</code>.
+ * 
+ * @author Various
+ * @see HttpSession
+ * @see HttpSessionBindingListener
+ * @see HttpSessionAttributeListener
+ */
+
+public class HttpSessionBindingEvent extends HttpSessionEvent
+{
+
+   /* The name to which the object is being bound or unbound */
+
+   private String name;
+
+   /* The object is being bound or unbound */
+
+   private Object value;
+
+   /**
+    * Constructs an event that notifies an object that it has been bound to or
+    * unbound from a session. To receive the event, the object must implement
+    * {@link HttpSessionBindingListener}.
+    * 
+    * @param session
+    *           the session to which the object is bound or unbound
+    * @param name
+    *           the name with which the object is bound or unbound
+    * @see #getName
+    * @see #getSession
+    */
+
+   public HttpSessionBindingEvent(HttpSession session, String name)
+   {
+      super(session);
+      this.name = name;
+   }
+
+   /**
+    * Constructs an event that notifies an object that it has been bound to or
+    * unbound from a session. To receive the event, the object must implement
+    * {@link HttpSessionBindingListener}.
+    * 
+    * @param session
+    *           the session to which the object is bound or unbound
+    * @param name
+    *           the name with which the object is bound or unbound
+    * @see #getName
+    * @see #getSession
+    */
+
+   public HttpSessionBindingEvent(HttpSession session, String name, Object value)
+   {
+      super(session);
+      this.name = name;
+      this.value = value;
+   }
+
+   /** Return the session that changed. */
+   public HttpSession getSession()
+   {
+      return super.getSession();
+   }
+
+   /**
+    * Returns the name with which the attribute is bound to or unbound from the
+    * session.
+    * 
+    * @return a string specifying the name with which the object is bound to or
+    *         unbound from the session
+    */
+
+   public String getName()
+   {
+      return name;
+   }
+
+   /**
+    * Returns the value of the attribute that has been added, removed or
+    * replaced. If the attribute was added (or bound), this is the value of the
+    * attribute. If the attribute was removed (or unbound), this is the value of
+    * the removed attribute. If the attribute was replaced, this is the old
+    * value of the attribute.
+    * 
+    * @since 2.3
+    */
+
+   public Object getValue()
+   {
+      return this.value;
+   }
+
+}

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpSessionBindingListener.java
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpSessionBindingListener.java	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpSessionBindingListener.java	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,63 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package javax.servlet.http;
+
+import java.util.EventListener;
+
+/**
+ * Causes an object to be notified when it is bound to or unbound from a
+ * session. The object is notified by an {@link HttpSessionBindingEvent} object.
+ * This may be as a result of a servlet programmer explicitly unbinding an
+ * attribute from a session, due to a session being invalidated, or due to a
+ * session timing out.
+ * 
+ * @author Various
+ * @see HttpSession
+ * @see HttpSessionBindingEvent
+ */
+
+public interface HttpSessionBindingListener extends EventListener
+{
+
+   /**
+    * Notifies the object that it is being bound to a session and identifies the
+    * session.
+    * 
+    * @param event
+    *           the event that identifies the session
+    * @see #valueUnbound
+    */
+
+   public void valueBound(HttpSessionBindingEvent event);
+
+   /**
+    * Notifies the object that it is being unbound from a session and identifies
+    * the session.
+    * 
+    * @param event
+    *           the event that identifies the session
+    * @see #valueBound
+    */
+
+   public void valueUnbound(HttpSessionBindingEvent event);
+
+}

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpSessionContext.java
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpSessionContext.java	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpSessionContext.java	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,54 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package javax.servlet.http;
+
+import java.util.Enumeration;
+
+/**
+ * @author Various
+ * @deprecated As of Java(tm) Servlet API 2.1 for security reasons, with no
+ *             replacement. This interface will be removed in a future version
+ *             of this API.
+ * @see HttpSession
+ * @see HttpSessionBindingEvent
+ * @see HttpSessionBindingListener
+ */
+
+public interface HttpSessionContext
+{
+
+   /**
+    * @deprecated As of Java Servlet API 2.1 with no replacement. This method
+    *             must return null and will be removed in a future version of
+    *             this API.
+    */
+
+   public HttpSession getSession(String sessionId);
+
+   /**
+    * @deprecated As of Java Servlet API 2.1 with no replacement. This method
+    *             must return an empty <code>Enumeration</code> and will be
+    *             removed in a future version of this API.
+    */
+
+   public Enumeration getIds();
+}

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpSessionEvent.java
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpSessionEvent.java	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpSessionEvent.java	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,43 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package javax.servlet.http;
+
+/**
+ * This is the class representing event notifications for changes to sessions
+ * within a web application.
+ * 
+ * @since v 2.3
+ */
+public class HttpSessionEvent extends java.util.EventObject
+{
+   /** Construct a session event from the given source. */
+   public HttpSessionEvent(HttpSession source)
+   {
+      super(source);
+   }
+
+   /** Return the session that changed. */
+   public HttpSession getSession()
+   {
+      return (HttpSession) super.getSource();
+   }
+}

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpSessionListener.java
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpSessionListener.java	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpSessionListener.java	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,55 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package javax.servlet.http;
+
+import java.util.EventListener;
+
+/**
+ * Implementations of this interface are notified of changes to the list of
+ * active sessions in a web application. To receive notification events, the
+ * implementation class must be configured in the deployment descriptor for the
+ * web application.
+ * 
+ * @see HttpSessionEvent
+ * @since v 2.3
+ */
+
+public interface HttpSessionListener extends EventListener
+{
+
+   /**
+    * Notification that a session was created.
+    * 
+    * @param se
+    *           the notification event
+    */
+   public void sessionCreated(HttpSessionEvent se);
+
+   /**
+    * Notification that a session is about to be invalidated.
+    * 
+    * @param se
+    *           the notification event
+    */
+   public void sessionDestroyed(HttpSessionEvent se);
+
+}

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpUtils.java
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpUtils.java	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/HttpUtils.java	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,289 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package javax.servlet.http;
+
+import javax.servlet.ServletInputStream;
+import java.util.Hashtable;
+import java.util.ResourceBundle;
+import java.util.StringTokenizer;
+import java.io.IOException;
+
+/**
+ * @deprecated As of Java(tm) Servlet API 2.3. These methods were only useful
+ *             with the default encoding and have been moved to the request
+ *             interfaces.
+ */
+
+public class HttpUtils
+{
+
+   private static final String LSTRING_FILE = "javax.servlet.http.LocalStrings";
+
+   private static ResourceBundle lStrings = ResourceBundle.getBundle(LSTRING_FILE);
+
+   /**
+    * Constructs an empty <code>HttpUtils</code> object.
+    */
+
+   public HttpUtils()
+   {
+   }
+
+   /**
+    * Parses a query string passed from the client to the server and builds a
+    * <code>HashTable</code> object with key-value pairs. The query string
+    * should be in the form of a string packaged by the GET or POST method, that
+    * is, it should have key-value pairs in the form <i>key=value</i>, with
+    * each pair separated from the next by a &amp; character.
+    * <p>
+    * A key can appear more than once in the query string with different values.
+    * However, the key appears only once in the hashtable, with its value being
+    * an array of strings containing the multiple values sent by the query
+    * string.
+    * <p>
+    * The keys and values in the hashtable are stored in their decoded form, so
+    * any + characters are converted to spaces, and characters sent in
+    * hexadecimal notation (like <i>%xx</i>) are converted to ASCII characters.
+    * 
+    * @param s
+    *           a string containing the query to be parsed
+    * @return a <code>HashTable</code> object built from the parsed key-value
+    *         pairs
+    * @exception IllegalArgumentException
+    *               if the query string is invalid
+    */
+
+   static public Hashtable parseQueryString(String s)
+   {
+
+      String valArray[] = null;
+
+      if (s == null)
+      {
+         throw new IllegalArgumentException();
+      }
+      Hashtable<String, String[]> ht = new Hashtable<String, String[]>();
+      StringBuffer sb = new StringBuffer();
+      StringTokenizer st = new StringTokenizer(s, "&");
+      while (st.hasMoreTokens())
+      {
+         String pair = (String) st.nextToken();
+         int pos = pair.indexOf('=');
+         if (pos == -1)
+         {
+            // XXX
+            // should give more detail about the illegal argument
+            throw new IllegalArgumentException();
+         }
+         String key = parseName(pair.substring(0, pos), sb);
+         String val = parseName(pair.substring(pos + 1, pair.length()), sb);
+         if (ht.containsKey(key))
+         {
+            String oldVals[] = (String[]) ht.get(key);
+            valArray = new String[oldVals.length + 1];
+            for (int i = 0; i < oldVals.length; i++)
+               valArray[i] = oldVals[i];
+            valArray[oldVals.length] = val;
+         }
+         else
+         {
+            valArray = new String[1];
+            valArray[0] = val;
+         }
+         ht.put(key, valArray);
+      }
+      return ht;
+   }
+
+   /**
+    * Parses data from an HTML form that the client sends to the server using
+    * the HTTP POST method and the <i>application/x-www-form-urlencoded</i>
+    * MIME type.
+    * <p>
+    * The data sent by the POST method contains key-value pairs. A key can
+    * appear more than once in the POST data with different values. However, the
+    * key appears only once in the hashtable, with its value being an array of
+    * strings containing the multiple values sent by the POST method.
+    * <p>
+    * The keys and values in the hashtable are stored in their decoded form, so
+    * any + characters are converted to spaces, and characters sent in
+    * hexadecimal notation (like <i>%xx</i>) are converted to ASCII characters.
+    * 
+    * @param len
+    *           an integer specifying the length, in characters, of the
+    *           <code>ServletInputStream</code> object that is also passed to
+    *           this method
+    * @param in
+    *           the <code>ServletInputStream</code> object that contains the
+    *           data sent from the client
+    * @return a <code>HashTable</code> object built from the parsed key-value
+    *         pairs
+    * @exception IllegalArgumentException
+    *               if the data sent by the POST method is invalid
+    */
+
+   static public Hashtable parsePostData(int len, ServletInputStream in)
+   {
+      // XXX
+      // should a length of 0 be an IllegalArgumentException
+
+      if (len <= 0)
+         return new Hashtable(); // cheap hack to return an empty hash
+
+      if (in == null)
+      {
+         throw new IllegalArgumentException();
+      }
+
+      //
+      // Make sure we read the entire POSTed body.
+      //
+      byte[] postedBytes = new byte[len];
+      try
+      {
+         int offset = 0;
+
+         do
+         {
+            int inputLen = in.read(postedBytes, offset, len - offset);
+            if (inputLen <= 0)
+            {
+               String msg = lStrings.getString("err.io.short_read");
+               throw new IllegalArgumentException(msg);
+            }
+            offset += inputLen;
+         }
+         while ((len - offset) > 0);
+
+      }
+      catch (IOException e)
+      {
+         throw new IllegalArgumentException(e.getMessage());
+      }
+
+      // XXX we shouldn't assume that the only kind of POST body
+      // is FORM data encoded using ASCII or ISO Latin/1 ... or
+      // that the body should always be treated as FORM data.
+      //
+
+      try
+      {
+         String postedBody = new String(postedBytes, 0, len, "8859_1");
+         return parseQueryString(postedBody);
+      }
+      catch (java.io.UnsupportedEncodingException e)
+      {
+         // XXX function should accept an encoding parameter & throw this
+         // exception. Otherwise throw something expected.
+         throw new IllegalArgumentException(e.getMessage());
+      }
+   }
+
+   /*
+    * Parse a name in the query string.
+    */
+
+   static private String parseName(String s, StringBuffer sb)
+   {
+      sb.setLength(0);
+      for (int i = 0; i < s.length(); i++)
+      {
+         char c = s.charAt(i);
+         switch (c)
+         {
+            case '+' :
+               sb.append(' ');
+               break;
+            case '%' :
+               try
+               {
+                  sb.append((char) Integer.parseInt(s.substring(i + 1, i + 3), 16));
+                  i += 2;
+               }
+               catch (NumberFormatException e)
+               {
+                  // XXX
+                  // need to be more specific about illegal arg
+                  throw new IllegalArgumentException();
+               }
+               catch (StringIndexOutOfBoundsException e)
+               {
+                  String rest = s.substring(i);
+                  sb.append(rest);
+                  if (rest.length() == 2)
+                     i++;
+               }
+
+               break;
+            default :
+               sb.append(c);
+               break;
+         }
+      }
+      return sb.toString();
+   }
+
+   /**
+    * Reconstructs the URL the client used to make the request, using
+    * information in the <code>HttpServletRequest</code> object. The returned
+    * URL contains a protocol, server name, port number, and server path, but it
+    * does not include query string parameters.
+    * <p>
+    * Because this method returns a <code>StringBuffer</code>, not a string,
+    * you can modify the URL easily, for example, to append query parameters.
+    * <p>
+    * This method is useful for creating redirect messages and for reporting
+    * errors.
+    * 
+    * @param req
+    *           a <code>HttpServletRequest</code> object containing the
+    *           client's request
+    * @return a <code>StringBuffer</code> object containing the reconstructed
+    *         URL
+    */
+
+   public static StringBuffer getRequestURL(HttpServletRequest req)
+   {
+      StringBuffer url = new StringBuffer();
+      String scheme = req.getScheme();
+      int port = req.getServerPort();
+      String urlPath = req.getRequestURI();
+
+      // String servletPath = req.getServletPath ();
+      // String pathInfo = req.getPathInfo ();
+
+      url.append(scheme); // http, https
+      url.append("://");
+      url.append(req.getServerName());
+      if ((scheme.equals("http") && port != 80) || (scheme.equals("https") && port != 443))
+      {
+         url.append(':');
+         url.append(req.getServerPort());
+      }
+      // if (servletPath != null)
+      // url.append (servletPath);
+      // if (pathInfo != null)
+      // url.append (pathInfo);
+      url.append(urlPath);
+      return url;
+   }
+}

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/LocalStrings.properties
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/LocalStrings.properties	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/LocalStrings.properties	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,13 @@
+# Default localized string information
+# Localized for Locale en_US
+
+err.cookie_name_is_token=Cookie name \"{0}\" is a reserved token
+err.io.negativelength=Negative Length given in write method
+err.io.short_read=Short Read
+
+http.method_not_implemented=Method {0} is not defined in RFC 2068 and is not supported by the Servlet API 
+
+http.method_get_not_supported=HTTP method GET is not supported by this URL
+http.method_post_not_supported=HTTP method POST is not supported by this URL
+http.method_put_not_supported=HTTP method PUT is not supported by this URL
+http.method_delete_not_supported=Http method DELETE is not supported by this URL

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/LocalStrings_es.properties
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/LocalStrings_es.properties	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/LocalStrings_es.properties	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,13 @@
+# Default localized string information
+# Localized para Locale es_ES
+
+err.cookie_name_is_token=El Nombre de Cookie {0} es una palabra reservada
+err.io.negativelength=Longitud Negativa en el metodo write
+err.io.short_read=Lectura Corta
+
+http.method_not_implemented=El Metodo {0} no esta definido en la especificacion RFC 2068 y no es soportado por la API Servlet 
+
+http.method_get_not_supported=El Metodo HTTP GET no es soportado por esta URL
+http.method_post_not_supported=El Metodo HTTP POST no es soportado por esta URL
+http.method_put_not_supported=El Metodo HTTP PUT no es soportado por esta URL
+http.method_delete_not_supported=El Metodo HTTP DELETE no es soportado por esta URL

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/LocalStrings_fr.properties
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/LocalStrings_fr.properties	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/LocalStrings_fr.properties	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,13 @@
+# Default localized string information
+# Localized for Locale fr_FR
+
+err.cookie_name_is_token=Le nom de cookie \"{0}\" est un \"token\" réservé
+err.io.negativelength=Taille négative donnée dans la méthode \"write\"
+err.io.short_read=Lecture partielle
+
+http.method_not_implemented=Le méthode {0} n''est pas définie dans la RFC 2068 et n''est pas supportée par l''API Servlet
+
+http.method_get_not_supported=La méthode HTTP GET n''est pas supportée par cette URL
+http.method_post_not_supported=La méthode HTTP POST n''est pas supportée par cette URL
+http.method_put_not_supported=La méthode HTTP PUT n''est pas supportée par cette URL
+http.method_delete_not_supported=La méthode HTTP DELETE n''est pas supportée par cette URL 

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/LocalStrings_ja.properties
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/LocalStrings_ja.properties	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/LocalStrings_ja.properties	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,13 @@
+# Default localized string information
+# Localized for Locale ja_JP
+
+err.cookie_name_is_token=\u30af\u30c3\u30ad\u30fc\u540d \"{0}\" \u306f\u4e88\u7d04\u6e08\u306e\u30c8\u30fc\u30af\u30f3\u3067\u3059\u3002
+err.io.negativelength=write\u30e1\u30bd\u30c3\u30c9\u306b\u8ca0\u306e\u9577\u3055\u304c\u6307\u5b9a\u3055\u308c\u307e\u3057\u305f\u3002
+err.io.short_read=\u8aad\u307f\u8fbc\u307f\u304c\u3059\u3050\u306b\u7d42\u308f\u308a\u307e\u3057\u305f\u3002
+
+http.method_not_implemented=\u30e1\u30bd\u30c3\u30c9 {0} \u306fRFC 2068\u306b\u306f\u5b9a\u7fa9\u3055\u308c\u3066\u304a\u3089\u305a\u3001\u30b5\u30fc\u30d6\u30ec\u30c3\u30c8API\u3067\u306f\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u307e\u305b\u3093\u3002
+
+http.method_get_not_supported=HTTP\u306eGET\u30e1\u30bd\u30c3\u30c9\u306f\u3001\u3053\u306eURL\u3067\u306f\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002
+http.method_post_not_supported=HTTP\u306ePOST\u30e1\u30bd\u30c3\u30c9\u306f\u3001\u3053\u306eURL\u3067\u306f\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002
+http.method_put_not_supported=HTTP\u306ePUT\u30e1\u30bd\u30c3\u30c9\u306f\u3001\u3053\u306eURL\u3067\u306f\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002
+http.method_delete_not_supported=HTTP\u306eDELETE\u30e1\u30bd\u30c3\u30c9\u306f\u3001\u3053\u306eURL\u3067\u306f\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/package.html
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/package.html	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/http/package.html	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,11 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<HTML>
+<HEAD>
+</HEAD>
+<BODY BGCOLOR="white">
+The javax.servlet.http package contains a number of classes and interfaces
+that describe and define the contracts between a servlet class
+running under the HTTP protocol and the runtime environment provided
+for an instance of such a class by a conforming servlet container.
+</BODY>
+</HTML>

Added: projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/package.html
===================================================================
--- projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/package.html	                        (rev 0)
+++ projects/javaee/trunk/jboss-servlet-api/src/main/javax/servlet/package.html	2007-04-02 13:42:12 UTC (rev 61984)
@@ -0,0 +1,11 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<HTML>
+<HEAD>
+</HEAD>
+<BODY BGCOLOR="white">
+	The javax.servlet package contains a number of classes and interfaces that
+	describe and define the contracts between a servlet class and the
+	runtime environment provided for an instance of such a class by a
+	conforming servlet container.
+</BODY>
+</HTML>




More information about the jboss-cvs-commits mailing list