Author: remm
Date: Mon Jun 25 10:29:58 2007
New Revision: 550556

URL: http://svn.apache.org/viewvc?view=rev&rev=550556
Log:
- Use a new package as suggested by Costin (maybe o.a.servlets.comet ?). This 
also has benefits for the documentation.
- Consider a HttpServlet-like CometServlet abstract class rather than the 
CometProcessor interface.

Added:
    tomcat/sandbox/comet/java/org/apache/comet/
    tomcat/sandbox/comet/java/org/apache/comet/CometEvent.java   (with props)
    tomcat/sandbox/comet/java/org/apache/comet/CometFilter.java   (with props)
    tomcat/sandbox/comet/java/org/apache/comet/CometFilterChain.java   (with 
props)
    tomcat/sandbox/comet/java/org/apache/comet/CometProcessor.java   (with 
props)
    tomcat/sandbox/comet/java/org/apache/comet/CometServlet.java   (with props)

Added: tomcat/sandbox/comet/java/org/apache/comet/CometEvent.java
URL: 
http://svn.apache.org/viewvc/tomcat/sandbox/comet/java/org/apache/comet/CometEvent.java?view=auto&rev=550556
==============================================================================
--- tomcat/sandbox/comet/java/org/apache/comet/CometEvent.java (added)
+++ tomcat/sandbox/comet/java/org/apache/comet/CometEvent.java Mon Jun 25 
10:29:58 2007
@@ -0,0 +1,176 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package org.apache.comet;
+
+import java.io.IOException;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * The CometEvent interface.
+ * 
+ * @author Filip Hanik
+ * @author Remy Maucherat
+ */
+public interface CometEvent {
+
+    /**
+     * Enumeration describing the major events that the container can invoke 
+     * the CometProcessor event() method with:
+     * <ul>
+     * <li>BEGIN - will be called at the beginning 
+     *  of the processing of the connection. It can be used to initialize any 
relevant 
+     *  fields using the request and response objects. Between the end of the 
processing 
+     *  of this event, and the beginning of the processing of the end or error 
events,
+     *  it is possible to use the response object to write data on the open 
connection.
+     *  Note that the response object and depedent OutputStream and Writer are 
still 
+     *  not synchronized, so when they are accessed by multiple threads, 
+     *  synchronization is mandatory. After processing the initial event, the 
request 
+     *  is considered to be committed.</li>
+     * <li>READ - This indicates that input data is available, and that one 
read can be made
+     *  without blocking. The available and ready methods of the InputStream or
+     *  Reader may be used to determine if there is a risk of blocking: the 
servlet
+     *  should read while data is reported available. When encountering a read 
error, 
+     *  the servlet should report it by propagating the exception properly. 
Throwing 
+     *  an exception will cause the error event to be invoked, and the 
connection 
+     *  will be closed. 
+     *  Alternately, it is also possible to catch any exception, perform clean 
up
+     *  on any data structure the servlet may be using, and using the close 
method
+     *  of the event. It is not allowed to attempt reading data from the 
request 
+     *  object outside of the execution of this method.</li>
+     * <li>END - End may be called to end the processing of the request. 
Fields that have
+     *  been initialized in the begin method should be reset. After this event 
has
+     *  been processed, the request and response objects, as well as all their 
dependent
+     *  objects will be recycled and used to process other requests.</li>
+     * <li>ERROR - Error will be called by the container in the case where an 
IO exception
+     *  or a similar unrecoverable error occurs on the connection. Fields that 
have
+     *  been initialized in the begin method should be reset. After this event 
has
+     *  been processed, the request and response objects, as well as all their 
dependent
+     *  objects will be recycled and used to process other requests.</li>
+     * <li>EVENT - Event will be called by the container after the resume() 
method is called.
+     *  This allows you get an event instantly, and you can perform IO actions
+     *  or close the Comet connection.</li>
+     * <li>WRITE - Write is sent if the servlet is using the ready method. 
This means that 
+     *  the connection is ready to receive data to be written out.</li>
+     * </ul>
+     */
+    public enum EventType {BEGIN, READ, END, ERROR, WRITE, EVENT}
+    
+    
+    /**
+     * Event details:
+     * <ul>
+     * <li>TIMEOUT - the connection timed out (sub type of ERROR); note that 
this ERROR type is not fatal, and
+     *   the connection will not be closed unless the servlet uses the close 
method of the event</li>
+     * <li>CLIENT_DISCONNECT - the client connection was closed (sub type of 
ERROR)</li>
+     * <li>IOEXCEPTION - an IO exception occurred, such as invalid content, 
for example, an invalid chunk block (sub type of ERROR)</li>
+     * <li>WEBAPP_RELOAD - the webapplication is being reloaded (sub type of 
END)</li>
+     * <li>SERVER_SHUTDOWN - the server is shutting down (sub type of END)</li>
+     * <li>SESSION_END - the servlet ended the session (sub type of END)</li>
+     * </ul>
+     */
+    public enum EventSubType { TIMEOUT, CLIENT_DISCONNECT, IOEXCEPTION, 
WEBAPP_RELOAD, SERVER_SHUTDOWN, SESSION_END }
+    
+    
+    /**
+     * Returns the HttpServletRequest.
+     * 
+     * @return HttpServletRequest
+     */
+    public HttpServletRequest getHttpServletRequest();
+    
+    /**
+     * Returns the HttpServletResponse.
+     * 
+     * @return HttpServletResponse
+     */
+    public HttpServletResponse getHttpServletResponse();
+    
+    /**
+     * Returns the event type.
+     * 
+     * @return EventType
+     * @see #EventType
+     */
+    public EventType getEventType();
+    
+    /**
+     * Returns the sub type of this event.
+     * 
+     * @return EventSubType
+     * @see #EventSubType
+     */
+    public EventSubType getEventSubType();
+
+    /**
+     * Ends the Comet session. This signals to the container that 
+     * the container wants to end the comet session. This will send back to the
+     * client a notice that the server has no more data to send as part of this
+     * request. The servlet should perform any needed cleanup as if it had 
recieved
+     * an END or ERROR event. 
+     * 
+     * @throws IOException if an IO exception occurs
+     */
+    public void close() throws IOException;
+
+    /**
+     * This method sets the timeout in milliseconds of idle time on the 
connection.
+     * The timeout is reset every time data is received from the connection or 
data is flushed
+     * using <code>response.flushBuffer()</code>. If a timeout occurs, the 
+     * servlet will receive an ERROR/TIMEOUT event which will not result in 
automatically closing
+     * the event (the event may be closed using the close() method).
+     * 
+     * @param timeout The timeout in milliseconds for this connection, must be 
a positive value, larger than 0
+     */
+    public void setTimeout(int timeout);
+
+    /**
+     * Returns true when data may be written to the connection (the flag 
becomes false 
+     * when the client is unable to accept data fast enough). When the flag 
becomes false, 
+     * the servlet must stop writing data. If there's an attempt to flush 
additional data 
+     * to the client and data still cannot be written immediately, an 
IOException will be 
+     * thrown. If calling this method returns false, it will also 
+     * request notification when the connection becomes available for writing 
again, and the  
+     * servlet will recieve a write event.<br/>
+     * 
+     * Note: If the servlet is not using ready, and is writing its output 
inside the
+     * container threads, using this method is not mandatory, but any 
incomplete writes will be
+     * performed again in blocking mode.
+     * 
+     * @return boolean true if you can write to the response 
+     */
+    public boolean ready();
+
+    /**
+     * Suspend processing of the connection until the configured timeout 
occurs, or resume() is called. In
+     * parctice, this means the servlet will no longer recieve read events. 
Reading should always be
+     * performed synchronously in the Tomcat threads unless the connection has 
been suspended.
+     */
+    public void suspend();
+
+    /**
+     * Will ask the servlet container to send a generic event to the servlet, 
where the request can be processed
+     * synchronously (for example, it is possible to use this to complete the 
request after some asynchronous
+     * processing is done). This also resumes read events if they had been 
disabled using suspend (it is possible
+     * to call suspend again). It is possible to call resume without calling 
suspend before.
+     */
+    public void resume();
+
+}

