You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by pe...@apache.org on 2010/07/04 12:50:53 UTC
svn commit: r960318 -
/tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java
Author: pero
Date: Sun Jul 4 10:50:53 2010
New Revision: 960318
URL: http://svn.apache.org/viewvc?rev=960318&view=rev
Log:
no functional change.
reformating and fix some checkstyle warnings
Modified:
tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java
Modified: tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java?rev=960318&r1=960317&r2=960318&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java Sun Jul 4 10:50:53 2010
@@ -1,13 +1,13 @@
-/*
+/**
* 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.
@@ -40,19 +40,21 @@ import org.apache.catalina.connector.Req
import org.apache.coyote.ActionCode;
import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;
+
/**
- *
+ *
* @author fhanik
*
*/
public class AsyncContextImpl implements AsyncContext {
-
+
public static enum AsyncState {
- NOT_STARTED, STARTED, DISPATCHING, DISPATCHED, COMPLETING, TIMING_OUT, ERROR_DISPATCHING
+ NOT_STARTED, STARTED, DISPATCHING,
+ DISPATCHED, COMPLETING, TIMING_OUT, ERROR_DISPATCHING
}
-
+
private static final Log log = LogFactory.getLog(AsyncContextImpl.class);
-
+
private ServletRequest servletRequest = null;
private ServletResponse servletResponse = null;
private List<AsyncListenerWrapper> listeners = new ArrayList<AsyncListenerWrapper>();
@@ -62,12 +64,15 @@ public class AsyncContextImpl implements
private AtomicReference<AsyncState> state = new AtomicReference<AsyncState>(AsyncState.NOT_STARTED);
private long timeout = -1;
private AsyncEvent event = null;
-
+
private Request request;
-
+
public AsyncContextImpl(Request request) {
if (log.isDebugEnabled()) {
- log.debug("AsyncContext created["+request.getRequestURI()+"?"+request.getQueryString()+"]", new DebugException());
+ log.debug("AsyncContext created["
+ + request.getRequestURI()
+ + "?" + request.getQueryString() + "]",
+ new DebugException());
}
//TODO SERVLET3 - async
this.request = request;
@@ -76,81 +81,102 @@ public class AsyncContextImpl implements
@Override
public void complete() {
if (log.isDebugEnabled()) {
- log.debug("AsyncContext Complete Called["+state.get()+"; "+request.getRequestURI()+"?"+request.getQueryString()+"]", new DebugException());
+ log.debug("AsyncContext Complete Called["
+ + state.get() + "; "
+ + request.getRequestURI()
+ + "?" + request.getQueryString() + "]",
+ new DebugException());
}
- if (state.get()==AsyncState.COMPLETING) {
+ if (state.get() == AsyncState.COMPLETING) {
//do nothing
- } else if (state.compareAndSet(AsyncState.DISPATCHED, AsyncState.COMPLETING) ||
- state.compareAndSet(AsyncState.STARTED, AsyncState.COMPLETING)) {
+ } else if (state.compareAndSet(AsyncState.DISPATCHED, AsyncState.COMPLETING)
+ || state.compareAndSet(AsyncState.STARTED, AsyncState.COMPLETING)) {
// TODO SERVLET3 - async
AtomicBoolean dispatched = new AtomicBoolean(false);
- request.getCoyoteRequest().action(ActionCode.ACTION_ASYNC_COMPLETE,dispatched);
- if (!dispatched.get()) doInternalComplete(false);
+ request.getCoyoteRequest().action(
+ ActionCode.ACTION_ASYNC_COMPLETE, dispatched);
+ if (!dispatched.get()) {
+ doInternalComplete(false);
+ }
} else {
- throw new IllegalStateException("Complete not allowed. Invalid state:"+state.get());
+ throw new IllegalStateException(
+ "Complete not allowed. Invalid state:" + state.get());
}
-
+
}
@Override
public void dispatch() {
- HttpServletRequest sr = (HttpServletRequest)getServletRequest();
+ HttpServletRequest sr = (HttpServletRequest) getServletRequest();
String path = sr.getRequestURI();
- String cpath = sr.getContextPath();
- if (cpath.length()>1) path = path.substring(cpath.length());
+ final String cpath = sr.getContextPath();
+ if (cpath.length() > 1) {
+ path = path.substring(cpath.length());
+ }
dispatch(path);
}
@Override
- public void dispatch(String path) {
- dispatch(request.getServletContext(),path);
+ public void dispatch(final String path) {
+ dispatch(request.getServletContext(), path);
}
@Override
- public void dispatch(ServletContext context, String path) {
+ public void dispatch(final ServletContext dispachContext,
+ final String path) {
if (log.isDebugEnabled()) {
- log.debug("AsyncContext Dispatch Called["+state.get()+"; "+path+"; "+request.getRequestURI()+"?"+request.getQueryString()+"]", new DebugException());
+ log.debug("AsyncContext Dispatch Called["
+ + state.get() + "; "
+ + path + "; "
+ + request.getRequestURI()
+ + "?" + request.getQueryString() + "]",
+ new DebugException());
}
// TODO SERVLET3 - async
- if (state.compareAndSet(AsyncState.STARTED, AsyncState.DISPATCHING) ||
- state.compareAndSet(AsyncState.DISPATCHED, AsyncState.DISPATCHING)) {
+ if (state.compareAndSet(AsyncState.STARTED, AsyncState.DISPATCHING)
+ || state.compareAndSet(AsyncState.DISPATCHED, AsyncState.DISPATCHING)) {
- if (request.getAttribute(ASYNC_REQUEST_URI)==null) {
- request.setAttribute(ASYNC_REQUEST_URI, request.getRequestURI()+"?"+request.getQueryString());
- request.setAttribute(ASYNC_CONTEXT_PATH, request.getContextPath());
- request.setAttribute(ASYNC_SERVLET_PATH, request.getServletPath());
- request.setAttribute(ASYNC_QUERY_STRING, request.getQueryString());
- }
- final RequestDispatcher requestDispatcher = context.getRequestDispatcher(path);
- final HttpServletRequest servletRequest = (HttpServletRequest)getRequest();
- final HttpServletResponse servletResponse = (HttpServletResponse)getResponse();
+ if (request.getAttribute(ASYNC_REQUEST_URI) == null) {
+ request.setAttribute(ASYNC_REQUEST_URI,
+ request.getRequestURI() + "?" + request.getQueryString());
+ request.setAttribute(ASYNC_CONTEXT_PATH,
+ request.getContextPath());
+ request.setAttribute(ASYNC_SERVLET_PATH,
+ request.getServletPath());
+ request.setAttribute(ASYNC_QUERY_STRING,
+ request.getQueryString());
+ }
+ final RequestDispatcher requestDispatcher = dispachContext.getRequestDispatcher(path);
+ final HttpServletRequest sRequest = (HttpServletRequest) getRequest();
+ final HttpServletResponse sResponse = (HttpServletResponse) getResponse();
Runnable run = new Runnable() {
public void run() {
- DispatcherType type = (DispatcherType)request.getAttribute(Globals.DISPATCHER_TYPE_ATTR);
+ DispatcherType type = (DispatcherType) request.getAttribute(Globals.DISPATCHER_TYPE_ATTR);
try {
//piggy back on the request dispatcher to ensure that filters etc get called.
//TODO SERVLET3 - async should this be include/forward or a new dispatch type
//javadoc suggests include with the type of DispatcherType.ASYNC
request.setAttribute(Globals.DISPATCHER_TYPE_ATTR, DispatcherType.ASYNC);
- requestDispatcher.include(servletRequest, servletResponse);
- }catch (Exception x) {
+ requestDispatcher.include(sRequest, sResponse);
+ } catch (Exception x) {
//log.error("Async.dispatch",x);
throw new RuntimeException(x);
- }finally {
+ } finally {
request.setAttribute(Globals.DISPATCHER_TYPE_ATTR, type);
}
}
};
this.dispatch = run;
AtomicBoolean dispatched = new AtomicBoolean(false);
- request.getCoyoteRequest().action(ActionCode.ACTION_ASYNC_DISPATCH, dispatched );
+ request.getCoyoteRequest().action(
+ ActionCode.ACTION_ASYNC_DISPATCH, dispatched);
if (!dispatched.get()) {
try {
doInternalDispatch();
- }catch (ServletException sx) {
+ } catch (ServletException sx) {
throw new RuntimeException(sx);
- }catch (IOException ix) {
+ } catch (IOException ix) {
throw new RuntimeException(ix);
}
}
@@ -158,7 +184,8 @@ public class AsyncContextImpl implements
complete();
}
} else {
- throw new IllegalStateException("Dispatch not allowed. Invalid state:"+state.get());
+ throw new IllegalStateException(
+ "Dispatch not allowed. Invalid state:" + state.get());
}
}
@@ -175,51 +202,59 @@ public class AsyncContextImpl implements
@Override
public void start(final Runnable run) {
if (log.isDebugEnabled()) {
- log.debug("AsyncContext Start Called["+state.get()+"; "+request.getRequestURI()+"?"+request.getQueryString()+"]", new DebugException());
+ log.debug("AsyncContext Start Called["
+ + state.get() + "; "
+ + request.getRequestURI()
+ + "?" + request.getQueryString() + "]",
+ new DebugException());
}
- if (state.compareAndSet(AsyncState.STARTED, AsyncState.DISPATCHING) ||
- state.compareAndSet(AsyncState.DISPATCHED, AsyncState.DISPATCHING)) {
+ if (state.compareAndSet(AsyncState.STARTED, AsyncState.DISPATCHING)
+ || state.compareAndSet(AsyncState.DISPATCHED, AsyncState.DISPATCHING)) {
// TODO SERVLET3 - async
final ServletContext sctx = getServletRequest().getServletContext();
Runnable r = new Runnable() {
public void run() {
- //TODO SERVLET3 - async - set context class loader when running the task.
+ //TODO SERVLET3 -
+ //async - set context class loader when running the task.
try {
-
+
run.run();
- }catch (Exception x) {
- log.error("Unable to run async task.",x);
+ } catch (Exception x) {
+ log.error("Unable to run async task.", x);
}
}
};
this.dispatch = r;
AtomicBoolean dispatched = new AtomicBoolean(false);
- request.getCoyoteRequest().action(ActionCode.ACTION_ASYNC_DISPATCH, dispatched );
+ request.getCoyoteRequest().action(
+ ActionCode.ACTION_ASYNC_DISPATCH, dispatched);
if (!dispatched.get()) {
try {
doInternalDispatch();
- }catch (ServletException sx) {
+ } catch (ServletException sx) {
throw new RuntimeException(sx);
- }catch (IOException ix) {
+ } catch (IOException ix) {
throw new RuntimeException(ix);
}
}
} else {
- throw new IllegalStateException("Dispatch not allowed. Invalid state:"+state.get());
+ throw new IllegalStateException(
+ "Dispatch not allowed. Invalid state:" + state.get());
}
}
-
+
@Override
- public void addListener(AsyncListener listener) {
+ public void addListener(final AsyncListener listener) {
AsyncListenerWrapper wrapper = new AsyncListenerWrapper();
wrapper.setListener(listener);
listeners.add(wrapper);
}
@Override
- public void addListener(AsyncListener listener, ServletRequest servletRequest,
- ServletResponse servletResponse) {
+ public void addListener(final AsyncListener listener,
+ final ServletRequest sRequest,
+ final ServletResponse sResponse) {
AsyncListenerWrapper wrapper = new AsyncListenerWrapper();
wrapper.setListener(listener);
listeners.add(wrapper);
@@ -240,7 +275,7 @@ public class AsyncContextImpl implements
}
return listener;
}
-
+
public void recycle() {
servletRequest = null;
servletResponse = null;
@@ -253,15 +288,18 @@ public class AsyncContextImpl implements
}
public boolean isStarted() {
- return (state.get() == AsyncState.STARTED || state.get() == AsyncState.DISPATCHING || state.get() == AsyncState.DISPATCHED);
+ return (state.get() == AsyncState.STARTED ||
+ state.get() == AsyncState.DISPATCHING ||
+ state.get() == AsyncState.DISPATCHED);
}
public void setStarted(Context context) {
if (state.compareAndSet(AsyncState.NOT_STARTED, AsyncState.STARTED) ||
- state.compareAndSet(AsyncState.DISPATCHED, AsyncState.STARTED)) {
+ state.compareAndSet(AsyncState.DISPATCHED, AsyncState.STARTED)) {
this.context = context;
} else {
- throw new IllegalStateException("Start illegal. Invalid state: "+state.get());
+ throw new IllegalStateException("Start illegal. Invalid state: " +
+ state.get());
}
}
@@ -278,7 +316,8 @@ public class AsyncContextImpl implements
return hasOriginalRequestAndResponse;
}
- public void setHasOriginalRequestAndResponse(boolean hasOriginalRequestAndResponse) {
+ public void setHasOriginalRequestAndResponse(
+ boolean hasOriginalRequestAndResponse) {
this.hasOriginalRequestAndResponse = hasOriginalRequestAndResponse;
}
@@ -289,11 +328,12 @@ public class AsyncContextImpl implements
public void setCompleted() {
this.state.set(AsyncState.NOT_STARTED);
}
-
+
public void doInternalDispatch() throws ServletException, IOException {
- if (this.state.compareAndSet(AsyncState.TIMING_OUT, AsyncState.COMPLETING)) {
- if( log.isDebugEnabled())
- log.debug("TIMING OUT!");
+ if (this.state.compareAndSet(
+ AsyncState.TIMING_OUT, AsyncState.COMPLETING)) {
+ if (log.isDebugEnabled())
+ log.debug("TIMING OUT!");
boolean listenerInvoked = false;
for (AsyncListenerWrapper listener : listeners) {
listener.fireOnTimeout(event);
@@ -303,18 +343,19 @@ public class AsyncContextImpl implements
((HttpServletResponse)servletResponse).setStatus(500);
}
doInternalComplete(true);
- } else if (this.state.compareAndSet(AsyncState.ERROR_DISPATCHING, AsyncState.COMPLETING)) {
- if( log.isDebugEnabled())
+ } else if (this.state.compareAndSet(
+ AsyncState.ERROR_DISPATCHING, AsyncState.COMPLETING)) {
+ if (log.isDebugEnabled())
log.debug("ON ERROR!");
boolean listenerInvoked = false;
for (AsyncListenerWrapper listener : listeners) {
try {
listener.fireOnError(event);
}catch (IllegalStateException x) {
- if( log.isDebugEnabled())
+ if (log.isDebugEnabled())
log.debug("Listener invoked invalid state.",x);
}catch (Exception x) {
- if(log.isDebugEnabled())
+ if (log.isDebugEnabled())
log.debug("Exception during onError.",x);
}
listenerInvoked = true;
@@ -323,15 +364,18 @@ public class AsyncContextImpl implements
((HttpServletResponse)servletResponse).setStatus(500);
}
doInternalComplete(true);
-
- } else if (this.state.compareAndSet(AsyncState.DISPATCHING, AsyncState.DISPATCHED)) {
+
+ } else if (this.state.compareAndSet(
+ AsyncState.DISPATCHING, AsyncState.DISPATCHED)) {
if (this.dispatch!=null) {
try {
dispatch.run();
} catch (RuntimeException x) {
doInternalComplete(true);
- if (x.getCause() instanceof ServletException) throw (ServletException)x.getCause();
- if (x.getCause() instanceof IOException) throw (IOException)x.getCause();
+ if (x.getCause() instanceof ServletException)
+ throw (ServletException)x.getCause();
+ if (x.getCause() instanceof IOException)
+ throw (IOException)x.getCause();
else throw new ServletException(x);
} finally {
dispatch = null;
@@ -340,23 +384,26 @@ public class AsyncContextImpl implements
} else if (this.state.get()==AsyncState.COMPLETING) {
doInternalComplete(false);
} else {
- throw new IllegalStateException("Dispatch illegal. Invalid state: "+state.get());
+ throw new IllegalStateException(
+ "Dispatch illegal. Invalid state: " +
+ state.get());
}
}
-
+
public void doInternalComplete(boolean error) {
if (isCompleted()) return;
if (state.compareAndSet(AsyncState.STARTED, AsyncState.NOT_STARTED)) {
//this is the same as
//request.startAsync().complete();
recycle();
- } else if (state.compareAndSet(AsyncState.COMPLETING, AsyncState.NOT_STARTED)) {
+ } else if (state.compareAndSet(
+ AsyncState.COMPLETING, AsyncState.NOT_STARTED)) {
for (AsyncListenerWrapper wrapper : listeners) {
try {
wrapper.fireOnComplete(event);
}catch (IOException x) {
//how does this propagate, or should it?
- //TODO SERVLET3 - async
+ //TODO SERVLET3 - async
log.error("",x);
}
}
@@ -366,42 +413,46 @@ public class AsyncContextImpl implements
log.error("",x);
}
recycle();
-
- } else {
- throw new IllegalStateException("Complete illegal. Invalid state:"+state.get());
+
+ } else {
+ throw new IllegalStateException("Complete illegal. Invalid state:" +
+ state.get());
}
}
-
+
public AsyncState getState() {
return state.get();
}
-
+
protected void setState(AsyncState st) {
state.set(st);
}
-
+
public long getTimeout() {
return timeout;
}
-
+
public void setTimeout(long timeout) {
this.timeout = timeout;
- request.getCoyoteRequest().action(ActionCode.ACTION_ASYNC_SETTIMEOUT,new Long(timeout));
+ request.getCoyoteRequest().action(ActionCode.ACTION_ASYNC_SETTIMEOUT,
+ new Long(timeout));
}
-
+
public void setTimeoutState() {
state.set(AsyncState.TIMING_OUT);
}
-
+
public void setErrorState(Throwable t) {
if (t!=null) request.setAttribute(RequestDispatcher.ERROR_EXCEPTION, t);
state.set(AsyncState.ERROR_DISPATCHING);
}
-
+
public void init(ServletRequest request, ServletResponse response) {
this.servletRequest = request;
this.servletResponse = response;
- event = new AsyncEvent(this, request, response);
+ event = new AsyncEvent(this, request, response);
}
+
+ @SuppressWarnings("serial")
public static class DebugException extends Exception {}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org