[jboss-svn-commits] JBL Code SVN: r37723 - in labs/jbosstm/trunk: txframework and 42 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sat Nov 19 06:45:21 EST 2011


Author: paul.robinson
Date: 2011-11-19 06:45:20 -0500 (Sat, 19 Nov 2011)
New Revision: 37723

Added:
   labs/jbosstm/trunk/txframework/
   labs/jbosstm/trunk/txframework/docs/
   labs/jbosstm/trunk/txframework/docs/BAFrameworkUpdated.odt
   labs/jbosstm/trunk/txframework/pom.xml
   labs/jbosstm/trunk/txframework/src/
   labs/jbosstm/trunk/txframework/src/main/
   labs/jbosstm/trunk/txframework/src/main/java/
   labs/jbosstm/trunk/txframework/src/main/java/org/
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsat/
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsat/Commit.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsat/Error.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsat/PostCommit.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsat/PrePrepare.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsat/Prepare.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsat/Rollback.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsat/Unknown.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsba/
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsba/Cancel.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsba/Close.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsba/Compensate.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsba/Complete.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsba/Completes.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsba/ConfirmCompleted.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsba/Error.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsba/Status.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsba/Unknown.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/management/
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/management/DataManagement.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/management/TxManagement.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/service/
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/service/ServiceRequest.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/transaction/
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/transaction/WSAT.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/transaction/WSBA.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/configuration/
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/configuration/service/
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/configuration/service/Default.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/configuration/service/RequestType.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/configuration/transaction/
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/configuration/transaction/CompletionType.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/configuration/trigger/
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/configuration/trigger/ATLifecycleEvent.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/configuration/trigger/BALifecycleEvent.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/exception/
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/exception/TXFrameworkException.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/management/
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/management/ATTxControl.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/management/BATxControl.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/management/DataControl.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/management/TxControl.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/management/WSBATxControl.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/DataControlImpl.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/Participant.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/ServiceRequestInterceptor.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/TXControlException.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/HandlerFactory.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/ParticipantRegistrationException.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/ProtocolHandler.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/UnsupportedProtocolException.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsat/
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsat/ATTxControlImpl.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsat/WSATDurable2PCParticipant.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsat/WSATHandler.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsat/WSATVolatile2PCParticipant.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsba/
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsba/WSBACoordinatorCompletionHandler.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsba/WSBACoordinatorCompletionParticipant.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsba/WSBAHandler.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsba/WSBAParticipantCompletionHandler.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsba/WSBAParticipantCompletionParticipant.java
   labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsba/WSBATxControlImpl.java
   labs/jbosstm/trunk/txframework/src/main/resources/
   labs/jbosstm/trunk/txframework/src/test/
   labs/jbosstm/trunk/txframework/src/test/java/
   labs/jbosstm/trunk/txframework/src/test/java/org/
   labs/jbosstm/trunk/txframework/src/test/java/org/jboss/
   labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/
   labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/
   labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/
   labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/ATTest.java
   labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/BACoordinatorCompletionTest.java
   labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/BAParticipantCompletionTest.java
   labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/BaseFunctionalTest.java
   labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/clients/
   labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/clients/ATClient.java
   labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/clients/BACoordinatorCompletionClient.java
   labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/clients/BAParticipantCompletionClient.java
   labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/common/
   labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/common/EventLog.java
   labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/common/ServiceCommand.java
   labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/common/SomeApplicationException.java
   labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/interfaces/
   labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/interfaces/AT.java
   labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/interfaces/BACoordinatorCompletion.java
   labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/interfaces/BAParticipantCompletion.java
   labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/services/
   labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/services/ATService.java
   labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/services/BACoordinatorCompletionService.java
   labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/services/BAParticipantCompletionService.java
   labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/impl/
   labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/impl/handlers/
   labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/impl/handlers/wsat/
   labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/impl/handlers/wsat/WSATDurable2PCParticipantTest.java
   labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/impl/handlers/wsat/WSATVolatile2PCParticipantTest.java
   labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/impl/handlers/wsba/
   labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/impl/handlers/wsba/WSBACoordinatorCompletionParticipantTest.java
   labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/impl/handlers/wsba/WSBAParticipantCompletionParticipantTest.java
   labs/jbosstm/trunk/txframework/src/test/resources/
   labs/jbosstm/trunk/txframework/src/test/resources/arquillian.xml
   labs/jbosstm/trunk/txframework/src/test/resources/context-handlers.xml
Log:
JBTM-713


Property changes on: labs/jbosstm/trunk/txframework
___________________________________________________________________
Added: svn:ignore
   + target


Added: labs/jbosstm/trunk/txframework/docs/BAFrameworkUpdated.odt
===================================================================
(Binary files differ)