Propchange: tomcat/sandbox/comet/java/org/apache/comet/CometEvent.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tomcat/sandbox/comet/java/org/apache/comet/CometFilter.java
URL: 
http://svn.apache.org/viewvc/tomcat/sandbox/comet/java/org/apache/comet/CometFilter.java?view=auto&rev=550556
==============================================================================
--- tomcat/sandbox/comet/java/org/apache/comet/CometFilter.java (added)
+++ tomcat/sandbox/comet/java/org/apache/comet/CometFilter.java Mon Jun 25 
10:29:58 2007
@@ -0,0 +1,82 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package org.apache.comet;
+
+import java.io.IOException;
+
+import javax.servlet.Filter;
+import javax.servlet.ServletException;
+
+/**
+ * A Comet filter, similar to regular filters, performs filtering tasks on 
either 
+ * the request to a resource (a Comet servlet), or on the response from a 
resource, or both.
+ * <br><br>
+ * Filters perform filtering in the <code>doFilterEvent</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>
+ * <br>
+ * 
+ * @author Remy Maucherat
+ * @author Filip Hanik
+ */
+public interface CometFilter extends Filter {
+
+    
+    /**
+     * The <code>doFilterEvent</code> method of the CometFilter is called by 
the container
+     * each time a request/response pair is passed through the chain due
+     * to a client event for a resource at the end of the chain. The 
CometFilterChain passed in to this
+     * method allows the Filter to pass on the event 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 contained in the event with a 
custom implementation to
+     * filter content or headers for input filtering and pass a CometEvent 
instance containing
+     * the wrapped request to the next filter<br>
+     * 3. Optionally wrap the response object contained in the event with a 
custom implementation to
+     * filter content or headers for output filtering and pass a CometEvent 
instance containing
+     * the wrapped request to the next filter<br>
+     * 4. a) <strong>Either</strong> invoke the next entity in the chain using 
the CometFilterChain object (<code>chain.doFilterEvent()</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 event processing<br>
+     * 5. Directly set fields on the response after invocation of the next 
entity in the filter chain.
+     * 
+     * @param event the event that is being processed. Another event may be 
passed along the chain.
+     * @param chain 
+     * @throws IOException
+     * @throws ServletException
+     */
+    public void doFilterEvent(CometEvent event, CometFilterChain chain)
+        throws IOException, ServletException;
+    
+
+}

