001: /*
002: * Copyright (c) 2002-2007 by OpenSymphony
003: * All rights reserved.
004: */
005: package com.opensymphony.webwork.interceptor;
006:
007: import com.opensymphony.xwork.ActionInvocation;
008:
009: import java.io.Serializable;
010:
011: /**
012: * Background thread to be executed by the ExecuteAndWaitInterceptor.
013: *
014: * @author <a href="plightbo@gmail.com">Pat Lightbody</a>
015: * @author <a href="jim@jimvanfleet.com">Jim Van Fleet</a>
016: */
017: public class BackgroundProcess implements Serializable {
018:
019: private static final long serialVersionUID = 8146242696076042381L;
020:
021: protected Object action;
022: protected ActionInvocation invocation;
023: protected String result;
024: protected Exception exception;
025: protected boolean done;
026:
027: public BackgroundProcess(String threadName,
028: final ActionInvocation invocation, int threadPriority) {
029: this .invocation = invocation;
030: this .action = invocation.getAction();
031: try {
032: final Thread t = new Thread(new Runnable() {
033: public void run() {
034: try {
035: beforeInvocation();
036: result = invocation.invokeActionOnly();
037: afterInvocation();
038: } catch (Exception e) {
039: exception = e;
040: }
041:
042: done = true;
043: }
044: });
045: t.setName(threadName);
046: t.setPriority(threadPriority);
047: t.start();
048: } catch (Exception e) {
049: exception = e;
050: }
051: }
052:
053: /**
054: * called before the background thread determines the result code
055: * from the ActionInvocation.
056: *
057: * @throws Exception any exception thrown will be thrown, in turn, by the ExecuteAndWaitInterceptor
058: */
059: protected void beforeInvocation() throws Exception {
060: }
061:
062: /**
063: * called after the background thread determines the result code
064: * from the ActionInvocation, but before the background thread is
065: * marked as done.
066: *
067: * @throws Exception any exception thrown will be thrown, in turn, by the ExecuteAndWaitInterceptor
068: */
069: protected void afterInvocation() throws Exception {
070: }
071:
072: /**
073: * Retrieves the action.
074: *
075: * @return the action.
076: */
077: public Object getAction() {
078: return action;
079: }
080:
081: /**
082: * Retrieves the action invocation.
083: *
084: * @return the action invocation
085: */
086: public ActionInvocation getInvocation() {
087: return invocation;
088: }
089:
090: /**
091: * Gets the result of the background process.
092: *
093: * @return the result; <tt>null</tt> if not done.
094: */
095: public String getResult() {
096: return result;
097: }
098:
099: /**
100: * Gets the exception if any was thrown during the execution of the background process.
101: *
102: * @return the exception or <tt>null</tt> if no exception was thrown.
103: */
104: public Exception getException() {
105: return exception;
106: }
107:
108: /**
109: * Returns the status of the background process.
110: *
111: * @return <tt>true</tt> if finished, <tt>false</tt> otherwise
112: */
113: public boolean isDone() {
114: return done;
115: }
116: }
|