Property changes on: labs/jbosstm/trunk/txframework/docs/BAFrameworkUpdated.odt
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: labs/jbosstm/trunk/txframework/pom.xml
===================================================================
--- labs/jbosstm/trunk/txframework/pom.xml	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/pom.xml	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>txframework</groupId>
+    <artifactId>txframework</artifactId>
+    <version>1.0</version>
+
+    <properties>
+        <arquillian.version>1.0.0.CR5</arquillian.version>
+    </properties>
+
+    <dependencyManagement>
+        <dependencies>
+            <!-- Define the version of JBoss' Java EE 6 APIs we want to import. Any
+                   dependencies from org.jboss.spec will have their version defined by this
+                   BOM -->
+            <!-- JBoss distributes a completed set of Java EE 6 APIs including a Bill
+                   of Materials (BOM). A BOM specifies the versions of a "stack" (or a collection)
+                   of artifacts. We use this here so that we always get the correct versions
+                   of artifacts. Here we use the jboss-javaee-web-6.0 stack (you can read this
+                   as the JBoss stack of the Java EE Web Profile 6 APIs), and we use version
+                   2.0.0.Beta1 which is the latest release of the stack. You can actually use
+                   this stack with any version of JBoss AS that implements Java EE 6, not just
+                   JBoss AS 7! -->
+            <dependency>
+                <groupId>org.jboss.spec</groupId>
+                <artifactId>jboss-javaee-web-6.0</artifactId>
+                <version>2.0.0.CR1</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+    <dependencies>
+        <dependency>
+            <groupId>org.jboss.jbossts</groupId>
+            <artifactId>jbossxts-api</artifactId>
+            <version>5.0.0-SNAPSHOT</version>
+            <scope>provided</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.jboss.logging</groupId>
+                    <artifactId>jboss-logging-spi</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <!-- Import the JPA API, we use provided scope as the API is included in
+              JBoss AS 7 -->
+        <dependency>
+            <groupId>org.jboss.spec.javax.transaction</groupId>
+            <artifactId>jboss-transaction-api_1.1_spec</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <!-- Import the CDI API, we use provided scope as the API is included in
+              JBoss AS 7 -->
+        <dependency>
+            <groupId>javax.enterprise</groupId>
+            <artifactId>cdi-api</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.jboss.jbossts</groupId>
+            <artifactId>jbossjta</artifactId>
+            <version>4.15.1.Final</version>
+            <scope>provided</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.jboss.logging</groupId>
+                    <artifactId>jboss-logging-spi</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <!-- Import the injection annotations -->
+        <dependency>
+            <groupId>javax.inject</groupId>
+            <artifactId>javax.inject</artifactId>
+            <version>1</version>
+            <scope>provided</scope>
+        </dependency>
+        <!-- We will provide some functional to check the quickstart deploys ok -->
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.8.1</version>
+            <scope>test</scope>
+        </dependency>
+        <!-- Arquillian allows you to test the example inside a container -->
+        <dependency>
+            <groupId>org.jboss.arquillian.junit</groupId>
+            <artifactId>arquillian-junit-container</artifactId>
+            <version>${arquillian.version}</version>
+            <scope>test</scope>
+        </dependency>
+
+    </dependencies>
+
+    <profiles>
+        <profile>
+            <!-- An optional Arquillian testing profile that executes functional in a remote
+         JBoss AS instance -->
+            <!-- Run with: mvn clean test -Pjbossas-remote-7 -->
+            <id>jbossas-remote-7</id>
+            <dependencies>
+                <dependency>
+                    <groupId>org.jboss.as</groupId>
+                    <artifactId>jboss-as-arquillian-container-remote</artifactId>
+                    <version>7.0.0.CR1</version>
+                    <scope>test</scope>
+                </dependency>
+            </dependencies>
+        </profile>
+    </profiles>
+</project>
\ No newline at end of file

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsat/Commit.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsat/Commit.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsat/Commit.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,16 @@
+package org.jboss.jbossts.txframework.api.annotation.lifecycle.wsat;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/*
+    Method level annotation stating that this @ServiceInvocation method should Complete a ParticipantCompletion WS-BA
+    Transaction on successful completion.
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target(ElementType.METHOD)
+public @interface Commit
+{
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsat/Error.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsat/Error.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsat/Error.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,16 @@
+package org.jboss.jbossts.txframework.api.annotation.lifecycle.wsat;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/*
+    Method level annotation stating that this @ServiceInvocation method should Complete a ParticipantCompletion WS-BA
+    Transaction on successful completion.
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target(ElementType.METHOD)
+public @interface Error
+{
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsat/PostCommit.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsat/PostCommit.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsat/PostCommit.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,16 @@
+package org.jboss.jbossts.txframework.api.annotation.lifecycle.wsat;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/*
+    Method level annotation stating that this @ServiceInvocation method should Complete a ParticipantCompletion WS-BA
+    Transaction on successful completion.
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target(ElementType.METHOD)
+public @interface PostCommit
+{
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsat/PrePrepare.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsat/PrePrepare.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsat/PrePrepare.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,16 @@
+package org.jboss.jbossts.txframework.api.annotation.lifecycle.wsat;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/*
+    Method level annotation stating that this @ServiceInvocation method should Complete a ParticipantCompletion WS-BA
+    Transaction on successful completion.
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target(ElementType.METHOD)
+public @interface PrePrepare
+{
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsat/Prepare.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsat/Prepare.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsat/Prepare.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,16 @@
+package org.jboss.jbossts.txframework.api.annotation.lifecycle.wsat;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/*
+    Method level annotation stating that this @ServiceInvocation method should Complete a ParticipantCompletion WS-BA
+    Transaction on successful completion.
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target(ElementType.METHOD)
+public @interface Prepare
+{
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsat/Rollback.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsat/Rollback.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsat/Rollback.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,16 @@
+package org.jboss.jbossts.txframework.api.annotation.lifecycle.wsat;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/*
+    Method level annotation stating that this @ServiceInvocation method should Complete a ParticipantCompletion WS-BA
+    Transaction on successful completion.
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target(ElementType.METHOD)
+public @interface Rollback
+{
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsat/Unknown.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsat/Unknown.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsat/Unknown.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,17 @@
+package org.jboss.jbossts.txframework.api.annotation.lifecycle.wsat;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/*
+    Method level annotation stating that this @ServiceInvocation method should Complete a ParticipantCompletion WS-BA
+    Transaction on successful completion.
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target(ElementType.METHOD)
+ at Deprecated
+public @interface Unknown
+{
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsba/Cancel.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsba/Cancel.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsba/Cancel.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,16 @@
+package org.jboss.jbossts.txframework.api.annotation.lifecycle.wsba;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/*
+    Method level annotation stating that this @ServiceInvocation method should Complete a ParticipantCompletion WS-BA
+    Transaction on successful completion.
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target(ElementType.METHOD)
+public @interface Cancel
+{
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsba/Close.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsba/Close.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsba/Close.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,17 @@
+package org.jboss.jbossts.txframework.api.annotation.lifecycle.wsba;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/*
+    //todo: update docs on this and the other similarly cloned annotations
+    Method level annotation stating that this @ServiceInvocation method should Complete a ParticipantCompletion WS-BA
+    Transaction on successful completion.
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target(ElementType.METHOD)
+public @interface Close
+{
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsba/Compensate.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsba/Compensate.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsba/Compensate.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,16 @@
+package org.jboss.jbossts.txframework.api.annotation.lifecycle.wsba;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/*
+    Method level annotation stating that this @ServiceInvocation method should Complete a ParticipantCompletion WS-BA
+    Transaction on successful completion.
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target(ElementType.METHOD)
+public @interface Compensate
+{
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsba/Complete.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsba/Complete.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsba/Complete.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,16 @@
+package org.jboss.jbossts.txframework.api.annotation.lifecycle.wsba;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/*
+    Method level annotation stating that this @ServiceInvocation method should Complete a ParticipantCompletion WS-BA
+    Transaction on successful completion.
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target(ElementType.METHOD)
+public @interface Complete
+{
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsba/Completes.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsba/Completes.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsba/Completes.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,16 @@
+package org.jboss.jbossts.txframework.api.annotation.lifecycle.wsba;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/*
+    Method level annotation stating that this @ServiceInvocation method should Complete a ParticipantCompletion WS-BA
+    Transaction on successful completion.
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target(ElementType.METHOD)
+public @interface Completes
+{
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsba/ConfirmCompleted.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsba/ConfirmCompleted.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsba/ConfirmCompleted.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,16 @@
+package org.jboss.jbossts.txframework.api.annotation.lifecycle.wsba;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/*
+    Method level annotation stating that this @ServiceInvocation method should Complete a ParticipantCompletion WS-BA
+    Transaction on successful completion.
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target(ElementType.METHOD)
+public @interface ConfirmCompleted
+{
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsba/Error.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsba/Error.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsba/Error.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,16 @@
+package org.jboss.jbossts.txframework.api.annotation.lifecycle.wsba;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/*
+    Method level annotation stating that this @ServiceInvocation method should Complete a ParticipantCompletion WS-BA
+    Transaction on successful completion.
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target(ElementType.METHOD)
+public @interface Error
+{
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsba/Status.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsba/Status.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsba/Status.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,16 @@
+package org.jboss.jbossts.txframework.api.annotation.lifecycle.wsba;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/*
+    Method level annotation stating that this @ServiceInvocation method should Complete a ParticipantCompletion WS-BA
+    Transaction on successful completion.
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target(ElementType.METHOD)
+public @interface Status
+{
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsba/Unknown.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsba/Unknown.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/lifecycle/wsba/Unknown.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,17 @@
+package org.jboss.jbossts.txframework.api.annotation.lifecycle.wsba;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/*
+    Method level annotation stating that this @ServiceInvocation method should Complete a ParticipantCompletion WS-BA
+    Transaction on successful completion.
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target(ElementType.METHOD)
+ at Deprecated
+public @interface Unknown
+{
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/management/DataManagement.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/management/DataManagement.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/management/DataManagement.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,16 @@
+package org.jboss.jbossts.txframework.api.annotation.management;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Field level annotation used to enable injection of a data control into service participant
+ * and lifecycle management classes
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target(ElementType.FIELD)
+public @interface DataManagement
+{
+}
\ No newline at end of file

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/management/TxManagement.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/management/TxManagement.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/management/TxManagement.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,16 @@
+package org.jboss.jbossts.txframework.api.annotation.management;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Field level annotation used to enable injection of a transaction control into service participant
+ * and lifecycle management classes
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target(ElementType.FIELD)
+public @interface TxManagement
+{
+}
\ No newline at end of file

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/service/ServiceRequest.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/service/ServiceRequest.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/service/ServiceRequest.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,33 @@
+package org.jboss.jbossts.txframework.api.annotation.service;
+
+import org.jboss.jbossts.txframework.api.configuration.service.Default;
+import org.jboss.jbossts.txframework.api.configuration.service.RequestType;
+import javax.interceptor.InterceptorBinding;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Method level annotation used to enable lifecycle handling and configure parameters which control its operation
+ */
+
+ at InterceptorBinding
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target({ElementType.METHOD, ElementType.TYPE})
+public @interface ServiceRequest
+{
+    /**
+     * The class which is the target of lifecycle handler callbacks. With POJO execution mode this class is the
+     * direct target for handler method invocations. With EJB execution mode it identifies the EJB interface
+     * class. With WS execution mode it identifies the client interface for  a JaxWS client.
+     */
+    public Class lifecycleClass() default Default.class;
+    /**
+     * identifies whether the service request is always read only as far as transactional modifications are
+     * concerned or, alternatively, that it may make changes to transactional data. in the latter case the
+     * service request method can indicate a read-only outcome by invoking the readOnly method of an injected
+     * control.
+     */
+    public RequestType requestType() default RequestType.MODIFY;
+}
\ No newline at end of file

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/transaction/WSAT.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/transaction/WSAT.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/transaction/WSAT.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,16 @@
+package org.jboss.jbossts.txframework.api.annotation.transaction;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Class level annotation used to declare that  a participant service will participate in lifecycle
+ * processing for WSAT atomic transactions.
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target(ElementType.TYPE)
+public @interface WSAT
+{
+}
\ No newline at end of file

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/transaction/WSBA.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/transaction/WSBA.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/annotation/transaction/WSBA.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,23 @@
+package org.jboss.jbossts.txframework.api.annotation.transaction;
+
+import org.jboss.jbossts.txframework.api.configuration.transaction.CompletionType;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Class level annotation used to declare that  a participant service will participate in lifecycle
+ * processing for WSBA business activity transactions.
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target(ElementType.TYPE)
+public @interface WSBA
+{
+    /**
+     * the specific WSBA completion protocol which should be used for a WSBA service participant
+     * @return
+     */
+    public CompletionType completionType() default CompletionType.COORDINATOR;
+}
\ No newline at end of file

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/configuration/service/Default.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/configuration/service/Default.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/configuration/service/Default.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,8 @@
+package org.jboss.jbossts.txframework.api.configuration.service;
+
+/**
+ * Marker type used to provide default value for class fields in tx framework service annotations
+ */
+final public class Default
+{
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/configuration/service/RequestType.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/configuration/service/RequestType.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/configuration/service/RequestType.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,17 @@
+package org.jboss.jbossts.txframework.api.configuration.service;
+
+/**
+ * specifies values taken by the requestType field in {@link org.jboss.jbossts.txframework.api.annotation.service.ServiceRequest#requestType()}annotations
+ */
+public enum RequestType
+{
+    /**
+     * this value indicates that a service request method will never make changes to data.
+     */
+    READ_ONLY,
+    /**
+     * this value indicates that a service request method may make changes to data and will employ an
+     * injected control, where necessary, to notify read only status for a specific invocation.
+     */
+    MODIFY
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/configuration/transaction/CompletionType.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/configuration/transaction/CompletionType.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/configuration/transaction/CompletionType.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,10 @@
+package org.jboss.jbossts.txframework.api.configuration.transaction;
+
+/**
+ * 
+ */
+public enum CompletionType
+{
+    COORDINATOR,
+    PARTICIPANT
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/configuration/trigger/ATLifecycleEvent.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/configuration/trigger/ATLifecycleEvent.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/configuration/trigger/ATLifecycleEvent.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,33 @@
+package org.jboss.jbossts.txframework.api.configuration.trigger;
+
+/**
+ * values identifying each of the possible atomic transaction lifecycle events for which lifecycle handlees
+ * can be registered
+ */
+public enum ATLifecycleEvent
+{
+    /**
+     * lifecycle event which happens just prior to the prepare operation while the transaction is still running
+     */
+    PRE_PREPARE,
+    /**
+     * lifecycle event which happens at prepare when the transaction is no longer running
+     */
+    PREPARE,
+    /**
+     * lifecycle event which happens if all service requests executed in the transaction have read only outcomes
+     */
+    READ_ONLY,
+    /**
+     * lifecycle event which happens if all the transaction is rolled back
+     */
+    ABORT,
+    /**
+     * lifecycle event which happens if the transaction commits
+     */
+    COMMIT,
+    /**
+     * lifecycle event which happens after commit or rollback
+     */
+    POST_COMMIT
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/configuration/trigger/BALifecycleEvent.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/configuration/trigger/BALifecycleEvent.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/configuration/trigger/BALifecycleEvent.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,54 @@
+package org.jboss.jbossts.txframework.api.configuration.trigger;
+
+/**
+ */
+public enum BALifecycleEvent
+{
+    /**
+     * lifecycle event which happens if all service requests methods executed in the activity have read only
+     * outcomes or if a service request method indicates, via a control, that the activity should exit.
+     */
+    EXIT,
+    /**
+     * lifecycle event which happens if a service request indicates that the activity cannot completed
+     */
+    NOT_COMPLETE,
+    /**
+     * lifecycle event which happens when the activity is completed. for coordinator completion activities this
+     * occurs when a completed notification is received from the coordinator. for participant completion activities
+     * this happens when a service request method indicates, via a control, that the activity has completed or a
+     * service request annotated with an @Completes annotation finishes executing.
+     */
+    COMPLETE,
+    /**
+     * lifecycle event which happens when the middleware has made durable the completed.
+     */
+    CONFIRM_COMPLETE,
+    /**
+     * lifecycle event which happens when the activity is cancelled.
+     */
+    CANCEL,
+    /**
+     * lifecycle event which happens when the activity is closed.
+     */
+    CLOSE,
+    /**
+     * lifecycle event which happens when the activity is compensated.
+     */
+    COMPENSATE,
+    /**
+     * lifecycle event which happens when the activity fails.
+     */
+    FAIL,
+    /*
+     * lifecycle event which happens when an error in the protocol occurs.
+     */
+    Error,
+
+    //todo: document when this occurs, why deprecated and what to use instead
+    @Deprecated
+    UNKNOWN,
+
+    //todo: do we need this lifecycle event? 
+    STATUS
+}
\ No newline at end of file

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/exception/TXFrameworkException.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/exception/TXFrameworkException.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/exception/TXFrameworkException.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,14 @@
+package org.jboss.jbossts.txframework.api.exception;
+
+public class TXFrameworkException extends Exception
+{
+    public TXFrameworkException(String message)
+    {
+        super(message);
+    }
+
+    public TXFrameworkException(String message, Throwable cause)
+    {
+        super(message, cause);
+    }
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/management/ATTxControl.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/management/ATTxControl.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/management/ATTxControl.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,12 @@
+package org.jboss.jbossts.txframework.api.management;
+
+import org.jboss.jbossts.txframework.api.configuration.trigger.ATLifecycleEvent;
+
+/**
+ * Interface defining a transaction control object which can be injected into a framework web service or
+ * lifecycle method for one of the Atomic Transaction protocols.
+ */
+public interface ATTxControl extends TxControl
+{
+    public void readOnly(ATLifecycleEvent event);
+}
\ No newline at end of file

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/management/BATxControl.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/management/BATxControl.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/management/BATxControl.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,14 @@
+package org.jboss.jbossts.txframework.api.management;
+
+import org.jboss.jbossts.txframework.api.configuration.trigger.BALifecycleEvent;
+import org.jboss.jbossts.txframework.impl.TXControlException;
+
+/**
+ * Interface defining a transaction control object which can be injected into a framework web service or
+ * lifecycle method for one of the Business Activity protocols.
+ */
+public interface BATxControl extends TxControl
+{
+    public void readOnly(BALifecycleEvent event) throws TXControlException;
+    public void completed() throws TXControlException;
+}
\ No newline at end of file

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/management/DataControl.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/management/DataControl.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/management/DataControl.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,12 @@
+package org.jboss.jbossts.txframework.api.management;
+
+/**
+ * Interface defining a data control object which can be injected into a framework web service or
+ * lifecycle method. Instances of this type and its subtypes can be uses to type fields which are
+ * the target of a DataManagement attribute.
+ */
+public interface DataControl
+{
+    public void put(Object objectId, Object object);
+    public Object get(Object objectId);
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/management/TxControl.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/management/TxControl.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/management/TxControl.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,25 @@
+package org.jboss.jbossts.txframework.api.management;
+
+import org.jboss.jbossts.txframework.impl.TXControlException;
+import java.io.Serializable;
+
+/**
+ * Interface defining at the most generic level a transaction control object which can be injected into a
+ * framework web service or lifecycle method. Instances of this type and its subtypes can be uses
+ * to type fields which are the target of a TxManagement attribute. A TxControl provides a set of
+ * operations which the web service or lifecycle method can use to influence the logic of the
+ * transaction.
+ */
+public interface TxControl
+{
+    /**
+     * this method can be called from a web service method while a transaction is active to notify the
+     * framework that no changes have been made during execution of the service method.
+     */
+    public void readOnly() throws TXControlException;
+    /**
+     * this method can be called from a web service or lifecycle method to notify the framework that the
+     * transaction has failed and may have left the service in an inconsistent state
+     */
+    public void fail() throws TXControlException;
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/management/WSBATxControl.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/management/WSBATxControl.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/api/management/WSBATxControl.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,14 @@
+package org.jboss.jbossts.txframework.api.management;
+
+import org.jboss.jbossts.txframework.api.exception.TXFrameworkException;
+import org.jboss.jbossts.txframework.impl.TXControlException;
+
+/**
+ * Interface defining a transaction control object which can be injected into a framework web service or
+ * lifecycle method for the Web Service Business Activity protocol.
+ */
+public interface WSBATxControl extends BATxControl
+{
+    public void exit() throws TXControlException;
+    public void cannotComplete() throws TXControlException;
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/DataControlImpl.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/DataControlImpl.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/DataControlImpl.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,20 @@
+package org.jboss.jbossts.txframework.impl;
+
+import org.jboss.jbossts.txframework.api.management.DataControl;
+import java.util.HashMap;
+import java.util.Map;
+
+public class DataControlImpl implements DataControl
+{
+    private Map<Object, Object> map = new HashMap<Object, Object>();
+
+    public void put(Object objectId, Object object)
+    {
+        map.put(objectId, object);
+    }
+
+    public Object get(Object objectId)
+    {
+        return map.get(objectId);
+    }
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/Participant.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/Participant.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/Participant.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,63 @@
+package org.jboss.jbossts.txframework.impl;
+
+import com.arjuna.wst.Durable2PCParticipant;
+import org.jboss.jbossts.txframework.api.annotation.lifecycle.wsba.ConfirmCompleted;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+public abstract class Participant
+{
+    protected Object serviceImpl;
+    protected Map<Class<? extends Annotation>, Method> lifecycleEventMap = new HashMap<Class<? extends Annotation>, Method>();
+
+    public Participant(Object serviceImpl)
+    {
+        this.serviceImpl = serviceImpl;
+    }
+
+    protected void registerEventsOfInterest(Class<? extends Annotation>... lifecycleEvents)
+    {
+        for (Class<? extends Annotation> lifecycleEvent : lifecycleEvents)
+        {
+            for (Method method : serviceImpl.getClass().getMethods())
+            {
+                Annotation annotation = method.getAnnotation(lifecycleEvent);
+                if (annotation != null)
+                {
+                    lifecycleEventMap.put(lifecycleEvent, method);
+                }
+            }
+        }
+
+    }
+
+    protected Object invoke(Class<? extends Annotation> lifecycleEvent, Object... args)
+    {
+        Method method = lifecycleEventMap.get(lifecycleEvent);
+        if (method == null)
+        {
+            //No handler registered
+            return null;
+        }
+
+        try
+        {
+            //todo: detect parameters better. Maybe have a different participant per interface.
+            if (lifecycleEvent == ConfirmCompleted.class)
+            {
+                return method.invoke(serviceImpl, args);
+            }
+            else
+            {
+                return method.invoke(serviceImpl);
+            }
+        }
+        catch (Exception e)
+        {
+            //todo: Log stacktrace to debug and throw a SystemException
+            throw new RuntimeException("Unable to invoke method '" + method.getName() + "' on '" + serviceImpl.getClass().getName() + "'", e);
+        }
+    }
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/ServiceRequestInterceptor.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/ServiceRequestInterceptor.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/ServiceRequestInterceptor.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,26 @@
+package org.jboss.jbossts.txframework.impl;
+
+import org.jboss.jbossts.txframework.api.annotation.service.ServiceRequest;
+import org.jboss.jbossts.txframework.impl.handlers.HandlerFactory;
+import org.jboss.jbossts.txframework.impl.handlers.ProtocolHandler;
+import javax.interceptor.AroundInvoke;
+import javax.interceptor.Interceptor;
+import javax.interceptor.InvocationContext;
+import java.lang.reflect.Method;
+
+ at ServiceRequest
+ at Interceptor
+public class ServiceRequestInterceptor
+{
+    @AroundInvoke
+    public Object intercept(InvocationContext ic) throws Throwable
+    {
+        Method serviceMethod = ic.getMethod();
+        Object serviceImpl = ic.getTarget();
+
+        ProtocolHandler protocolHandler = HandlerFactory.createInstance(serviceImpl, serviceMethod);
+
+        return protocolHandler.proceed(ic);
+    }
+
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/TXControlException.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/TXControlException.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/TXControlException.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,16 @@
+package org.jboss.jbossts.txframework.impl;
+
+import org.jboss.jbossts.txframework.api.exception.TXFrameworkException;
+
+public class TXControlException extends TXFrameworkException
+{
+    public TXControlException(String message)
+    {
+        super(message);
+    }
+
+    public TXControlException(String message, Throwable cause)
+    {
+        super(message, cause);
+    }
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/HandlerFactory.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/HandlerFactory.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/HandlerFactory.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,43 @@
+package org.jboss.jbossts.txframework.impl.handlers;
+
+import org.jboss.jbossts.txframework.api.annotation.transaction.WSAT;
+import org.jboss.jbossts.txframework.api.annotation.transaction.WSBA;
+import org.jboss.jbossts.txframework.api.configuration.transaction.CompletionType;
+import org.jboss.jbossts.txframework.api.exception.TXFrameworkException;
+import org.jboss.jbossts.txframework.impl.handlers.wsat.WSATHandler;
+import org.jboss.jbossts.txframework.impl.handlers.wsba.*;
+import java.lang.reflect.Method;
+
+public class HandlerFactory
+{
+    public static ProtocolHandler createInstance(Object serviceImpl, Method serviceMethod) throws TXFrameworkException
+    {
+        Class serviceClass = serviceImpl.getClass();
+
+        WSBA wsba = (WSBA) serviceClass.getAnnotation(WSBA.class);
+        if (wsba != null)
+        {
+            CompletionType completionType = wsba.completionType();
+            if (completionType == CompletionType.PARTICIPANT)
+            {
+                return new WSBAParticipantCompletionHandler(serviceImpl, serviceMethod);
+            }
+            else if (completionType == CompletionType.COORDINATOR)
+            {
+                return new WSBACoordinatorCompletionHandler(serviceImpl, serviceMethod);
+            }
+            else
+            {
+                throw new UnsupportedProtocolException("Unexpected or null completionType");
+            }
+        }
+
+        WSAT wsat = (WSAT) serviceClass.getAnnotation(WSAT.class);
+        if (wsat != null)
+        {
+            return new WSATHandler(serviceImpl, serviceMethod);
+        }
+        
+        throw new UnsupportedProtocolException("Expected to find a transaction type annotation on '" + serviceClass.getName() + "'");
+    }
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/ParticipantRegistrationException.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/ParticipantRegistrationException.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/ParticipantRegistrationException.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,16 @@
+package org.jboss.jbossts.txframework.impl.handlers;
+
+import org.jboss.jbossts.txframework.api.exception.TXFrameworkException;
+
+public class ParticipantRegistrationException extends TXFrameworkException
+{
+    public ParticipantRegistrationException(String message)
+    {
+        super(message);
+    }
+
+    public ParticipantRegistrationException(String message, Throwable cause)
+    {
+        super(message, cause);
+    }
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/ProtocolHandler.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/ProtocolHandler.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/ProtocolHandler.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,8 @@
+package org.jboss.jbossts.txframework.impl.handlers;
+
+import javax.interceptor.InvocationContext;
+
+public interface ProtocolHandler
+{
+    public Object proceed(InvocationContext ic) throws Exception;
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/UnsupportedProtocolException.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/UnsupportedProtocolException.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/UnsupportedProtocolException.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,16 @@
+package org.jboss.jbossts.txframework.impl.handlers;
+
+import org.jboss.jbossts.txframework.api.exception.TXFrameworkException;
+
+public class UnsupportedProtocolException extends TXFrameworkException
+{
+    public UnsupportedProtocolException(String message)
+    {
+        super(message);
+    }
+
+    public UnsupportedProtocolException(String message, Throwable cause)
+    {
+        super(message, cause);
+    }
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsat/ATTxControlImpl.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsat/ATTxControlImpl.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsat/ATTxControlImpl.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,31 @@
+package org.jboss.jbossts.txframework.impl.handlers.wsat;
+
+import com.arjuna.wst11.BAParticipantManager;
+import org.jboss.jbossts.txframework.api.configuration.trigger.ATLifecycleEvent;
+import org.jboss.jbossts.txframework.api.configuration.trigger.BALifecycleEvent;
+import org.jboss.jbossts.txframework.api.management.ATTxControl;
+import org.jboss.jbossts.txframework.api.management.WSBATxControl;
+import org.jboss.jbossts.txframework.impl.TXControlException;
+
+public class ATTxControlImpl implements ATTxControl
+{
+
+    public ATTxControlImpl()
+    {
+    }
+
+    public void readOnly(ATLifecycleEvent event)
+    {
+        //todo: implement
+    }
+
+    public void readOnly() throws TXControlException
+    {
+        //todo: implement
+    }
+
+    public void fail() throws TXControlException
+    {
+        //todo: implement
+    }
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsat/WSATDurable2PCParticipant.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsat/WSATDurable2PCParticipant.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsat/WSATDurable2PCParticipant.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,50 @@
+package org.jboss.jbossts.txframework.impl.handlers.wsat;
+
+import com.arjuna.wst.*;
+import org.jboss.jbossts.txframework.api.annotation.lifecycle.wsat.*;
+import org.jboss.jbossts.txframework.api.annotation.lifecycle.wsat.Error;
+import org.jboss.jbossts.txframework.impl.Participant;
+
+public class WSATDurable2PCParticipant extends Participant implements Durable2PCParticipant
+{
+    public WSATDurable2PCParticipant(Object serviceImpl)
+    {
+        super(serviceImpl);
+
+        registerEventsOfInterest(Rollback.class, Commit.class, Prepare.class, Error.class, Unknown.class);
+    }
+
+    public void commit() throws WrongStateException, SystemException
+    {
+        invoke(Commit.class);
+    }
+
+    public void rollback() throws WrongStateException, SystemException
+    {
+        invoke(Rollback.class);
+    }
+
+    public void error() throws SystemException
+    {
+        invoke(Error.class);
+    }
+
+    public Vote prepare() throws WrongStateException, SystemException
+    {
+        //todo check type
+        Vote vote = (Vote) invoke(Prepare.class);
+        if (vote == null)
+        {
+            return new Prepared();
+        }
+        else
+        {
+            return vote;
+        }
+    }
+
+    public void unknown() throws SystemException
+    {
+        invoke(Unknown.class);
+    }
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsat/WSATHandler.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsat/WSATHandler.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsat/WSATHandler.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,98 @@
+package org.jboss.jbossts.txframework.impl.handlers.wsat;
+
+import com.arjuna.ats.arjuna.common.Uid;
+import com.arjuna.mw.wst11.TransactionManager;
+import com.arjuna.mw.wst11.TransactionManagerFactory;
+import com.arjuna.wst.*;
+import com.arjuna.wst11.BAParticipantManager;
+import org.jboss.jbossts.txframework.api.annotation.lifecycle.wsba.Completes;
+import org.jboss.jbossts.txframework.api.annotation.management.TxManagement;
+import org.jboss.jbossts.txframework.api.exception.TXFrameworkException;
+import org.jboss.jbossts.txframework.api.management.ATTxControl;
+import org.jboss.jbossts.txframework.api.management.WSBATxControl;
+import org.jboss.jbossts.txframework.impl.Participant;
+import org.jboss.jbossts.txframework.impl.handlers.ParticipantRegistrationException;
+import org.jboss.jbossts.txframework.impl.handlers.ProtocolHandler;
+import org.jboss.jbossts.txframework.impl.handlers.wsba.WSBATxControlImpl;
+import javax.interceptor.InvocationContext;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+
+public class WSATHandler implements ProtocolHandler
+{
+    private Object serviceImpl;
+    private ATTxControl atTxControl;
+
+    public WSATHandler(Object serviceImpl, Method serviceMethod) throws TXFrameworkException
+    {
+        this.serviceImpl = serviceImpl;
+
+        String idPrefix = serviceImpl.getClass().getName();
+        registerParticipants(idPrefix);
+
+        atTxControl = new ATTxControlImpl();
+        injectTxManagement(atTxControl);
+    }
+
+    //todo: Use CDI to do injection
+    private void injectTxManagement(ATTxControl atTxControl) throws TXFrameworkException
+    {
+        Field[] fields = serviceImpl.getClass().getFields();
+        for (Field field : serviceImpl.getClass().getFields())
+        {
+            if (field.getAnnotation(TxManagement.class) != null)
+            {
+                try
+                {
+                    //todo: check field type
+                    field.set(serviceImpl, atTxControl);
+                }
+                catch (IllegalAccessException e)
+                {
+                    throw new TXFrameworkException("Unable to inject TxManagement impl to field '" + field.getName() + "' on '" + serviceImpl.getClass().getName() + "'", e);
+                }
+            }
+        }
+        //didn't find an injection point. No problem as this is optional
+    }
+
+    public Object proceed(InvocationContext ic) throws Exception
+    {
+        try
+        {
+            return ic.proceed();
+        }
+        //todo: Should this not be throwable?
+        catch (Exception e)
+        {
+            //todo: Something went wrong, so ensure TX rollback
+            throw e;
+        }
+    }
+
+    private void registerParticipants(String idPrefix) throws ParticipantRegistrationException
+    {
+        try
+        {
+            Volatile2PCParticipant volatileParticipant = new WSATVolatile2PCParticipant(serviceImpl);
+            Durable2PCParticipant durableParticipant = new WSATDurable2PCParticipant(serviceImpl);
+
+            TransactionManager transactionManager = TransactionManagerFactory.transactionManager();
+            transactionManager.enlistForVolatileTwoPhase(volatileParticipant, idPrefix + new Uid().toString());
+            transactionManager.enlistForDurableTwoPhase(durableParticipant, idPrefix + new Uid().toString());
+        }
+        catch (WrongStateException e)
+        {
+            throw new ParticipantRegistrationException("Transaction was not in a state in which participants can be registered", e);
+        }
+        catch (UnknownTransactionException e)
+        {
+            throw new ParticipantRegistrationException("Can't register a participant as the transaction in unknown", e);
+        }
+        catch (SystemException e)
+        {
+            throw new ParticipantRegistrationException("A SystemException occurred when attempting to register a participant", e);
+        }
+    }
+
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsat/WSATVolatile2PCParticipant.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsat/WSATVolatile2PCParticipant.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsat/WSATVolatile2PCParticipant.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,49 @@
+package org.jboss.jbossts.txframework.impl.handlers.wsat;
+
+import com.arjuna.wst.*;
+import org.jboss.jbossts.txframework.api.annotation.lifecycle.wsat.*;
+import org.jboss.jbossts.txframework.api.annotation.lifecycle.wsat.Error;
+import org.jboss.jbossts.txframework.impl.Participant;
+
+public class WSATVolatile2PCParticipant extends Participant implements Volatile2PCParticipant
+{
+    public WSATVolatile2PCParticipant(Object serviceImpl)
+    {
+        super(serviceImpl);
+
+        registerEventsOfInterest(PrePrepare.class, PostCommit.class, Rollback.class, Error.class, Unknown.class);
+    }
+
+    public void commit() throws WrongStateException, SystemException
+    {
+        invoke(PostCommit.class);
+    }
+
+    public void rollback() throws WrongStateException, SystemException
+    {
+        invoke(Rollback.class);
+    }
+
+    public void error() throws SystemException
+    {
+        invoke(Error.class);
+    }
+
+    public Vote prepare() throws WrongStateException, SystemException
+    {
+        Vote vote = (Vote) invoke(PrePrepare.class);
+        if (vote == null)
+        {
+            return new Prepared();
+        }
+        else
+        {
+            return vote;
+        }
+    }
+
+    public void unknown() throws SystemException
+    {
+        invoke(Unknown.class);
+    }
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsba/WSBACoordinatorCompletionHandler.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsba/WSBACoordinatorCompletionHandler.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsba/WSBACoordinatorCompletionHandler.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,47 @@
+package org.jboss.jbossts.txframework.impl.handlers.wsba;
+
+import com.arjuna.ats.arjuna.common.Uid;
+import com.arjuna.mw.wst11.BusinessActivityManager;
+import com.arjuna.mw.wst11.BusinessActivityManagerFactory;
+import com.arjuna.wst.SystemException;
+import com.arjuna.wst.UnknownTransactionException;
+import com.arjuna.wst.WrongStateException;
+import com.arjuna.wst11.BAParticipantManager;
+import org.jboss.jbossts.txframework.api.exception.TXFrameworkException;
+import org.jboss.jbossts.txframework.impl.handlers.ParticipantRegistrationException;
+import java.lang.reflect.Method;
+
+public class WSBACoordinatorCompletionHandler extends WSBAHandler
+{
+    private WSBACoordinatorCompletionParticipant participant;
+
+    public WSBACoordinatorCompletionHandler(Object serviceImpl, Method serviceMethod) throws TXFrameworkException
+    {
+        super(serviceImpl, serviceMethod);
+    }
+
+    @Override
+    protected BAParticipantManager registerParticipants(Object serviceImpl, Method serviceMethod) throws ParticipantRegistrationException
+    {
+        try
+        {
+            participant = new WSBACoordinatorCompletionParticipant(serviceImpl);
+
+            Class serviceClass = serviceImpl.getClass();
+            BusinessActivityManager businessActivityManager = BusinessActivityManagerFactory.businessActivityManager();
+            return businessActivityManager.enlistForBusinessAgreementWithCoordinatorCompletion(participant, serviceClass.getName() + new Uid().toString());
+        }
+        catch (WrongStateException e)
+        {
+            throw new ParticipantRegistrationException("Transaction was not in a state in which participants can be registered", e);
+        }
+        catch (UnknownTransactionException e)
+        {
+            throw new ParticipantRegistrationException("Can't register a participant as the transaction in unknown", e);
+        }
+        catch (SystemException e)
+        {
+            throw new ParticipantRegistrationException("A SystemException occurred when attempting to register a participant", e);
+        }
+    }
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsba/WSBACoordinatorCompletionParticipant.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsba/WSBACoordinatorCompletionParticipant.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsba/WSBACoordinatorCompletionParticipant.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,20 @@
+package org.jboss.jbossts.txframework.impl.handlers.wsba;
+
+import com.arjuna.wst.*;
+import org.jboss.jbossts.txframework.api.annotation.lifecycle.wsba.Complete;
+
+public class WSBACoordinatorCompletionParticipant  extends WSBAParticipantCompletionParticipant implements
+        BusinessAgreementWithCoordinatorCompletionParticipant
+{
+    public WSBACoordinatorCompletionParticipant(Object serviceImpl)
+    {
+        super(serviceImpl);
+
+        registerEventsOfInterest(Complete.class);
+    }
+
+    public void complete() throws WrongStateException, SystemException
+    {
+        invoke(Complete.class);
+    }
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsba/WSBAHandler.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsba/WSBAHandler.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsba/WSBAHandler.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,82 @@
+package org.jboss.jbossts.txframework.impl.handlers.wsba;
+
+import com.arjuna.wst11.BAParticipantManager;
+import org.jboss.jbossts.txframework.api.annotation.lifecycle.wsba.Completes;
+import org.jboss.jbossts.txframework.api.annotation.management.TxManagement;
+import org.jboss.jbossts.txframework.api.exception.TXFrameworkException;
+import org.jboss.jbossts.txframework.api.management.WSBATxControl;
+import org.jboss.jbossts.txframework.impl.handlers.ProtocolHandler;
+import org.jboss.jbossts.txframework.impl.handlers.ParticipantRegistrationException;
+import javax.interceptor.InvocationContext;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+
+public abstract class WSBAHandler implements ProtocolHandler
+{
+    private Method serviceMethod;
+    private Object serviceImpl;
+    private WSBATxControl wsbaTxControl;
+    private BAParticipantManager participantManager;
+
+    public WSBAHandler(Object serviceImpl, Method serviceMethod) throws TXFrameworkException
+    {
+        this.serviceImpl = serviceImpl;
+        this.serviceMethod = serviceMethod;
+        participantManager = registerParticipants(serviceImpl, serviceMethod);
+        wsbaTxControl = new WSBATxControlImpl(participantManager);
+
+        injectTxManagement(wsbaTxControl);
+    }
+
+    protected abstract BAParticipantManager registerParticipants(Object serviceImpl, Method serviceMethod) throws ParticipantRegistrationException;
+
+    //todo: Use CDI to do injection
+    private void injectTxManagement(WSBATxControl wsbaTxControl) throws TXFrameworkException
+    {
+        Field[] fields = serviceImpl.getClass().getFields();
+        for (Field field : serviceImpl.getClass().getFields())
+        {
+            if (field.getAnnotation(TxManagement.class) != null)
+            {
+                try
+                {
+                    //todo: check field type
+                    field.set(serviceImpl, wsbaTxControl);
+                }
+                catch (IllegalAccessException e)
+                {
+                    throw new TXFrameworkException("Unable to inject TxManagement impl to field '" + field.getName() + "' on '" + serviceImpl.getClass().getName() + "'", e);
+                }
+            }
+        }
+        //didn't find an injection point. No problem as this is optional
+    }
+
+    public Object proceed(InvocationContext ic) throws Exception
+    {
+        try
+        {
+            Object result = ic.proceed();
+            //todo: find a better way of getting the current status of the TX
+            if (shouldComplete(serviceMethod) && !((WSBATxControlImpl) wsbaTxControl).isCannotComplete())
+            {
+                participantManager.completed();
+            }
+            return result;
+        }
+        //todo: Should this not be throwable?
+        catch (Exception e)
+        {
+            //Something went wrong, so notify cannot completed
+            participantManager.cannotComplete();
+            throw e;
+        }
+    }
+
+    private boolean shouldComplete(Method serviceMethod)
+    {
+        Completes completes = serviceMethod.getAnnotation(Completes.class);
+        return completes != null;
+    }
+
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsba/WSBAParticipantCompletionHandler.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsba/WSBAParticipantCompletionHandler.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsba/WSBAParticipantCompletionHandler.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,49 @@
+package org.jboss.jbossts.txframework.impl.handlers.wsba;
+
+import com.arjuna.ats.arjuna.common.Uid;
+import com.arjuna.mw.wst11.BusinessActivityManager;
+import com.arjuna.mw.wst11.BusinessActivityManagerFactory;
+import com.arjuna.wst.SystemException;
+import com.arjuna.wst.UnknownTransactionException;
+import com.arjuna.wst.WrongStateException;
+import com.arjuna.wst11.BAParticipantManager;
+import org.jboss.jbossts.txframework.api.exception.TXFrameworkException;
+import org.jboss.jbossts.txframework.impl.handlers.ParticipantRegistrationException;
+import java.lang.reflect.Method;
+
+public class WSBAParticipantCompletionHandler extends WSBAHandler
+{
+    private WSBAParticipantCompletionParticipant participant;
+
+    public WSBAParticipantCompletionHandler(Object serviceImpl, Method serviceMethod) throws TXFrameworkException
+    {
+        super(serviceImpl, serviceMethod);
+    }
+
+    @Override
+    protected BAParticipantManager registerParticipants(Object serviceImpl, Method serviceMethod) throws ParticipantRegistrationException
+    {
+        try
+        {
+            Class serviceClass = serviceImpl.getClass();
+
+            participant = new WSBAParticipantCompletionParticipant(serviceImpl);
+
+            BusinessActivityManager businessActivityManager = BusinessActivityManagerFactory.businessActivityManager();
+            return businessActivityManager.enlistForBusinessAgreementWithParticipantCompletion(participant, serviceClass.getName() + new Uid().toString());
+        }
+        catch (WrongStateException e)
+        {
+            throw new ParticipantRegistrationException("Transaction was not in a state in which participants can be registered", e);
+        }
+        catch (UnknownTransactionException e)
+        {
+            throw new ParticipantRegistrationException("Can't register a participant as the transaction in unknown", e);
+        }
+        catch (SystemException e)
+        {
+            throw new ParticipantRegistrationException("A SystemException occurred when attempting to register a participant", e);
+
+        }
+    }
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsba/WSBAParticipantCompletionParticipant.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsba/WSBAParticipantCompletionParticipant.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsba/WSBAParticipantCompletionParticipant.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,60 @@
+package org.jboss.jbossts.txframework.impl.handlers.wsba;
+
+import com.arjuna.wst.BusinessAgreementWithParticipantCompletionParticipant;
+import com.arjuna.wst.FaultedException;
+import com.arjuna.wst.SystemException;
+import com.arjuna.wst.WrongStateException;
+import com.arjuna.wst11.ConfirmCompletedParticipant;
+import org.jboss.jbossts.txframework.api.annotation.lifecycle.wsba.*;
+import org.jboss.jbossts.txframework.api.annotation.lifecycle.wsba.Error;
+import org.jboss.jbossts.txframework.impl.Participant;
+import java.io.Serializable;
+
+public class WSBAParticipantCompletionParticipant extends Participant implements BusinessAgreementWithParticipantCompletionParticipant,
+        ConfirmCompletedParticipant, Serializable
+{
+    public WSBAParticipantCompletionParticipant(Object serviceImpl)
+    {
+        super(serviceImpl);
+
+        registerEventsOfInterest(Cancel.class, Close.class, Compensate.class, ConfirmCompleted.class, Error.class, Status.class, Unknown.class);
+    }
+
+    public void error() throws SystemException
+    {
+        invoke(Error.class);
+    }
+
+    public void close() throws WrongStateException, SystemException
+    {
+        invoke(Close.class);
+    }
+
+    public void cancel() throws FaultedException, WrongStateException, SystemException
+    {
+        invoke(Cancel.class);
+    }
+
+    public void compensate() throws FaultedException, WrongStateException, SystemException
+    {
+        invoke(Compensate.class);
+    }
+
+    public String status() throws SystemException
+    {
+        //todo: return a default status
+        //todo: check impl returns a String
+        return (String) invoke(Status.class);
+    }
+
+    @Deprecated
+    public void unknown() throws SystemException
+    {
+        invoke(Unknown.class);
+    }
+
+    public void confirmCompleted(boolean completed)
+    {
+        invoke(ConfirmCompleted.class, completed);
+    }
+}

Added: labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsba/WSBATxControlImpl.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsba/WSBATxControlImpl.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/main/java/org/jboss/jbossts/txframework/impl/handlers/wsba/WSBATxControlImpl.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,102 @@
+package org.jboss.jbossts.txframework.impl.handlers.wsba;
+
+import com.arjuna.wst.SystemException;
+import com.arjuna.wst.UnknownTransactionException;
+import com.arjuna.wst.WrongStateException;
+import com.arjuna.wst11.BAParticipantManager;
+import org.jboss.jbossts.txframework.api.configuration.trigger.BALifecycleEvent;
+import org.jboss.jbossts.txframework.api.exception.TXFrameworkException;
+import org.jboss.jbossts.txframework.api.management.WSBATxControl;
+import org.jboss.jbossts.txframework.impl.TXControlException;
+
+public class WSBATxControlImpl implements WSBATxControl
+{
+    BAParticipantManager baParticipantManager;
+    //todo: Need to hook into lifecycle or record it here.
+    private boolean cannotComplete = false;
+
+    public WSBATxControlImpl(BAParticipantManager baParticipantManager)
+    {
+        this.baParticipantManager = baParticipantManager;
+    }
+
+    public void exit() throws TXControlException
+    {
+        try
+        {
+            baParticipantManager.exit();
+        }
+        catch (Exception e)
+        {
+            throw new TXControlException("Exception when calling 'exit' on participant manager", e);
+        }
+    }
+
+    public void cannotComplete() throws TXControlException
+    {
+        try
+        {
+            baParticipantManager.cannotComplete();
+            cannotComplete = true;
+        }
+        catch (Exception e)
+        {
+            throw new TXControlException("Exception when calling 'cannotComplete' on participant manager", e);
+        }
+    }
+
+    public void readOnly(BALifecycleEvent event) throws TXControlException
+    {
+        //todo: what is the BALifecycleEvent for?
+        try
+        {
+            baParticipantManager.exit();
+        }
+        catch (Exception e)
+        {
+            throw new TXControlException("Exception when calling 'exit' on participant manager", e);
+        }
+    }
+
+    public void completed() throws TXControlException
+    {
+        try
+        {
+            baParticipantManager.completed();
+        }
+        catch (Exception e)
+        {
+            throw new TXControlException("Exception when calling 'completed' on participant manager", e);
+        }
+    }
+
+    public void readOnly() throws TXControlException
+    {
+        try
+        {
+            baParticipantManager.exit();
+        }
+        catch (Exception e)
+        {
+            throw new TXControlException("Exception when calling 'exit' on participant manager", e);
+        }
+    }
+
+    public void fail() throws TXControlException
+    {
+        try
+        {
+            //todo: Why does this take a QName?
+            baParticipantManager.fail(null);
+        }
+        catch (Exception e)
+        {
+            throw new TXControlException("Exception when calling 'fail' on participant manager", e);
+        }
+    }
+
+    public boolean isCannotComplete()
+    {
+        return cannotComplete;
+    }
+}

Added: labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/ATTest.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/ATTest.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/ATTest.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,133 @@
+package org.jboss.jbossts.txframework.functional;
+
+import com.arjuna.mw.wst11.UserTransaction;
+import com.arjuna.mw.wst11.UserTransactionFactory;
+import com.arjuna.wst.TransactionRolledBackException;
+import static org.jboss.jbossts.txframework.functional.common.ServiceCommand.*;
+import org.junit.After;
+import org.junit.Assert;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.jbossts.txframework.api.annotation.lifecycle.wsat.*;
+import org.jboss.jbossts.txframework.functional.clients.ATClient;
+import org.jboss.jbossts.txframework.functional.interfaces.AT;
+import org.jboss.shrinkwrap.api.ArchivePaths;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.ByteArrayAsset;
+import org.jboss.shrinkwrap.api.asset.StringAsset;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import javax.xml.ws.soap.SOAPFaultException;
+import java.lang.annotation.Annotation;
+import java.util.Arrays;
+
+ at RunWith(Arquillian.class)
+public class ATTest extends BaseFunctionalTest
+{
+    private UserTransaction ut;
+    private AT client;
+
+    @Before
+    public void setupTest() throws Exception
+    {
+        ut = UserTransactionFactory.userTransaction();
+        client = ATClient.newInstance();
+    }
+
+    @After
+    public void teardownTest() throws Exception
+    {
+        client.clearEventLog();
+    }
+
+    @Test
+    public void testSimple() throws Exception
+    {
+        ut.begin();
+        client.invoke();
+        ut.commit();
+
+        assertOrder(Prepare.class, Commit.class);
+    }
+
+    @Test
+    public void testClientDrivenRollback() throws Exception
+    {
+        ut.begin();
+        client.invoke();
+        ut.rollback();
+
+        //todo: should rollback be called twice? once for volatile and once for durable
+        assertOrder(Rollback.class, Rollback.class);
+
+    }
+
+    @Test(expected = TransactionRolledBackException.class)
+    public void testParticipantDrivenRollback() throws Exception
+    {
+        try
+        {
+            ut.begin();
+            client.invoke(VOTE_ROLLBACK);
+            ut.commit();
+        }
+        catch (TransactionRolledBackException e)
+        {
+            //todo: should rollback be called twice? once for volatile and once for durable
+            assertOrder(Prepare.class, Rollback.class);
+            throw e;
+        }
+    }
+
+    @Test
+    public void testApplicationException() throws Exception
+    {
+        try
+        {
+            ut.begin();
+            client.invoke(THROW_APPLICATION_EXCEPTION);
+            Assert.fail("Exception should have been thrown by now");
+        }
+        catch (SOAPFaultException e)
+        {
+            //todo: can we pass application exceptions over SOAP when using an EJB exposed as a JAX-WS ws?
+            System.out.println("Caught exception");
+        }
+        finally
+        {
+            ut.rollback();
+        }
+        //todo: should this cause Rollback?
+        assertOrder(Rollback.class, Rollback.class);
+    }
+
+    private void assertOrder(Class<? extends Annotation>... expectedOrder)
+    {
+        Assert.assertEquals(Arrays.asList(expectedOrder), client.getEventLog().getLog());
+    }
+}
+
+//todo: support multi invocation
+/*@Test
+public void testManualCompleteMultiInvoke() throws Exception
+{
+    UserBusinessActivity uba = UserBusinessActivityFactory.userBusinessActivity();
+    BAParticipantCompletion client = BAParticipantCompletionClient.newInstance();
+
+    Assert.assertTrue(!client.contains("a"));
+    Assert.assertTrue(!client.contains("b"));
+
+    uba.begin();
+    client.saveDataManualComplete("a");
+    client.saveDataManualComplete("b", ServiceCommand.COMPLETE);
+    uba.close();
+
+    Assert.assertTrue(client.contains("a"));
+    Assert.assertTrue(client.contains("b"));
+
+    client.clearData();
+    Assert.assertTrue(!client.contains("a"));
+    Assert.assertTrue(!client.contains("b"));
+}*/

Added: labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/BACoordinatorCompletionTest.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/BACoordinatorCompletionTest.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/BACoordinatorCompletionTest.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,96 @@
+package org.jboss.jbossts.txframework.functional;
+
+import com.arjuna.mw.wst11.UserBusinessActivity;
+import com.arjuna.mw.wst11.UserBusinessActivityFactory;
+import com.arjuna.wst.TransactionRolledBackException;
+import junit.framework.Assert;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.jbossts.txframework.api.annotation.lifecycle.wsba.Cancel;
+import org.jboss.jbossts.txframework.api.annotation.lifecycle.wsba.Close;
+import org.jboss.jbossts.txframework.api.annotation.lifecycle.wsba.Complete;
+import org.jboss.jbossts.txframework.api.annotation.lifecycle.wsba.ConfirmCompleted;
+import org.jboss.jbossts.txframework.functional.clients.BACoordinatorCompletionClient;
+import static org.jboss.jbossts.txframework.functional.common.ServiceCommand.*;
+import org.jboss.jbossts.txframework.functional.interfaces.BACoordinatorCompletion;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import javax.xml.ws.soap.SOAPFaultException;
+import java.lang.annotation.Annotation;
+import java.util.Arrays;
+
+ at RunWith(Arquillian.class)
+public class BACoordinatorCompletionTest extends BaseFunctionalTest
+{
+    UserBusinessActivity uba;
+    BACoordinatorCompletion client;
+
+    @Before
+    public void setupTest() throws Exception
+    {
+        uba = UserBusinessActivityFactory.userBusinessActivity();
+        client = BACoordinatorCompletionClient.newInstance();
+    }
+
+    @After
+    public void teardownTest() throws Exception
+    {
+        client.clearEventLog();
+    }
+
+    @Test
+    public void testSimple() throws Exception
+    {
+        uba.begin();
+        client.saveData();
+        uba.close();
+
+        assertOrder(Complete.class, ConfirmCompleted.class, Close.class);
+    }
+
+    @Test
+    public void testClientDrivenCancel() throws Exception
+    {
+        uba.begin();
+        client.saveData();
+        uba.cancel();
+
+        assertOrder(Cancel.class);
+    }
+
+    @Test
+    public void testApplicationException() throws Exception
+    {
+        try
+        {
+            uba.begin();
+            client.saveData(THROW_APPLICATION_EXCEPTION);
+            Assert.fail("Exception should have been thrown by now");
+        }
+        catch (SOAPFaultException e)
+        {
+            //todo: can we pass application exceptions over SOAP when using an EJB exposed as a JAX-WS ws?
+        }
+        finally
+        {
+            uba.cancel();
+        }
+        assertOrder();
+    }
+
+    @Test(expected = TransactionRolledBackException.class)
+    public void testCannotComplete() throws Exception
+    {
+        uba.begin();
+        client.saveData(CANNOT_COMPLETE);
+        uba.close();
+
+        assertOrder();
+    }
+
+    private void assertOrder(Class<? extends Annotation>... expectedOrder)
+    {
+        org.junit.Assert.assertEquals(Arrays.asList(expectedOrder), client.getEventLog().getLog());
+    }
+}

Added: labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/BAParticipantCompletionTest.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/BAParticipantCompletionTest.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/BAParticipantCompletionTest.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,130 @@
+package org.jboss.jbossts.txframework.functional;
+
+import com.arjuna.mw.wst11.UserBusinessActivity;
+import com.arjuna.mw.wst11.UserBusinessActivityFactory;
+import com.arjuna.wst.TransactionRolledBackException;
+import junit.framework.Assert;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.jbossts.txframework.api.annotation.lifecycle.wsba.Close;
+import org.jboss.jbossts.txframework.api.annotation.lifecycle.wsba.Compensate;
+import org.jboss.jbossts.txframework.api.annotation.lifecycle.wsba.ConfirmCompleted;
+import org.jboss.jbossts.txframework.functional.clients.BAParticipantCompletionClient;
+import org.jboss.jbossts.txframework.functional.common.ServiceCommand;
+import org.jboss.jbossts.txframework.functional.interfaces.BAParticipantCompletion;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import javax.xml.ws.soap.SOAPFaultException;
+import java.lang.annotation.Annotation;
+import java.util.Arrays;
+
+ at RunWith(Arquillian.class)
+public class BAParticipantCompletionTest extends BaseFunctionalTest
+{
+    UserBusinessActivity uba;
+    BAParticipantCompletion client;
+
+    @Before
+    public void setupTest() throws Exception
+    {
+        uba = UserBusinessActivityFactory.userBusinessActivity();
+        client = BAParticipantCompletionClient.newInstance();
+    }
+
+    @After
+    public void teardownTest() throws Exception
+    {
+        client.clearEventLog();
+    }
+
+    @Test
+    public void testAutoComplete() throws Exception
+    {
+        uba.begin();
+        client.saveDataAutoComplete();
+        uba.close();
+
+        assertOrder(ConfirmCompleted.class, Close.class);
+
+    }
+
+    @Test
+    public void testManualComplete() throws Exception
+    {
+        uba.begin();
+        client.saveDataManualComplete(ServiceCommand.COMPLETE);
+        uba.close();
+
+        assertOrder(ConfirmCompleted.class, Close.class);
+    }
+
+    //todo: support multi invocation
+    /*@Test
+    public void testManualCompleteMultiInvoke() throws Exception
+    {
+        UserBusinessActivity uba = UserBusinessActivityFactory.userBusinessActivity();
+        BAParticipantCompletion client = BAParticipantCompletionClient.newInstance();
+
+        Assert.assertTrue(!client.contains());
+        Assert.assertTrue(!client.contains("b"));
+
+        uba.begin();
+        client.saveDataManualComplete();
+        client.saveDataManualComplete("b", ServiceCommand.COMPLETE);
+        uba.close();
+
+        Assert.assertTrue(client.contains());
+        Assert.assertTrue(client.contains("b"));
+
+        client.clearData();
+        Assert.assertTrue(!client.contains());
+        Assert.assertTrue(!client.contains("b"));
+    }*/
+
+    @Test
+    public void testClientDrivenCompensate() throws Exception
+    {
+        uba.begin();
+        client.saveDataAutoComplete();
+        uba.cancel();
+
+        assertOrder(ConfirmCompleted.class, Compensate.class);
+    }
+
+    @Test
+    public void testApplicationException() throws Exception
+    {
+        try
+        {
+            uba.begin();
+            client.saveDataAutoComplete(ServiceCommand.THROW_APPLICATION_EXCEPTION);
+            Assert.fail("Exception should have been thrown by now");
+        }
+        catch (SOAPFaultException e)
+        {
+            //todo: can we pass application exceptions over SOAP when using an EJB exposed as a JAX-WS ws?
+            System.out.println("Caught exception");
+        }
+        finally
+        {
+            uba.cancel();
+        }
+        assertOrder();
+    }
+
+    @Test(expected = TransactionRolledBackException.class)
+    public void testCannotComplete() throws Exception
+    {
+        uba.begin();
+        client.saveDataAutoComplete(ServiceCommand.CANNOT_COMPLETE);
+        uba.close();
+        assertOrder();
+    }
+
+
+    private void assertOrder(Class<? extends Annotation>... expectedOrder)
+    {
+        org.junit.Assert.assertEquals(Arrays.asList(expectedOrder), client.getEventLog().getLog());
+    }
+}

Added: labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/BaseFunctionalTest.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/BaseFunctionalTest.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/BaseFunctionalTest.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,38 @@
+package org.jboss.jbossts.txframework.functional;
+
+import com.arjuna.mw.wst11.UserBusinessActivity;
+import com.arjuna.mw.wst11.UserBusinessActivityFactory;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.jbossts.txframework.functional.clients.BACoordinatorCompletionClient;
+import org.jboss.jbossts.txframework.functional.interfaces.BACoordinatorCompletion;
+import org.jboss.shrinkwrap.api.ArchivePaths;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.ByteArrayAsset;
+import org.jboss.shrinkwrap.api.asset.StringAsset;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.junit.After;
+import org.junit.Before;
+import java.lang.annotation.Annotation;
+import java.util.Arrays;
+
+public class BaseFunctionalTest
+{
+    @Deployment
+    public static JavaArchive createTestArchive()
+    {
+        //todo: Does the application developer have to specify the interceptor?
+        JavaArchive archive = ShrinkWrap.create(JavaArchive.class, "test.jar")
+                .addPackages(true, "org.jboss.jbossts.txframework")
+                .addAsResource("context-handlers.xml")
+                .addAsManifestResource(new ByteArrayAsset("<interceptors><class>org.jboss.jbossts.txframework.impl.ServiceRequestInterceptor</class></interceptors>".getBytes()),
+                        ArchivePaths.create("beans.xml"));
+
+        archive.delete(ArchivePaths.create("META-INF/MANIFEST.MF"));
+
+        String ManifestMF = "Manifest-Version: 1.0\n"
+                + "Dependencies: org.jboss.xts,org.jboss.modules,deployment.arquillian-service,org.jboss.msc,org.jboss.jts\n";
+        archive.setManifest(new StringAsset(ManifestMF));
+
+        return archive;
+    }
+}

Added: labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/clients/ATClient.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/clients/ATClient.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/clients/ATClient.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,54 @@
+package org.jboss.jbossts.txframework.functional.clients;
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags.
+ * See the copyright.txt in the distribution for a full listing
+ * of individual contributors.
+ * This copyrighted material is made available to anyone wishing to use,
+ * modify, copy, or redistribute it subject to the terms and conditions
+ * of the GNU Lesser General Public License, v. 2.1.
+ * This program is distributed in the hope that it will be useful, but WITHOUT A
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
+ * You should have received a copy of the GNU Lesser General Public License,
+ * v.2.1 along with this distribution; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA  02110-1301, USA.
+ *
+ * (C) 2005-2006,
+ * @author JBoss Inc.
+ */
+import com.arjuna.mw.wst11.client.JaxWSHeaderContextProcessor;
+import org.jboss.jbossts.txframework.functional.interfaces.AT;
+import javax.xml.namespace.QName;
+import javax.xml.ws.BindingProvider;
+import javax.xml.ws.Service;
+import javax.xml.ws.handler.Handler;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+public class ATClient
+{
+    public static AT newInstance() throws Exception
+    {
+        URL wsdlLocation = new URL("http://localhost:8080/test/ATService/AT?wsdl");
+        QName serviceName = new QName("http://www.jboss.com/functional/at/", "ATService");
+        QName portName = new QName("http://www.jboss.com/functional/at/", "AT");
+
+        Service service = Service.create(wsdlLocation, serviceName);
+        AT client = service.getPort(portName, AT.class);
+
+        /*
+           Add client handler chain
+        */
+        BindingProvider bindingProvider = (BindingProvider) client;
+        List<Handler> handlers = new ArrayList<Handler>(1);
+        handlers.add(new JaxWSHeaderContextProcessor());
+        bindingProvider.getBinding().setHandlerChain(handlers);
+
+        return client;
+    }
+}
+

Added: labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/clients/BACoordinatorCompletionClient.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/clients/BACoordinatorCompletionClient.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/clients/BACoordinatorCompletionClient.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,54 @@
+package org.jboss.jbossts.txframework.functional.clients;
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags.
+ * See the copyright.txt in the distribution for a full listing
+ * of individual contributors.
+ * This copyrighted material is made available to anyone wishing to use,
+ * modify, copy, or redistribute it subject to the terms and conditions
+ * of the GNU Lesser General Public License, v. 2.1.
+ * This program is distributed in the hope that it will be useful, but WITHOUT A
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
+ * You should have received a copy of the GNU Lesser General Public License,
+ * v.2.1 along with this distribution; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA  02110-1301, USA.
+ *
+ * (C) 2005-2006,
+ * @author JBoss Inc.
+ */
+import com.arjuna.mw.wst11.client.JaxWSHeaderContextProcessor;
+import org.jboss.jbossts.txframework.functional.interfaces.BACoordinatorCompletion;
+import javax.xml.namespace.QName;
+import javax.xml.ws.BindingProvider;
+import javax.xml.ws.Service;
+import javax.xml.ws.handler.Handler;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+public class BACoordinatorCompletionClient
+{
+    public static BACoordinatorCompletion newInstance() throws Exception
+    {
+        URL wsdlLocation = new URL("http://localhost:8080/test/BACoordinatorCompletionService/BACoordinatorCompletion?wsdl");
+        QName serviceName = new QName("http://www.jboss.com/functional/ba/participantcompletion/", "BACoordinatorCompletionService");
+        QName portName = new QName("http://www.jboss.com/functional/ba/participantcompletion/", "BACoordinatorCompletionService");
+
+        Service service = Service.create(wsdlLocation, serviceName);
+        BACoordinatorCompletion client = service.getPort(portName, BACoordinatorCompletion.class);
+
+        /*
+           Add client handler chain
+        */
+        BindingProvider bindingProvider = (BindingProvider) client;
+        List<Handler> handlers = new ArrayList<Handler>(1);
+        handlers.add(new JaxWSHeaderContextProcessor());
+        bindingProvider.getBinding().setHandlerChain(handlers);
+
+        return client;
+    }
+}
+

Added: labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/clients/BAParticipantCompletionClient.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/clients/BAParticipantCompletionClient.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/clients/BAParticipantCompletionClient.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,54 @@
+package org.jboss.jbossts.txframework.functional.clients;
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags.
+ * See the copyright.txt in the distribution for a full listing
+ * of individual contributors.
+ * This copyrighted material is made available to anyone wishing to use,
+ * modify, copy, or redistribute it subject to the terms and conditions
+ * of the GNU Lesser General Public License, v. 2.1.
+ * This program is distributed in the hope that it will be useful, but WITHOUT A
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
+ * You should have received a copy of the GNU Lesser General Public License,
+ * v.2.1 along with this distribution; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA  02110-1301, USA.
+ *
+ * (C) 2005-2006,
+ * @author JBoss Inc.
+ */
+import com.arjuna.mw.wst11.client.JaxWSHeaderContextProcessor;
+import org.jboss.jbossts.txframework.functional.interfaces.BAParticipantCompletion;
+import javax.xml.namespace.QName;
+import javax.xml.ws.BindingProvider;
+import javax.xml.ws.Service;
+import javax.xml.ws.handler.Handler;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+public class BAParticipantCompletionClient
+{
+    public static BAParticipantCompletion newInstance() throws Exception
+    {
+        URL wsdlLocation = new URL("http://localhost:8080/test/BAParticipantCompletionService/BAParticipantCompletion?wsdl");
+        QName serviceName = new QName("http://www.jboss.com/functional/ba/participantcompletion/", "BAParticipantCompletionService");
+        QName portName = new QName("http://www.jboss.com/functional/ba/participantcompletion/", "BAParticipantCompletionService");
+
+        Service service = Service.create(wsdlLocation, serviceName);
+        BAParticipantCompletion client = service.getPort(portName, BAParticipantCompletion.class);
+
+        /*
+           Add client handler chain
+        */
+        BindingProvider bindingProvider = (BindingProvider) client;
+        List<Handler> handlers = new ArrayList<Handler>(1);
+        handlers.add(new JaxWSHeaderContextProcessor());
+        bindingProvider.getBinding().setHandlerChain(handlers);
+
+        return client;
+    }
+}
+

Added: labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/common/EventLog.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/common/EventLog.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/common/EventLog.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,25 @@
+package org.jboss.jbossts.txframework.functional.common;
+
+import java.lang.annotation.Annotation;
+import java.util.ArrayList;
+import java.util.List;
+
+public class EventLog
+{
+    private static volatile List<Class<? extends Annotation>> log = new ArrayList<Class<? extends Annotation>>();
+
+    public void add(Class<? extends Annotation> event)
+    {
+        log.add(event);
+    }
+
+    public List<Class<? extends Annotation>> getLog()
+    {
+        return log;
+    }
+
+    public void clear()
+    {
+        log.clear();
+    }
+}

Added: labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/common/ServiceCommand.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/common/ServiceCommand.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/common/ServiceCommand.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,6 @@
+package org.jboss.jbossts.txframework.functional.common;
+
+public enum ServiceCommand
+{
+    THROW_APPLICATION_EXCEPTION, CANNOT_COMPLETE, COMPLETE, READ_ONLY, VOTE_ROLLBACK
+}

Added: labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/common/SomeApplicationException.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/common/SomeApplicationException.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/common/SomeApplicationException.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,17 @@
+package org.jboss.jbossts.txframework.functional.common;
+
+import java.io.Serializable;
+
+public class SomeApplicationException extends Exception implements Serializable
+{
+    public SomeApplicationException(String message, Throwable cause)
+    {
+        super(message, cause);
+    }
+
+    public SomeApplicationException(String message)
+    {
+        super(message);
+    }
+
+}

Added: labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/interfaces/AT.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/interfaces/AT.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/interfaces/AT.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,27 @@
+package org.jboss.jbossts.txframework.functional.interfaces;
+
+import org.jboss.jbossts.txframework.functional.common.EventLog;
+import org.jboss.jbossts.txframework.functional.common.ServiceCommand;
+import org.jboss.jbossts.txframework.functional.common.SomeApplicationException;
+import javax.ejb.Remote;
+import javax.ejb.Stateless;
+import javax.jws.HandlerChain;
+import javax.jws.WebMethod;
+import javax.jws.WebService;
+import javax.jws.soap.SOAPBinding;
+import java.lang.annotation.Annotation;
+import java.util.List;
+
+ at Remote
+public interface AT
+{
+    @WebMethod
+    public void invoke(ServiceCommand... serviceCommands) throws SomeApplicationException;
+
+    @WebMethod
+    public EventLog getEventLog();
+
+    @WebMethod
+    public void clearEventLog();
+
+}

Added: labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/interfaces/BACoordinatorCompletion.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/interfaces/BACoordinatorCompletion.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/interfaces/BACoordinatorCompletion.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,21 @@
+package org.jboss.jbossts.txframework.functional.interfaces;
+
+import org.jboss.jbossts.txframework.functional.common.EventLog;
+import org.jboss.jbossts.txframework.functional.common.ServiceCommand;
+import org.jboss.jbossts.txframework.functional.common.SomeApplicationException;
+import javax.ejb.Remote;
+import javax.jws.WebMethod;
+
+ at Remote
+public interface BACoordinatorCompletion
+{
+    @WebMethod
+    public void saveData(ServiceCommand... serviceCommands) throws SomeApplicationException;
+
+    @WebMethod
+    public EventLog getEventLog();
+
+    @WebMethod
+    public void clearEventLog();
+
+}

Added: labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/interfaces/BAParticipantCompletion.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/interfaces/BAParticipantCompletion.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/interfaces/BAParticipantCompletion.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,24 @@
+package org.jboss.jbossts.txframework.functional.interfaces;
+
+import org.jboss.jbossts.txframework.functional.common.EventLog;
+import org.jboss.jbossts.txframework.functional.common.ServiceCommand;
+import org.jboss.jbossts.txframework.functional.common.SomeApplicationException;
+import javax.ejb.Remote;
+import javax.jws.WebMethod;
+
+ at Remote
+public interface BAParticipantCompletion
+{
+    @WebMethod
+    public void saveDataAutoComplete(ServiceCommand... serviceCommands) throws SomeApplicationException;
+
+    @WebMethod
+    public void saveDataManualComplete(ServiceCommand... serviceCommands) throws SomeApplicationException;
+
+    @WebMethod
+    public EventLog getEventLog();
+
+    @WebMethod
+    public void clearEventLog();
+
+}

Added: labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/services/ATService.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/services/ATService.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/services/ATService.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,158 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. 
+ * See the copyright.txt in the distribution for a full listing 
+ * of individual contributors.
+ * This copyrighted material is made available to anyone wishing to use,
+ * modify, copy, or redistribute it subject to the terms and conditions
+ * of the GNU Lesser General Public License, v. 2.1.
+ * This program is distributed in the hope that it will be useful, but WITHOUT A
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
+ * You should have received a copy of the GNU Lesser General Public License,
+ * v.2.1 along with this distribution; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA  02110-1301, USA.
+ * 
+ * (C) 2005-2006,
+ * @author JBoss Inc.
+ */
+package org.jboss.jbossts.txframework.functional.services;
+
+import com.arjuna.wst.*;
+import org.jboss.jbossts.txframework.api.annotation.lifecycle.wsat.*;
+import org.jboss.jbossts.txframework.api.annotation.lifecycle.wsat.Error;
+import org.jboss.jbossts.txframework.api.annotation.management.TxManagement;
+import org.jboss.jbossts.txframework.api.annotation.service.ServiceRequest;
+import org.jboss.jbossts.txframework.api.annotation.transaction.WSAT;
+import org.jboss.jbossts.txframework.api.management.ATTxControl;
+import org.jboss.jbossts.txframework.functional.common.EventLog;
+import org.jboss.jbossts.txframework.functional.common.ServiceCommand;
+import org.jboss.jbossts.txframework.functional.common.SomeApplicationException;
+import org.jboss.jbossts.txframework.functional.interfaces.AT;
+import org.jboss.jbossts.txframework.impl.TXControlException;
+import javax.ejb.Remote;
+import javax.ejb.Stateless;
+import javax.jws.HandlerChain;
+import javax.jws.WebMethod;
+import javax.jws.WebService;
+import javax.jws.soap.SOAPBinding;
+import java.lang.annotation.Annotation;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Paul Robinson (paul.robinson at redhat.com)
+ */
+ at Remote(AT.class)
+ at WSAT
+ at Stateless
+ at WebService(serviceName = "ATService", portName = "AT",
+        name = "AT", targetNamespace = "http://www.jboss.com/functional/at/")
+//todo: Can the framework specify the handlerchain if not isPresent? Would have to be added earlier in the chain than we currently intercept
+ at HandlerChain(file = "/context-handlers.xml", name = "Context Handlers")
+ at SOAPBinding(style = SOAPBinding.Style.RPC)
+public class ATService implements AT
+{
+    @TxManagement
+    public ATTxControl txControl;
+    private boolean rollback = false;
+    private EventLog eventLog = new EventLog();
+
+    @WebMethod
+    @ServiceRequest
+    public void invoke(ServiceCommand[] serviceCommands) throws SomeApplicationException
+    {
+        try
+        {
+            if (isPresent(ServiceCommand.THROW_APPLICATION_EXCEPTION, serviceCommands))
+            {
+                throw new SomeApplicationException("Intentionally thrown Exception");
+            }
+
+            if (isPresent(ServiceCommand.READ_ONLY, serviceCommands))
+            {
+                //todo: is this right?
+                txControl.readOnly();
+            }
+
+            if (isPresent(ServiceCommand.VOTE_ROLLBACK, serviceCommands))
+            {
+                rollback = true;
+            }
+        }
+        catch (TXControlException e)
+        {
+            throw new RuntimeException("Error invoking lifecycle methods on the TXControl", e);
+        }
+    }
+
+    @WebMethod
+    public EventLog getEventLog()
+    {
+        return eventLog;
+    }
+
+    @WebMethod
+    public void clearEventLog()
+    {
+        eventLog.clear();
+    }
+
+    @Commit
+    @WebMethod(exclude = true)
+    public void commit()
+    {
+        eventLog.add(Commit.class);
+    }
+
+    @Rollback
+    @WebMethod(exclude = true)
+    public void rollback()
+    {
+        eventLog.add(Rollback.class);
+    }
+
+    @Prepare
+    @WebMethod(exclude = true)
+    public Vote prepare()
+    {
+        eventLog.add(Prepare.class);
+        if (rollback)
+        {
+            return new Aborted();
+        }
+        else
+        {
+            return new Prepared();
+        }
+    }
+
+    @Unknown
+    @WebMethod(exclude = true)
+    public void unknown() throws SystemException
+    {
+        eventLog.add(Unknown.class);
+    }
+
+    @Error
+    @WebMethod(exclude = true)
+    public void error() throws SystemException
+    {
+        eventLog.add(Error.class);
+    }
+
+    private boolean isPresent(ServiceCommand expectedServiceCommand, ServiceCommand... serviceCommands)
+    {
+        for (ServiceCommand foundServiceCommand : serviceCommands)
+        {
+            if (foundServiceCommand == expectedServiceCommand)
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
+}

Added: labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/services/BACoordinatorCompletionService.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/services/BACoordinatorCompletionService.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/services/BACoordinatorCompletionService.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,176 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. 
+ * See the copyright.txt in the distribution for a full listing 
+ * of individual contributors.
+ * This copyrighted material is made available to anyone wishing to use,
+ * modify, copy, or redistribute it subject to the terms and conditions
+ * of the GNU Lesser General Public License, v. 2.1.
+ * This program is distributed in the hope that it will be useful, but WITHOUT A
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
+ * You should have received a copy of the GNU Lesser General Public License,
+ * v.2.1 along with this distribution; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA  02110-1301, USA.
+ * 
+ * (C) 2005-2006,
+ * @author JBoss Inc.
+ */
+package org.jboss.jbossts.txframework.functional.services;
+
+import org.jboss.jbossts.txframework.api.annotation.lifecycle.wsba.*;
+import org.jboss.jbossts.txframework.api.annotation.lifecycle.wsba.Error;
+import org.jboss.jbossts.txframework.api.annotation.management.TxManagement;
+import org.jboss.jbossts.txframework.api.annotation.service.ServiceRequest;
+import org.jboss.jbossts.txframework.api.annotation.transaction.WSBA;
+import org.jboss.jbossts.txframework.api.configuration.transaction.CompletionType;
+import org.jboss.jbossts.txframework.api.management.WSBATxControl;
+import org.jboss.jbossts.txframework.functional.common.EventLog;
+import org.jboss.jbossts.txframework.functional.common.ServiceCommand;
+import org.jboss.jbossts.txframework.functional.common.SomeApplicationException;
+import org.jboss.jbossts.txframework.functional.interfaces.BACoordinatorCompletion;
+import org.jboss.jbossts.txframework.impl.TXControlException;
+import javax.ejb.Stateless;
+import javax.inject.Inject;
+import javax.jws.HandlerChain;
+import javax.jws.WebMethod;
+import javax.jws.WebService;
+import javax.jws.soap.SOAPBinding;
+
+/**
+ * @author Paul Robinson (paul.robinson at redhat.com)
+ */
+ at Stateless
+ at WebService(serviceName = "BACoordinatorCompletionService", portName = "BACoordinatorCompletionService",
+        name = "BACoordinatorCompletion", targetNamespace = "http://www.jboss.com/functional/ba/participantcompletion/")
+//todo: Can the framework specify the handlerchain if not isPresent? Would have to be added earlier in the chain than we currently intercept
+ at HandlerChain(file = "/context-handlers.xml", name = "Context Handlers")
+ at SOAPBinding(style = SOAPBinding.Style.RPC)
+ at WSBA(completionType = CompletionType.COORDINATOR)
+public class BACoordinatorCompletionService implements BACoordinatorCompletion
+{
+    @TxManagement
+    public WSBATxControl txControl;
+    @Inject
+    private EventLog eventLog = new EventLog();
+
+    @WebMethod
+    @ServiceRequest
+    //todo: batch up data and only add during confirmCompleted
+    public void saveData(ServiceCommand[] serviceCommands) throws SomeApplicationException
+    {
+        try
+        {
+            if (isPresent(ServiceCommand.THROW_APPLICATION_EXCEPTION, serviceCommands))
+            {
+                throw new SomeApplicationException("Intentionally thrown Exception");
+            }
+
+            if (isPresent(ServiceCommand.CANNOT_COMPLETE, serviceCommands))
+            {
+                txControl.cannotComplete();
+                return;
+            }
+
+            if (isPresent(ServiceCommand.COMPLETE, serviceCommands))
+            {
+                txControl.completed();
+            }
+        }
+        catch (TXControlException e)
+        {
+            throw new RuntimeException("Error invoking lifecycle methods on the TXControl", e);
+        }
+    }
+
+    @WebMethod
+    public EventLog getEventLog()
+    {
+        return eventLog;
+    }
+
+    @WebMethod
+    public void clearEventLog()
+    {
+        eventLog.clear();
+    }
+
+    //todo: why is this never invoked? Always true for CoordinationCompletion?
+    @Compensate
+    @WebMethod(exclude = true)
+    public void compensate()
+    {
+        eventLog.add(Compensate.class);
+    }
+
+    @ConfirmCompleted
+    @WebMethod(exclude = true)
+    public void confirmCompleted(Boolean success)
+    {
+        eventLog.add(ConfirmCompleted.class);
+    }
+
+    @Cancel
+    @WebMethod(exclude = true)
+    public void cancel()
+    {
+        eventLog.add(Cancel.class);
+    }
+
+    @Close
+    @WebMethod(exclude = true)
+    public void close()
+    {
+        eventLog.add(Close.class);
+    }
+
+    @Complete
+    @WebMethod(exclude = true)
+    public void complete()
+    {
+        eventLog.add(Complete.class);
+    }
+
+    @ConfirmCompleted
+    @WebMethod(exclude = true)
+    public void confirmCompleted(boolean success)
+    {
+        eventLog.add(ConfirmCompleted.class);
+    }
+
+    @Error
+    @WebMethod(exclude = true)
+    public void error()
+    {
+        eventLog.add(Error.class);
+    }
+
+    @Status
+    @WebMethod(exclude = true)
+    public String status()
+    {
+        eventLog.add(Status.class);
+        return null;
+    }
+
+    @Unknown
+    @WebMethod(exclude = true)
+    public void unknown()
+    {
+        eventLog.add(Unknown.class);
+    }
+
+    private boolean isPresent(ServiceCommand expectedServiceCommand, ServiceCommand... serviceCommands)
+    {
+        for (ServiceCommand foundServiceCommand : serviceCommands)
+        {
+            if (foundServiceCommand == expectedServiceCommand)
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+}

Added: labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/services/BAParticipantCompletionService.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/services/BAParticipantCompletionService.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/functional/services/BAParticipantCompletionService.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,183 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. 
+ * See the copyright.txt in the distribution for a full listing 
+ * of individual contributors.
+ * This copyrighted material is made available to anyone wishing to use,
+ * modify, copy, or redistribute it subject to the terms and conditions
+ * of the GNU Lesser General Public License, v. 2.1.
+ * This program is distributed in the hope that it will be useful, but WITHOUT A
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
+ * You should have received a copy of the GNU Lesser General Public License,
+ * v.2.1 along with this distribution; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA  02110-1301, USA.
+ * 
+ * (C) 2005-2006,
+ * @author JBoss Inc.
+ */
+package org.jboss.jbossts.txframework.functional.services;
+
+import org.jboss.jbossts.txframework.api.annotation.lifecycle.wsba.*;
+import org.jboss.jbossts.txframework.api.annotation.lifecycle.wsba.Error;
+import org.jboss.jbossts.txframework.api.annotation.management.TxManagement;
+import org.jboss.jbossts.txframework.api.annotation.service.ServiceRequest;
+import org.jboss.jbossts.txframework.api.annotation.transaction.WSBA;
+import org.jboss.jbossts.txframework.api.configuration.transaction.CompletionType;
+import org.jboss.jbossts.txframework.api.management.WSBATxControl;
+
+import static org.jboss.jbossts.txframework.functional.common.ServiceCommand.*;
+
+import org.jboss.jbossts.txframework.functional.common.EventLog;
+import org.jboss.jbossts.txframework.functional.common.ServiceCommand;
+import org.jboss.jbossts.txframework.functional.common.SomeApplicationException;
+import org.jboss.jbossts.txframework.functional.interfaces.BAParticipantCompletion;
+import org.jboss.jbossts.txframework.impl.TXControlException;
+import javax.ejb.Stateless;
+import javax.inject.Inject;
+import javax.jws.HandlerChain;
+import javax.jws.WebMethod;
+import javax.jws.WebService;
+import javax.jws.soap.SOAPBinding;
+
+/**
+ * @author Paul Robinson (paul.robinson at redhat.com)
+ */
+ at Stateless
+ at WebService(serviceName = "BAParticipantCompletionService", portName = "BAParticipantCompletionService",
+        name = "BAParticipantCompletion", targetNamespace = "http://www.jboss.com/functional/ba/participantcompletion/")
+//todo: Can the framework specify the handlerchain if not present? Would have to be added earlier in the chain than we currently intercept
+ at HandlerChain(file = "/context-handlers.xml", name = "Context Handlers")
+ at SOAPBinding(style = SOAPBinding.Style.RPC)
+ at WSBA(completionType = CompletionType.PARTICIPANT)
+public class BAParticipantCompletionService implements BAParticipantCompletion
+{
+    @TxManagement
+    public WSBATxControl txControl;
+    @Inject
+    private EventLog eventLog = new EventLog();
+
+    @WebMethod
+    @ServiceRequest
+    @Completes
+    public void saveDataAutoComplete(ServiceCommand... serviceCommands) throws SomeApplicationException
+    {
+        saveData(serviceCommands);
+    }
+
+    @WebMethod
+    @ServiceRequest
+    public void saveDataManualComplete(ServiceCommand... serviceCommands) throws SomeApplicationException
+    {
+        saveData(serviceCommands);
+    }
+
+    private void saveData(ServiceCommand[] serviceCommands) throws SomeApplicationException
+    {
+        try
+        {
+            if (present(THROW_APPLICATION_EXCEPTION, serviceCommands))
+            {
+                throw new SomeApplicationException("Intentionally thrown Exception");
+            }
+
+            if (present(CANNOT_COMPLETE, serviceCommands))
+            {
+                txControl.cannotComplete();
+                return;
+            }
+
+            if (present(COMPLETE, serviceCommands))
+            {
+                txControl.completed();
+            }
+        }
+        catch (TXControlException e)
+        {
+            throw new RuntimeException("Error invoking lifecycle methods on the TXControl", e);
+        }
+    }
+
+    @WebMethod
+    public EventLog getEventLog()
+    {
+        return eventLog;
+    }
+
+    @WebMethod
+    public void clearEventLog()
+    {
+        eventLog.clear();
+    }
+
+    @Compensate
+    @WebMethod(exclude = true)
+    public void compensate()
+    {
+        eventLog.add(Compensate.class);
+    }
+
+    @ConfirmCompleted
+    @WebMethod(exclude = true)
+    public void confirmCompleted(Boolean success)
+    {
+        eventLog.add(ConfirmCompleted.class);
+    }
+
+    @Cancel
+    @WebMethod(exclude = true)
+    public void cancel()
+    {
+        eventLog.add(Cancel.class);
+    }
+
+    @Close
+    @WebMethod(exclude = true)
+    public void close()
+    {
+        eventLog.add(Close.class);
+    }
+
+    @ConfirmCompleted
+    @WebMethod(exclude = true)
+    public void confirmCompleted(boolean success)
+    {
+        eventLog.add(ConfirmCompleted.class);
+    }
+
+    @Error
+    @WebMethod(exclude = true)
+    public void error()
+    {
+        eventLog.add(Error.class);
+    }
+
+    @Status
+    @WebMethod(exclude = true)
+    public String status()
+    {
+        eventLog.add(Status.class);
+        return null;
+    }
+
+    @Unknown
+    @WebMethod(exclude = true)
+    public void unknown()
+    {
+        eventLog.add(Unknown.class);
+    }
+
+    private boolean present(ServiceCommand expectedServiceCommand, ServiceCommand... serviceCommands)
+    {
+        for (ServiceCommand foundServiceCommand : serviceCommands)
+        {
+            if (foundServiceCommand == expectedServiceCommand)
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+}

Added: labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/impl/handlers/wsat/WSATDurable2PCParticipantTest.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/impl/handlers/wsat/WSATDurable2PCParticipantTest.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/impl/handlers/wsat/WSATDurable2PCParticipantTest.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,82 @@
+package org.jboss.jbossts.txframework.impl.handlers.wsat;
+
+import com.arjuna.wst.Durable2PCParticipant;
+import com.arjuna.wst.SystemException;
+import com.arjuna.wst.Vote;
+import com.arjuna.wst.WrongStateException;
+import junit.framework.Assert;
+import org.jboss.jbossts.txframework.api.annotation.lifecycle.wsat.Commit;
+import org.jboss.jbossts.txframework.api.annotation.lifecycle.wsat.Prepare;
+import org.jboss.jbossts.txframework.api.annotation.lifecycle.wsat.Rollback;
+import org.jboss.jbossts.txframework.api.annotation.lifecycle.wsat.Unknown;
+import org.jboss.jbossts.txframework.api.annotation.lifecycle.wsat.Error;
+import org.junit.Test;
+import java.lang.annotation.Annotation;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class WSATDurable2PCParticipantTest
+{
+    @Test
+    public void testCallbacks() throws Exception
+    {
+        LifecycleImpl lifecycle = new LifecycleImpl();
+        WSATDurable2PCParticipant participant = new WSATDurable2PCParticipant(lifecycle);
+
+        participant.prepare();
+        participant.commit();
+        participant.rollback();
+        participant.unknown();
+        participant.error();
+
+        List<Class<? extends Annotation>> actualOrder = lifecycle.getExecutionOrder();
+        assertOrder(actualOrder, Prepare.class, Commit.class, Rollback.class, Unknown.class, Error.class);
+    }
+
+    public class LifecycleImpl implements Durable2PCParticipant
+    {
+        private List<Class<? extends Annotation>> executionOrder = new ArrayList<Class<? extends Annotation>>();
+
+        @Prepare
+        public Vote prepare() throws WrongStateException, SystemException
+        {
+            executionOrder.add(Prepare.class);
+            //todo: return a vote
+            return null;
+        }
+
+        @Commit
+        public void commit() throws WrongStateException, SystemException
+        {
+            executionOrder.add(Commit.class);
+        }
+
+        @Rollback
+        public void rollback() throws WrongStateException, SystemException
+        {
+            executionOrder.add(Rollback.class);
+        }
+
+        @Unknown
+        public void unknown() throws SystemException
+        {
+            executionOrder.add(Unknown.class);
+        }
+
+        @Error
+        public void error() throws SystemException
+        {
+            executionOrder.add(Error.class);
+        }
+
+        public List<Class<? extends Annotation>> getExecutionOrder()
+        {
+            return executionOrder;
+        }
+    }
+    private void assertOrder( List<Class<? extends Annotation>> actualOrder, Class<? extends Annotation>... expectedOrder)
+    {
+        org.junit.Assert.assertEquals(Arrays.asList(expectedOrder), actualOrder);
+    }
+}

Added: labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/impl/handlers/wsat/WSATVolatile2PCParticipantTest.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/impl/handlers/wsat/WSATVolatile2PCParticipantTest.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/impl/handlers/wsat/WSATVolatile2PCParticipantTest.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,77 @@
+package org.jboss.jbossts.txframework.impl.handlers.wsat;
+
+import com.arjuna.wst.*;
+import junit.framework.Assert;
+import org.jboss.jbossts.txframework.api.annotation.lifecycle.wsat.*;
+import org.jboss.jbossts.txframework.api.annotation.lifecycle.wsat.Error;
+import org.junit.Test;
+import java.lang.annotation.Annotation;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class WSATVolatile2PCParticipantTest
+{
+    @Test
+    public void testCallbacks() throws Exception
+    {
+        LifecycleImpl lifecycle = new LifecycleImpl();
+        WSATDurable2PCParticipant participant = new WSATDurable2PCParticipant(lifecycle);
+
+        participant.prepare();
+        participant.commit();
+        participant.rollback();
+        participant.unknown();
+        participant.error();
+
+        List<Class<? extends Annotation>> actualOrder = lifecycle.getExecutionOrder();
+        assertOrder(actualOrder, PrePrepare.class, PostCommit.class, Rollback.class, Unknown.class, Error.class);
+    }
+
+    private void assertOrder(List<Class<? extends Annotation>> actualOrder, Class<? extends Annotation>... expectedOrder)
+    {
+        org.junit.Assert.assertEquals(Arrays.asList(expectedOrder), actualOrder);
+    }
+
+    public class LifecycleImpl implements Volatile2PCParticipant
+    {
+        private List<Class<? extends Annotation>> executionOrder = new ArrayList<Class<? extends Annotation>>();
+
+        @Prepare
+        public Vote prepare() throws WrongStateException, SystemException
+        {
+            executionOrder.add(PrePrepare.class);
+            //todo: return a vote
+            return null;
+        }
+
+        @Commit
+        public void commit() throws WrongStateException, SystemException
+        {
+            executionOrder.add(PostCommit.class);
+        }
+
+        @Rollback
+        public void rollback() throws WrongStateException, SystemException
+        {
+            executionOrder.add(Rollback.class);
+        }
+
+        @Unknown
+        public void unknown() throws SystemException
+        {
+            executionOrder.add(Unknown.class);
+        }
+
+        @Error
+        public void error() throws SystemException
+        {
+            executionOrder.add(Error.class);
+        }
+
+        public List<Class<? extends Annotation>> getExecutionOrder()
+        {
+            return executionOrder;
+        }
+    }
+}

Added: labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/impl/handlers/wsba/WSBACoordinatorCompletionParticipantTest.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/impl/handlers/wsba/WSBACoordinatorCompletionParticipantTest.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/impl/handlers/wsba/WSBACoordinatorCompletionParticipantTest.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,98 @@
+package org.jboss.jbossts.txframework.impl.handlers.wsba;
+
+import com.arjuna.wst.BusinessAgreementWithCoordinatorCompletionParticipant;
+import com.arjuna.wst11.ConfirmCompletedParticipant;
+import junit.framework.Assert;
+import org.jboss.jbossts.txframework.api.annotation.lifecycle.wsba.*;
+import org.jboss.jbossts.txframework.api.annotation.lifecycle.wsba.Error;
+import org.junit.Test;
+import java.lang.annotation.Annotation;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class WSBACoordinatorCompletionParticipantTest
+{
+    @Test
+    public void testCallbacks() throws Exception
+    {
+        LifecycleImpl lifecycle = new LifecycleImpl();
+        WSBACoordinatorCompletionParticipant participant = new WSBACoordinatorCompletionParticipant(lifecycle);
+
+        participant.cancel();
+        participant.close();
+        participant.compensate();
+        participant.complete();
+        participant.confirmCompleted(true);
+        participant.error();
+        participant.status();
+        participant.unknown();
+
+        List<Class<? extends Annotation>> actualOrder = lifecycle.getExecutionOrder();
+        assertOrder(actualOrder, Cancel.class, Close.class, Compensate.class, Complete.class, ConfirmCompleted.class, Error.class, Status.class, Unknown.class);
+    }
+
+    private void assertOrder(List<Class<? extends Annotation>> actualOrder, Class<? extends Annotation>... expectedOrder)
+    {
+        org.junit.Assert.assertEquals(Arrays.asList(expectedOrder), actualOrder);
+    }
+
+    public class LifecycleImpl implements BusinessAgreementWithCoordinatorCompletionParticipant, ConfirmCompletedParticipant
+    {
+        private List<Class<? extends Annotation>> executionOrder = new ArrayList<Class<? extends Annotation>>();
+
+        @Cancel
+        public void cancel()
+        {
+            executionOrder.add(Cancel.class);
+        }
+
+        @Close
+        public void close()
+        {
+            executionOrder.add(Close.class);
+        }
+
+        @Compensate
+        public void compensate()
+        {
+            executionOrder.add(Compensate.class);
+        }
+
+        @Complete
+        public void complete()
+        {
+            executionOrder.add(Complete.class);
+        }
+
+        @ConfirmCompleted
+        public void confirmCompleted(boolean success)
+        {
+            executionOrder.add(ConfirmCompleted.class);
+        }
+
+        @Error
+        public void error()
+        {
+            executionOrder.add(Error.class);
+        }
+
+        @Status
+        public String status()
+        {
+            executionOrder.add(Status.class);
+            return null;
+        }
+
+        @Unknown
+        public void unknown()
+        {
+            executionOrder.add(Unknown.class);
+        }
+
+        public List<Class<? extends Annotation>> getExecutionOrder()
+        {
+            return executionOrder;
+        }
+    }
+}

Added: labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/impl/handlers/wsba/WSBAParticipantCompletionParticipantTest.java
===================================================================
--- labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/impl/handlers/wsba/WSBAParticipantCompletionParticipantTest.java	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/test/java/org/jboss/jbossts/txframework/impl/handlers/wsba/WSBAParticipantCompletionParticipantTest.java	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,102 @@
+package org.jboss.jbossts.txframework.impl.handlers.wsba;
+
+import com.arjuna.wst.BusinessAgreementWithCoordinatorCompletionParticipant;
+import com.arjuna.wst.BusinessAgreementWithParticipantCompletionParticipant;
+import com.arjuna.wst11.ConfirmCompletedParticipant;
+import junit.framework.Assert;
+import org.jboss.jbossts.txframework.api.annotation.lifecycle.wsba.*;
+import org.jboss.jbossts.txframework.api.annotation.lifecycle.wsba.Error;
+import org.junit.Test;
+import java.lang.annotation.Annotation;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class WSBAParticipantCompletionParticipantTest
+{
+    @Test
+    public void testCallbacks() throws Exception
+    {
+        LifecycleImpl lifecycle = new LifecycleImpl();
+        WSBAParticipantCompletionParticipant participant = new WSBAParticipantCompletionParticipant(lifecycle);
+
+        participant.cancel();
+        participant.close();
+        participant.compensate();
+        participant.confirmCompleted(true);
+        participant.error();
+        participant.status();
+        participant.unknown();
+
+        List<Class<? extends Annotation>> expectedOrder = new ArrayList<Class<? extends Annotation>>();
+        expectedOrder.add(Cancel.class);
+        expectedOrder.add(Close.class);
+        expectedOrder.add(Compensate.class);
+        expectedOrder.add(ConfirmCompleted.class);
+        expectedOrder.add(Error.class);
+        expectedOrder.add(Status.class);
+        expectedOrder.add(Unknown.class);
+
+        List<Class<? extends Annotation>> actualOrder = lifecycle.getExecutionOrder();
+        assertOrder(actualOrder, Cancel.class, Close.class, Compensate.class, ConfirmCompleted.class, Error.class, Status.class, Unknown.class);
+    }
+
+    private void assertOrder(List<Class<? extends Annotation>> actualOrder, Class<? extends Annotation>... expectedOrder)
+    {
+        org.junit.Assert.assertEquals(Arrays.asList(expectedOrder), actualOrder);
+    }
+
+    public class LifecycleImpl implements BusinessAgreementWithParticipantCompletionParticipant, ConfirmCompletedParticipant
+    {
+        private List<Class<? extends Annotation>> executionOrder = new ArrayList<Class<? extends Annotation>>();
+
+        @Cancel
+        public void cancel()
+        {
+            executionOrder.add(Cancel.class);
+        }
+
+        @Close
+        public void close()
+        {
+            executionOrder.add(Close.class);
+        }
+
+        @Compensate
+        public void compensate()
+        {
+            executionOrder.add(Compensate.class);
+        }
+
+        @ConfirmCompleted
+        public void confirmCompleted(boolean success)
+        {
+            executionOrder.add(ConfirmCompleted.class);
+        }
+
+        @Error
+        public void error()
+        {
+            executionOrder.add(Error.class);
+        }
+
+
+        @Status
+        public String status()
+        {
+            executionOrder.add(Status.class);
+            return null;
+        }
+
+        @Unknown
+        public void unknown()
+        {
+            executionOrder.add(Unknown.class);
+        }
+
+        public List<Class<? extends Annotation>> getExecutionOrder()
+        {
+            return executionOrder;
+        }
+    }
+}

Added: labs/jbosstm/trunk/txframework/src/test/resources/arquillian.xml
===================================================================
--- labs/jbosstm/trunk/txframework/src/test/resources/arquillian.xml	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/test/resources/arquillian.xml	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<arquillian xmlns="http://jboss.org/schema/arquillian" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+            xsi:schemaLocation="http://jboss.org/schema/arquillian
+        http://jboss.org/schema/arquillian/arquillian_1_0.xsd">
+
+    <!-- Uncomment to have test archives exported to the file system for inspection -->
+    <engine>
+        <property name="deploymentExportPath">target/exploded-artifact-for-inspection</property>
+    </engine>
+
+    <!-- Example configuration for a remote JBoss AS 7 instance -->
+    <container qualifier="jboss" default="true">
+        <protocol type="jmx-as7">
+            <property name="executionType">REMOTE</property>
+        </protocol>
+    </container>
+
+</arquillian>
\ No newline at end of file

Added: labs/jbosstm/trunk/txframework/src/test/resources/context-handlers.xml
===================================================================
--- labs/jbosstm/trunk/txframework/src/test/resources/context-handlers.xml	                        (rev 0)
+++ labs/jbosstm/trunk/txframework/src/test/resources/context-handlers.xml	2011-11-19 11:45:20 UTC (rev 37723)
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+-->
+<handler-chains xmlns="http://java.sun.com/xml/ns/javaee"
+xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:schemaLocation="http://java.sun.com/xml/ns/javaee">
+    <handler-chain>
+	<handler>
+		<handler-name>ContextHandler</handler-name>
+		<handler-class>com.arjuna.mw.wst11.service.JaxWSHeaderContextProcessor</handler-class>
+	</handler>
+    </handler-chain>
+</handler-chains>



More information about the jboss-svn-commits mailing list