]> WPIA git - gigi.git/commitdiff
adding servlet api (from tomcat)
authorFelix Dörre <felix@dogcraft.de>
Thu, 19 Jun 2014 17:21:23 +0000 (19:21 +0200)
committerBenny Baumann <BenBE@geshi.org>
Fri, 20 Jun 2014 18:46:52 +0000 (20:46 +0200)
83 files changed:
.classpath
lib/servlet-api/javax/servlet/AsyncContext.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/AsyncEvent.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/AsyncListener.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/DispatcherType.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/Filter.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/FilterChain.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/FilterConfig.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/FilterRegistration.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/GenericServlet.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/HttpConstraintElement.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/HttpMethodConstraintElement.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/LocalStrings.properties [new file with mode: 0644]
lib/servlet-api/javax/servlet/LocalStrings_es.properties [new file with mode: 0644]
lib/servlet-api/javax/servlet/LocalStrings_fr.properties [new file with mode: 0644]
lib/servlet-api/javax/servlet/LocalStrings_ja.properties [new file with mode: 0644]
lib/servlet-api/javax/servlet/MultipartConfigElement.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/ReadListener.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/Registration.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/RequestDispatcher.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/Servlet.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/ServletConfig.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/ServletContainerInitializer.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/ServletContext.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/ServletContextAttributeEvent.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/ServletContextAttributeListener.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/ServletContextEvent.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/ServletContextListener.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/ServletException.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/ServletInputStream.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/ServletOutputStream.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/ServletRegistration.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/ServletRequest.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/ServletRequestAttributeEvent.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/ServletRequestAttributeListener.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/ServletRequestEvent.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/ServletRequestListener.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/ServletRequestWrapper.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/ServletResponse.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/ServletResponseWrapper.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/ServletSecurityElement.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/SessionCookieConfig.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/SessionTrackingMode.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/SingleThreadModel.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/UnavailableException.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/WriteListener.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/annotation/HandlesTypes.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/annotation/HttpConstraint.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/annotation/HttpMethodConstraint.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/annotation/MultipartConfig.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/annotation/ServletSecurity.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/annotation/WebFilter.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/annotation/WebInitParam.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/annotation/WebListener.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/annotation/WebServlet.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/descriptor/JspConfigDescriptor.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/descriptor/JspPropertyGroupDescriptor.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/descriptor/TaglibDescriptor.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/http/Cookie.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/http/HttpServlet.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/http/HttpServletRequest.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/http/HttpServletRequestWrapper.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/http/HttpServletResponse.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/http/HttpServletResponseWrapper.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/http/HttpSession.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/http/HttpSessionActivationListener.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/http/HttpSessionAttributeListener.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/http/HttpSessionBindingEvent.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/http/HttpSessionBindingListener.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/http/HttpSessionContext.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/http/HttpSessionEvent.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/http/HttpSessionIdListener.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/http/HttpSessionListener.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/http/HttpUpgradeHandler.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/http/HttpUtils.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/http/LocalStrings.properties [new file with mode: 0644]
lib/servlet-api/javax/servlet/http/LocalStrings_es.properties [new file with mode: 0644]
lib/servlet-api/javax/servlet/http/LocalStrings_fr.properties [new file with mode: 0644]
lib/servlet-api/javax/servlet/http/LocalStrings_ja.properties [new file with mode: 0644]
lib/servlet-api/javax/servlet/http/Part.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/http/WebConnection.java [new file with mode: 0644]
lib/servlet-api/javax/servlet/http/package.html [new file with mode: 0644]
lib/servlet-api/javax/servlet/package.html [new file with mode: 0644]

index fb5011632c0ab8d6649a148c6fb5845a1b34c747..342147deed9492586ed3c076b286d2fe31402d94 100644 (file)
@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
        <classpathentry kind="src" path="src"/>
+       <classpathentry kind="src" path="lib/servlet-api"/>
        <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
        <classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/lib/servlet-api/javax/servlet/AsyncContext.java b/lib/servlet-api/javax/servlet/AsyncContext.java