Propchange: tomcat/sandbox/comet/java/org/apache/comet/CometFilter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tomcat/sandbox/comet/java/org/apache/comet/CometFilterChain.java
URL: 
http://svn.apache.org/viewvc/tomcat/sandbox/comet/java/org/apache/comet/CometFilterChain.java?view=auto&rev=550556
==============================================================================
--- tomcat/sandbox/comet/java/org/apache/comet/CometFilterChain.java (added)
+++ tomcat/sandbox/comet/java/org/apache/comet/CometFilterChain.java Mon Jun 25 
10:29:58 2007
@@ -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 org.apache.comet;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+
+/**
+ * A CometFilterChain is an object provided by the servlet container to the 
developer
+ * giving a view into the invocation chain of a filtered event for a resource. 
Filters
+ * use the CometFilterChain 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.
+ * 
+ * @author Remy Maucherat
+ * @author Filip Hanik
+ */
+public interface CometFilterChain {
+
+    
+    /**
+     * 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 event the event to pass along the chain.
+     */
+    public void doFilterEvent(CometEvent event) throws IOException, 
ServletException;
+    
+
+}

Propchange: tomcat/sandbox/comet/java/org/apache/comet/CometFilterChain.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tomcat/sandbox/comet/java/org/apache/comet/CometProcessor.java
URL: 
http://svn.apache.org/viewvc/tomcat/sandbox/comet/java/org/apache/comet/CometProcessor.java?view=auto&rev=550556
==============================================================================
--- tomcat/sandbox/comet/java/org/apache/comet/CometProcessor.java (added)
+++ tomcat/sandbox/comet/java/org/apache/comet/CometProcessor.java Mon Jun 25 
10:29:58 2007
@@ -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 org.apache.comet;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.Servlet;
+
+/**
+ * This interface should be implemented by servlets which would like to handle
+ * asynchronous IO, recieving events when data is available for reading, and
+ * being able to output data without the need for being invoked by the 
container.
+ * Note: When this interface is implemented, the service method of the servlet 
will
+ * never be called, and will be replaced with a begin event.
+ */
+public interface CometProcessor extends Servlet 
+{
+
+    /**
+     * Process the given Comet event.
+     * 
+     * @param event The Comet event that will be processed
+     * @throws IOException
+     * @throws ServletException
+     */
+    public void event(CometEvent event)
+        throws IOException, ServletException;
+
+}

Propchange: tomcat/sandbox/comet/java/org/apache/comet/CometProcessor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tomcat/sandbox/comet/java/org/apache/comet/CometServlet.java
URL: 
http://svn.apache.org/viewvc/tomcat/sandbox/comet/java/org/apache/comet/CometServlet.java?view=auto&rev=550556
==============================================================================
--- tomcat/sandbox/comet/java/org/apache/comet/CometServlet.java (added)
+++ tomcat/sandbox/comet/java/org/apache/comet/CometServlet.java Mon Jun 25 
10:29:58 2007
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package org.apache.comet;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+
+/**
+ * This class should be extended by servlets which would like to handle
+ * asynchronous IO, recieving events when data is available for reading, and
+ * being able to output data without the need for being invoked by the 
container.
+ * Note: When this interface is implemented, the service method of the servlet 
will
+ * never be called, and will be replaced with a begin event.
+ */
+public abstract class CometServlet extends HttpServlet
+{
+
+    /**
+     * Process the given Comet event.
+     * 
+     * @param event The Comet event that will be processed
+     * @throws IOException
+     * @throws ServletException
+     */
+    public void event(CometEvent event)
+        throws IOException, ServletException {
+        if (event.getEventType() == CometEvent.EventType.BEGIN) {
+            doEventBegin(event);
+        } else if (event.getEventType() == CometEvent.EventType.END) {
+            doEventEnd(event);
+        } else if (event.getEventType() == CometEvent.EventType.ERROR) {
+            doEventError(event);
+        } else if (event.getEventType() == CometEvent.EventType.EVENT) {
+            doEventEvent(event);
+        } else if (event.getEventType() == CometEvent.EventType.READ) {
+            doEventRead(event);
+        } else if (event.getEventType() == CometEvent.EventType.WRITE) {
+            doEventWrite(event);
+        }
+    }
+
+    public void doEventBegin(CometEvent event) {
+        
+    }
+    
+    public void doEventEnd(CometEvent event) {
+        
+    }
+    
+    public void doEventError(CometEvent event) {
+        
+    }
+    
+    // ?
+    public void doEventEvent(CometEvent event) {
+        
+    }
+    
+    public void doEventRead(CometEvent event) {
+        
+    }
+    
+    public void doEventWrite(CometEvent event) {
+        
+    }
+    
+}

Propchange: tomcat/sandbox/comet/java/org/apache/comet/CometServlet.java
------------------------------------------------------------------------------
    svn:eol-style = native



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to