[jboss-cvs] JBossAS SVN: r91678 - in projects/jboss-jca/trunk: core/src/main/java/org/jboss/jca/core/api and 2 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Mon Jul 27 11:08:35 EDT 2009
Author: jesper.pedersen
Date: 2009-07-27 11:08:34 -0400 (Mon, 27 Jul 2009)
New Revision: 91678
Modified:
projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/util/ClassUtil.java
projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/api/WorkWrapper.java
projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/workmanager/WorkManagerImpl.java
projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/test/core/spec/chapter11/common/TransactionContextCustom.java
Log:
[JBJCA-112] Adding Partial Implementation for Specification Chapter11. Patch by Gurkan Erdogdu
Modified: projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/util/ClassUtil.java
===================================================================
--- projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/util/ClassUtil.java 2009-07-27 15:07:55 UTC (rev 91677)
+++ projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/util/ClassUtil.java 2009-07-27 15:08:34 UTC (rev 91678)
@@ -22,6 +22,9 @@
package org.jboss.jca.common.util;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+
/**
* Utility for class related operations.
*
@@ -29,6 +32,9 @@
*/
public final class ClassUtil
{
+ /** Empty class array */
+ private static final Class<?>[] EMPTY_CLASS_ARRAY = new Class[0];
+
// Not-instantiate me
private ClassUtil()
{
@@ -57,4 +63,43 @@
return to.isAssignableFrom(from);
}
+ /**
+ * Returns true if <b>synchronized</b> keyword exists, false otherwise.
+ *
+ * @param modifiers member modifieres
+ * @return true if <b>synchronized</b> keyword exists, false otherwise
+ */
+ public static boolean modifiersHasSynchronizedKeyword(int modifiers)
+ {
+ return Modifier.isSynchronized(modifiers);
+ }
+
+ /**
+ * Gets class' method with given name and parameter types.
+ * @param clazz class
+ * @param methodName method name
+ * @param parameterTypes parameter types
+ * @return method
+ * @throws NoSuchMethodException if not method exist
+ */
+ public static Method getClassMethod(Class<?> clazz, String methodName,
+ Class<?>[] parameterTypes) throws NoSuchMethodException
+ {
+ if (clazz == null)
+ {
+ throw new IllegalArgumentException("Class is null");
+ }
+
+ if (methodName == null || methodName.equals(""))
+ {
+ throw new IllegalArgumentException("Method name is null or empty");
+ }
+
+ if (parameterTypes == null)
+ {
+ parameterTypes = EMPTY_CLASS_ARRAY;
+ }
+
+ return clazz.getDeclaredMethod(methodName, parameterTypes);
+ }
}
Modified: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/api/WorkWrapper.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/api/WorkWrapper.java 2009-07-27 15:07:55 UTC (rev 91677)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/api/WorkWrapper.java 2009-07-27 15:08:34 UTC (rev 91678)
@@ -65,7 +65,7 @@
new HashMap<Class<? extends WorkContext>, WorkContext>();
/** the work listener */
- private WorkListener workListener;
+ private WorkListener workListener;
/** The start timeout */
private long startTimeout;
@@ -261,26 +261,29 @@
public void execute()
{
if (trace)
- log.trace("Executing work " + this);
+ {
+ log.trace("Starting work " + this);
+ }
+
try
{
workManager.startWork(this);
+ work.run();
+
}
catch (WorkException e)
{
- taskRejected(new NestedRuntimeException(e));
- return;
- }
- try
- {
- work.run();
- }
+ taskCompleted(new NestedRuntimeException(e));
+ }
finally
{
workManager.endWork(this);
}
+
if (trace)
- log.trace("Executed work " + this);
+ {
+ log.trace("Executed work " + this);
+ }
}
/**
@@ -289,13 +292,15 @@
public void stop()
{
if (trace)
- log.trace("Stopping work " + this);
+ {
+ log.trace("Stopping work " + this);
+ }
work.release();
}
/**
- * Accepted
+ * Work is accepted.
* @param time The blocked time
*/
public void accepted(long time)
@@ -303,7 +308,9 @@
blockedTime = time;
if (trace)
- log.trace("Accepted work " + this);
+ {
+ log.trace("Accepted work " + this);
+ }
if (workListener != null)
{
@@ -313,7 +320,7 @@
}
/**
- * Rejected
+ * Work is rejected.
* @param time The blocked time
* @param throwable The throwable
*/
@@ -324,23 +331,29 @@
if (trace)
{
if (throwable != null)
- log.trace("Rejecting work " + this, throwable);
+ {
+ log.trace("Rejecting work " + this, throwable);
+ }
else
- log.trace("Rejecting work " + this);
+ {
+ log.trace("Rejecting work " + this);
+ }
}
if (throwable != null)
{
exception = new WorkRejectedException(throwable);
if (throwable instanceof StartTimeoutException)
- exception.setErrorCode(WorkRejectedException.START_TIMED_OUT);
+ {
+ exception.setErrorCode(WorkRejectedException.START_TIMED_OUT);
+ }
}
workManager.cancelWork(this);
if (workListener != null)
{
- WorkEvent event = new WorkEvent(workManager, WorkEvent.WORK_ACCEPTED, work, exception);
+ WorkEvent event = new WorkEvent(workManager, WorkEvent.WORK_REJECTED, work, exception);
workListener.workRejected(event);
}
}
@@ -352,7 +365,9 @@
public void started(long time)
{
if (waitType != WAIT_NONE)
- blockedTime = time;
+ {
+ blockedTime = time;
+ }
if (workListener != null)
{
@@ -369,13 +384,19 @@
public void completed(long time, Throwable throwable)
{
if (waitType == WAIT_FOR_COMPLETE)
- blockedTime = time;
+ {
+ blockedTime = time;
+ }
if (throwable != null)
- exception = new WorkCompletedException(throwable);
+ {
+ exception = new WorkCompletedException(throwable);
+ }
if (trace)
- log.trace("Completed work " + this);
+ {
+ log.trace("Completed work " + this);
+ }
if (workListener != null)
{
Modified: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/workmanager/WorkManagerImpl.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/workmanager/WorkManagerImpl.java 2009-07-27 15:07:55 UTC (rev 91677)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/workmanager/WorkManagerImpl.java 2009-07-27 15:08:34 UTC (rev 91678)
@@ -23,10 +23,11 @@
package org.jboss.jca.core.workmanager;
import org.jboss.jca.common.api.ThreadPool;
+import org.jboss.jca.common.util.ClassUtil;
import org.jboss.jca.core.api.WorkManager;
import org.jboss.jca.core.api.WorkWrapper;
-import java.lang.reflect.Modifier;
+import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@@ -39,6 +40,7 @@
import javax.resource.spi.work.WorkCompletedException;
import javax.resource.spi.work.WorkContext;
import javax.resource.spi.work.WorkContextErrorCodes;
+import javax.resource.spi.work.WorkContextLifecycleListener;
import javax.resource.spi.work.WorkContextProvider;
import javax.resource.spi.work.WorkException;
import javax.resource.spi.work.WorkListener;
@@ -50,7 +52,10 @@
import org.jboss.util.threadpool.Task;
/**
- * The work manager implementation
+ * The work manager implementation.
+ *
+ * @author gurkanerdogdu
+ * @version $Rev$ $Date$
*/
public class WorkManagerImpl implements WorkManager
{
@@ -72,6 +77,13 @@
/** The XA terminator */
private JBossXATerminator xaTerminator;
+
+ /**Work run method name*/
+ private static final String RUN_METHOD_NAME = "run";
+
+ /**Work release method name*/
+ private static final String RELEASE_METHOD_NAME = "release";
+
/**Default supported workcontext types*/
static
@@ -82,13 +94,16 @@
}
/**
- * Default constructor
+ * Default constructor.
+ * <p>
+ * Defines a default spec compliant.
+ * </p>
*/
public WorkManagerImpl()
{
specCompliant = true;
}
-
+
/**
* Retrieve the thread pool
* @return the thread pool
@@ -160,42 +175,22 @@
WorkListener workListener)
throws WorkException
{
- if (work == null)
- throw new WorkException("Null work");
-
- if (specCompliant)
- verifyWork(work);
-
- boolean isWorkContextProvider = false;
- if (work instanceof WorkContextProvider)
+ checkAndVerifyWork(work, execContext);
+
+ if (execContext == null)
{
- //Implements WorkContextProvider and not-null ExecutionContext
- if (execContext != null)
- {
- throw new WorkRejectedException("Work execution context must be null because " +
- "work instance implements WorkContextProvider!");
- }
-
- isWorkContextProvider = true;
+ execContext = new ExecutionContext();
}
-
- if (execContext == null)
- execContext = new ExecutionContext();
WorkWrapper wrapper =
new WorkWrapper(this, work, Task.WAIT_FOR_COMPLETE, startTimeout, execContext, workListener);
- //Check workcontexts
- if (isWorkContextProvider)
- {
- setupWorkContextProviders(wrapper);
- }
+ //Submit Work Instance
+ submitWork(wrapper);
- importWork(wrapper);
- executeWork(wrapper);
+ //Check Result
+ checkWorkCompletionException(wrapper);
- if (wrapper.getWorkException() != null)
- throw wrapper.getWorkException();
}
/**
@@ -215,41 +210,21 @@
WorkListener workListener)
throws WorkException
{
- if (work == null)
- throw new WorkException("Null work");
-
- if (specCompliant)
- verifyWork(work);
-
- boolean isWorkContextProvider = false;
- if (work instanceof WorkContextProvider)
+ checkAndVerifyWork(work, execContext);
+
+ if (execContext == null)
{
- //Implements WorkContextProvider and not-null ExecutionContext
- if (execContext != null)
- {
- throw new WorkRejectedException("Work execution context must be null because " +
- "work instance implements WorkContextProvider!");
- }
-
- isWorkContextProvider = true;
+ execContext = new ExecutionContext();
}
-
- if (execContext == null)
- execContext = new ExecutionContext();
WorkWrapper wrapper = new WorkWrapper(this, work, Task.WAIT_FOR_START, startTimeout, execContext, workListener);
- if (isWorkContextProvider)
- {
- setupWorkContextProviders(wrapper);
- }
+ //Submit Work Instance
+ submitWork(wrapper);
- importWork(wrapper);
- executeWork(wrapper);
+ //Check Result
+ checkWorkCompletionException(wrapper);
- if (wrapper.getWorkException() != null)
- throw wrapper.getWorkException();
-
return wrapper.getBlockedElapsed();
}
@@ -270,58 +245,47 @@
WorkListener workListener)
throws WorkException
{
- if (work == null)
- throw new WorkException("Null work");
-
- if (specCompliant)
- verifyWork(work);
-
-
- boolean isWorkContextProvider = false;
- if (work instanceof WorkContextProvider)
+ checkAndVerifyWork(work, execContext);
+
+ if (execContext == null)
{
- //Implements WorkContextProvider and not-null ExecutionContext
- if (execContext != null)
- {
- throw new WorkRejectedException("Work execution context must be null " +
- "because work instance implements WorkContextProvider!");
- }
-
- isWorkContextProvider = true;
+ execContext = new ExecutionContext();
}
-
- if (execContext == null)
- execContext = new ExecutionContext();
WorkWrapper wrapper = new WorkWrapper(this, work, Task.WAIT_NONE, startTimeout, execContext, workListener);
- if (isWorkContextProvider)
- {
- setupWorkContextProviders(wrapper);
- }
+ //Submit Work Instance
+ submitWork(wrapper);
- importWork(wrapper);
- executeWork(wrapper);
-
- if (wrapper.getWorkException() != null)
- throw wrapper.getWorkException();
+ //Check Result
+ checkWorkCompletionException(wrapper);
}
/**
- * Import any work
+ * Imports any work.
* @param wrapper the work wrapper
* @throws WorkException for any error
*/
protected void importWork(WorkWrapper wrapper) throws WorkException
{
+ if (wrapper == null)
+ {
+ return;
+ }
+
trace = log.isTraceEnabled();
+
if (trace)
- log.trace("Importing work " + wrapper);
+ {
+ log.trace("Importing work " + wrapper);
+ }
- if (wrapper == null)
- return;
+ ExecutionContext ctx = wrapper.getWorkContext(TransactionContext.class);
+ if (ctx == null)
+ {
+ ctx = wrapper.getExecutionContext();
+ }
- ExecutionContext ctx = wrapper.getExecutionContext();
if (ctx != null)
{
Xid xid = ctx.getXid();
@@ -332,43 +296,80 @@
xaTerminator.registerWork(wrapper.getWork(), xid, timeout);
}
}
+
+ //Fires Context setup complete
+ fireWorkContextSetupComplete(ctx);
+
if (trace)
- log.trace("Imported work " + wrapper);
+ {
+ log.trace("Imported work " + wrapper);
+ }
}
/**
- * Execute the work
+ * Submit the given work instance for executing by the thread pool.
* @param wrapper the work wrapper
* @throws WorkException for any error
*/
- protected void executeWork(WorkWrapper wrapper) throws WorkException
+ protected void submitWork(WorkWrapper wrapper) throws WorkException
{
+ if (wrapper == null)
+ {
+ return;
+ }
+
if (trace)
- log.trace("Submitting work to thread pool " + wrapper);
+ {
+ log.trace("Submitting work to thread pool " + wrapper);
+ }
- if (wrapper == null)
- return;
-
threadPool.runTaskWrapper(wrapper);
if (trace)
- log.trace("Submitted work to thread pool " + wrapper);
+ {
+ log.trace("Submitted work to thread pool " + wrapper);
+ }
}
/**
- * Start work
+ * Starts given work instance.
* @param wrapper the work wrapper
* @throws WorkException for any error
*/
public void startWork(WorkWrapper wrapper) throws WorkException
{
+ if (wrapper == null)
+ {
+ return;
+ }
+
if (trace)
- log.trace("Starting work " + wrapper);
+ {
+ log.trace("Setting up work contexts " + wrapper);
+ }
+
+ //Setting up WorkContexts if an exist
+ setupWorkContextProviders(wrapper);
+
+ if (trace)
+ {
+ log.trace("Setted up work contexts " + wrapper);
+ }
+
+ //Import work instance
+ importWork(wrapper);
+
+ if (trace)
+ {
+ log.trace("Starting work " + wrapper);
+ }
- if (wrapper == null)
- return;
-
- ExecutionContext ctx = wrapper.getExecutionContext();
+ ExecutionContext ctx = wrapper.getWorkContext(TransactionContext.class);
+ if (ctx == null)
+ {
+ ctx = wrapper.getExecutionContext();
+ }
+
if (ctx != null)
{
Xid xid = ctx.getXid();
@@ -378,22 +379,33 @@
}
}
if (trace)
- log.trace("Started work " + wrapper);
+ {
+ log.trace("Started work " + wrapper);
+ }
}
/**
- * End work
+ * Ends given work instance.
* @param wrapper the work wrapper
*/
public void endWork(WorkWrapper wrapper)
{
+ if (wrapper == null)
+ {
+ return;
+ }
+
if (trace)
- log.trace("Ending work " + wrapper);
+ {
+ log.trace("Ending work " + wrapper);
+ }
- if (wrapper == null)
- return;
+ ExecutionContext ctx = wrapper.getWorkContext(TransactionContext.class);
+ if (ctx == null)
+ {
+ ctx = wrapper.getExecutionContext();
+ }
- ExecutionContext ctx = wrapper.getExecutionContext();
if (ctx != null)
{
Xid xid = ctx.getXid();
@@ -403,22 +415,33 @@
}
}
if (trace)
- log.trace("Ended work " + wrapper);
+ {
+ log.trace("Ended work " + wrapper);
+ }
}
/**
- * Cancel work
+ * Cancels given work instance.
* @param wrapper the work wrapper
*/
public void cancelWork(WorkWrapper wrapper)
{
+ if (wrapper == null)
+ {
+ return;
+ }
+
if (trace)
- log.trace("Cancel work " + wrapper);
+ {
+ log.trace("Cancel work " + wrapper);
+ }
- if (wrapper == null)
- return;
+ ExecutionContext ctx = wrapper.getWorkContext(TransactionContext.class);
+ if (ctx == null)
+ {
+ ctx = wrapper.getExecutionContext();
+ }
- ExecutionContext ctx = wrapper.getExecutionContext();
if (ctx != null)
{
Xid xid = ctx.getXid();
@@ -428,45 +451,42 @@
}
}
if (trace)
- log.trace("Canceled work " + wrapper);
+ {
+ log.trace("Canceled work " + wrapper);
+ }
}
/**
- * Verify work
+ * Verify the given work instance.
* @param work The work
* @throws WorkException Thrown if a spec compliant issue is found
*/
private void verifyWork(Work work) throws WorkException
- {
- Class<?>[] types = new Class[] {};
-
- try
+ {
+ Class<?> workClass = work.getClass();
+ boolean result = false;
+
+ result = verfiyWorkMethods(workClass, RUN_METHOD_NAME, null, workClass.getName() +
+ ": Run method is not defined");
+
+ if (!result)
{
- if (Modifier.isSynchronized(work.getClass().getMethod("run", types).getModifiers()))
- throw new WorkException(work.getClass().getName() + ": Run method is synchronized");
+ throw new WorkException(workClass.getName() + ": Run method is synchronized");
}
- catch (NoSuchMethodException nsme)
+
+ result = verfiyWorkMethods(workClass, RELEASE_METHOD_NAME, null, workClass.getName() +
+ ": Release method is not defined");
+
+ if (!result)
{
- throw new WorkException(work.getClass().getName() + ": Run method is not defined");
+ throw new WorkException(workClass.getName() + ": Release method is synchronized");
}
-
- try
- {
- if (Modifier.isSynchronized(work.getClass().getMethod("release", types).getModifiers()))
- throw new WorkException(work.getClass().getName() + ": Release method is synchronized");
- }
- catch (NoSuchMethodException nsme)
- {
- throw new WorkException(work.getClass().getName() + ": Release method is not defined");
- }
-
}
/**
* Setup work context's of the given work instance.
*
- * @param work work instance
- * @param executionContext execution context instance
+ * @param wrapper wrapper work instance
* @throws WorkException if any exception occurs
*/
private void setupWorkContextProviders(WorkWrapper wrapper) throws WorkException
@@ -478,101 +498,116 @@
Work work = wrapper.getWork();
- WorkContextProvider wcProvider = (WorkContextProvider) work;
- List<WorkContext> contexts = wcProvider.getWorkContexts();
-
- if (contexts != null && contexts.size() > 0)
+ //If work is an instanceof WorkContextProvider
+ if (work instanceof WorkContextProvider)
{
- boolean isTransactionContext = false;
- boolean isSecurityContext = false;
- boolean isHintcontext = false;
+ WorkContextProvider wcProvider = (WorkContextProvider) work;
+ List<WorkContext> contexts = wcProvider.getWorkContexts();
- for (WorkContext context : contexts)
+ if (contexts != null && contexts.size() > 0)
{
- Class<? extends WorkContext> contextType = null;
+ boolean isTransactionContext = false;
+ boolean isSecurityContext = false;
+ boolean isHintcontext = false;
- // Get supported work context class
- contextType = getSupportedWorkContextClass(context.getClass());
+ for (WorkContext context : contexts)
+ {
+ Class<? extends WorkContext> contextType = null;
- // Not supported
- if (contextType == null)
- {
- if (trace)
+ // Get supported work context class
+ contextType = getSupportedWorkContextClass(context.getClass());
+
+ // Not supported
+ if (contextType == null)
{
- log.trace("Not supported work context class : " + context.getClass());
+ if (trace)
+ {
+ log.trace("Not supported work context class : " + context.getClass());
+ }
+
+ fireWorkContextSetupFailed(context, WorkContextErrorCodes.UNSUPPORTED_CONTEXT_TYPE);
+
+ throw new WorkCompletedException("Unsupported WorkContext class : " + context.getClass(),
+ WorkContextErrorCodes.UNSUPPORTED_CONTEXT_TYPE);
}
- throw new WorkCompletedException("Unsupported WorkContext class : " + context.getClass(),
- WorkContextErrorCodes.UNSUPPORTED_CONTEXT_TYPE);
- }
- // Duplicate checks
- else
- {
- // TransactionContext duplicate
- if (isTransactionContext(contextType))
+ // Duplicate checks
+ else
{
- if (isTransactionContext)
+ // TransactionContext duplicate
+ if (isTransactionContext(contextType))
{
- if (trace)
+ if (isTransactionContext)
{
- log.trace("Duplicate transaction work context : " + context.getClass());
+ if (trace)
+ {
+ log.trace("Duplicate transaction work context : " + context.getClass());
+ }
+
+ fireWorkContextSetupFailed(context, WorkContextErrorCodes.DUPLICATE_CONTEXTS);
+
+ throw new WorkCompletedException("Duplicate TransactionWorkContext class : " +
+ context.getClass(), WorkContextErrorCodes.DUPLICATE_CONTEXTS);
}
-
- throw new WorkCompletedException("Duplicate TransactionWorkContext class : " +
- context.getClass(), WorkContextErrorCodes.DUPLICATE_CONTEXTS);
+ else
+ {
+ isTransactionContext = true;
+ }
}
- else
+ // SecurityContext duplicate
+ else if (isSecurityContext(contextType))
{
- isTransactionContext = true;
- }
- }
- // SecurityContext duplicate
- else if (isSecurityContext(contextType))
- {
- if (isSecurityContext)
- {
- if (trace)
+ if (isSecurityContext)
{
- log.trace("Duplicate security work context : " + context.getClass());
+ if (trace)
+ {
+ log.trace("Duplicate security work context : " + context.getClass());
+ }
+
+ fireWorkContextSetupFailed(context, WorkContextErrorCodes.DUPLICATE_CONTEXTS);
+
+ throw new WorkCompletedException("Duplicate SecurityWorkContext class : " + context.getClass(),
+ WorkContextErrorCodes.DUPLICATE_CONTEXTS);
}
-
- throw new WorkCompletedException("Duplicate SecurityWorkContext class : " + context.getClass(),
- WorkContextErrorCodes.DUPLICATE_CONTEXTS);
+ else
+ {
+ isSecurityContext = true;
+ }
}
- else
+ // HintContext duplicate
+ else if (isHintContext(contextType))
{
- isSecurityContext = true;
- }
- }
- // HintContext duplicate
- else if (isHintContext(contextType))
- {
- if (isHintcontext)
- {
- if (trace)
+ if (isHintcontext)
{
- log.trace("Duplicate hint work context : " + context.getClass());
+ if (trace)
+ {
+ log.trace("Duplicate hint work context : " + context.getClass());
+ }
+
+ fireWorkContextSetupFailed(context, WorkContextErrorCodes.DUPLICATE_CONTEXTS);
+
+ throw new WorkCompletedException("Duplicate HintWorkContext class : " + context.getClass(),
+ WorkContextErrorCodes.DUPLICATE_CONTEXTS);
}
-
- throw new WorkCompletedException("Duplicate HintWorkContext class : " + context.getClass(),
- WorkContextErrorCodes.DUPLICATE_CONTEXTS);
+ else
+ {
+ isHintcontext = true;
+ }
}
+ // Normally, this must not be happened!i just safe check!
else
{
- isHintcontext = true;
+ fireWorkContextSetupFailed(context, WorkContextErrorCodes.UNSUPPORTED_CONTEXT_TYPE);
+
+ throw new WorkCompletedException("Unsupported WorkContext class : " + context.getClass(),
+ WorkContextErrorCodes.UNSUPPORTED_CONTEXT_TYPE);
}
}
- // Normally, this must not be happened!i just safe check!
- else
- {
- throw new WorkCompletedException("Unsupported WorkContext class : " + context.getClass(),
- WorkContextErrorCodes.UNSUPPORTED_CONTEXT_TYPE);
- }
+
+ // Add workcontext instance to the work
+ wrapper.addWorkContext(contextType, context);
}
-
- // Add workcontext instance to the work
- wrapper.addWorkContext(contextType, context);
- }
- }
+ }
+ }
}
/**
@@ -654,5 +689,97 @@
return false;
}
+
+ /**
+ * Check and verfiy work before submitting.
+ * @param work the work instance
+ * @param executionContext any execution context that is passed by apadater
+ * @throws WorkException if any exception occurs
+ */
+ private void checkAndVerifyWork(Work work, ExecutionContext executionContext) throws WorkException
+ {
+ if (work == null)
+ {
+ throw new WorkException("Null work");
+ }
+ if (specCompliant)
+ {
+ verifyWork(work);
+ }
+
+ if (work instanceof WorkContextProvider)
+ {
+ //Implements WorkContextProvider and not-null ExecutionContext
+ if (executionContext != null)
+ {
+ throw new WorkRejectedException("Work execution context must be null because " +
+ "work instance implements WorkContextProvider!");
+ }
+ }
+ }
+
+ /**
+ * Checks work completed status.
+ * @param wrapper work wrapper instance
+ * @throws {@link WorkException} if work is completed with an exception
+ */
+ private void checkWorkCompletionException(WorkWrapper wrapper) throws WorkException
+ {
+ if (wrapper.getWorkException() != null)
+ {
+ throw wrapper.getWorkException();
+ }
+ }
+
+ private boolean verfiyWorkMethods(Class<?> workClass, String methodName,
+ Class<?>[] parameterTypes, String errorMessage) throws WorkException
+ {
+ Method method = null;
+ try
+ {
+ method = ClassUtil.getClassMethod(workClass, methodName, null);
+
+ if (ClassUtil.modifiersHasSynchronizedKeyword(method.getModifiers()))
+ {
+ return false;
+ }
+ }
+ catch (NoSuchMethodException nsme)
+ {
+ throw new WorkException(errorMessage);
+ }
+
+ return true;
+ }
+
+ /**
+ * Calls listener with given error code.
+ * @param listener work context listener
+ * @param errorCode error code
+ */
+ private void fireWorkContextSetupFailed(Object workContext, String errorCode)
+ {
+ if (workContext instanceof WorkContextLifecycleListener)
+ {
+ WorkContextLifecycleListener listener = (WorkContextLifecycleListener)workContext;
+ listener.contextSetupFailed(errorCode);
+ }
+
+ }
+
+ /**
+ * Calls listener after work context is setted up.
+ * @param listener work context listener
+ */
+ private void fireWorkContextSetupComplete(Object workContext)
+ {
+ if (workContext instanceof WorkContextLifecycleListener)
+ {
+ WorkContextLifecycleListener listener = (WorkContextLifecycleListener)workContext;
+ listener.contextSetupComplete();
+ }
+
+ }
+
}
Modified: projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/test/core/spec/chapter11/common/TransactionContextCustom.java
===================================================================
--- projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/test/core/spec/chapter11/common/TransactionContextCustom.java 2009-07-27 15:07:55 UTC (rev 91677)
+++ projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/test/core/spec/chapter11/common/TransactionContextCustom.java 2009-07-27 15:08:34 UTC (rev 91678)
@@ -23,18 +23,57 @@
package org.jboss.jca.test.core.spec.chapter11.common;
import javax.resource.spi.work.TransactionContext;
+import javax.resource.spi.work.WorkContextLifecycleListener;
/**
* TransactionContextCustom.
* @version $Rev$ $Date$
*
*/
-public class TransactionContextCustom extends TransactionContext
+public class TransactionContextCustom extends TransactionContext implements WorkContextLifecycleListener
{
+ /** Serial version UID */
+ private static final long serialVersionUID = -3841107265829832325L;
+ /**contextSetupComplete*/
+ private static boolean contextSetupComplete = false;
+
+ /**contextSetupFailedErrorCode*/
+ private static String contextSetupFailedErrorCode = "";
+
/**
- *
+ * isContextSetupComplete
+ * @return isContextSetupComplete
*/
- private static final long serialVersionUID = -3841107265829832325L;
+ public static boolean isContextSetupComplete()
+ {
+ return contextSetupComplete;
+ }
+ /**
+ * getContextSetupFailedErrorCode
+ * @return getContextSetupFailedErrorCode
+ */
+ public static String getContextSetupFailedErrorCode()
+ {
+ return contextSetupFailedErrorCode;
+ }
+
+ /**
+ * Context setup complete
+ */
+ public void contextSetupComplete()
+ {
+ contextSetupComplete = true;
+ }
+
+ /**
+ * Context setup failed
+ * @param errorCode The error code
+ */
+ public void contextSetupFailed(String errorCode)
+ {
+ contextSetupFailedErrorCode = errorCode;
+ contextSetupComplete = false;
+ }
}
More information about the jboss-cvs-commits
mailing list