new file mode 100644 (file)
index 0000000..bc2267e
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License.  You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package javax.servlet;
+
+/**
+ * TODO SERVLET3 - Add comments
+ * @since Servlet 3.0
+ */
+public interface AsyncContext {
+    public static final String ASYNC_REQUEST_URI =
+        "javax.servlet.async.request_uri";
+    public static final String ASYNC_CONTEXT_PATH  =
+        "javax.servlet.async.context_path";
+    public static final String ASYNC_PATH_INFO =
+        "javax.servlet.async.path_info";
+    public static final String ASYNC_SERVLET_PATH =
+        "javax.servlet.async.servlet_path";
+    public static final String ASYNC_QUERY_STRING =
+        "javax.servlet.async.query_string";
+
+    ServletRequest getRequest();
+
+    ServletResponse getResponse();
+
+    boolean hasOriginalRequestAndResponse();
+
+    /**
+     *
+     * @throws IllegalStateException
+     */
+    void dispatch();
+
+    /**
+     *
+     * @param path
+     * @throws IllegalStateException
+     */
+    void dispatch(String path);
+
+    /**
+     *
+     * @param context
+     * @param path
+     * @throws IllegalStateException
+     */
+    void dispatch(ServletContext context, String path);
+
+    void complete();
+
+    void start(Runnable run);
+
+    void addListener(AsyncListener listener);
+
+    void addListener(AsyncListener listener, ServletRequest request,
+            ServletResponse response);
+
+    <T extends AsyncListener> T createListener(Class<T> clazz)
+    throws ServletException;
+
+    /**
+     * Set timeout in milliseconds. 0 or less indicates no timeout.
+     */
+    void setTimeout(long timeout);
+
+    /**
+     * Get timeout in milliseconds. 0 or less indicates no timeout.
+     */
+    long getTimeout();
+}
diff --git a/lib/servlet-api/javax/servlet/AsyncEvent.java b/lib/servlet-api/javax/servlet/AsyncEvent.java
new file mode 100644 (file)
index 0000000..4b0f0b3
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License.  You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package javax.servlet;
+
+/**
+ * TODO SERVLET3 - Add comments
+ * @since Servlet 3.0
+ */
+public class AsyncEvent {
+    private final AsyncContext context;
+    private final ServletRequest request;
+    private final ServletResponse response;
+    private final Throwable throwable;
+
+    public AsyncEvent(AsyncContext context) {
+        this.context = context;
+        this.request = null;
+        this.response = null;
+        this.throwable = null;
+    }
+
+    public AsyncEvent(AsyncContext context, ServletRequest request,
+            ServletResponse response) {
+        this.context = context;
+        this.request = request;
+        this.response = response;
+        this.throwable = null;
+    }
+
+    public AsyncEvent(AsyncContext context, Throwable throwable) {
+        this.context = context;
+        this.throwable = throwable;
+        this.request = null;
+        this.response = null;
+    }
+
+    public AsyncEvent(AsyncContext context, ServletRequest request,
+            ServletResponse response, Throwable throwable) {
+        this.context = context;
+        this.request = request;
+        this.response = response;
+        this.throwable = throwable;
+    }
+
+    public AsyncContext getAsyncContext() {
+        return context;
+    }
+
+    public ServletRequest getSuppliedRequest() {
+        return request;
+    }
+
+    public ServletResponse getSuppliedResponse() {
+        return response;
+    }
+
+    public Throwable getThrowable() {
+        return throwable;
+    }
+}
diff --git a/lib/servlet-api/javax/servlet/AsyncListener.java b/lib/servlet-api/javax/servlet/AsyncListener.java
new file mode 100644 (file)
index 0000000..66f6392
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License.  You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package javax.servlet;
+
+import java.io.IOException;
+import java.util.EventListener;
+
+/**
+ * TODO SERVLET3 - Add comments
+ * @since Servlet 3.0
+ */
+public interface AsyncListener extends EventListener {
+    void onComplete(AsyncEvent event) throws IOException;
+    void onTimeout(AsyncEvent event) throws IOException;
+    void onError(AsyncEvent event) throws IOException;
+    void onStartAsync(AsyncEvent event) throws IOException;
+}
diff --git a/lib/servlet-api/javax/servlet/DispatcherType.java b/lib/servlet-api/javax/servlet/DispatcherType.java
new file mode 100644 (file)
index 0000000..67e5603
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License.  You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package javax.servlet;
+
+/**
+ * @since Servlet 3.0
+ */
+public enum DispatcherType {
+    FORWARD,
+    INCLUDE,
+    REQUEST,
+    ASYNC,
+    ERROR
+}
diff --git a/lib/servlet-api/javax/servlet/Filter.java b/lib/servlet-api/javax/servlet/Filter.java
new file mode 100644 (file)
index 0000000..b36b37d
--- /dev/null
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package 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>
+ * 1) Authentication Filters <br>
+ * 2) Logging and Auditing Filters <br>
+ * 3) Image conversion Filters <br>
+ * 4) Data compression Filters <br>
+ * 5) Encryption Filters <br>
+ * 6) Tokenizing Filters <br>
+ * 7) Filters that trigger resource access events <br>
+ * 8) XSL/T filters <br>
+ * 9) Mime-type chain Filter <br>
+ *
+ * @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>
+     * 1.Throws a ServletException <br>
+     * 2.Does not return within a time period defined by the web container
+     */
+    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>
+     * 1. Examine the request<br>
+     * 2. Optionally wrap the request object with a custom implementation to
+     * filter content or headers for input filtering <br>
+     * 3. Optionally wrap the response object with a custom implementation to
+     * filter content or headers for output filtering <br>
+     * 4. a) <strong>Either</strong> invoke the next entity in the chain using
+     * the FilterChain object (<code>chain.doFilter()</code>), <br>
+     * 4. b) <strong>or</strong> not pass on the request/response pair to the
+     * next entity in the filter chain to block the request processing<br>
+     * 5. Directly set headers on the response after invocation of the next
+     * entity in the filter chain.
+     **/
+    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();
+
+}
diff --git a/lib/servlet-api/javax/servlet/FilterChain.java b/lib/servlet-api/javax/servlet/FilterChain.java
new file mode 100644 (file)
index 0000000..cdc5206
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package 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;
+
+}
diff --git a/lib/servlet-api/javax/servlet/FilterConfig.java b/lib/servlet-api/javax/servlet/FilterConfig.java
new file mode 100644 (file)
index 0000000..4a0a65b
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package 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 {@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
+     *            <code>String</code> specifying the name of the initialization
+     *            parameter
+     *
+     * @return <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 <code>Enumeration</code> of <code>String</code> objects
+     *         containing the names of the filter's initialization parameters
+     */
+    public Enumeration<String> getInitParameterNames();
+
+}
diff --git a/lib/servlet-api/javax/servlet/FilterRegistration.java b/lib/servlet-api/javax/servlet/FilterRegistration.java
new file mode 100644 (file)
index 0000000..52d9596
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License.  You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package javax.servlet;
+
+import java.util.Collection;
+import java.util.EnumSet;
+
+/**
+ * @since Servlet 3.0
+ * TODO SERVLET3 - Add comments
+ */
+public interface FilterRegistration extends Registration {
+
+    /**
+     *
+     * @param dispatcherTypes
+     * @param isMatchAfter
+     * @param servletNames
+     * @throws IllegalArgumentException
+     * @throws IllegalStateException
+     */
+    public void addMappingForServletNames(
+            EnumSet<DispatcherType> dispatcherTypes,
+            boolean isMatchAfter, String... servletNames);
+    /**
+     *
+     * @return TODO
+     */
+    public Collection<String> getServletNameMappings();
+
+    /**
+     *
+     * @param dispatcherTypes
+     * @param isMatchAfter
+     * @param urlPatterns
+     * @throws IllegalArgumentException
+     * @throws IllegalStateException
+     */
+    public void addMappingForUrlPatterns(
+            EnumSet<DispatcherType> dispatcherTypes,
+            boolean isMatchAfter, String... urlPatterns);
+
+    /**
+     *
+     * @return TODO
+     */
+    public Collection<String> getUrlPatternMappings();
+
+    public static interface Dynamic
+    extends FilterRegistration, Registration.Dynamic {
+        // No additional methods
+    }
+}
diff --git a/lib/servlet-api/javax/servlet/GenericServlet.java b/lib/servlet-api/javax/servlet/GenericServlet.java
new file mode 100644 (file)
index 0000000..f040cb7
--- /dev/null
@@ -0,0 +1,238 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package javax.servlet;
+
+import java.io.IOException;
+import java.util.Enumeration;
+
+/**
+ * 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.
+ */
+public abstract class GenericServlet implements Servlet, ServletConfig,
+        java.io.Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private transient ServletConfig config;
+
+    /**
+     * Does nothing. All of the servlet initialization is done by one of the
+     * <code>init</code> methods.
+     */
+    public GenericServlet() {
+        // NOOP
+    }
+
+    /**
+     * Called by the servlet container to indicate to a servlet that the servlet
+     * is being taken out of service. See {@link Servlet#destroy}.
+     */
+    @Override
+    public void destroy() {
+        // NOOP by default
+    }
+
+    /**
+     * 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
+     */
+    @Override
+    public String getInitParameter(String name) {
+        return getServletConfig().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
+     */
+    @Override
+    public Enumeration<String> getInitParameterNames() {
+        return getServletConfig().getInitParameterNames();
+    }
+
+    /**
+     * Returns this servlet's {@link ServletConfig} object.
+     *
+     * @return ServletConfig the <code>ServletConfig</code> object that
+     *         initialized this servlet
+     */
+    @Override
+    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
+     */
+    @Override
+    public ServletContext getServletContext() {
+        return getServletConfig().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
+     */
+    @Override
+    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
+     *            configuration information for this servlet
+     * @exception ServletException
+     *                if an exception occurs that interrupts the servlet's
+     *                normal operation
+     * @see UnavailableException
+     */
+    @Override
+    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 {
+        // NOOP by default
+    }
+
+    /**
+     * 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
+     */
+    @Override
+    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
+     */
+    @Override
+    public String getServletName() {
+        return config.getServletName();
+    }
+}
diff --git a/lib/servlet-api/javax/servlet/HttpConstraintElement.java b/lib/servlet-api/javax/servlet/HttpConstraintElement.java
new file mode 100644 (file)
index 0000000..c7a4f93
--- /dev/null
@@ -0,0 +1,98 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License.  You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package javax.servlet;
+
+import java.util.ResourceBundle;
+
+import javax.servlet.annotation.ServletSecurity.EmptyRoleSemantic;
+import javax.servlet.annotation.ServletSecurity.TransportGuarantee;
+
+/**
+ * @since Servlet 3.0
+ * TODO SERVLET3 - Add comments
+ */
+public class HttpConstraintElement {
+
+    private static final String LSTRING_FILE = "javax.servlet.LocalStrings";
+    private static final ResourceBundle lStrings =
+        ResourceBundle.getBundle(LSTRING_FILE);
+
+    private final EmptyRoleSemantic emptyRoleSemantic;// = EmptyRoleSemantic.PERMIT;
+    private final TransportGuarantee transportGuarantee;// = TransportGuarantee.NONE;
+    private final String[] rolesAllowed;// = new String[0];
+
+    /**
+     * Default constraint is permit with no transport guarantee.
+     */
+    public HttpConstraintElement() {
+        // Default constructor
+        this.emptyRoleSemantic = EmptyRoleSemantic.PERMIT;
+        this.transportGuarantee = TransportGuarantee.NONE;
+        this.rolesAllowed = new String[0];
+    }
+
+    /**
+     * Convenience constructor for {@link EmptyRoleSemantic#DENY}.
+     *
+     */
+    public HttpConstraintElement(EmptyRoleSemantic emptyRoleSemantic) {
+        this.emptyRoleSemantic = emptyRoleSemantic;
+        this.transportGuarantee = TransportGuarantee.NONE;
+        this.rolesAllowed = new String[0];
+    }
+
+    /**
+     * Convenience constructor to specify transport guarantee and/or roles.
+     */
+    public HttpConstraintElement(TransportGuarantee transportGuarantee,
+            String... rolesAllowed) {
+        this.emptyRoleSemantic = EmptyRoleSemantic.PERMIT;
+        this.transportGuarantee = transportGuarantee;
+        this.rolesAllowed = rolesAllowed;
+    }
+
+    /**
+     *
+     * @param emptyRoleSemantic
+     * @param transportGuarantee
+     * @param rolesAllowed
+     * @throws IllegalArgumentException if roles are specified when DENY is used
+     */
+    public HttpConstraintElement(EmptyRoleSemantic emptyRoleSemantic,
+            TransportGuarantee transportGuarantee, String... rolesAllowed) {
+        if (rolesAllowed != null && rolesAllowed.length > 0 &&
+                EmptyRoleSemantic.DENY.equals(emptyRoleSemantic)) {
+            throw new IllegalArgumentException(lStrings.getString(
+                    "httpConstraintElement.invalidRolesDeny"));
+        }
+        this.emptyRoleSemantic = emptyRoleSemantic;
+        this.transportGuarantee = transportGuarantee;
+        this.rolesAllowed = rolesAllowed;
+    }
+
+    public EmptyRoleSemantic getEmptyRoleSemantic() {
+        return emptyRoleSemantic;
+    }
+
+    public TransportGuarantee getTransportGuarantee() {
+        return transportGuarantee;
+    }
+
+    public String[] getRolesAllowed() {
+        return rolesAllowed;
+    }
+}
\ No newline at end of file
diff --git a/lib/servlet-api/javax/servlet/HttpMethodConstraintElement.java b/lib/servlet-api/javax/servlet/HttpMethodConstraintElement.java
new file mode 100644 (file)
index 0000000..5de2ad9
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License.  You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package javax.servlet;
+
+import java.util.ResourceBundle;
+
+/**
+ * @since Servlet 3.0
+ * TODO SERVLET3 - Add comments
+ */
+public class HttpMethodConstraintElement extends HttpConstraintElement {
+
+    // Can't inherit from HttpConstraintElement as API does not allow it
+    private static final String LSTRING_FILE = "javax.servlet.LocalStrings";
+    private static final ResourceBundle lStrings =
+        ResourceBundle.getBundle(LSTRING_FILE);
+
+    private final String methodName;
+
+    public HttpMethodConstraintElement(String methodName) {
+        if (methodName == null || methodName.length() == 0) {
+            throw new IllegalArgumentException(lStrings.getString(
+                    "httpMethodConstraintElement.invalidMethod"));
+        }
+        this.methodName = methodName;
+    }
+
+    public HttpMethodConstraintElement(String methodName,
+            HttpConstraintElement constraint) {
+        super(constraint.getEmptyRoleSemantic(),
+                constraint.getTransportGuarantee(),
+                constraint.getRolesAllowed());
+        if (methodName == null || methodName.length() == 0) {
+            throw new IllegalArgumentException(lStrings.getString(
+                    "httpMethodConstraintElement.invalidMethod"));
+        }
+        this.methodName = methodName;
+    }
+
+    public String getMethodName() {
+        return methodName;
+    }
+}
\ No newline at end of file
diff --git a/lib/servlet-api/javax/servlet/LocalStrings.properties b/lib/servlet-api/javax/servlet/LocalStrings.properties
new file mode 100644 (file)
index 0000000..0f60d51
--- /dev/null
@@ -0,0 +1,24 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Default localized string information
+# Localized for Locale en_US
+
+err.not_iso8859_1=Not an ISO 8859-1 character: {0}
+value.true=true
+value.false=false
+
+httpConstraintElement.invalidRolesDeny=Roles may not be specified when using DENY
+httpMethodConstraintElement.invalidMethod=Invalid HTTP method
\ No newline at end of file
diff --git a/lib/servlet-api/javax/servlet/LocalStrings_es.properties b/lib/servlet-api/javax/servlet/LocalStrings_es.properties
new file mode 100644 (file)
index 0000000..497c0dc
--- /dev/null
@@ -0,0 +1,19 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+err.not_iso8859_1 = No es un car\u00E1cter ISO 8859-1\: {0}
+value.true = true
+value.false = false
+httpConstraintElement.invalidRolesDeny = No se pueden especificar Roles al utilizar DENY (DENEGAR)
+httpMethodConstraintElement.invalidMethod = M\u00E9todo HTTP inv\u00E1lido
diff --git a/lib/servlet-api/javax/servlet/LocalStrings_fr.properties b/lib/servlet-api/javax/servlet/LocalStrings_fr.properties
new file mode 100644 (file)
index 0000000..05f75ec
--- /dev/null
@@ -0,0 +1,23 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Default localized string information
+# Localized for Locale fr_FR
+
+err.not_iso8859_1={0} n''est pas un caract\u00e8re ISO 8859-1
+value.true=true
+value.false=false
+
+
diff --git a/lib/servlet-api/javax/servlet/LocalStrings_ja.properties b/lib/servlet-api/javax/servlet/LocalStrings_ja.properties
new file mode 100644 (file)
index 0000000..2a87482
--- /dev/null
@@ -0,0 +1,21 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# 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
diff --git a/lib/servlet-api/javax/servlet/MultipartConfigElement.java b/lib/servlet-api/javax/servlet/MultipartConfigElement.java
new file mode 100644 (file)
index 0000000..39b9f8b
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License.  You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package javax.servlet;
+
+import javax.servlet.annotation.MultipartConfig;
+
+/**
+ * @since Servlet 3.0
+ * TODO SERVLET3 - Add comments
+ */
+public class MultipartConfigElement {
+
+    private final String location;// = "";
+    private final long maxFileSize;// = -1;
+    private final long maxRequestSize;// = -1;
+    private final int fileSizeThreshold;// = 0;
+
+    public MultipartConfigElement(String location) {
+        // Keep empty string default if location is null
+        if (location != null) {
+            this.location = location;
+        } else {
+            this.location = "";
+        }
+        this.maxFileSize = -1;
+        this.maxRequestSize = -1;
+        this.fileSizeThreshold = 0;
+    }
+
+    public MultipartConfigElement(String location, long maxFileSize,
+            long maxRequestSize, int fileSizeThreshold) {
+        // Keep empty string default if location is null
+        if (location != null) {
+            this.location = location;
+        } else {
+            this.location = "";
+        }
+        this.maxFileSize = maxFileSize;
+        this.maxRequestSize = maxRequestSize;
+        this.fileSizeThreshold = fileSizeThreshold;
+    }
+
+    public MultipartConfigElement(MultipartConfig annotation) {
+        location = annotation.location();
+        maxFileSize = annotation.maxFileSize();
+        maxRequestSize = annotation.maxRequestSize();
+        fileSizeThreshold = annotation.fileSizeThreshold();
+    }
+
+    public String getLocation() {
+        return location;
+    }
+
+    public long getMaxFileSize() {
+        return maxFileSize;
+    }
+
+    public long getMaxRequestSize() {
+        return maxRequestSize;
+    }
+
+    public int getFileSizeThreshold() {
+        return fileSizeThreshold;
+    }
+}
\ No newline at end of file
diff --git a/lib/servlet-api/javax/servlet/ReadListener.java b/lib/servlet-api/javax/servlet/ReadListener.java
new file mode 100644 (file)
index 0000000..1d51c6c
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package javax.servlet;
+
+import java.io.IOException;
+
+/**
+ * Receives notification of read events when using non-blocking IO.
+ *
+ * @since Servlet 3.1
+ */
+public interface ReadListener extends java.util.EventListener{
+
+    /**
+     * Invoked when data is available to read. The container will invoke this
+     * method the first time for a request as soon as there is data to read.
+     * Subsequent invocations will only occur if a call to
+     * {@link ServletInputStream#isReady()} has returned false and data has
+     * subsequently become available to read.
+     *
+     * @throws IOException
+     */
+    public abstract void onDataAvailable() throws IOException;
+
+    /**
+     * Invoked when the request body has been fully read.
+     *
+     * @throws IOException
+     */
+    public abstract void onAllDataRead() throws IOException;
+
+    /**
+     * Invoked if an error occurs while reading the request body.
+     *
+     * @param throwable The exception that occurred
+     */
+    public abstract void onError(java.lang.Throwable throwable);
+}
diff --git a/lib/servlet-api/javax/servlet/Registration.java b/lib/servlet-api/javax/servlet/Registration.java
new file mode 100644 (file)
index 0000000..fa9f4ec
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License.  You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package javax.servlet;
+
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * TODO SERVLET3 - Add comments
+ * @since Servlet 3.0
+ */
+public interface Registration {
+
+    public String getName();
+
+    public String getClassName();
+
+    /**
+     *
+     * @param name
+     * @param value
+     * @return TODO
+     * @throws IllegalArgumentException
+     * @throws IllegalStateException
+     */
+    public boolean setInitParameter(String name, String value);
+
+    public String getInitParameter(String name);
+
+    /**
+     *
+     * @param initParameters
+     * @return TODO
+     * @throws IllegalArgumentException
+     * @throws IllegalStateException
+     */
+    public Set<String> setInitParameters(Map<String,String> initParameters);
+
+    public Map<String, String> getInitParameters();
+
+    public interface Dynamic extends Registration {
+
+        /**
+         *
+         * @param isAsyncSupported
+         * @throws IllegalStateException
+         */
+        public void setAsyncSupported(boolean isAsyncSupported);
+    }
+}
diff --git a/lib/servlet-api/javax/servlet/RequestDispatcher.java b/lib/servlet-api/javax/servlet/RequestDispatcher.java
new file mode 100644 (file)
index 0000000..99ceeef
--- /dev/null
@@ -0,0 +1,293 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package 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.
+ *
+ * @see ServletContext#getRequestDispatcher(java.lang.String)
+ * @see ServletContext#getNamedDispatcher(java.lang.String)
+ * @see ServletRequest#getRequestDispatcher(java.lang.String)
+ *
+ */
+public interface RequestDispatcher {
+
+    /**
+     * The name of the request attribute that should be set by the container
+     * when the {@link #forward(ServletRequest, ServletResponse)} method is
+     * called. It provides the original value of a path-related property of the
+     * request. See the chapter "Forwarded Request Parameters" in the Servlet
+     * Specification for details.
+     *
+     * @since Servlet 3.0
+     */
+    static final String FORWARD_REQUEST_URI = "javax.servlet.forward.request_uri";
+
+    /**
+     * The name of the request attribute that should be set by the container
+     * when the {@link #forward(ServletRequest, ServletResponse)} method is
+     * called. It provides the original value of a path-related property of the
+     * request. See the chapter "Forwarded Request Parameters" in the Servlet
+     * Specification for details.
+     *
+     * @since Servlet 3.0
+     */
+    static final String FORWARD_CONTEXT_PATH = "javax.servlet.forward.context_path";
+
+    /**
+     * The name of the request attribute that should be set by the container
+     * when the {@link #forward(ServletRequest, ServletResponse)} method is
+     * called. It provides the original value of a path-related property of the
+     * request. See the chapter "Forwarded Request Parameters" in the Servlet
+     * Specification for details.
+     *
+     * @since Servlet 3.0
+     */
+    static final String FORWARD_PATH_INFO = "javax.servlet.forward.path_info";
+
+    /**
+     * The name of the request attribute that should be set by the container
+     * when the {@link #forward(ServletRequest, ServletResponse)} method is
+     * called. It provides the original value of a path-related property of the
+     * request. See the chapter "Forwarded Request Parameters" in the Servlet
+     * Specification for details.
+     *
+     * @since Servlet 3.0
+     */
+    static final String FORWARD_SERVLET_PATH = "javax.servlet.forward.servlet_path";
+
+    /**
+     * The name of the request attribute that should be set by the container
+     * when the {@link #forward(ServletRequest, ServletResponse)} method is
+     * called. It provides the original value of a path-related property of the
+     * request. See the chapter "Forwarded Request Parameters" in the Servlet
+     * Specification for details.
+     *
+     * @since Servlet 3.0
+     */
+    static final String FORWARD_QUERY_STRING = "javax.servlet.forward.query_string";
+
+    /**
+     * The name of the request attribute that should be set by the container
+     * when the {@link #include(ServletRequest, ServletResponse)} method is
+     * called on the {@code RequestDispatcher} obtained by a path and not by a
+     * name. It provides information on the path that was used to obtain the
+     * {@code RequestDispatcher} instance for this include call. See the chapter
+     * "Included Request Parameters" in the Servlet Specification for details.
+     *
+     * @since Servlet 3.0
+     */
+    static final String INCLUDE_REQUEST_URI = "javax.servlet.include.request_uri";
+
+    /**
+     * The name of the request attribute that should be set by the container
+     * when the {@link #include(ServletRequest, ServletResponse)} method is
+     * called on the {@code RequestDispatcher} obtained by a path and not by a
+     * name. It provides information on the path that was used to obtain the
+     * {@code RequestDispatcher} instance for this include call. See the chapter
+     * "Included Request Parameters" in the Servlet Specification for details.
+     *
+     * @since Servlet 3.0
+     */
+    static final String INCLUDE_CONTEXT_PATH = "javax.servlet.include.context_path";
+
+    /**
+     * The name of the request attribute that should be set by the container
+     * when the {@link #include(ServletRequest, ServletResponse)} method is
+     * called on the {@code RequestDispatcher} obtained by a path and not by a
+     * name. It provides information on the path that was used to obtain the
+     * {@code RequestDispatcher} instance for this include call. See the chapter
+     * "Included Request Parameters" in the Servlet Specification for details.
+     *
+     * @since Servlet 3.0
+     */
+    static final String INCLUDE_PATH_INFO = "javax.servlet.include.path_info";
+
+    /**
+     * The name of the request attribute that should be set by the container
+     * when the {@link #include(ServletRequest, ServletResponse)} method is
+     * called on the {@code RequestDispatcher} obtained by a path and not by a
+     * name. It provides information on the path that was used to obtain the
+     * {@code RequestDispatcher} instance for this include call. See the chapter
+     * "Included Request Parameters" in the Servlet Specification for details.
+     *
+     * @since Servlet 3.0
+     */
+    static final String INCLUDE_SERVLET_PATH = "javax.servlet.include.servlet_path";
+
+    /**
+     * The name of the request attribute that should be set by the container
+     * when the {@link #include(ServletRequest, ServletResponse)} method is
+     * called on the {@code RequestDispatcher} obtained by a path and not by a
+     * name. It provides information on the path that was used to obtain the
+     * {@code RequestDispatcher} instance for this include call. See the chapter
+     * "Included Request Parameters" in the Servlet Specification for details.
+     *
+     * @since Servlet 3.0
+     */
+    static final String INCLUDE_QUERY_STRING = "javax.servlet.include.query_string";
+
+    /**
+     * The name of the request attribute that should be set by the container
+     * when custom error-handling servlet or JSP page is invoked. The value of
+     * the attribute is of type {@code java.lang.Throwable}. See the chapter
+     * "Error Handling" in the Servlet Specification for details.
+     *
+     * @since Servlet 3.0
+     */
+    public static final String ERROR_EXCEPTION = "javax.servlet.error.exception";
+
+    /**
+     * The name of the request attribute that should be set by the container
+     * when custom error-handling servlet or JSP page is invoked. The value of
+     * the attribute is of type {@code java.lang.Class}. See the chapter
+     * "Error Handling" in the Servlet Specification for details.
+     *
+     * @since Servlet 3.0
+     */
+    public static final String ERROR_EXCEPTION_TYPE = "javax.servlet.error.exception_type";
+
+    /**
+     * The name of the request attribute that should be set by the container
+     * when custom error-handling servlet or JSP page is invoked. The value of
+     * the attribute is of type {@code java.lang.String}. See the chapter
+     * "Error Handling" in the Servlet Specification for details.
+     *
+     * @since Servlet 3.0
+     */
+    public static final String ERROR_MESSAGE = "javax.servlet.error.message";
+
+    /**
+     * The name of the request attribute that should be set by the container
+     * when custom error-handling servlet or JSP page is invoked. The value of
+     * the attribute is of type {@code java.lang.String}. See the chapter
+     * "Error Handling" in the Servlet Specification for details.
+     *
+     * @since Servlet 3.0
+     */
+    public static final String ERROR_REQUEST_URI = "javax.servlet.error.request_uri";
+
+    /**
+     * The name of the request attribute that should be set by the container
+     * when custom error-handling servlet or JSP page is invoked. The value of
+     * the attribute is of type {@code java.lang.String}. See the chapter
+     * "Error Handling" in the Servlet Specification for details.
+     *
+     * @since Servlet 3.0
+     */
+    public static final String ERROR_SERVLET_NAME = "javax.servlet.error.servlet_name";
+
+    /**
+     * The name of the request attribute that should be set by the container
+     * when custom error-handling servlet or JSP page is invoked. The value of
+     * the attribute is of type {@code java.lang.Integer}. See the chapter
+     * "Error Handling" in the Servlet Specification for details.
+     *
+     * @since Servlet 3.0
+     */
+    public static final String ERROR_STATUS_CODE = "javax.servlet.error.status_code";
+
+    /**
+     * 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;
+}
diff --git a/lib/servlet-api/javax/servlet/Servlet.java b/lib/servlet-api/javax/servlet/Servlet.java
new file mode 100644 (file)
index 0000000..73d30bb
--- /dev/null
@@ -0,0 +1,178 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package 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>Any calls from clients to the <code>service</code> method are handled.
+ * <li>The servlet is taken out of service, then destroyed with the
+ * <code>destroy</code> method, then garbage collected and finalized.
+ * </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.
+ *
+ * @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>Does not return within a time period defined by the Web server
+     * </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();
+}
diff --git a/lib/servlet-api/javax/servlet/ServletConfig.java b/lib/servlet-api/javax/servlet/ServletConfig.java
new file mode 100644 (file)
index 0000000..be61656
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package 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<String> getInitParameterNames();
+}
diff --git a/lib/servlet-api/javax/servlet/ServletContainerInitializer.java b/lib/servlet-api/javax/servlet/ServletContainerInitializer.java
new file mode 100644 (file)
index 0000000..2029c8a
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License.  You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package javax.servlet;
+
+import java.util.Set;
+
+/**
+ * ServletContainerInitializers (SCIs) are registered via an entry in the
+ * file META-INF/services/javax.servlet.ServletContainerInitializer that must be
+ * included in the JAR file that contains the SCI implementation.
+ * <p>
+ * SCI processing is performed regardless of the setting of metadata-complete.
+ * SCI processing can be controlled per JAR file via fragment ordering. If an
+ * absolute ordering is defined, the only those JARs included in the ordering
+ * will be processed for SCIs. To disable SCI processing completely, an empty
+ * absolute ordering may be defined.
+ * <p>
+ * SCIs register an interest in annotations (class, method or field) and/or
+ * types via the {@link javax.servlet.annotation.HandlesTypes} annotation which
+ * is added to the class.
+ *
+ * @since Servlet 3.0
+ */
+public interface ServletContainerInitializer {
+
+    /**
+     * Receives notification during startup of a web application of the classes
+     * within the web application that matched the criteria defined via the
+     * {@link javax.servlet.annotation.HandlesTypes} annotation.
+     *
+     * @param c     The (possibly null) set of classes that met the specified
+     *              criteria
+     * @param ctx   The ServletContext of the web application in which the
+     *              classes were discovered
+     *
+     * @throws ServletException If an error occurs
+     */
+    void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException;
+}
diff --git a/lib/servlet-api/javax/servlet/ServletContext.java b/lib/servlet-api/javax/servlet/ServletContext.java
new file mode 100644 (file)
index 0000000..9aa1177
--- /dev/null
@@ -0,0 +1,895 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package javax.servlet;
+
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.EventListener;
+import java.util.Map;
+import java.util.Set;
+
+import javax.servlet.descriptor.JspConfigDescriptor;
+
+/**
+ * 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.
+ *
+ * @see Servlet#getServletConfig
+ * @see ServletConfig#getServletContext
+ */
+public interface ServletContext {
+
+    public static final String TEMPDIR = "javax.servlet.context.tempdir";
+
+    /**
+     * @since Servlet 3.0
+     */
+    public static final String ORDERED_LIBS = "javax.servlet.context.orderedLibs";
+
+    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 3.1 must
+     * have this method return the integer 3.
+     *
+     * @return 3
+     */
+    public int getMajorVersion();
+
+    /**
+     * Returns the minor version of the Servlet API that this servlet container
+     * supports. All implementations that comply with Version 3.1 must have this
+     * method return the integer 1.
+     *
+     * @return 1
+     */
+    public int getMinorVersion();
+
+    /**
+     * @return TODO
+     * @throws UnsupportedOperationException    If called from a
+     *    {@link ServletContextListener#contextInitialized(ServletContextEvent)}
+     *    method of a {@link ServletContextListener} that was not defined in a
+     *    web.xml file, a web-fragment.xml file nor annotated with
+     *    {@link javax.servlet.annotation.WebListener}. For example, a
+     *    {@link ServletContextListener} defined in a TLD would not be able to
+     *    use this method.
+     *
+     * @since Servlet 3.0 TODO SERVLET3 - Add comments
+     */
+    public int getEffectiveMajorVersion();
+
+    /**
+     * @return TODO
+     * @throws UnsupportedOperationException    If called from a
+     *    {@link ServletContextListener#contextInitialized(ServletContextEvent)}
+     *    method of a {@link ServletContextListener} that was not defined in a
+     *    web.xml file, a web-fragment.xml file nor annotated with
+     *    {@link javax.servlet.annotation.WebListener}. For example, a
+     *    {@link ServletContextListener} defined in a TLD would not be able to
+     *    use this method.
+     * @since Servlet 3.0 TODO SERVLET3 - Add comments
+     */
+    public int getEffectiveMinorVersion();
+
+    /**
+     * 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<String> 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.
+     */
+    @SuppressWarnings("dep-ann")
+    // Spec API does not use @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.
+     */
+    @SuppressWarnings("dep-ann")
+    // Spec API does not use @Deprecated
+    public Enumeration<Servlet> 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.
+     */
+    @SuppressWarnings("dep-ann")
+    // Spec API does not use @Deprecated
+    public Enumeration<String> 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.
+     */
+    @SuppressWarnings("dep-ann")
+    // Spec API does not use @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 the value of the initialization
+     *         parameter
+     * @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<String> getInitParameterNames();
+
+    /**
+     * @param name
+     * @param value
+     * @return TODO
+     * @throws IllegalStateException
+     * @throws UnsupportedOperationException    If called from a
+     *    {@link ServletContextListener#contextInitialized(ServletContextEvent)}
+     *    method of a {@link ServletContextListener} that was not defined in a
+     *    web.xml file, a web-fragment.xml file nor annotated with
+     *    {@link javax.servlet.annotation.WebListener}. For example, a
+     *    {@link ServletContextListener} defined in a TLD would not be able to
+     *    use this method.
+     * @since Servlet 3.0 TODO SERVLET3 - Add comments
+     */
+    public boolean setInitParameter(String name, String value);
+
+    /**
+     * 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<String> 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();
+
+    /**
+     * @param servletName
+     * @param className
+     * @return TODO
+     * @throws IllegalStateException
+     *             If the context has already been initialised
+     * @throws UnsupportedOperationException    If called from a
+     *    {@link ServletContextListener#contextInitialized(ServletContextEvent)}
+     *    method of a {@link ServletContextListener} that was not defined in a
+     *    web.xml file, a web-fragment.xml file nor annotated with
+     *    {@link javax.servlet.annotation.WebListener}. For example, a
+     *    {@link ServletContextListener} defined in a TLD would not be able to
+     *    use this method.
+     * @since Servlet 3.0 TODO SERVLET3 - Add comments
+     */
+    public ServletRegistration.Dynamic addServlet(String servletName,
+            String className);
+
+    /**
+     * @param servletName
+     * @param servlet
+     * @return TODO
+     * @throws IllegalStateException
+     *             If the context has already been initialised
+     * @throws UnsupportedOperationException    If called from a
+     *    {@link ServletContextListener#contextInitialized(ServletContextEvent)}
+     *    method of a {@link ServletContextListener} that was not defined in a
+     *    web.xml file, a web-fragment.xml file nor annotated with
+     *    {@link javax.servlet.annotation.WebListener}. For example, a
+     *    {@link ServletContextListener} defined in a TLD would not be able to
+     *    use this method.
+     * @since Servlet 3.0 TODO SERVLET3 - Add comments
+     */
+    public ServletRegistration.Dynamic addServlet(String servletName,
+            Servlet servlet);
+
+    /**
+     * @param servletName
+     * @param servletClass
+     * @return TODO
+     * @throws IllegalStateException
+     *             If the context has already been initialised
+     * @throws UnsupportedOperationException    If called from a
+     *    {@link ServletContextListener#contextInitialized(ServletContextEvent)}
+     *    method of a {@link ServletContextListener} that was not defined in a
+     *    web.xml file, a web-fragment.xml file nor annotated with
+     *    {@link javax.servlet.annotation.WebListener}. For example, a
+     *    {@link ServletContextListener} defined in a TLD would not be able to
+     *    use this method.
+     * @since Servlet 3.0 TODO SERVLET3 - Add comments
+     */
+    public ServletRegistration.Dynamic addServlet(String servletName,
+            Class<? extends Servlet> servletClass);
+
+    /**
+     * @param c
+     * @return TODO
+     * @throws ServletException
+     * @throws UnsupportedOperationException    If called from a
+     *    {@link ServletContextListener#contextInitialized(ServletContextEvent)}
+     *    method of a {@link ServletContextListener} that was not defined in a
+     *    web.xml file, a web-fragment.xml file nor annotated with
+     *    {@link javax.servlet.annotation.WebListener}. For example, a
+     *    {@link ServletContextListener} defined in a TLD would not be able to
+     *    use this method.
+     * @since Servlet 3.0 TODO SERVLET3 - Add comments
+     */
+    public <T extends Servlet> T createServlet(Class<T> c)
+            throws ServletException;
+
+    /**
+     * Obtain the details of the named servlet.
+     *
+     * @param servletName   The name of the Servlet of interest
+     *
+     * @return  The registration details for the named Servlet or
+     *          <code>null</code> if no Servlet has been registered with the
+     *          given name
+     *
+     * @throws UnsupportedOperationException    If called from a
+     *    {@link ServletContextListener#contextInitialized(ServletContextEvent)}
+     *    method of a {@link ServletContextListener} that was not defined in a
+     *    web.xml file, a web-fragment.xml file nor annotated with
+     *    {@link javax.servlet.annotation.WebListener}. For example, a
+     *    {@link ServletContextListener} defined in a TLD would not be able to
+     *    use this method.
+     *
+     * @since Servlet 3.0
+     */
+    public ServletRegistration getServletRegistration(String servletName);
+
+    /**
+     * @return TODO
+     * @throws UnsupportedOperationException    If called from a
+     *    {@link ServletContextListener#contextInitialized(ServletContextEvent)}
+     *    method of a {@link ServletContextListener} that was not defined in a
+     *    web.xml file, a web-fragment.xml file nor annotated with
+     *    {@link javax.servlet.annotation.WebListener}. For example, a
+     *    {@link ServletContextListener} defined in a TLD would not be able to
+     *    use this method.
+     * @since Servlet 3.0 TODO SERVLET3 - Add comments
+     */
+    public Map<String, ? extends ServletRegistration> getServletRegistrations();
+
+    /**
+     * @param filterName
+     * @param className
+     * @return TODO
+     * @throws UnsupportedOperationException    If called from a
+     *    {@link ServletContextListener#contextInitialized(ServletContextEvent)}
+     *    method of a {@link ServletContextListener} that was not defined in a
+     *    web.xml file, a web-fragment.xml file nor annotated with
+     *    {@link javax.servlet.annotation.WebListener}. For example, a
+     *    {@link ServletContextListener} defined in a TLD would not be able to
+     *    use this method.
+     * @throws IllegalStateException
+     *             If the context has already been initialised
+     * @since Servlet 3.0 TODO SERVLET3 - Add comments
+     */
+    public FilterRegistration.Dynamic addFilter(String filterName,
+            String className);
+
+    /**
+     * @param filterName
+     * @param filter
+     * @return TODO
+     * @throws UnsupportedOperationException    If called from a
+     *    {@link ServletContextListener#contextInitialized(ServletContextEvent)}
+     *    method of a {@link ServletContextListener} that was not defined in a
+     *    web.xml file, a web-fragment.xml file nor annotated with
+     *    {@link javax.servlet.annotation.WebListener}. For example, a
+     *    {@link ServletContextListener} defined in a TLD would not be able to
+     *    use this method.
+     * @throws IllegalStateException
+     *             If the context has already been initialised
+     * @since Servlet 3.0 TODO SERVLET3 - Add comments
+     */
+    public FilterRegistration.Dynamic addFilter(String filterName, Filter filter);
+
+    /**
+     * @param filterName
+     * @param filterClass
+     * @return TODO
+     * @throws UnsupportedOperationException    If called from a
+     *    {@link ServletContextListener#contextInitialized(ServletContextEvent)}
+     *    method of a {@link ServletContextListener} that was not defined in a
+     *    web.xml file, a web-fragment.xml file nor annotated with
+     *    {@link javax.servlet.annotation.WebListener}. For example, a
+     *    {@link ServletContextListener} defined in a TLD would not be able to
+     *    use this method.
+     * @throws IllegalStateException
+     *             If the context has already been initialised
+     * @since Servlet 3.0 TODO SERVLET3 - Add comments
+     */
+    public FilterRegistration.Dynamic addFilter(String filterName,
+            Class<? extends Filter> filterClass);
+
+    /**
+     * @param c
+     * @return TODO
+     * @throws UnsupportedOperationException    If called from a
+     *    {@link ServletContextListener#contextInitialized(ServletContextEvent)}
+     *    method of a {@link ServletContextListener} that was not defined in a
+     *    web.xml file, a web-fragment.xml file nor annotated with
+     *    {@link javax.servlet.annotation.WebListener}. For example, a
+     *    {@link ServletContextListener} defined in a TLD would not be able to
+     *    use this method.
+     * @throws ServletException
+     * @since Servlet 3.0 TODO SERVLET3 - Add comments
+     */
+    public <T extends Filter> T createFilter(Class<T> c)
+            throws ServletException;
+
+    /**
+     * @param filterName
+     * @return TODO
+     * @throws UnsupportedOperationException    If called from a
+     *    {@link ServletContextListener#contextInitialized(ServletContextEvent)}
+     *    method of a {@link ServletContextListener} that was not defined in a
+     *    web.xml file, a web-fragment.xml file nor annotated with
+     *    {@link javax.servlet.annotation.WebListener}. For example, a
+     *    {@link ServletContextListener} defined in a TLD would not be able to
+     *    use this method.
+     * @since Servlet 3.0 TODO SERVLET3 - Add comments
+     */
+    public FilterRegistration getFilterRegistration(String filterName);
+
+    /**
+     * @return TODO
+     * @throws UnsupportedOperationException    If called from a
+     *    {@link ServletContextListener#contextInitialized(ServletContextEvent)}
+     *    method of a {@link ServletContextListener} that was not defined in a
+     *    web.xml file, a web-fragment.xml file nor annotated with
+     *    {@link javax.servlet.annotation.WebListener}. For example, a
+     *    {@link ServletContextListener} defined in a TLD would not be able to
+     *    use this method.
+     * @since Servlet 3.0 TODO SERVLET3 - Add comments
+     */
+    public Map<String, ? extends FilterRegistration> getFilterRegistrations();
+
+    /**
+     * @return TODO
+     * @throws UnsupportedOperationException    If called from a
+     *    {@link ServletContextListener#contextInitialized(ServletContextEvent)}
+     *    method of a {@link ServletContextListener} that was not defined in a
+     *    web.xml file, a web-fragment.xml file nor annotated with
+     *    {@link javax.servlet.annotation.WebListener}. For example, a
+     *    {@link ServletContextListener} defined in a TLD would not be able to
+     *    use this method.
+     * @since Servlet 3.0 TODO SERVLET3 - Add comments
+     */
+    public SessionCookieConfig getSessionCookieConfig();
+
+    /**
+     * @param sessionTrackingModes
+     * @throws IllegalArgumentException
+     *             If sessionTrackingModes specifies
+     *             {@link SessionTrackingMode#SSL} in combination with any other
+     *             {@link SessionTrackingMode}
+     * @throws IllegalStateException
+     *             If the context has already been initialised
+     * @throws UnsupportedOperationException    If called from a
+     *    {@link ServletContextListener#contextInitialized(ServletContextEvent)}
+     *    method of a {@link ServletContextListener} that was not defined in a
+     *    web.xml file, a web-fragment.xml file nor annotated with
+     *    {@link javax.servlet.annotation.WebListener}. For example, a
+     *    {@link ServletContextListener} defined in a TLD would not be able to
+     *    use this method.
+     * @since Servlet 3.0 TODO SERVLET3 - Add comments
+     */
+    public void setSessionTrackingModes(
+            Set<SessionTrackingMode> sessionTrackingModes);
+
+    /**
+     * @return TODO
+     * @throws UnsupportedOperationException    If called from a
+     *    {@link ServletContextListener#contextInitialized(ServletContextEvent)}
+     *    method of a {@link ServletContextListener} that was not defined in a
+     *    web.xml file, a web-fragment.xml file nor annotated with
+     *    {@link javax.servlet.annotation.WebListener}. For example, a
+     *    {@link ServletContextListener} defined in a TLD would not be able to
+     *    use this method.
+     * @since Servlet 3.0 TODO SERVLET3 - Add comments
+     */
+    public Set<SessionTrackingMode> getDefaultSessionTrackingModes();
+
+    /**
+     * @return TODO
+     * @throws UnsupportedOperationException    If called from a
+     *    {@link ServletContextListener#contextInitialized(ServletContextEvent)}
+     *    method of a {@link ServletContextListener} that was not defined in a
+     *    web.xml file, a web-fragment.xml file nor annotated with
+     *    {@link javax.servlet.annotation.WebListener}. For example, a
+     *    {@link ServletContextListener} defined in a TLD would not be able to
+     *    use this method.
+     * @since Servlet 3.0 TODO SERVLET3 - Add comments
+     */
+    public Set<SessionTrackingMode> getEffectiveSessionTrackingModes();
+
+    /**
+     * @param className
+     * @throws UnsupportedOperationException    If called from a
+     *    {@link ServletContextListener#contextInitialized(ServletContextEvent)}
+     *    method of a {@link ServletContextListener} that was not defined in a
+     *    web.xml file, a web-fragment.xml file nor annotated with
+     *    {@link javax.servlet.annotation.WebListener}. For example, a
+     *    {@link ServletContextListener} defined in a TLD would not be able to
+     *    use this method.
+     * @since Servlet 3.0 TODO SERVLET3 - Add comments
+     */
+    public void addListener(String className);
+
+    /**
+     * @param <T>
+     * @param t
+     * @throws UnsupportedOperationException    If called from a
+     *    {@link ServletContextListener#contextInitialized(ServletContextEvent)}
+     *    method of a {@link ServletContextListener} that was not defined in a
+     *    web.xml file, a web-fragment.xml file nor annotated with
+     *    {@link javax.servlet.annotation.WebListener}. For example, a
+     *    {@link ServletContextListener} defined in a TLD would not be able to
+     *    use this method.
+     * @since Servlet 3.0 TODO SERVLET3 - Add comments
+     */
+    public <T extends EventListener> void addListener(T t);
+
+    /**
+     * @param listenerClass
+     * @throws UnsupportedOperationException    If called from a
+     *    {@link ServletContextListener#contextInitialized(ServletContextEvent)}
+     *    method of a {@link ServletContextListener} that was not defined in a
+     *    web.xml file, a web-fragment.xml file nor annotated with
+     *    {@link javax.servlet.annotation.WebListener}. For example, a
+     *    {@link ServletContextListener} defined in a TLD would not be able to
+     *    use this method.
+     * @since Servlet 3.0 TODO SERVLET3 - Add comments
+     */
+    public void addListener(Class<? extends EventListener> listenerClass);
+
+    /**
+     * @param <T>
+     * @param c
+     * @return TODO
+     * @throws ServletException
+     * @throws UnsupportedOperationException    If called from a
+     *    {@link ServletContextListener#contextInitialized(ServletContextEvent)}
+     *    method of a {@link ServletContextListener} that was not defined in a
+     *    web.xml file, a web-fragment.xml file nor annotated with
+     *    {@link javax.servlet.annotation.WebListener}. For example, a
+     *    {@link ServletContextListener} defined in a TLD would not be able to
+     *    use this method.
+     * @since Servlet 3.0 TODO SERVLET3 - Add comments
+     */
+    public <T extends EventListener> T createListener(Class<T> c)
+            throws ServletException;
+
+    /**
+     * @return TODO
+     * @throws UnsupportedOperationException    If called from a
+     *    {@link ServletContextListener#contextInitialized(ServletContextEvent)}
+     *    method of a {@link ServletContextListener} that was not defined in a
+     *    web.xml file, a web-fragment.xml file nor annotated with
+     *    {@link javax.servlet.annotation.WebListener}. For example, a
+     *    {@link ServletContextListener} defined in a TLD would not be able to
+     *    use this method.
+     * @since Servlet 3.0 TODO SERVLET3 - Add comments
+     */
+    public JspConfigDescriptor getJspConfigDescriptor();
+
+    /**
+     * @return TODO
+     * @throws UnsupportedOperationException    If called from a
+     *    {@link ServletContextListener#contextInitialized(ServletContextEvent)}
+     *    method of a {@link ServletContextListener} that was not defined in a
+     *    web.xml file, a web-fragment.xml file nor annotated with
+     *    {@link javax.servlet.annotation.WebListener}. For example, a
+     *    {@link ServletContextListener} defined in a TLD would not be able to
+     *    use this method.
+     * @throws SecurityException
+     * @since Servlet 3.0 TODO SERVLET3 - Add comments
+     */
+    public ClassLoader getClassLoader();
+
+    /**
+     * @param roleNames
+     * @throws UnsupportedOperationException    If called from a
+     *    {@link ServletContextListener#contextInitialized(ServletContextEvent)}
+     *    method of a {@link ServletContextListener} that was not defined in a
+     *    web.xml file, a web-fragment.xml file nor annotated with
+     *    {@link javax.servlet.annotation.WebListener}. For example, a
+     *    {@link ServletContextListener} defined in a TLD would not be able to
+     *    use this method.
+     * @throws IllegalArgumentException
+     * @throws IllegalStateException
+     * @since Servlet 3.0 TODO SERVLET3 - Add comments
+     */
+    public void declareRoles(String... roleNames);
+
+    /**
+     * Returns the primary name of the virtual host on which this context is
+     * deployed. The name may or may not be a valid host name.
+     */
+    public String getVirtualServerName();
+}
diff --git a/lib/servlet-api/javax/servlet/ServletContextAttributeEvent.java b/lib/servlet-api/javax/servlet/ServletContextAttributeEvent.java
new file mode 100644 (file)
index 0000000..b1bf727
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package 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 static final long serialVersionUID = 1L;
+
+    private final String name;
+    private final 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;
+    }
+}
diff --git a/lib/servlet-api/javax/servlet/ServletContextAttributeListener.java b/lib/servlet-api/javax/servlet/ServletContextAttributeListener.java
new file mode 100644 (file)
index 0000000..60cd3ab
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package 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);
+}
diff --git a/lib/servlet-api/javax/servlet/ServletContextEvent.java b/lib/servlet-api/javax/servlet/ServletContextEvent.java
new file mode 100644 (file)
index 0000000..92a9120
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package 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 {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 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();
+    }
+}
diff --git a/lib/servlet-api/javax/servlet/ServletContextListener.java b/lib/servlet-api/javax/servlet/ServletContextListener.java
new file mode 100644 (file)
index 0000000..7d1b8e6
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package 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);
+}
diff --git a/lib/servlet-api/javax/servlet/ServletException.java b/lib/servlet-api/javax/servlet/ServletException.java
new file mode 100644 (file)
index 0000000..96e3e5c
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package javax.servlet;
+
+/**
+ * Defines a general exception a servlet can throw when it encounters
+ * difficulty.
+ */
+public class ServletException extends Exception {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 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);
+    }
+
+    /**
+     * 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);
+    }
+
+    /**
+     * Returns the exception that caused this servlet exception.
+     *
+     * @return the <code>Throwable</code> that caused this servlet exception
+     */
+    public Throwable getRootCause() {
+        return getCause();
+    }
+}
diff --git a/lib/servlet-api/javax/servlet/ServletInputStream.java b/lib/servlet-api/javax/servlet/ServletInputStream.java
new file mode 100644 (file)
index 0000000..d116e32
--- /dev/null
@@ -0,0 +1,117 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package javax.servlet;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * 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.
+ *
+ * @see ServletRequest
+ */
+public abstract class ServletInputStream extends InputStream {
+
+    /**
+     * Does nothing, because this is an abstract class.
+     */
+    protected ServletInputStream() {
+        // NOOP
+    }
+
+    /**
+     * 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;
+    }
+
+    /**
+     * Returns <code>true</code> if all the data has been read from the stream,
+     * else <code>false</code>.
+     *
+     * @since Servlet 3.1
+     */
+    public abstract boolean isFinished();
+
+    /**
+     * Returns <code>true</code> if data can be read without blocking, else
+     * <code>false</code>. If this method is called and returns false, the
+     * container will invoke {@link ReadListener#onDataAvailable()} when data is
+     * available.
+     *
+     * @since Servlet 3.1
+     */
+    public abstract boolean isReady();
+
+    /**
+     * Sets the {@link ReadListener} for this {@link ServletInputStream} and
+     * thereby switches to non-blocking IO. It is only valid to switch to
+     * non-blocking IO within async processing or HTTP upgrade processing.
+     *
+     * @param listener  The non-blocking IO read listener
+     *
+     * @throws IllegalStateException    If this method is called if neither
+     *                                  async nor HTTP upgrade is in progress or
+     *                                  if the {@link ReadListener} has already
+     *                                  been set
+     * @throws NullPointerException     If listener is null
+     *
+     * @since Servlet 3.1
+     */
+    public abstract void setReadListener(ReadListener listener);
+}
diff --git a/lib/servlet-api/javax/servlet/ServletOutputStream.java b/lib/servlet-api/javax/servlet/ServletOutputStream.java
new file mode 100644 (file)
index 0000000..3498e2d
--- /dev/null
@@ -0,0 +1,302 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package javax.servlet;
+
+import java.io.CharConversionException;
+import java.io.IOException;
+import java.io.OutputStream;
+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.
+ *
+ * @see ServletResponse
+ */
+public abstract class ServletOutputStream extends OutputStream {
+
+    private static final String LSTRING_FILE = "javax.servlet.LocalStrings";
+    private static final ResourceBundle lStrings = ResourceBundle.getBundle(LSTRING_FILE);
+
+    /**
+     * Does nothing, because this is an abstract class.
+     */
+    protected ServletOutputStream() {
+        // NOOP
+    }
+
+    /**
+     * 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] = Character.valueOf(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();
+    }
+
+    /**
+     * Checks if a non-blocking write will succeed. If this returns
+     * <code>false</code>, it will cause a callback to
+     * {@link WriteListener#onWritePossible()} when the buffer has emptied. If
+     * this method returns <code>false</code> no further data must be written
+     * until the contain calls {@link WriteListener#onWritePossible()}.
+     *
+     * @return <code>true</code> if data can be written, else <code>false</code>
+     *
+     * @since Servlet 3.1
+     */
+    public abstract boolean isReady();
+
+    /**
+     * Sets the {@link WriteListener} for this {@link ServletOutputStream} and
+     * thereby switches to non-blocking IO. It is only valid to switch to
+     * non-blocking IO within async processing or HTTP upgrade processing.
+     *
+     * @param listener  The non-blocking IO write listener
+     *
+     * @throws IllegalStateException    If this method is called if neither
+     *                                  async nor HTTP upgrade is in progress or
+     *                                  if the {@link WriteListener} has already
+     *                                  been set
+     * @throws NullPointerException     If listener is null
+     *
+     * @since Servlet 3.1
+     */
+    public abstract void setWriteListener(javax.servlet.WriteListener listener);
+}
diff --git a/lib/servlet-api/javax/servlet/ServletRegistration.java b/lib/servlet-api/javax/servlet/ServletRegistration.java
new file mode 100644 (file)
index 0000000..a0b5b34
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License.  You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package javax.servlet;
+
+import java.util.Collection;
+import java.util.Set;
+
+/**
+ * TODO SERVLET3 - Add comments
+ * @since Servlet 3.0
+ */
+public interface ServletRegistration extends Registration {
+
+    /**
+     *
+     * @param urlPatterns
+     * @return TODO
+     * @throws IllegalArgumentException if urlPattern is null or empty
+     * @throws IllegalStateException if the associated ServletContext has
+     *                                  already been initialised
+     */
+    public Set<String> addMapping(String... urlPatterns);
+
+    public Collection<String> getMappings();
+
+    public String getRunAsRole();
+
+    public static interface Dynamic
+    extends ServletRegistration, Registration.Dynamic {
+        public void setLoadOnStartup(int loadOnStartup);
+        public void setMultipartConfig(MultipartConfigElement multipartConfig);
+        public void setRunAsRole(String roleName);
+        public Set<String> setServletSecurity(ServletSecurityElement constraint);
+    }
+}
diff --git a/lib/servlet-api/javax/servlet/ServletRequest.java b/lib/servlet-api/javax/servlet/ServletRequest.java
new file mode 100644 (file)
index 0000000..f32dff3
--- /dev/null
@@ -0,0 +1,492 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package 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}.
+ *
+ * @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.
+     * Names beginning with <code>java.*</code> and <code>javax.*</code> are
+     * reserved for use by the Servlet specification. Names beginning with
+     * <code>sun.*</code>, <code>com.sun.*</code>, <code>oracle.*</code> and
+     * <code>com.oracle.*</code>) are reserved for use by Oracle Corporation.
+     *
+     * @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<String> 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().
+     *
+     * @param env
+     *            a <code>String</code> containing the name of the character
+     *            encoding.
+     * @throws java.io.UnsupportedEncodingException
+     *             if this is not a valid encoding
+     */
+    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 or is greater than {@link Integer#MAX_VALUE}
+     */
+    public int getContentLength();
+
+    /**
+     * 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 a long integer containing the length of the request body or -1 if
+     *         the length is not known
+     */
+    public long getContentLengthLong();
+
+    /**
+     * 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<String> 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<String, String[]> 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 java.io.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> and <code>javax.*</code> are
+     * reserved for use by the Servlet specification. Names beginning with
+     * <code>sun.*</code>, <code>com.sun.*</code>, <code>oracle.*</code> and
+     * <code>com.oracle.*</code>) are reserved for use by Oracle Corporation.
+     * <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> and <code>javax.*</code> are
+     * reserved for use by the Servlet specification. Names beginning with
+     * <code>sun.*</code>, <code>com.sun.*</code>, <code>oracle.*</code> and
+     * <code>com.oracle.*</code>) are reserved for use by Oracle Corporation.
+     *
+     * @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<Locale> 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.
+     */
+    @SuppressWarnings("dep-ann")
+    // Spec API does not use @Deprecated
+    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();
+
+    /**
+     * @return TODO
+     * @since Servlet 3.0 TODO SERVLET3 - Add comments
+     */
+    public ServletContext getServletContext();
+
+    /**
+     * @return TODO
+     * @throws java.lang.IllegalStateException
+     *             If async is not supported for this request
+     * @since Servlet 3.0 TODO SERVLET3 - Add comments
+     */
+    public AsyncContext startAsync() throws IllegalStateException;
+
+    /**
+     * @param servletRequest
+     * @param servletResponse
+     * @return TODO
+     * @throws java.lang.IllegalStateException
+     * @since Servlet 3.0 TODO SERVLET3 - Add comments
+     */
+    public AsyncContext startAsync(ServletRequest servletRequest,
+            ServletResponse servletResponse) throws IllegalStateException;
+
+    /**
+     * @return TODO
+     * @since Servlet 3.0 TODO SERVLET3 - Add comments
+     */
+    public boolean isAsyncStarted();
+
+    /**
+     * @return TODO
+     * @since Servlet 3.0 TODO SERVLET3 - Add comments
+     */
+    public boolean isAsyncSupported();
+
+    /**
+     * @return TODO
+     * @throws java.lang.IllegalStateException
+     * @since Servlet 3.0 TODO SERVLET3 - Add comments
+     */
+    public AsyncContext getAsyncContext();
+
+    /**
+     * @return TODO
+     * @since Servlet 3.0 TODO SERVLET3 - Add comments
+     */
+    public DispatcherType getDispatcherType();
+}
diff --git a/lib/servlet-api/javax/servlet/ServletRequestAttributeEvent.java b/lib/servlet-api/javax/servlet/ServletRequestAttributeEvent.java
new file mode 100644 (file)
index 0000000..9b25184
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package 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 static final long serialVersionUID = 1L;
+
+    private final String name;
+    private final 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;
+    }
+}
diff --git a/lib/servlet-api/javax/servlet/ServletRequestAttributeListener.java b/lib/servlet-api/javax/servlet/ServletRequestAttributeListener.java
new file mode 100644 (file)
index 0000000..8d65fa1
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License.  You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package 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);
+}
+
diff --git a/lib/servlet-api/javax/servlet/ServletRequestEvent.java b/lib/servlet-api/javax/servlet/ServletRequestEvent.java
new file mode 100644 (file)
index 0000000..5d95eab
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package 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 static final long serialVersionUID = 1L;
+
+    private final transient 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();
+    }
+}
diff --git a/lib/servlet-api/javax/servlet/ServletRequestListener.java b/lib/servlet-api/javax/servlet/ServletRequestListener.java
new file mode 100644 (file)
index 0000000..4ac7055
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License.  You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package 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 );
+}
diff --git a/lib/servlet-api/javax/servlet/ServletRequestWrapper.java b/lib/servlet-api/javax/servlet/ServletRequestWrapper.java
new file mode 100644 (file)
index 0000000..308a29f
--- /dev/null
@@ -0,0 +1,458 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package 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.
+     */
+    @Override
+    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.
+     */
+    @Override
+    public Enumeration<String> getAttributeNames() {
+        return this.request.getAttributeNames();
+    }
+
+    /**
+     * The default behavior of this method is to return getCharacterEncoding()
+     * on the wrapped request object.
+     */
+    @Override
+    public String getCharacterEncoding() {
+        return this.request.getCharacterEncoding();
+    }
+
+    /**
+     * The default behavior of this method is to set the character encoding on
+     * the wrapped request object.
+     */
+    @Override
+    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.
+     */
+    @Override
+    public int getContentLength() {
+        return this.request.getContentLength();
+    }
+
+    @Override
+    public long getContentLengthLong() {
+        return this.request.getContentLengthLong();
+    }
+
+    /**
+     * The default behavior of this method is to return getContentType() on the
+     * wrapped request object.
+     */
+    @Override
+    public String getContentType() {
+        return this.request.getContentType();
+    }
+
+    /**
+     * The default behavior of this method is to return getInputStream() on the
+     * wrapped request object.
+     */
+    @Override
+    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.
+     */
+    @Override
+    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.
+     */
+    @Override
+    public Map<String, String[]> getParameterMap() {
+        return this.request.getParameterMap();
+    }
+
+    /**
+     * The default behavior of this method is to return getParameterNames() on
+     * the wrapped request object.
+     */
+    @Override
+    public Enumeration<String> getParameterNames() {
+        return this.request.getParameterNames();
+    }
+
+    /**
+     * The default behavior of this method is to return
+     * getParameterValues(String name) on the wrapped request object.
+     */
+    @Override
+    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.
+     */
+    @Override
+    public String getProtocol() {
+        return this.request.getProtocol();
+    }
+
+    /**
+     * The default behavior of this method is to return getScheme() on the
+     * wrapped request object.
+     */
+    @Override
+    public String getScheme() {
+        return this.request.getScheme();
+    }
+
+    /**
+     * The default behavior of this method is to return getServerName() on the
+     * wrapped request object.
+     */
+    @Override
+    public String getServerName() {
+        return this.request.getServerName();
+    }
+
+    /**
+     * The default behavior of this method is to return getServerPort() on the
+     * wrapped request object.
+     */
+    @Override
+    public int getServerPort() {
+        return this.request.getServerPort();
+    }
+
+    /**
+     * The default behavior of this method is to return getReader() on the
+     * wrapped request object.
+     */
+    @Override
+    public BufferedReader getReader() throws IOException {
+        return this.request.getReader();
+    }
+
+    /**
+     * The default behavior of this method is to return getRemoteAddr() on the
+     * wrapped request object.
+     */
+    @Override
+    public String getRemoteAddr() {
+        return this.request.getRemoteAddr();
+    }
+
+    /**
+     * The default behavior of this method is to return getRemoteHost() on the
+     * wrapped request object.
+     */
+    @Override
+    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.
+     */
+    @Override
+    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.
+     */
+    @Override
+    public void removeAttribute(String name) {
+        this.request.removeAttribute(name);
+    }
+
+    /**
+     * The default behavior of this method is to return getLocale() on the
+     * wrapped request object.
+     */
+    @Override
+    public Locale getLocale() {
+        return this.request.getLocale();
+    }
+
+    /**
+     * The default behavior of this method is to return getLocales() on the
+     * wrapped request object.
+     */
+    @Override
+    public Enumeration<Locale> getLocales() {
+        return this.request.getLocales();
+    }
+
+    /**
+     * The default behavior of this method is to return isSecure() on the
+     * wrapped request object.
+     */
+    @Override
+    public boolean isSecure() {
+        return this.request.isSecure();
+    }
+
+    /**
+     * The default behavior of this method is to return
+     * getRequestDispatcher(String path) on the wrapped request object.
+     */
+    @Override
+    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 3.0 of the Java Servlet API
+     */
+    @Override
+    @SuppressWarnings("dep-ann")
+    // Spec API does not use @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
+     */
+    @Override
+    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
+     */
+    @Override
+    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
+     */
+    @Override
+    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
+     */
+    @Override
+    public int getLocalPort() {
+        return this.request.getLocalPort();
+    }
+
+    /**
+     * The default behavior of this method is to return getServletContext() on
+     * the wrapped request object.
+     *
+     * @since Servlet 3.0
+     */
+    @Override
+    public ServletContext getServletContext() {
+        return request.getServletContext();
+    }
+
+    /**
+     * The default behavior of this method is to return startAsync() on the
+     * wrapped request object.
+     *
+     * @throws java.lang.IllegalStateException
+     * @since Servlet 3.0
+     */
+    @Override
+    public AsyncContext startAsync() throws IllegalStateException {
+        return request.startAsync();
+    }
+
+    /**
+     * The default behavior of this method is to return startAsync(Runnable) on
+     * the wrapped request object.
+     *
+     * @param servletRequest
+     * @param servletResponse
+     * @throws java.lang.IllegalStateException
+     * @since Servlet 3.0
+     */
+    @Override
+    public AsyncContext startAsync(ServletRequest servletRequest,
+            ServletResponse servletResponse) throws IllegalStateException {
+        return request.startAsync(servletRequest, servletResponse);
+    }
+
+    /**
+     * The default behavior of this method is to return isAsyncStarted() on the
+     * wrapped request object.
+     *
+     * @since Servlet 3.0
+     */
+    @Override
+    public boolean isAsyncStarted() {
+        return request.isAsyncStarted();
+    }
+
+    /**
+     * The default behavior of this method is to return isAsyncSupported() on
+     * the wrapped request object.
+     *
+     * @since Servlet 3.0
+     */
+    @Override
+    public boolean isAsyncSupported() {
+        return request.isAsyncSupported();
+    }
+
+    /**
+     * The default behavior of this method is to return getAsyncContext() on the
+     * wrapped request object.
+     *
+     * @since Servlet 3.0
+     */
+    @Override
+    public AsyncContext getAsyncContext() {
+        return request.getAsyncContext();
+    }
+
+    /**
+     * @param wrapped
+     * @since Servlet 3.0 TODO SERVLET3 - Add comments
+     */
+    public boolean isWrapperFor(ServletRequest wrapped) {
+        if (request == wrapped) {
+            return true;
+        }
+        if (request instanceof ServletRequestWrapper) {
+            return ((ServletRequestWrapper) request).isWrapperFor(wrapped);
+        }
+        return false;
+    }
+
+    /**
+     * @param wrappedType
+     * @since Servlet 3.0 TODO SERVLET3 - Add comments
+     */
+    public boolean isWrapperFor(Class<?> wrappedType) {
+        if (wrappedType.isAssignableFrom(request.getClass())) {
+            return true;
+        }
+        if (request instanceof ServletRequestWrapper) {
+            return ((ServletRequestWrapper) request).isWrapperFor(wrappedType);
+        }
+        return false;
+    }
+
+    /**
+     * The default behavior of this method is to call getDispatcherType() on the
+     * wrapped request object.
+     *
+     * @since Servlet 3.0
+     */
+    @Override
+    public DispatcherType getDispatcherType() {
+        return this.request.getDispatcherType();
+    }
+}
diff --git a/lib/servlet-api/javax/servlet/ServletResponse.java b/lib/servlet-api/javax/servlet/ServletResponse.java
new file mode 100644 (file)
index 0000000..f96e24e
--- /dev/null
@@ -0,0 +1,342 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package 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.
+ *
+ * @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}, 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 java.io.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 #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);
+
+    /**
+     * TODO SERVLET 3.1
+     */
+    public void setContentLengthLong(long length);
+
+    /**
+     * 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();
+
+}
diff --git a/lib/servlet-api/javax/servlet/ServletResponseWrapper.java b/lib/servlet-api/javax/servlet/ServletResponseWrapper.java
new file mode 100644 (file)
index 0000000..9b440dd
--- /dev/null
@@ -0,0 +1,244 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package 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.
+ *
+ * @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
+     */
+    @Override
+    public void setCharacterEncoding(String charset) {
+        this.response.setCharacterEncoding(charset);
+    }
+
+    /**
+     * The default behavior of this method is to return getCharacterEncoding()
+     * on the wrapped response object.
+     */
+    @Override
+    public String getCharacterEncoding() {
+        return this.response.getCharacterEncoding();
+    }
+
+    /**
+     * The default behavior of this method is to return getOutputStream() on the
+     * wrapped response object.
+     */
+    @Override
+    public ServletOutputStream getOutputStream() throws IOException {
+        return this.response.getOutputStream();
+    }
+
+    /**
+     * The default behavior of this method is to return getWriter() on the
+     * wrapped response object.
+     */
+    @Override
+    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.
+     */
+    @Override
+    public void setContentLength(int len) {
+        this.response.setContentLength(len);
+    }
+
+    /**
+     * The default behavior of this method is to call setContentLength(long len)
+     * on the wrapped response object.
+     */
+    @Override
+    public void setContentLengthLong(long length) {
+        this.response.setContentLengthLong(length);
+    }
+
+    /**
+     * The default behavior of this method is to call setContentType(String
+     * type) on the wrapped response object.
+     */
+    @Override
+    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
+     */
+    @Override
+    public String getContentType() {
+        return this.response.getContentType();
+    }
+
+    /**
+     * The default behavior of this method is to call setBufferSize(int size) on
+     * the wrapped response object.
+     */
+    @Override
+    public void setBufferSize(int size) {
+        this.response.setBufferSize(size);
+    }
+
+    /**
+     * The default behavior of this method is to return getBufferSize() on the
+     * wrapped response object.
+     */
+    @Override
+    public int getBufferSize() {
+        return this.response.getBufferSize();
+    }
+
+    /**
+     * The default behavior of this method is to call flushBuffer() on the
+     * wrapped response object.
+     */
+    @Override
+    public void flushBuffer() throws IOException {
+        this.response.flushBuffer();
+    }
+
+    /**
+     * The default behavior of this method is to return isCommitted() on the
+     * wrapped response object.
+     */
+    @Override
+    public boolean isCommitted() {
+        return this.response.isCommitted();
+    }
+
+    /**
+     * The default behavior of this method is to call reset() on the wrapped
+     * response object.
+     */
+    @Override
+    public void reset() {
+        this.response.reset();
+    }
+
+    /**
+     * The default behavior of this method is to call resetBuffer() on the
+     * wrapped response object.
+     */
+    @Override
+    public void resetBuffer() {
+        this.response.resetBuffer();
+    }
+
+    /**
+     * The default behavior of this method is to call setLocale(Locale loc) on
+     * the wrapped response object.
+     */
+    @Override
+    public void setLocale(Locale loc) {
+        this.response.setLocale(loc);
+    }
+
+    /**
+     * The default behavior of this method is to return getLocale() on the
+     * wrapped response object.
+     */
+    @Override
+    public Locale getLocale() {
+        return this.response.getLocale();
+    }
+
+    /**
+     * @param wrapped
+     * @since Servlet 3.0 TODO SERVLET3 - Add comments
+     */
+    public boolean isWrapperFor(ServletResponse wrapped) {
+        if (response == wrapped) {
+            return true;
+        }
+        if (response instanceof ServletResponseWrapper) {
+            return ((ServletResponseWrapper) response).isWrapperFor(wrapped);
+        }
+        return false;
+    }
+
+    /**
+     * @param wrappedType
+     * @since Servlet 3.0 TODO SERVLET3 - Add comments
+     */
+    public boolean isWrapperFor(Class<?> wrappedType) {
+        if (wrappedType.isAssignableFrom(response.getClass())) {
+            return true;
+        }
+        if (response instanceof ServletResponseWrapper) {
+            return ((ServletResponseWrapper) response).isWrapperFor(wrappedType);
+        }
+        return false;
+    }
+
+}
diff --git a/lib/servlet-api/javax/servlet/ServletSecurityElement.java b/lib/servlet-api/javax/servlet/ServletSecurityElement.java
new file mode 100644 (file)
index 0000000..cf2832f
--- /dev/null
@@ -0,0 +1,135 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package javax.servlet;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.annotation.HttpMethodConstraint;
+import javax.servlet.annotation.ServletSecurity;
+
+/**
+ *
+ * @since Servlet 3.0
+ * TODO SERVLET3 - Add comments
+ */
+public class ServletSecurityElement extends HttpConstraintElement {
+
+    private final Map<String,HttpMethodConstraintElement> methodConstraints =
+        new HashMap<>();
+
+    /**
+     * Use default HttpConstraint.
+     */
+    public ServletSecurityElement() {
+        super();
+    }
+
+    /**
+     * Use specified HttpConstraintElement.
+     * @param httpConstraintElement
+     */
+    public ServletSecurityElement(HttpConstraintElement httpConstraintElement) {
+        this (httpConstraintElement, null);
+    }
+
+    /**
+     * Use specific constraints for specified methods and default
+     * HttpConstraintElement for all other methods.
+     * @param httpMethodConstraints
+     * @throws IllegalArgumentException if a method name is specified more than
+     * once
+     */
+    public ServletSecurityElement(
+            Collection<HttpMethodConstraintElement> httpMethodConstraints) {
+        super();
+        addHttpMethodConstraints(httpMethodConstraints);
+    }
+
+
+    /**
+     * Use specified HttpConstraintElement as default and specific constraints
+     * for specified methods.
+     * @param httpConstraintElement
+     * @param httpMethodConstraints
+     * @throws IllegalArgumentException if a method name is specified more than
+     */
+    public ServletSecurityElement(HttpConstraintElement httpConstraintElement,
+            Collection<HttpMethodConstraintElement> httpMethodConstraints) {
+        super(httpConstraintElement.getEmptyRoleSemantic(),
+                httpConstraintElement.getTransportGuarantee(),
+                httpConstraintElement.getRolesAllowed());
+        addHttpMethodConstraints(httpMethodConstraints);
+    }
+
+    /**
+     * Create from an annotation.
+     * @param annotation
+     * @throws IllegalArgumentException if a method name is specified more than
+     */
+    public ServletSecurityElement(ServletSecurity annotation) {
+        this(new HttpConstraintElement(annotation.value().value(),
+                annotation.value().transportGuarantee(),
+                annotation.value().rolesAllowed()));
+
+        List<HttpMethodConstraintElement> l = new ArrayList<>();
+        HttpMethodConstraint[] constraints = annotation.httpMethodConstraints();
+        if (constraints != null) {
+            for (int i = 0; i < constraints.length; i++) {
+                HttpMethodConstraintElement e =
+                    new HttpMethodConstraintElement(constraints[i].value(),
+                            new HttpConstraintElement(
+                                    constraints[i].emptyRoleSemantic(),
+                                    constraints[i].transportGuarantee(),
+                                    constraints[i].rolesAllowed()));
+                l.add(e);
+            }
+        }
+        addHttpMethodConstraints(l);
+    }
+
+    public Collection<HttpMethodConstraintElement> getHttpMethodConstraints() {
+        Collection<HttpMethodConstraintElement> result = new HashSet<>();
+        result.addAll(methodConstraints.values());
+        return result;
+    }
+
+    public Collection<String> getMethodNames() {
+        Collection<String> result = new HashSet<>();
+        result.addAll(methodConstraints.keySet());
+        return result;
+    }
+
+    private void addHttpMethodConstraints(
+            Collection<HttpMethodConstraintElement> httpMethodConstraints) {
+        if (httpMethodConstraints == null) {
+            return;
+        }
+        for (HttpMethodConstraintElement constraint : httpMethodConstraints) {
+            String method = constraint.getMethodName();
+            if (methodConstraints.containsKey(method)) {
+                throw new IllegalArgumentException(
+                        "Duplicate method name: " + method);
+            }
+            methodConstraints.put(method, constraint);
+        }
+    }
+}
diff --git a/lib/servlet-api/javax/servlet/SessionCookieConfig.java b/lib/servlet-api/javax/servlet/SessionCookieConfig.java
new file mode 100644 (file)
index 0000000..11567c0
--- /dev/null
@@ -0,0 +1,90 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package javax.servlet;
+
+/**
+ *
+ * TODO SERVLET3 - Add comments
+ * @since Servlet 3.0
+ */
+public interface SessionCookieConfig {
+
+    /**
+     *
+     * @param name
+     * @throws IllegalStateException
+     */
+    public void setName(String name);
+
+    public String getName();
+
+    /**
+     *
+     * @param domain
+     * @throws IllegalStateException
+     */
+    public void setDomain(String domain);
+
+    public String getDomain();
+
+    /**
+     *
+     * @param path
+     * @throws IllegalStateException
+     */
+    public void setPath(String path);
+
+    public String getPath();
+
+    /**
+     *
+     * @param comment
+     * @throws IllegalStateException
+     */
+    public void setComment(String comment);
+
+    public String getComment();
+
+    /**
+     *
+     * @param httpOnly
+     * @throws IllegalStateException
+     */
+    public void setHttpOnly(boolean httpOnly);
+
+    public boolean isHttpOnly();
+
+    /**
+     *
+     * @param secure
+     * @throws IllegalStateException
+     */
+    public void setSecure(boolean secure);
+
+    public boolean isSecure();
+
+    /**
+     * Sets the maximum age.
+     *
+     * @param MaxAge the maximum age to set
+     * @throws IllegalStateException
+     */
+    public void setMaxAge(int MaxAge);
+
+    public int getMaxAge();
+
+}
diff --git a/lib/servlet-api/javax/servlet/SessionTrackingMode.java b/lib/servlet-api/javax/servlet/SessionTrackingMode.java
new file mode 100644 (file)
index 0000000..c59fd0c
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License.  You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package javax.servlet;
+
+/**
+ * @since Servlet 3.0
+ */
+public enum SessionTrackingMode {
+    COOKIE,
+    URL,
+    SSL
+}
diff --git a/lib/servlet-api/javax/servlet/SingleThreadModel.java b/lib/servlet-api/javax/servlet/SingleThreadModel.java
new file mode 100644 (file)
index 0000000..6e8437e
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package 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.
+ *
+ * @deprecated As of Java Servlet API 2.4, with no direct replacement.
+ */
+@SuppressWarnings("dep-ann")
+// Spec API does not use @Deprecated
+public interface SingleThreadModel {
+    // No methods
+}
diff --git a/lib/servlet-api/javax/servlet/UnavailableException.java b/lib/servlet-api/javax/servlet/UnavailableException.java
new file mode 100644 (file)
index 0000000..c03c6d2
--- /dev/null
@@ -0,0 +1,178 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package 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.
+ */
+public class UnavailableException extends ServletException {
+
+    private static final long serialVersionUID = 1L;
+
+    private final Servlet servlet; // what's unavailable
+    private final boolean permanent; // needs admin action?
+    private final int seconds; // unavailability estimate
+
+    /**
+     * @param servlet
+     *            the <code>Servlet</code> instance that is unavailable
+     * @param msg
+     *            a <code>String</code> specifying the descriptive message
+     * @deprecated As of Java Servlet API 2.2, use
+     *             {@link #UnavailableException(String)} instead.
+     */
+    @SuppressWarnings("dep-ann")
+    // Spec API does not use @Deprecated
+    public UnavailableException(Servlet servlet, String msg) {
+        super(msg);
+        this.servlet = servlet;
+        permanent = true;
+        this.seconds = 0;
+    }
+
+    /**
+     * @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 As of Java Servlet API 2.2, use
+     *             {@link #UnavailableException(String, int)} instead.
+     */
+    @SuppressWarnings("dep-ann")
+    // Spec API does not use @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);
+        seconds = 0;
+        servlet = null;
+        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;
+        servlet = null;
+        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;
+    }
+
+    /**
+     * Returns the servlet that is reporting its unavailability.
+     *
+     * @return the <code>Servlet</code> object that is throwing the
+     *         <code>UnavailableException</code>
+     * @deprecated As of Java Servlet API 2.2, with no replacement.
+     */
+    @SuppressWarnings("dep-ann")
+    // Spec API does not use @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;
+    }
+}
diff --git a/lib/servlet-api/javax/servlet/WriteListener.java b/lib/servlet-api/javax/servlet/WriteListener.java
new file mode 100644 (file)
index 0000000..488111f
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package javax.servlet;
+
+import java.io.IOException;
+
+/**
+ * Receives notification of write events when using non-blocking IO.
+ *
+ * @since Servlet 3.1
+ */
+public interface WriteListener extends java.util.EventListener{
+
+    /**
+     * Invoked when it it possible to write data without blocking. The container
+     * will invoke this method the first time for a request as soon as data can
+     * be written. Subsequent invocations will only occur if a call to
+     * {@link ServletOutputStream#isReady()} has returned false and it has since
+     * become possible to write data.
+     *
+     * @throws IOException
+     */
+    public void onWritePossible() throws IOException;
+
+    /**
+     * Invoked if an error occurs while writing the response.
+     *
+     * @param throwable
+     */
+    public void onError(java.lang.Throwable throwable);
+}
\ No newline at end of file
diff --git a/lib/servlet-api/javax/servlet/annotation/HandlesTypes.java b/lib/servlet-api/javax/servlet/annotation/HandlesTypes.java
new file mode 100644 (file)
index 0000000..c5f26b0
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package javax.servlet.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * This annotation is used to declare an array of application classes which are
+ * passed to a {@link javax.servlet.ServletContainerInitializer}.
+ *
+ * @since Servlet 3.0
+ */
+@Target({ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface HandlesTypes {
+
+    /**
+     * @return array of classes
+     */
+    Class<?>[] value();
+
+}
diff --git a/lib/servlet-api/javax/servlet/annotation/HttpConstraint.java b/lib/servlet-api/javax/servlet/annotation/HttpConstraint.java
new file mode 100644 (file)
index 0000000..fd4366c
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package javax.servlet.annotation;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+import javax.servlet.annotation.ServletSecurity.EmptyRoleSemantic;
+import javax.servlet.annotation.ServletSecurity.TransportGuarantee;
+
+/**
+ * This annotation represents the security constraints that are applied to all
+ * requests with HTTP protocol method types that are not otherwise represented
+ * by a corresponding {@link javax.servlet.annotation.HttpMethodConstraint} in a
+ * {@link javax.servlet.annotation.ServletSecurity} annotation.
+ *
+ * @since Servlet 3.0
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface HttpConstraint {
+
+    /**
+     * The EmptyRoleSemantic determines the behaviour when the rolesAllowed list
+     * is empty.
+     *
+     * @return empty role semantic
+     */
+    EmptyRoleSemantic value() default EmptyRoleSemantic.PERMIT;
+
+    /**
+     * Determines whether SSL/TLS is required to process the current request.
+     *
+     * @return transport guarantee
+     */
+    TransportGuarantee transportGuarantee() default TransportGuarantee.NONE;
+
+    /**
+     * The authorized roles' names. The container may discard duplicate role
+     * names during processing of the annotation. N.B. The String "*" does not
+     * have a special meaning if it occurs as a role name.
+     *
+     * @return array of names. The array may be of zero length, in which case
+     *         the EmptyRoleSemantic applies; the returned value determines
+     *         whether access is to be permitted or denied regardless of the
+     *         identity and authentication state in either case, PERMIT or DENY.<br />
+     *         Otherwise, when the array contains one or more role names access
+     *         is permitted if the user a member of at least one of the named
+     *         roles. The EmptyRoleSemantic is not applied in this case.
+     *
+     */
+    String[] rolesAllowed() default {};
+
+}
diff --git a/lib/servlet-api/javax/servlet/annotation/HttpMethodConstraint.java b/lib/servlet-api/javax/servlet/annotation/HttpMethodConstraint.java
new file mode 100644 (file)
index 0000000..84e7c1d
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package javax.servlet.annotation;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+import javax.servlet.annotation.ServletSecurity.EmptyRoleSemantic;
+import javax.servlet.annotation.ServletSecurity.TransportGuarantee;
+
+/**
+ * Specific security constraints can be applied to different types of request,
+ * differentiated by the HTTP protocol method type by using this annotation
+ * inside the {@link javax.servlet.annotation.ServletSecurity} annotation.
+ *
+ * @since Servlet 3.0
+ *
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface HttpMethodConstraint {
+
+    /**
+     * HTTP Protocol method name (e.g. POST, PUT)
+     *
+     * @return method name
+     */
+    String value();
+
+    /**
+     * The EmptyRoleSemantic determines the behaviour when the rolesAllowed list
+     * is empty.
+     *
+     * @return empty role semantic
+     */
+    EmptyRoleSemantic emptyRoleSemantic() default EmptyRoleSemantic.PERMIT;
+
+    /**
+     * Determines whether SSL/TLS is required to process the current request.
+     *
+     * @return transport guarantee
+     */
+    TransportGuarantee transportGuarantee() default TransportGuarantee.NONE;
+
+    /**
+     * The authorized roles' names. The container may discard duplicate role
+     * names during processing of the annotation. N.B. The String "*" does not
+     * have a special meaning if it occurs as a role name.
+     *
+     * @return array of names. The array may be of zero length, in which case
+     *         the EmptyRoleSemantic applies; the returned value determines
+     *         whether access is to be permitted or denied regardless of the
+     *         identity and authentication state in either case, PERMIT or DENY.<br />
+     *         Otherwise, when the array contains one or more role names access
+     *         is permitted if the user a member of at least one of the named
+     *         roles. The EmptyRoleSemantic is not applied in this case.
+     */
+    String[] rolesAllowed() default {};
+}
diff --git a/lib/servlet-api/javax/servlet/annotation/MultipartConfig.java b/lib/servlet-api/javax/servlet/annotation/MultipartConfig.java
new file mode 100644 (file)
index 0000000..a86f86e
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package javax.servlet.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * This annotation is used to indicate that the {@link javax.servlet.Servlet} on
+ * which it is declared expects requests to made using the {@code
+ * multipart/form-data} MIME type. <br />
+ * <br />
+ *
+ * {@link javax.servlet.http.Part} components of a given {@code
+ * multipart/form-data} request are retrieved by a Servlet annotated with
+ * {@code MultipartConfig} by calling
+ * {@link javax.servlet.http.HttpServletRequest#getPart} or
+ * {@link javax.servlet.http.HttpServletRequest#getParts}.<br />
+ * <br />
+ *
+ * E.g. <code>@WebServlet("/upload")}</code><br />
+ *
+ * <code>@MultipartConfig()</code> <code>public class UploadServlet extends
+ * HttpServlet ... } </code><br />
+ *
+ * @since Servlet 3.0
+ */
+@Target({ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface MultipartConfig {
+
+    /**
+     * @return location in which the Container stores temporary files
+     */
+    String location() default "";
+
+    /**
+     * @return the maximum size allowed for uploaded files (in bytes)
+     */
+    long maxFileSize() default -1L;
+
+    /**
+     * @return the maximum size of the request allowed for {@code
+     *         multipart/form-data}
+     */
+    long maxRequestSize() default -1L;
+
+    /**
+     * @return the size threshold at which the file will be written to the disk
+     */
+    int fileSizeThreshold() default 0;
+}
diff --git a/lib/servlet-api/javax/servlet/annotation/ServletSecurity.java b/lib/servlet-api/javax/servlet/annotation/ServletSecurity.java
new file mode 100644 (file)
index 0000000..7ed432e
--- /dev/null
@@ -0,0 +1,90 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package javax.servlet.annotation;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Declare this annotation on a {@link javax.servlet.Servlet} implementation
+ * class to enforce security constraints on HTTP protocol requests.<br />
+ * The container applies constraints to the URL patterns mapped to each Servlet
+ * which declares this annotation.<br />
+ * <br />
+ *
+ * @since Servlet 3.0
+ */
+@Inherited
+@Target({ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface ServletSecurity {
+
+    /**
+     * Represents the two possible values of the empty role semantic, active
+     * when a list of role names is empty.
+     */
+    enum EmptyRoleSemantic {
+
+        /**
+         * Access MUST be permitted, regardless of authentication state or
+         * identity
+         */
+        PERMIT,
+
+        /**
+         * Access MUST be denied, regardless of authentication state or identity
+         */
+        DENY
+    }
+
+    /**
+     * Represents the two possible values of data transport, encrypted or not.
+     */
+    enum TransportGuarantee {
+
+        /**
+         * User data must not be encrypted by the container during transport
+         */
+        NONE,
+
+        /**
+         * The container MUST encrypt user data during transport
+         */
+        CONFIDENTIAL
+    }
+
+    /**
+     * The default constraint to apply to requests not handled by specific
+     * method constraints
+     *
+     * @return http constraint
+     */
+    HttpConstraint value() default @HttpConstraint;
+
+    /**
+     * An array of HttpMethodContraint objects to which the security constraint
+     * will be applied
+     *
+     * @return array of http method constraint
+     */
+    HttpMethodConstraint[] httpMethodConstraints() default {};
+}
diff --git a/lib/servlet-api/javax/servlet/annotation/WebFilter.java b/lib/servlet-api/javax/servlet/annotation/WebFilter.java
new file mode 100644 (file)
index 0000000..08cbfdb
--- /dev/null
@@ -0,0 +1,122 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package javax.servlet.annotation;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import javax.servlet.DispatcherType;
+
+/**
+ * The annotation used to declare a Servlet {@link javax.servlet.Filter}. <br />
+ * <br />
+ *
+ * This annotation will be processed by the container during deployment, the
+ * Filter class in which it is found will be created as per the configuration
+ * and applied to the URL patterns, {@link javax.servlet.Servlet}s and
+ * {@link javax.servlet.DispatcherType}s.<br />
+ * <br/>
+ *
+ * If the name attribute is not defined, the fully qualified name of the class
+ * is used.<br/>
+ * <br/>
+ *
+ * At least one URL pattern MUST be declared in either the {@code value} or
+ * {@code urlPattern} attribute of the annotation, but not both.<br/>
+ * <br/>
+ *
+ * The {@code value} attribute is recommended for use when the URL pattern is
+ * the only attribute being set, otherwise the {@code urlPattern} attribute
+ * should be used.<br />
+ * <br />
+ *
+ * The annotated class MUST implement {@link javax.servlet.Filter}.
+ *
+ * E.g.
+ *
+ * <code>@WebFilter("/path/*")</code><br />
+ * <code>public class AnExampleFilter implements Filter { ... </code><br />
+ *
+ * @since Servlet 3.0 (Section 8.1.2)
+ *
+ */
+@Target({ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface WebFilter {
+
+    /**
+     * @return description of the Filter, if present
+     */
+    String description() default "";
+
+    /**
+     * @return display name of the Filter, if present
+     */
+    String displayName() default "";
+
+    /**
+     * @return array of initialization params for this Filter
+     */
+    WebInitParam[] initParams() default {};
+
+    /**
+     * @return name of the Filter, if present
+     */
+    String filterName() default "";
+
+    /**
+     * @return small icon for this Filter, if present
+     */
+    String smallIcon() default "";
+
+    /**
+     * @return the large icon for this Filter, if present
+     */
+    String largeIcon() default "";
+
+    /**
+     * @return array of Servlet names to which this Filter applies
+     */
+    String[] servletNames() default {};
+
+    /**
+     * A convenience method, to allow extremely simple annotation of a class.
+     *
+     * @return array of URL patterns
+     * @see #urlPatterns()
+     */
+    String[] value() default {};
+
+    /**
+     * @return array of URL patterns to which this Filter applies
+     */
+    String[] urlPatterns() default {};
+
+    /**
+     * @return array of DispatcherTypes to which this filter applies
+     */
+    DispatcherType[] dispatcherTypes() default {DispatcherType.REQUEST};
+
+    /**
+     * @return asynchronous operation supported by this Filter
+     */
+    boolean asyncSupported() default false;
+}
diff --git a/lib/servlet-api/javax/servlet/annotation/WebInitParam.java b/lib/servlet-api/javax/servlet/annotation/WebInitParam.java
new file mode 100644 (file)
index 0000000..e5fb73f
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package javax.servlet.annotation;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * The annotation used to declare an initialization parameter on a
+ * {@link javax.servlet.Servlet} or {@link javax.servlet.Filter}, within a
+ * {@link javax.servlet.annotation.WebFilter} or
+ * {@link javax.servlet.annotation.WebServlet} annotation.<br />
+ * <br />
+ *
+ * E.g.
+ * <code>&amp;#064;WebServlet(name="TestServlet", urlPatterns={"/test"},initParams={&amp;#064;WebInitParam(name="test", value="true")})
+ * public class TestServlet extends HttpServlet { ... </code><br />
+ *
+ * @since Servlet 3.0
+ */
+@Target({ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface WebInitParam {
+
+    /**
+     * @return name of the initialization parameter
+     */
+    String name();
+
+    /**
+     * @return value of the initialization parameter
+     */
+    String value();
+
+    /**
+     * @return description of the initialization parameter
+     */
+    String description() default "";
+}
diff --git a/lib/servlet-api/javax/servlet/annotation/WebListener.java b/lib/servlet-api/javax/servlet/annotation/WebListener.java
new file mode 100644 (file)
index 0000000..81f5ff7
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package javax.servlet.annotation;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * The annotation used to declare a listener for various types of event, in a
+ * given web application context.<br />
+ * <br />
+ *
+ * The class annotated MUST implement one, (or more), of the following
+ * interfaces: {@link javax.servlet.http.HttpSessionAttributeListener},
+ * {@link javax.servlet.http.HttpSessionListener},
+ * {@link javax.servlet.ServletContextAttributeListener},
+ * {@link javax.servlet.ServletContextListener},
+ * {@link javax.servlet.ServletRequestAttributeListener},
+ * {@link javax.servlet.ServletRequestListener} or
+ * {@link javax.servlet.http.HttpSessionIdListener}
+ * <br />
+ *
+ * E.g. <code>@WebListener</code><br />
+ * <code>public TestListener implements ServletContextListener {</code><br />
+ *
+ * @since Servlet 3.0
+ */
+@Target({ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface WebListener {
+
+    /**
+     * @return description of the listener, if present
+     */
+    String value() default "";
+}
diff --git a/lib/servlet-api/javax/servlet/annotation/WebServlet.java b/lib/servlet-api/javax/servlet/annotation/WebServlet.java
new file mode 100644 (file)
index 0000000..eebf8ba
--- /dev/null
@@ -0,0 +1,113 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package javax.servlet.annotation;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * This annotation is used to declare the configuration of an
+ * {@link javax.servlet.Servlet}. <br/>
+ *
+ * If the name attribute is not defined, the fully qualified name of the class
+ * is used.<br/>
+ * <br/>
+ *
+ * At least one URL pattern MUST be declared in either the {@code value} or
+ * {@code urlPattern} attribute of the annotation, but not both.<br/>
+ * <br/>
+ *
+ * The {@code value} attribute is recommended for use when the URL pattern is
+ * the only attribute being set, otherwise the {@code urlPattern} attribute
+ * should be used.<br />
+ * <br />
+ *
+ * The class on which this annotation is declared MUST extend
+ * {@link javax.servlet.http.HttpServlet}. <br />
+ * <br />
+ *
+ * E.g. <code>@WebServlet("/path")}<br />
+ * public class TestServlet extends HttpServlet ... {</code><br />
+ *
+ * E.g.
+ * <code>@WebServlet(name="TestServlet", urlPatterns={"/path", "/alt"}) <br />
+ * public class TestServlet extends HttpServlet ... {</code><br />
+ *
+ * @since Servlet 3.0 (Section 8.1.1)
+ *
+ */
+@Target({ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface WebServlet {
+
+    /**
+     * @return name of the Servlet
+     */
+    String name() default "";
+
+    /**
+     * A convenience method, to allow extremely simple annotation of a class.
+     *
+     * @return array of URL patterns
+     * @see #urlPatterns()
+     */
+    String[] value() default {};
+
+    /**
+     * @return array of URL patterns to which this Filter applies
+     */
+    String[] urlPatterns() default {};
+
+    /**
+     * @return load on startup ordering hint
+     */
+    int loadOnStartup() default -1;
+
+    /**
+     * @return array of initialization params for this Servlet
+     */
+    WebInitParam[] initParams() default {};
+
+    /**
+     * @return asynchronous operation supported by this Servlet
+     */
+    boolean asyncSupported() default false;
+
+    /**
+     * @return small icon for this Servlet, if present
+     */
+    String smallIcon() default "";
+
+    /**
+     * @return large icon for this Servlet, if present
+     */
+    String largeIcon() default "";
+
+    /**
+     * @return description of this Servlet, if present
+     */
+    String description() default "";
+
+    /**
+     * @return display name of this Servlet, if present
+     */
+    String displayName() default "";
+}
diff --git a/lib/servlet-api/javax/servlet/descriptor/JspConfigDescriptor.java b/lib/servlet-api/javax/servlet/descriptor/JspConfigDescriptor.java
new file mode 100644 (file)
index 0000000..27b3cc7
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package javax.servlet.descriptor;
+
+import java.util.Collection;
+
+/**
+ * @since Servlet 3.0
+ * TODO SERVLET3 - Add comments
+ */
+public interface JspConfigDescriptor {
+    public Collection<TaglibDescriptor> getTaglibs();
+    public Collection<JspPropertyGroupDescriptor> getJspPropertyGroups();
+}
diff --git a/lib/servlet-api/javax/servlet/descriptor/JspPropertyGroupDescriptor.java b/lib/servlet-api/javax/servlet/descriptor/JspPropertyGroupDescriptor.java
new file mode 100644 (file)
index 0000000..ddee69b
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package javax.servlet.descriptor;
+
+import java.util.Collection;
+
+/**
+ * @since Servlet 3.0
+ * TODO SERVLET3 - Add comments
+ */
+public interface JspPropertyGroupDescriptor {
+    public Collection<String> getUrlPatterns();
+    public String getElIgnored();
+    public String getPageEncoding();
+    public String getScriptingInvalid();
+    public String getIsXml();
+    public Collection<String> getIncludePreludes();
+    public Collection<String> getIncludeCodas();
+    public String getDeferredSyntaxAllowedAsLiteral();
+    public String getTrimDirectiveWhitespaces();
+    public String getDefaultContentType();
+    public String getBuffer();
+    public String getErrorOnUndeclaredNamespace();
+}
diff --git a/lib/servlet-api/javax/servlet/descriptor/TaglibDescriptor.java b/lib/servlet-api/javax/servlet/descriptor/TaglibDescriptor.java
new file mode 100644 (file)
index 0000000..b2e8e98
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package javax.servlet.descriptor;
+
+/**
+ * @since Servlet 3.0
+ * TODO SERVLET3 - Add comments
+ */
+public interface TaglibDescriptor {
+    public String getTaglibURI();
+    public String getTaglibLocation();
+}
diff --git a/lib/servlet-api/javax/servlet/http/Cookie.java b/lib/servlet-api/javax/servlet/http/Cookie.java
new file mode 100644 (file)
index 0000000..1774555
--- /dev/null
@@ -0,0 +1,458 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package javax.servlet.http;
+
+import java.io.Serializable;
+import java.text.MessageFormat;
+import java.util.BitSet;
+import java.util.Locale;
+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.
+ */
+public class Cookie implements Cloneable, Serializable {
+
+    private static final CookieNameValidator validation;
+    static {
+        boolean strictNaming;
+        String prop = System.getProperty("org.apache.tomcat.util.http.ServerCookie.STRICT_NAMING");
+        if (prop != null) {
+            strictNaming = Boolean.parseBoolean(prop);
+        } else {
+            strictNaming = Boolean.getBoolean("org.apache.catalina.STRICT_SERVLET_COMPLIANCE");
+        }
+
+        if (strictNaming) {
+            validation = new RFC2109Validator();
+        }
+        else {
+            validation = new NetscapeValidator();
+        }
+    }
+
+    private static final long serialVersionUID = 1L;
+
+    private final String name;
+    private String value;
+
+    private int version = 0; // ;Version=1 ... means RFC 2109 style
+
+    //
+    // Attributes encoded in the header's cookie fields.
+    //
+    private String comment; // ;Comment=VALUE ... describes cookie's use
+    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 boolean httpOnly; // Not in cookie specs, but supported by browsers
+
+    /**
+     * 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) {
+        validation.validate(name);
+        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(Locale.ENGLISH); // 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;
+    }
+
+    /**
+     * Overrides the standard <code>java.lang.Object.clone</code> method to
+     * return a copy of this cookie.
+     */
+    @Override
+    public Object clone() {
+        try {
+            return super.clone();
+        } catch (CloneNotSupportedException e) {
+            throw new RuntimeException(e.getMessage());
+        }
+    }
+
+    /**
+     * Sets the flag that controls if this cookie will be hidden from scripts on
+     * the client side.
+     *
+     * @param httpOnly  The new value of the flag
+     *
+     * @since Servlet 3.0
+     */
+    public void setHttpOnly(boolean httpOnly) {
+        this.httpOnly = httpOnly;
+    }
+
+    /**
+     * Gets the flag that controls if this cookie will be hidden from scripts on
+     * the client side.
+     *
+     * @return  <code>true</code> if the cookie is hidden from scripts, else
+     *          <code>false</code>
+     * @since Servlet 3.0
+     */
+    public boolean isHttpOnly() {
+        return httpOnly;
+    }
+}
+
+
+class CookieNameValidator {
+    private static final String LSTRING_FILE = "javax.servlet.http.LocalStrings";
+    private static final ResourceBundle lStrings = ResourceBundle.getBundle(LSTRING_FILE);
+
+    protected final BitSet allowed;
+
+    protected CookieNameValidator(String separators) {
+        allowed = new BitSet(128);
+        allowed.set(0x20, 0x7f); // any CHAR except CTLs or separators
+        for (int i = 0; i < separators.length(); i++) {
+            char ch = separators.charAt(i);
+            allowed.clear(ch);
+        }
+    }
+
+    void validate(String name) {
+        if (name == null || name.length() == 0) {
+            throw new IllegalArgumentException(lStrings.getString("err.cookie_name_blank"));
+        }
+        if (!isToken(name) ||
+                name.equalsIgnoreCase("Comment") ||
+                name.equalsIgnoreCase("Discard") ||
+                name.equalsIgnoreCase("Domain") ||
+                name.equalsIgnoreCase("Expires") ||
+                name.equalsIgnoreCase("Max-Age") ||
+                name.equalsIgnoreCase("Path") ||
+                name.equalsIgnoreCase("Secure") ||
+                name.equalsIgnoreCase("Version") ||
+                name.startsWith("$")) {
+            String errMsg = lStrings.getString("err.cookie_name_is_token");
+            throw new IllegalArgumentException(MessageFormat.format(errMsg, name));
+        }
+    }
+
+    private boolean isToken(String possibleToken) {
+        int len = possibleToken.length();
+
+        for (int i = 0; i < len; i++) {
+            char c = possibleToken.charAt(i);
+            if (!allowed.get(c)) {
+                return false;
+            }
+        }
+        return true;
+    }
+}
+
+class NetscapeValidator extends CookieNameValidator {
+    private static final String NETSCAPE_SEPARATORS = ",; ";
+
+    NetscapeValidator() {
+        super(NETSCAPE_SEPARATORS);
+    }
+}
+
+class RFC2109Validator extends CookieNameValidator {
+    private static final String RFC2616_SEPARATORS = "()<>@,;:\\\"/[]?={} \t";
+
+    RFC2109Validator() {
+        super(RFC2616_SEPARATORS);
+
+        // special treatment to allow for FWD_SLASH_IS_SEPARATOR property
+        boolean allowSlash;
+        String prop = System.getProperty("org.apache.tomcat.util.http.ServerCookie.FWD_SLASH_IS_SEPARATOR");
+        if (prop != null) {
+            allowSlash = !Boolean.parseBoolean(prop);
+        } else {
+            allowSlash = !Boolean.getBoolean("org.apache.catalina.STRICT_SERVLET_COMPLIANCE");
+        }
+        if (allowSlash) {
+            allowed.set('/');
+        }
+    }
+}
diff --git a/lib/servlet-api/javax/servlet/http/HttpServlet.java b/lib/servlet-api/javax/servlet/http/HttpServlet.java
new file mode 100644 (file)
index 0000000..f44ebcd
--- /dev/null
@@ -0,0 +1,881 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package javax.servlet.http;
+
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.io.UnsupportedEncodingException;
+import java.lang.reflect.Method;
+import java.text.MessageFormat;
+import java.util.Enumeration;
+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>Method</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.
+ */
+public abstract class HttpServlet extends GenericServlet {
+
+    private static final long serialVersionUID = 1L;
+
+    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 final ResourceBundle lStrings =
+        ResourceBundle.getBundle(LSTRING_FILE);
+
+
+    /**
+     * Does nothing, because this is an abstract class.
+     */
+    public HttpServlet() {
+        // NOOP
+    }
+
+
+    /**
+     * 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 client
+     *
+     * @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 static 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)
+            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";
+        StringBuilder buffer = new StringBuilder("TRACE ").append(req.getRequestURI())
+            .append(" ").append(req.getProtocol());
+
+        Enumeration<String> reqHeaderEnum = req.getHeaderNames();
+
+        while( reqHeaderEnum.hasMoreElements() ) {
+            String headerName = reqHeaderEnum.nextElement();
+            buffer.append(CRLF).append(headerName).append(": ")
+                .append(req.getHeader(headerName));
+        }
+
+        buffer.append(CRLF);
+
+        responseLength = buffer.length();
+
+        resp.setContentType("message/http");
+        resp.setContentLength(responseLength);
+        ServletOutputStream out = resp.getOutputStream();
+        out.print(buffer.toString());
+        out.close();
+        return;
+    }
+
+
+    /**
+     * Receives standard HTTP requests from the public
+     * <code>service</code> method and dispatches
+     * them to the <code>do</code><i>Method</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;
+                try {
+                    ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
+                } catch (IllegalArgumentException iae) {
+                    // Invalid date header - proceed as if none was set
+                    ifModifiedSince = -1;
+                }
+                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
+     */
+    @Override
+    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 wrapper 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 to the
+ * wrapped HTTP Servlet Response object.
+ */
+// file private
+class NoBodyResponse extends HttpServletResponseWrapper {
+    private final NoBodyOutputStream noBody;
+    private PrintWriter writer;
+    private boolean didSetContentLength;
+
+    // file private
+    NoBodyResponse(HttpServletResponse r) {
+        super(r);
+        noBody = new NoBodyOutputStream();
+    }
+
+    // file private
+    void setContentLength() {
+        if (!didSetContentLength) {
+            if (writer != null) {
+                writer.flush();
+            }
+            super.setContentLength(noBody.getContentLength());
+        }
+    }
+
+
+    // SERVLET RESPONSE interface methods
+
+    @Override
+    public void setContentLength(int len) {
+        super.setContentLength(len);
+        didSetContentLength = true;
+    }
+
+    @Override
+    public void setContentLengthLong(long len) {
+        super.setContentLengthLong(len);
+        didSetContentLength = true;
+    }
+
+    @Override
+    public void setHeader(String name, String value) {
+        super.setHeader(name, value);
+        checkHeader(name);
+    }
+
+    @Override
+    public void addHeader(String name, String value) {
+        super.addHeader(name, value);
+        checkHeader(name);
+    }
+
+    @Override
+    public void setIntHeader(String name, int value) {
+        super.setIntHeader(name, value);
+        checkHeader(name);
+    }
+
+    @Override
+    public void addIntHeader(String name, int value) {
+        super.addIntHeader(name, value);
+        checkHeader(name);
+    }
+
+    private void checkHeader(String name) {
+        if ("content-length".equalsIgnoreCase(name)) {
+            didSetContentLength = true;
+        }
+    }
+
+    @Override
+    public ServletOutputStream getOutputStream() throws IOException {
+        return noBody;
+    }
+
+    @Override
+    public PrintWriter getWriter() throws UnsupportedEncodingException {
+
+        if (writer == null) {
+            OutputStreamWriter w;
+
+            w = new OutputStreamWriter(noBody, getCharacterEncoding());
+            writer = new PrintWriter(w);
+        }
+        return writer;
+    }
+}
+
+
+/*
+ * 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 final ResourceBundle lStrings =
+        ResourceBundle.getBundle(LSTRING_FILE);
+
+    private int contentLength = 0;
+
+    // file private
+    NoBodyOutputStream() {
+        // NOOP
+    }
+
+    // file private
+    int getContentLength() {
+        return contentLength;
+    }
+
+    @Override
+    public void write(int b) {
+        contentLength++;
+    }
+
+    @Override
+    public void write(byte buf[], int offset, int len) throws IOException {
+        if (buf == null) {
+            throw new NullPointerException(
+                    lStrings.getString("err.io.nullArray"));
+        }
+
+        if (offset < 0 || len < 0 || offset+len > buf.length) {
+            String msg = lStrings.getString("err.io.indexOutOfBounds");
+            Object[] msgArgs = new Object[3];
+            msgArgs[0] = Integer.valueOf(offset);
+            msgArgs[1] = Integer.valueOf(len);
+            msgArgs[2] = Integer.valueOf(buf.length);
+            msg = MessageFormat.format(msg, msgArgs);
+            throw new IndexOutOfBoundsException(msg);
+        }
+
+        contentLength += len;
+    }
+
+    @Override
+    public boolean isReady() {
+        // TODO SERVLET 3.1
+        return false;
+    }
+
+    @Override
+    public void setWriteListener(javax.servlet.WriteListener listener) {
+        // TODO SERVLET 3.1
+    }
+}
diff --git a/lib/servlet-api/javax/servlet/http/HttpServletRequest.java b/lib/servlet-api/javax/servlet/http/HttpServletRequest.java
new file mode 100644 (file)
index 0000000..3c1f6a1
--- /dev/null
@@ -0,0 +1,522 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package javax.servlet.http;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Enumeration;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+
+/**
+ * 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).
+ */
+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<String> 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<String> 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.
+     *
+     * @return a <code>String</code> specifying the portion of the request URI
+     *         that indicates the context of the request
+     */
+    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 #getRequestURL}.
+     *
+     * @return a <code>String</code> containing the part of the URL from the
+     *         protocol name up to the query string
+     * @see #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>
+     * 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();
+
+    /**
+     * Changes the session ID of the session associated with this request. This
+     * method does not create a new session object it only changes the ID of the
+     * current session.
+     *
+     * @return the new session ID allocated to the session
+     * @see HttpSessionIdListener
+     * @since Servlet 3.1
+     */
+    public String changeSessionId();
+
+    /**
+     * Checks whether the requested session ID is still valid.
+     *
+     * @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
+     */
+    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.
+     */
+    @SuppressWarnings("dep-ann")
+    // Spec API does not use @Deprecated
+    public boolean isRequestedSessionIdFromUrl();
+
+    /**
+     * Triggers the same authentication process as would be triggered if the
+     * request is for a resource that is protected by a security constraint.
+     *
+     * @param response  The response to use to return any authentication
+     *                  challenge
+     * @return <code>true</code> if the user is successfully authenticated and
+     *         <code>false</code> if not
+     *
+     * @since Servlet 3.0
+     */
+    public boolean authenticate(HttpServletResponse response)
+            throws IOException, ServletException;
+
+    /**
+     * Authenticate the provided user name and password and then associated the
+     * authenticated user with the request.
+     *
+     * @param username  The user name to authenticate
+     * @param password  The password to use to authenticate the user
+     *
+     * @throws ServletException
+     *             If any of {@link #getRemoteUser()},
+     *             {@link #getUserPrincipal()} or {@link #getAuthType()} are
+     *             non-null, if the configured authenticator does not support
+     *             user name and password authentication or if the
+     *             authentication fails
+     * @since Servlet 3.0
+     */
+    public void login(String username, String password) throws ServletException;
+
+    /**
+     * Removes any authenticated user from the request.
+     *
+     * @throws ServletException
+     *             If the logout fails
+     * @since Servlet 3.0
+     */
+    public void logout() throws ServletException;
+
+    /**
+     * Return a collection of all uploaded Parts.
+     *
+     * @return A collection of all uploaded Parts.
+     * @throws IOException
+     *             if an I/O error occurs
+     * @throws IllegalStateException
+     *             if size limits are exceeded or no multipart configuration is
+     *             provided
+     * @throws ServletException
+     *             if the request is not multipart/form-data
+     * @since Servlet 3.0
+     */
+    public Collection<Part> getParts() throws IOException,
+            ServletException;
+
+    /**
+     * Gets the named Part or null if the Part does not exist. Triggers upload
+     * of all Parts.
+     *
+     * @param name
+     * @return The named Part or null if the Part does not exist
+     * @throws IOException
+     *             if an I/O error occurs
+     * @throws IllegalStateException
+     *             if size limits are exceeded
+     * @throws ServletException
+     *             if the request is not multipart/form-data
+     * @since Servlet 3.0
+     */
+    public Part getPart(String name) throws IOException,
+            ServletException;
+
+    /**
+     * Start the HTTP upgrade process and pass the connection to the provided
+     * protocol handler once the current request/response pair has completed
+     * processing. Calling this method sets the response status to {@link
+     * HttpServletResponse#SC_SWITCHING_PROTOCOLS} and flushes the response.
+     * Protocol specific headers must have already been set before this method
+     * is called.
+     *
+     * @throws IOException
+     *             if an I/O error occurred during the upgrade
+     * @throws ServletException
+     *             if the given httpUpgradeHandlerClass fails to be instantiated
+     * @since Servlet 3.1
+     */
+    public <T extends HttpUpgradeHandler> T upgrade(
+            Class<T> httpUpgradeHandlerClass) throws java.io.IOException, ServletException;
+}
diff --git a/lib/servlet-api/javax/servlet/http/HttpServletRequestWrapper.java b/lib/servlet-api/javax/servlet/http/HttpServletRequestWrapper.java
new file mode 100644 (file)
index 0000000..a72a244
--- /dev/null
@@ -0,0 +1,376 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package javax.servlet.http;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Enumeration;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequestWrapper;
+
+/**
+ * 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.
+     */
+    @Override
+    public String getAuthType() {
+        return this._getHttpServletRequest().getAuthType();
+    }
+
+    /**
+     * The default behavior of this method is to return getCookies() on the
+     * wrapped request object.
+     */
+    @Override
+    public Cookie[] getCookies() {
+        return this._getHttpServletRequest().getCookies();
+    }
+
+    /**
+     * The default behavior of this method is to return getDateHeader(String
+     * name) on the wrapped request object.
+     */
+    @Override
+    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.
+     */
+    @Override
+    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.
+     */
+    @Override
+    public Enumeration<String> getHeaders(String name) {
+        return this._getHttpServletRequest().getHeaders(name);
+    }
+
+    /**
+     * The default behavior of this method is to return getHeaderNames() on the
+     * wrapped request object.
+     */
+    @Override
+    public Enumeration<String> getHeaderNames() {
+        return this._getHttpServletRequest().getHeaderNames();
+    }
+
+    /**
+     * The default behavior of this method is to return getIntHeader(String
+     * name) on the wrapped request object.
+     */
+    @Override
+    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.
+     */
+    @Override
+    public String getMethod() {
+        return this._getHttpServletRequest().getMethod();
+    }
+
+    /**
+     * The default behavior of this method is to return getPathInfo() on the
+     * wrapped request object.
+     */
+    @Override
+    public String getPathInfo() {
+        return this._getHttpServletRequest().getPathInfo();
+    }
+
+    /**
+     * The default behavior of this method is to return getPathTranslated() on
+     * the wrapped request object.
+     */
+    @Override
+    public String getPathTranslated() {
+        return this._getHttpServletRequest().getPathTranslated();
+    }
+
+    /**
+     * The default behavior of this method is to return getContextPath() on the
+     * wrapped request object.
+     */
+    @Override
+    public String getContextPath() {
+        return this._getHttpServletRequest().getContextPath();
+    }
+
+    /**
+     * The default behavior of this method is to return getQueryString() on the
+     * wrapped request object.
+     */
+    @Override
+    public String getQueryString() {
+        return this._getHttpServletRequest().getQueryString();
+    }
+
+    /**
+     * The default behavior of this method is to return getRemoteUser() on the
+     * wrapped request object.
+     */
+    @Override
+    public String getRemoteUser() {
+        return this._getHttpServletRequest().getRemoteUser();
+    }
+
+    /**
+     * The default behavior of this method is to return isUserInRole(String
+     * role) on the wrapped request object.
+     */
+    @Override
+    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.
+     */
+    @Override
+    public java.security.Principal getUserPrincipal() {
+        return this._getHttpServletRequest().getUserPrincipal();
+    }
+
+    /**
+     * The default behavior of this method is to return getRequestedSessionId()
+     * on the wrapped request object.
+     */
+    @Override
+    public String getRequestedSessionId() {
+        return this._getHttpServletRequest().getRequestedSessionId();
+    }
+
+    /**
+     * The default behavior of this method is to return getRequestURI() on the
+     * wrapped request object.
+     */
+    @Override
+    public String getRequestURI() {
+        return this._getHttpServletRequest().getRequestURI();
+    }
+
+    /**
+     * The default behavior of this method is to return getRequestURL() on the
+     * wrapped request object.
+     */
+    @Override
+    public StringBuffer getRequestURL() {
+        return this._getHttpServletRequest().getRequestURL();
+    }
+
+    /**
+     * The default behavior of this method is to return getServletPath() on the
+     * wrapped request object.
+     */
+    @Override
+    public String getServletPath() {
+        return this._getHttpServletRequest().getServletPath();
+    }
+
+    /**
+     * The default behavior of this method is to return getSession(boolean
+     * create) on the wrapped request object.
+     */
+    @Override
+    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.
+     */
+    @Override
+    public HttpSession getSession() {
+        return this._getHttpServletRequest().getSession();
+    }
+
+    /**
+     * The default behavior of this method is to call changeSessionId() on the
+     * wrapped request object.
+     */
+    @Override
+    public String changeSessionId() {
+        return this._getHttpServletRequest().changeSessionId();
+    }
+
+    /**
+     * The default behavior of this method is to return
+     * isRequestedSessionIdValid() on the wrapped request object.
+     */
+    @Override
+    public boolean isRequestedSessionIdValid() {
+        return this._getHttpServletRequest().isRequestedSessionIdValid();
+    }
+
+    /**
+     * The default behavior of this method is to return
+     * isRequestedSessionIdFromCookie() on the wrapped request object.
+     */
+    @Override
+    public boolean isRequestedSessionIdFromCookie() {
+        return this._getHttpServletRequest().isRequestedSessionIdFromCookie();
+    }
+
+    /**
+     * The default behavior of this method is to return
+     * isRequestedSessionIdFromURL() on the wrapped request object.
+     */
+    @Override
+    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 3.0 of the Java Servlet API
+     */
+    @Override
+    @SuppressWarnings("dep-ann")
+    // Spec API does not use @Deprecated
+    public boolean isRequestedSessionIdFromUrl() {
+        return this._getHttpServletRequest().isRequestedSessionIdFromUrl();
+    }
+
+    /**
+     * {@inheritDoc}
+     * <p>
+     * The default behavior of this method is to return
+     * {@link HttpServletRequest#authenticate(HttpServletResponse)}
+     * on the wrapped request object.
+     *
+     * @since Servlet 3.0
+     */
+    @Override
+    public boolean authenticate(HttpServletResponse response)
+            throws IOException, ServletException {
+        return this._getHttpServletRequest().authenticate(response);
+    }
+
+    /**
+     * {@inheritDoc}
+     * <p>
+     * The default behavior of this method is to return
+     * {@link HttpServletRequest#login(String, String)}
+     * on the wrapped request object.
+     *
+     * @since Servlet 3.0
+     */
+    @Override
+    public void login(String username, String password) throws ServletException {
+        this._getHttpServletRequest().login(username, password);
+    }
+
+    /**
+     * {@inheritDoc}
+     * <p>
+     * The default behavior of this method is to return
+     * {@link HttpServletRequest#logout()}
+     * on the wrapped request object.
+     *
+     * @since Servlet 3.0
+     */
+    @Override
+    public void logout() throws ServletException {
+        this._getHttpServletRequest().logout();
+    }
+
+    /**
+     * {@inheritDoc}
+     * <p>
+     * The default behavior of this method is to return
+     * {@link HttpServletRequest#getParts()}
+     * on the wrapped request object.
+     *
+     * @since Servlet 3.0
+     */
+    @Override
+    public Collection<Part> getParts() throws IOException,
+            ServletException {
+        return this._getHttpServletRequest().getParts();
+    }
+
+    /**
+     * {@inheritDoc}
+     * <p>
+     * The default behavior of this method is to return
+     * {@link HttpServletRequest#getPart(String)}
+     * on the wrapped request object.
+     *
+     * @since Servlet 3.0
+     */
+    @Override
+    public Part getPart(String name) throws IOException,
+            ServletException {
+        return this._getHttpServletRequest().getPart(name);
+    }
+
+    /**
+     * {@inheritDoc}
+     * <p>
+     * The default behavior of this method is to return
+     * {@link HttpServletRequest#upgrade(Class)} on the wrapped request object.
+     *
+     * @since Servlet 3.1
+     */
+    @Override
+    public <T extends HttpUpgradeHandler> T upgrade(
+            Class<T> httpUpgradeHandlerClass) throws IOException, ServletException {
+        return this._getHttpServletRequest().upgrade(httpUpgradeHandlerClass);
+    }
+}
diff --git a/lib/servlet-api/javax/servlet/http/HttpServletResponse.java b/lib/servlet-api/javax/servlet/http/HttpServletResponse.java
new file mode 100644 (file)
index 0000000..c5c6f82
--- /dev/null
@@ -0,0 +1,597 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package javax.servlet.http;
+
+import java.io.IOException;
+import java.util.Collection;
+
+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).
+ *
+ * @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);
+
+    /**
+     * @param url
+     *            the url to be encoded.
+     * @return the encoded URL if encoding is needed; the unchanged URL
+     *         otherwise.
+     * @deprecated As of version 2.1, use encodeURL(String url) instead
+     */
+    @SuppressWarnings("dep-ann")
+    // Spec API does not use @Deprecated
+    public String encodeUrl(String url);
+
+    /**
+     * @param url
+     *            the url to be encoded.
+     * @return the encoded URL if encoding is needed; the unchanged URL
+     *         otherwise.
+     * @deprecated As of version 2.1, use encodeRedirectURL(String url) instead
+     */
+    @SuppressWarnings("dep-ann")
+    // Spec API does not use @Deprecated
+    public String encodeRedirectUrl(String url);
+
+    /**
+     * Sends an error response to the client using the specified status code and
+     * clears the output buffer. 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
+     * clears the buffer. This is equivalent to calling {@link #sendError(int,
+     * String)} with the same status code and <code>null</code> for the message.
+     *
+     * @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);
+
+    /**
+     * Sets the status code and message for this response.
+     *
+     * @param sc
+     *            the status code
+     * @param sm
+     *            the status message
+     * @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>.
+     */
+    @SuppressWarnings("dep-ann")
+    // Spec API does not use @Deprecated
+    public void setStatus(int sc, String sm);
+
+    /**
+     * Return the HTTP status code associated with this Response.
+     *
+     * @since Servlet 3.0
+     */
+    public int getStatus();
+
+    /**
+     * Return the value for the specified header, or <code>null</code> if this
+     * header has not been set.  If more than one value was added for this
+     * name, only the first is returned; use {@link #getHeaders(String)} to
+     * retrieve all of them.
+     *
+     * @param name Header name to look up
+     *
+     * @since Servlet 3.0
+     */
+    public String getHeader(String name);
+
+    /**
+     * Return a Collection of all the header values associated with the
+     * specified header name.
+     *
+     * @param name Header name to look up
+     *
+     * @since Servlet 3.0
+     */
+    public Collection<String> getHeaders(String name);
+
+    /**
+     * Return an Iterable of all the header names set for this response.
+     *
+     * @since Servlet 3.0
+     */
+    public Collection<String> getHeaderNames();
+
+    /*
+     * 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;
+}
diff --git a/lib/servlet-api/javax/servlet/http/HttpServletResponseWrapper.java b/lib/servlet-api/javax/servlet/http/HttpServletResponseWrapper.java
new file mode 100644 (file)
index 0000000..aafc95f
--- /dev/null
@@ -0,0 +1,270 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package javax.servlet.http;
+
+import java.io.IOException;
+import java.util.Collection;
+
+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.
+ *
+ * @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.
+     */
+    @Override
+    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.
+     */
+    @Override
+    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.
+     */
+    @Override
+    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.
+     */
+    @Override
+    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 3.0 of the Java Servlet API
+     */
+    @Override
+    @SuppressWarnings("dep-ann")
+    // Spec API does not use @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 3.0 of the Java Servlet API
+     */
+    @Override
+    @SuppressWarnings("dep-ann")
+    // Spec API does not use @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.
+     */
+    @Override
+    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.
+     */
+    @Override
+    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.
+     */
+    @Override
+    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.
+     */
+    @Override
+    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.
+     */
+    @Override
+    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.
+     */
+    @Override
+    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.
+     */
+    @Override
+    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.
+     */
+    @Override
+    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.
+     */
+    @Override
+    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.
+     */
+    @Override
+    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 3.0 of the Java Servlet API
+     */
+    @Override
+    @SuppressWarnings("dep-ann")
+    // Spec API does not use @Deprecated
+    public void setStatus(int sc, String sm) {
+        this._getHttpServletResponse().setStatus(sc, sm);
+    }
+
+    /**
+     * {@inheritDoc}
+     * <p>
+     * The default implementation is to call
+     * {@link HttpServletResponse#getStatus()}
+     * on the wrapper {@link HttpServletResponse}.
+     *
+     * @since Servlet 3.0
+     */
+    @Override
+    public int getStatus() {
+        return this._getHttpServletResponse().getStatus();
+    }
+
+    /**
+     * {@inheritDoc}
+     * <p>
+     * The default implementation is to call
+     * {@link HttpServletResponse#getHeader(String)}
+     * on the wrapper {@link HttpServletResponse}.
+     *
+     * @since Servlet 3.0
+     */
+    @Override
+    public String getHeader(String name) {
+        return this._getHttpServletResponse().getHeader(name);
+    }
+
+    /**
+     * {@inheritDoc}
+     * <p>
+     * The default implementation is to call
+     * {@link HttpServletResponse#getHeaders(String)}
+     * on the wrapper {@link HttpServletResponse}.
+     *
+     * @since Servlet 3.0
+     */
+    @Override
+    public Collection<String> getHeaders(String name) {
+        return this._getHttpServletResponse().getHeaders(name);
+    }
+
+    /**
+     * {@inheritDoc}
+     * <p>
+     * The default implementation is to call
+     * {@link HttpServletResponse#getHeaderNames()}
+     * on the wrapper {@link HttpServletResponse}.
+     *
+     * @since Servlet 3.0
+     */
+    @Override
+    public Collection<String> getHeaderNames() {
+        return this._getHttpServletResponse().getHeaderNames();
+    }
+}
diff --git a/lib/servlet-api/javax/servlet/http/HttpSession.java b/lib/servlet-api/javax/servlet/http/HttpSession.java
new file mode 100644 (file)
index 0000000..d15b97c
--- /dev/null
@@ -0,0 +1,284 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package 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.
+ *
+ * @see HttpSessionBindingListener
+ */
+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
+     * @exception IllegalStateException
+     *                if this method is called on an invalidated 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 zero or negative time
+     * indicates that 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 zero or negative time indicates that 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.
+     */
+    @SuppressWarnings("dep-ann")
+    // Spec API does not use @Deprecated
+    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);
+
+    /**
+     * @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
+     * @deprecated As of Version 2.2, this method is replaced by
+     *             {@link #getAttribute}.
+     */
+    @SuppressWarnings("dep-ann")
+    // Spec API does not use @Deprecated
+    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<String> 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
+     * @deprecated As of Version 2.2, this method is replaced by
+     *             {@link #getAttributeNames}
+     */
+    @SuppressWarnings("dep-ann")
+    // Spec API does not use @Deprecated
+    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);
+
+    /**
+     * @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
+     * @deprecated As of Version 2.2, this method is replaced by
+     *             {@link #setAttribute}
+     */
+    @SuppressWarnings("dep-ann")
+    // Spec API does not use @Deprecated
+    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);
+
+    /**
+     * @param name
+     *            the name of the object to remove from this session
+     * @exception IllegalStateException
+     *                if this method is called on an invalidated session
+     * @deprecated As of Version 2.2, this method is replaced by
+     *             {@link #removeAttribute}
+     */
+    @SuppressWarnings("dep-ann")
+    // Spec API does not use @Deprecated
+    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();
+}
diff --git a/lib/servlet-api/javax/servlet/http/HttpSessionActivationListener.java b/lib/servlet-api/javax/servlet/http/HttpSessionActivationListener.java
new file mode 100644 (file)
index 0000000..eace111
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License.  You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package 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);
+}
+
diff --git a/lib/servlet-api/javax/servlet/http/HttpSessionAttributeListener.java b/lib/servlet-api/javax/servlet/http/HttpSessionAttributeListener.java
new file mode 100644 (file)
index 0000000..0c8f9ca
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package 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);
+}
diff --git a/lib/servlet-api/javax/servlet/http/HttpSessionBindingEvent.java b/lib/servlet-api/javax/servlet/http/HttpSessionBindingEvent.java
new file mode 100644 (file)
index 0000000..a921719
--- /dev/null
@@ -0,0 +1,111 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package 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>.
+ *
+ * @see HttpSession
+ * @see HttpSessionBindingListener
+ * @see HttpSessionAttributeListener
+ */
+public class HttpSessionBindingEvent extends HttpSessionEvent {
+
+    private static final long serialVersionUID = 1L;
+
+    /* The name to which the object is being bound or unbound */
+    private final String name;
+
+    /* The object is being bound or unbound */
+    private final 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;
+        this.value = null;
+    }
+
+    /**
+     * 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. */
+    @Override
+    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;
+    }
+}
diff --git a/lib/servlet-api/javax/servlet/http/HttpSessionBindingListener.java b/lib/servlet-api/javax/servlet/http/HttpSessionBindingListener.java
new file mode 100644 (file)
index 0000000..a09845e
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package 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.
+ *
+ * @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);
+}
diff --git a/lib/servlet-api/javax/servlet/http/HttpSessionContext.java b/lib/servlet-api/javax/servlet/http/HttpSessionContext.java
new file mode 100644 (file)
index 0000000..2a7e18b
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package javax.servlet.http;
+
+import java.util.Enumeration;
+
+/**
+ * @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
+ */
+@SuppressWarnings("dep-ann")
+// Spec API does not use @Deprecated
+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.
+     */
+    // Spec API does not use @Deprecated
+    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.
+     */
+    // Spec API does not use @Deprecated
+    public Enumeration<String> getIds();
+}
diff --git a/lib/servlet-api/javax/servlet/http/HttpSessionEvent.java b/lib/servlet-api/javax/servlet/http/HttpSessionEvent.java
new file mode 100644 (file)
index 0000000..ef83877
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package 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 {
+    private static final long serialVersionUID = 1L;
+
+    /** 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();
+    }
+}
diff --git a/lib/servlet-api/javax/servlet/http/HttpSessionIdListener.java b/lib/servlet-api/javax/servlet/http/HttpSessionIdListener.java
new file mode 100644 (file)
index 0000000..0c3c0c2
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package javax.servlet.http;
+
+import java.util.EventListener;
+
+/**
+ * Implementations of this interface are notified when an {@link HttpSession}'s
+ * ID changes. To receive notification events, the implementation class must be
+ * configured in the deployment descriptor for the web application, annotated
+ * with {@link javax.servlet.annotation.WebListener} or registered by calling an
+ * addListener method on the {@link javax.servlet.ServletContext}.
+ *
+ * @see HttpSessionEvent
+ * @see HttpServletRequest#changeSessionId()
+ * @since Servlet 3.1
+ */
+public interface HttpSessionIdListener extends EventListener {
+
+    /**
+     * Notification that a session ID has been changed.
+     *
+     * @param se the notification event
+     * @param oldSessionId the old session ID
+     */
+    public void sessionIdChanged(HttpSessionEvent se, String oldSessionId);
+}
diff --git a/lib/servlet-api/javax/servlet/http/HttpSessionListener.java b/lib/servlet-api/javax/servlet/http/HttpSessionListener.java
new file mode 100644 (file)
index 0000000..a0f1009
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package 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);
+
+}
diff --git a/lib/servlet-api/javax/servlet/http/HttpUpgradeHandler.java b/lib/servlet-api/javax/servlet/http/HttpUpgradeHandler.java
new file mode 100644 (file)
index 0000000..095200c
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package javax.servlet.http;
+
+/**
+ * Interface between the HTTP upgrade process and the new protocol.
+ *
+ * @since Servlet 3.1
+ */
+public interface HttpUpgradeHandler {
+
+    /**
+     * This method is called once the request/response pair where
+     * {@link HttpServletRequest#upgrade(Class)} is called has completed
+     * processing and is the point where control of the connection passes from
+     * the container to the {@link HttpUpgradeHandler}.
+     *
+     * @param connection    The connection that has been upgraded
+     *
+     * @since Servlet 3.1
+     */
+    void init(WebConnection connection);
+
+    /**
+     * This method is called after the upgraded connection has been closed.
+     */
+    void destroy();
+}
diff --git a/lib/servlet-api/javax/servlet/http/HttpUtils.java b/lib/servlet-api/javax/servlet/http/HttpUtils.java
new file mode 100644 (file)
index 0000000..a0b4971
--- /dev/null
@@ -0,0 +1,282 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License.  You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+package javax.servlet.http;
+
+import java.io.IOException;
+import java.util.Hashtable;
+import java.util.ResourceBundle;
+import java.util.StringTokenizer;
+
+import javax.servlet.ServletInputStream;
+
+/**
+ * @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.
+ */
+@SuppressWarnings("dep-ann") // Spec API does not use @Deprecated
+public class HttpUtils {
+
+    private static final String LSTRING_FILE =
+        "javax.servlet.http.LocalStrings";
+    private static final ResourceBundle lStrings =
+        ResourceBundle.getBundle(LSTRING_FILE);
+
+
+    /**
+     * Constructs an empty <code>HttpUtils</code> object.
+     *
+     */
+    public HttpUtils() {
+        // NOOP
+    }
+
+
+    /**
+     *
+     * 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
+     *
+     */
+    public static Hashtable<String,String[]> parseQueryString(String s) {
+
+        String valArray[] = null;
+
+        if (s == null) {
+            throw new IllegalArgumentException();
+        }
+        Hashtable<String,String[]> ht = new Hashtable<>();
+        StringBuilder sb = new StringBuilder();
+        StringTokenizer st = new StringTokenizer(s, "&");
+        while (st.hasMoreTokens()) {
+            String pair = 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[] = 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
+     *
+     */
+    public static Hashtable<String,String[]> parsePostData(int len,
+                                          ServletInputStream in) {
+        // XXX
+        // should a length of 0 be an IllegalArgumentException
+
+        // cheap hack to return an empty hash
+        if (len <=0)
+            return new Hashtable<>();
+
+        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(), e);
+        }
+
+        // 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(), e);
+        }
+    }
+
+
+    /*
+     * Parse a name in the query string.
+     */
+    private static String parseName(String s, StringBuilder 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();
+
+        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 ());
+        }
+
+        url.append(urlPath);
+        return url;
+    }
+}
+
+
+
diff --git a/lib/servlet-api/javax/servlet/http/LocalStrings.properties b/lib/servlet-api/javax/servlet/http/LocalStrings.properties
new file mode 100644 (file)
index 0000000..a9def62
--- /dev/null
@@ -0,0 +1,30 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Default localized string information
+# Localized for Locale en_US
+
+err.cookie_name_is_token=Cookie name \"{0}\" is a reserved token
+err.cookie_name_blank=Cookie name may not be null or zero length
+err.io.nullArray=Null passed for byte array in write method
+err.io.indexOutOfBounds=Invalid offset [{0}] and / or length [{1}] specified for array of size [{2}]
+err.io.short_read=Short Read
+
+http.method_not_implemented=Method {0} is not is not implemented by this servlet for this URI
+
+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
diff --git a/lib/servlet-api/javax/servlet/http/LocalStrings_es.properties b/lib/servlet-api/javax/servlet/http/LocalStrings_es.properties
new file mode 100644 (file)
index 0000000..31fc0d8
--- /dev/null
@@ -0,0 +1,23 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+err.cookie_name_is_token = El nombre de Cookie {0} es una palabra reservada
+err.cookie_name_blank = El nombre del Cookie no puede ser nulo o de longitud cero
+err.io.negativelength = Longitud Negativa en el metodo write
+err.io.short_read = Lectura Corta
+http.method_not_implemented = El Metodo {0} no esta implementado por este servlet para esta URI
+http.method_get_not_supported = El Metodo HTTP GET no est\u00E1 soportado por esta URL
+http.method_post_not_supported = El Metodo HTTP POST no est\u00E1 soportado por esta URL
+http.method_put_not_supported = El Metodo HTTP PUT no est\u00E1 soportado por esta URL
+http.method_delete_not_supported = El Metodo HTTP DELETE no es soportado por esta URL
diff --git a/lib/servlet-api/javax/servlet/http/LocalStrings_fr.properties b/lib/servlet-api/javax/servlet/http/LocalStrings_fr.properties
new file mode 100644 (file)
index 0000000..18fd1c0
--- /dev/null
@@ -0,0 +1,28 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Default localized string information
+# Localized for Locale fr_FR
+
+err.cookie_name_is_token=Le nom de cookie \"{0}\" est un \"token\" r\u00e9serv\u00e9
+err.io.negativelength=Taille n\u00e9gative donn\u00e9e dans la m\u00e9thode \"write\"
+err.io.short_read=Lecture partielle
+
+http.method_not_implemented=Le m\u00e9thode {0} n''est pas d\u00e9finie dans la RFC 2068 et n''est pas support\u00e9e par l''API Servlet
+
+http.method_get_not_supported=La m\u00e9thode HTTP GET n''est pas support\u00e9e par cette URL
+http.method_post_not_supported=La m\u00e9thode HTTP POST n''est pas support\u00e9e par cette URL
+http.method_put_not_supported=La m\u00e9thode HTTP PUT n''est pas support\u00e9e par cette URL
+http.method_delete_not_supported=La m\u00e9thode HTTP DELETE n''est pas support\u00e9e par cette URL
diff --git a/lib/servlet-api/javax/servlet/http/LocalStrings_ja.properties b/lib/servlet-api/javax/servlet/http/LocalStrings_ja.properties
new file mode 100644 (file)
index 0000000..70983d7
--- /dev/null
@@ -0,0 +1,28 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# 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
diff --git a/lib/servlet-api/javax/servlet/http/Part.java b/lib/servlet-api/javax/servlet/http/Part.java
new file mode 100644 (file)
index 0000000..6d08de4
--- /dev/null
@@ -0,0 +1,118 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License.  You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package javax.servlet.http;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Collection;
+
+/**
+ * This class represents a part as uploaded to the server as part of a
+ * <code>multipart/form-data</code> request body. The part may represent either
+ * an uploaded file or form data.
+ *
+ * @since Servlet 3.0
+ */
+public interface Part {
+
+    /**
+     * Obtain an <code>InputStream</code> that can be used to retrieve the
+     * contents of the file.
+     */
+    public InputStream getInputStream() throws IOException;
+
+    /**
+     * Obtain the content type passed by the browser or <code>null</code> if not
+     * defined.
+     */
+    public String getContentType();
+
+    /**
+     * Obtain the name of the field in the multipart form corresponding to this
+     * part.
+     */
+    public String getName();
+
+    /**
+     * If this part represents an uploaded file, gets the file name submitted
+     * in the upload. Returns {@code null} if no file name is available or if
+     * this part is not a file upload.
+     *
+     * @return the submitted file name or {@code null}.
+     *
+     * @since Servlet 3.1
+     */
+    public String getSubmittedFileName();
+
+    /**
+     * Obtain the size of this part.
+     */
+    public long getSize();
+
+    /**
+     * A convenience method to write an uploaded part to disk. The client code
+     * is not concerned with whether or not the part is stored in memory, or on
+     * disk in a temporary location. They just want to write the uploaded part
+     * to a file.
+     *
+     *  This method is not guaranteed to succeed if called more than once for
+     *  the same part. This allows a particular implementation to use, for
+     *  example, file renaming, where possible, rather than copying all of the
+     *  underlying data, thus gaining a significant performance benefit.
+     *
+     * @param fileName  The location into which the uploaded part should be
+     *                  stored. Relative locations are relative to {@link
+     *                  javax.servlet.MultipartConfigElement#getLocation()}
+     */
+    public void write(String fileName) throws IOException;
+
+    /**
+     * Deletes the underlying storage for a part, including deleting any
+     * associated temporary disk file. Although the container will delete this
+     * storage automatically this method can be used to ensure that this is done
+     * at an earlier time, thus preserving system resources.
+     * <p>
+     * Containers are only required to delete the associated storage when the
+     * Part instance is garbage collected. Apache Tomcat will delete the
+     * associated storage when the associated request has finished processing.
+     * Behaviour of other containers may be different.
+     */
+    public void delete() throws IOException;
+
+    /**
+     * Obtains the value of the specified part header as a String. If there are
+     * multiple headers with the same name, this method returns the first header
+     * in the part. The header name is case insensitive.
+     *
+     * @param name  Header name
+     * @return      The header value or <code>null</code> if the header is not
+     *              present
+     */
+    public String getHeader(String name);
+
+    /**
+     * Obtain all the values of the specified part header. If the part did not
+     * include any headers of the specified name, this method returns an empty
+     * Collection. The header name is case insensitive.
+     */
+    public Collection<String> getHeaders(String name);
+
+    /**
+     * Returns a Collection of all the header names provided for this part.
+     */
+    public Collection<String> getHeaderNames();
+}
diff --git a/lib/servlet-api/javax/servlet/http/WebConnection.java b/lib/servlet-api/javax/servlet/http/WebConnection.java
new file mode 100644 (file)
index 0000000..0619360
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package javax.servlet.http;
+
+import java.io.IOException;
+
+import javax.servlet.ServletInputStream;
+import javax.servlet.ServletOutputStream;
+
+/**
+ * The interface used by a {@link HttpUpgradeHandler} to interact with an upgraded
+ * HTTP connection.
+ *
+ * @since Servlet 3.1
+ */
+public interface WebConnection extends AutoCloseable {
+
+    /**
+     * Provides access to the {@link ServletInputStream} for reading data from
+     * the client.
+     */
+    ServletInputStream getInputStream() throws IOException;
+
+    /**
+     * Provides access to the {@link ServletOutputStream} for writing data to
+     * the client.
+     */
+    ServletOutputStream getOutputStream() throws IOException;
+}
\ No newline at end of file
diff --git a/lib/servlet-api/javax/servlet/http/package.html b/lib/servlet-api/javax/servlet/http/package.html
new file mode 100644 (file)
index 0000000..08e6692
--- /dev/null
@@ -0,0 +1,30 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<HTML>
+<HEAD>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+</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>
diff --git a/lib/servlet-api/javax/servlet/package.html b/lib/servlet-api/javax/servlet/package.html
new file mode 100644 (file)
index 0000000..7336be6
--- /dev/null
@@ -0,0 +1,30 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<HTML>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<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>