[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