You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by li...@apache.org on 2010/07/13 18:33:31 UTC

svn commit: r963787 - in /incubator/aries/trunk/transaction: transaction-blueprint/src/main/java/org/apache/aries/transaction/ transaction-itests/src/test/java/org/apache/aries/transaction/itests/

Author: linsun
Date: Tue Jul 13 16:33:30 2010
New Revision: 963787

URL: http://svn.apache.org/viewvc?rev=963787&view=rev
Log:
ARIES-354 Update tranaction strategy to transaction attribute in blueprint transaction project

Added:
    incubator/aries/trunk/transaction/transaction-blueprint/src/main/java/org/apache/aries/transaction/TransactionAttribute.java   (with props)
    incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/InvalidTranAttributeTest.java   (with props)
    incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/MandatoryTranAttributeTest.java   (with props)
    incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/NeverTranAttributeTest.java   (with props)
    incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/NotSupportedTranAttributeTest.java   (with props)
    incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/RequiredTranAttributeTest.java   (with props)
    incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/RequiresNewTranAttributeTest.java   (with props)
    incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/SupportsTranAttributeTest.java   (with props)
Removed:
    incubator/aries/trunk/transaction/transaction-blueprint/src/main/java/org/apache/aries/transaction/TransactionStrategy.java
    incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/InvalidTranStrategyTest.java
    incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/MandatoryTranStrategyTest.java
    incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/NeverTranStrategyTest.java
    incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/NotSupportedTranStrategyTest.java
    incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/RequiredTranStrategyTest.java
    incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/RequiresNewTranStrategyTest.java
    incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/SupportsTranStrategyTest.java

Added: incubator/aries/trunk/transaction/transaction-blueprint/src/main/java/org/apache/aries/transaction/TransactionAttribute.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/transaction/transaction-blueprint/src/main/java/org/apache/aries/transaction/TransactionAttribute.java?rev=963787&view=auto
==============================================================================
--- incubator/aries/trunk/transaction/transaction-blueprint/src/main/java/org/apache/aries/transaction/TransactionAttribute.java (added)
+++ incubator/aries/trunk/transaction/transaction-blueprint/src/main/java/org/apache/aries/transaction/TransactionAttribute.java Tue Jul 13 16:33:30 2010
@@ -0,0 +1,175 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.aries.transaction;
+
+import javax.transaction.HeuristicMixedException;
+import javax.transaction.HeuristicRollbackException;
+import javax.transaction.InvalidTransactionException;
+import javax.transaction.NotSupportedException;
+import javax.transaction.RollbackException;
+import javax.transaction.Status;
+import javax.transaction.SystemException;
+import javax.transaction.Transaction;
+import javax.transaction.TransactionManager;
+
+public enum TransactionAttribute {
+    MANDATORY
+    {
+      public TransactionToken begin(TransactionManager man) throws SystemException
+      {
+        if (man.getStatus() == Status.STATUS_NO_TRANSACTION) {
+          throw new IllegalStateException("No transaction on the thread");
+        }
+
+        return new TransactionToken(man.getTransaction(), null, MANDATORY);
+      }
+    },
+    NEVER
+    {
+      public TransactionToken begin(TransactionManager man) throws SystemException
+      {
+        if (man.getStatus() == Status.STATUS_ACTIVE) {
+          throw new IllegalStateException("Transaction on the thread");
+        }
+
+        return new TransactionToken(null, null, NEVER);
+      }
+    },
+    NOTSUPPORTED
+    {
+      public TransactionToken begin(TransactionManager man) throws SystemException
+      {
+        if (man.getStatus() == Status.STATUS_ACTIVE) {
+          return new TransactionToken(null, man.suspend(), this);
+        }
+
+        return new TransactionToken(null, null, NOTSUPPORTED);
+      }
+
+      public void finish(TransactionManager man, TransactionToken tranToken) throws SystemException,
+          InvalidTransactionException, IllegalStateException
+      {
+        Transaction tran = tranToken.getSuspendedTransaction();
+        if (tran != null) {
+          man.resume(tran);
+        }
+      }
+    },
+    REQUIRED
+    {
+      public TransactionToken begin(TransactionManager man) throws SystemException, NotSupportedException
+      {
+        if (man.getStatus() == Status.STATUS_NO_TRANSACTION) {
+          man.begin();
+          return new TransactionToken(man.getTransaction(), null, REQUIRED, true);
+        }
+
+        return new TransactionToken(man.getTransaction(), null, REQUIRED);
+      }
+
+      public void finish(TransactionManager man, TransactionToken tranToken) throws SystemException,
+          InvalidTransactionException, IllegalStateException, SecurityException, RollbackException,
+          HeuristicMixedException, HeuristicRollbackException
+      {
+        if (tranToken.isCompletionAllowed()) {
+          if (man.getStatus() == Status.STATUS_MARKED_ROLLBACK) {
+            man.rollback();
+          } else {
+            man.commit();
+          }
+        }
+      }
+    },
+    REQUIRESNEW
+    {
+      public TransactionToken begin(TransactionManager man) throws SystemException, NotSupportedException,
+          InvalidTransactionException, IllegalStateException
+      {
+        TransactionToken tranToken;
+        if (man.getStatus() == Status.STATUS_ACTIVE) {
+          tranToken = new TransactionToken(null, man.suspend(), REQUIRESNEW);
+        } else {
+          tranToken = new TransactionToken(null, null, REQUIRESNEW);
+        }
+
+        try {
+          man.begin();
+        } catch (SystemException e) {
+          man.resume(tranToken.getSuspendedTransaction());
+          throw e;
+        } catch (NotSupportedException e) {
+          man.resume(tranToken.getSuspendedTransaction());
+          throw e;
+        }
+        
+        tranToken.setActiveTransaction(man.getTransaction());
+        tranToken.setCompletionAllowed(true);
+        
+        return tranToken;
+      }
+
+      public void finish(TransactionManager man, TransactionToken tranToken) throws SystemException,
+          InvalidTransactionException, IllegalStateException, SecurityException, RollbackException,
+          HeuristicMixedException, HeuristicRollbackException
+      {
+        if (tranToken.isCompletionAllowed()) {
+          if (man.getStatus() == Status.STATUS_MARKED_ROLLBACK) {
+            man.rollback();
+          } else {
+            man.commit();
+          }
+        }
+
+        Transaction tran = tranToken.getSuspendedTransaction();
+        if (tran != null) {
+          man.resume(tran);
+        }
+      }
+    },
+    SUPPORTS
+    {
+      public TransactionToken begin(TransactionManager man) throws SystemException, NotSupportedException,
+          InvalidTransactionException, IllegalStateException
+      {
+          if (man.getStatus() == Status.STATUS_ACTIVE) {
+              return new TransactionToken(man.getTransaction(), null, SUPPORTS);
+          }
+
+          return new TransactionToken(null, null, SUPPORTS);
+      }
+    };
+
+    public static TransactionAttribute fromValue(String value)
+    {
+      return valueOf(value.toUpperCase());
+    }
+
+    public TransactionToken begin(TransactionManager man) throws SystemException, NotSupportedException,
+        InvalidTransactionException, IllegalStateException
+    {
+      return null;
+    }
+
+    public void finish(TransactionManager man, TransactionToken tranToken) throws SystemException,
+        InvalidTransactionException, IllegalStateException, SecurityException, RollbackException,
+        HeuristicMixedException, HeuristicRollbackException
+    {
+
+    }
+}

Propchange: incubator/aries/trunk/transaction/transaction-blueprint/src/main/java/org/apache/aries/transaction/TransactionAttribute.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/aries/trunk/transaction/transaction-blueprint/src/main/java/org/apache/aries/transaction/TransactionAttribute.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: incubator/aries/trunk/transaction/transaction-blueprint/src/main/java/org/apache/aries/transaction/TransactionAttribute.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/InvalidTranAttributeTest.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/InvalidTranAttributeTest.java?rev=963787&view=auto
==============================================================================
--- incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/InvalidTranAttributeTest.java (added)
+++ incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/InvalidTranAttributeTest.java Tue Jul 13 16:33:30 2010
@@ -0,0 +1,39 @@
+/*  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.aries.transaction.itests;
+
+import static org.junit.Assert.fail;
+
+import org.apache.aries.transaction.test.TestBean;
+import org.junit.Test;
+
+public class InvalidTranAttributeTest extends AbstractIntegrationTest {
+  
+  @Test
+  public void testInvalid() throws Exception {
+      TestBean bean = getOsgiService(TestBean.class, "(tranAttribute=Invalid)", DEFAULT_TIMEOUT);
+      
+      //Test without client transaction - an exception is thrown because the bean is not
+      //configured correctly, i.e. multiple transaction elements match to the same method
+      //name.
+      try {
+          bean.insertRow("testWithoutClientTran", 1);
+          fail("IllegalStateException not thrown");
+      } catch (IllegalStateException e) {
+          e.printStackTrace();
+      }
+  }
+}

Propchange: incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/InvalidTranAttributeTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/InvalidTranAttributeTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/InvalidTranAttributeTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/MandatoryTranAttributeTest.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/MandatoryTranAttributeTest.java?rev=963787&view=auto
==============================================================================
--- incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/MandatoryTranAttributeTest.java (added)
+++ incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/MandatoryTranAttributeTest.java Tue Jul 13 16:33:30 2010
@@ -0,0 +1,93 @@
+/*  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.aries.transaction.itests;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.sql.SQLException;
+
+import javax.transaction.RollbackException;
+import javax.transaction.UserTransaction;
+
+import org.apache.aries.transaction.test.TestBean;
+import org.junit.Test;
+
+public class MandatoryTranAttributeTest extends AbstractIntegrationTest {
+  
+  @Test
+  public void testMandatory() throws Exception {
+      TestBean bean = getOsgiService(TestBean.class, "(tranAttribute=Mandatory)", DEFAULT_TIMEOUT);
+      UserTransaction tran = getOsgiService(UserTransaction.class);
+      
+      //Test with client transaction - the user transaction is used to insert a row
+      int initialRows = bean.countRows();
+      
+      tran.begin();
+      bean.insertRow("testWithClientTran", 1);
+      tran.commit();
+      
+      int finalRows = bean.countRows();
+      assertTrue("Initial rows: " + initialRows + ", Final rows: " + finalRows, finalRows - initialRows == 1);
+  
+      //Test with client transaction and application exception - the user transaction is not rolled back
+      initialRows = bean.countRows();
+      
+      tran.begin();
+      bean.insertRow("testWithClientTranAndWithAppException", 1);
+      
+      try {
+          bean.insertRow("testWithClientTranAndWithAppException", 2, new SQLException("Dummy exception"));
+      } catch (SQLException e) {
+          e.printStackTrace();
+      }
+      
+      tran.commit();
+      
+      finalRows = bean.countRows();
+      assertTrue("Initial rows: " + initialRows + ", Final rows: " + finalRows, finalRows - initialRows == 2);
+      
+      //Test with client transaction and runtime exception - the user transaction is rolled back
+      initialRows = bean.countRows();
+      
+      tran.begin();
+      bean.insertRow("testWithClientTranAndWithRuntimeException", 1);
+      
+      try {
+          bean.insertRow("testWithClientTranAndWithRuntimeException", 2, new RuntimeException("Dummy exception"));
+      } catch (RuntimeException e) {
+          e.printStackTrace();
+      }
+      
+      try {
+          tran.commit();
+          fail("RollbackException not thrown");
+      } catch (RollbackException e) {
+          e.printStackTrace();
+      }
+      
+      finalRows = bean.countRows();
+      assertTrue("Initial rows: " + initialRows + ", Final rows: " + finalRows, finalRows - initialRows == 0);
+      
+      //Test without client transaction - an exception is thrown because a transaction is mandatory
+      try {
+          bean.insertRow("testWithoutClientTran", 1);
+          fail("IllegalStateException not thrown");
+      } catch (IllegalStateException e) {
+          e.printStackTrace();
+      }
+  }
+}

Propchange: incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/MandatoryTranAttributeTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/MandatoryTranAttributeTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/MandatoryTranAttributeTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/NeverTranAttributeTest.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/NeverTranAttributeTest.java?rev=963787&view=auto
==============================================================================
--- incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/NeverTranAttributeTest.java (added)
+++ incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/NeverTranAttributeTest.java Tue Jul 13 16:33:30 2010
@@ -0,0 +1,64 @@
+/*  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.aries.transaction.itests;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import javax.transaction.UserTransaction;
+
+import org.apache.aries.transaction.test.TestBean;
+import org.junit.Test;
+
+public class NeverTranAttributeTest extends AbstractIntegrationTest {
+  
+  @Test
+  public void testNever() throws Exception {
+      TestBean bean = getOsgiService(TestBean.class, "(tranAttribute=Never)", DEFAULT_TIMEOUT);
+      UserTransaction tran = getOsgiService(UserTransaction.class);
+      
+      //Test with client transaction - an exception is thrown because transactions are not allowed
+      int initialRows = bean.countRows();
+      
+      tran.begin();
+      
+      try {
+          bean.insertRow("testWithClientTran", 1);
+          fail("IllegalStateException not thrown");
+      } catch (IllegalStateException e) {
+          e.printStackTrace();
+      }
+      
+      tran.commit();
+      
+      int finalRows = bean.countRows();
+      assertTrue("Initial rows: " + initialRows + ", Final rows: " + finalRows, finalRows - initialRows == 0);
+      
+      //Test without client transaction - the insert fails because the bean delegates to another
+      //bean with a transaction strategy of Mandatory, and no transaction is available
+      initialRows = bean.countRows();
+
+      try {
+          bean.insertRow("testWithoutClientTran", 1, true);
+          fail("IllegalStateException not thrown");
+      } catch (IllegalStateException e) {
+          e.printStackTrace();
+      }
+      
+      finalRows = bean.countRows();
+      assertTrue("Initial rows: " + initialRows + ", Final rows: " + finalRows, finalRows - initialRows == 0);
+  }
+}

Propchange: incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/NeverTranAttributeTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/NeverTranAttributeTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/NeverTranAttributeTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/NotSupportedTranAttributeTest.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/NotSupportedTranAttributeTest.java?rev=963787&view=auto
==============================================================================
--- incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/NotSupportedTranAttributeTest.java (added)
+++ incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/NotSupportedTranAttributeTest.java Tue Jul 13 16:33:30 2010
@@ -0,0 +1,105 @@
+/*  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.aries.transaction.itests;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.sql.SQLException;
+
+import javax.transaction.UserTransaction;
+
+import org.apache.aries.transaction.test.TestBean;
+import org.junit.Test;
+
+public class NotSupportedTranAttributeTest extends AbstractIntegrationTest {
+  
+  @Test
+  public void testNotSupported() throws Exception {
+      TestBean nsBean = getOsgiService(TestBean.class, "(tranAttribute=NotSupported)", DEFAULT_TIMEOUT);
+      TestBean rBean = getOsgiService(TestBean.class, "(tranAttribute=Required)", DEFAULT_TIMEOUT);
+      UserTransaction tran = getOsgiService(UserTransaction.class);
+      
+      //Test with client transaction - the insert fails because the bean delegates to another
+      //bean with a transaction strategy of Mandatory, and no transaction is available, i.e.
+      //the user transaction is not propagated, and there is no container transaction.
+      int initialRows = nsBean.countRows();
+      
+      tran.begin();
+      
+      try {
+          nsBean.insertRow("testWithClientTran", 1, true);
+          fail("IllegalStateException not thrown");
+      } catch (IllegalStateException e) {
+          e.printStackTrace();
+      }
+      
+      tran.commit();
+      
+      int finalRows = nsBean.countRows();
+      assertTrue("Initial rows: " + initialRows + ", Final rows: " + finalRows, finalRows - initialRows == 0);
+      
+      //Test with client transaction and with application exception - the user transaction is not
+      //marked for rollback and can still be committed
+      initialRows = nsBean.countRows();
+      
+      tran.begin();
+      rBean.insertRow("testWithClientTranAndWithAppException", 1);
+      
+      try {
+          nsBean.throwApplicationException();
+      } catch (SQLException e) {
+          e.printStackTrace();
+      }
+      
+      tran.commit();
+      
+      finalRows = nsBean.countRows();
+      assertTrue("Initial rows: " + initialRows + ", Final rows: " + finalRows, finalRows - initialRows == 1);
+      
+      //Test with client transaction and with runtime exception - the user transaction is not
+      //marked for rollback and can still be committed
+      initialRows = nsBean.countRows();
+      
+      tran.begin();
+      rBean.insertRow("testWithClientTranAndWithRuntimeException", 1);
+      
+      try {
+          nsBean.throwRuntimeException();
+      } catch (RuntimeException e) {
+          e.printStackTrace();
+      }
+      
+      tran.commit();
+      
+      finalRows = nsBean.countRows();
+      assertTrue("Initial rows: " + initialRows + ", Final rows: " + finalRows, finalRows - initialRows == 1);
+      
+      //Test without client transaction - the insert fails because the bean delegates to another
+      //bean with a transaction strategy of Mandatory, and no transaction is available
+      initialRows = nsBean.countRows();
+      
+      try {
+          nsBean.insertRow("testWithoutClientTran", 1, true);
+          fail("IllegalStateException not thrown");
+      } catch (IllegalStateException e) {
+          e.printStackTrace();
+      }
+      
+      finalRows = nsBean.countRows();
+      assertTrue("Initial rows: " + initialRows + ", Final rows: " + finalRows, finalRows - initialRows == 0);
+  }
+}

Propchange: incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/NotSupportedTranAttributeTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/NotSupportedTranAttributeTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/NotSupportedTranAttributeTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/RequiredTranAttributeTest.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/RequiredTranAttributeTest.java?rev=963787&view=auto
==============================================================================
--- incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/RequiredTranAttributeTest.java (added)
+++ incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/RequiredTranAttributeTest.java Tue Jul 13 16:33:30 2010
@@ -0,0 +1,117 @@
+/*  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.aries.transaction.itests;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.sql.SQLException;
+
+import javax.transaction.RollbackException;
+import javax.transaction.UserTransaction;
+
+import org.apache.aries.transaction.test.TestBean;
+import org.junit.Test;
+
+public class RequiredTranAttributeTest extends AbstractIntegrationTest {
+  
+  @Test
+  public void testRequired() throws Exception {
+      TestBean bean = getOsgiService(TestBean.class, "(tranAttribute=Required)", DEFAULT_TIMEOUT);
+      UserTransaction tran = getOsgiService(UserTransaction.class);
+      
+      //Test with client transaction - the user transaction is used to insert a row
+      int initialRows = bean.countRows();
+      
+      tran.begin();
+      bean.insertRow("testWithClientTran", 1);
+      tran.commit();
+      
+      int finalRows = bean.countRows();
+      assertTrue("Initial rows: " + initialRows + ", Final rows: " + finalRows, finalRows - initialRows == 1);
+      
+      //Test with client transaction and application exception - the user transaction is not rolled back
+      initialRows = bean.countRows();
+      
+      tran.begin();
+      bean.insertRow("testWithClientTranAndWithAppException", 1);
+      
+      try {
+          bean.insertRow("testWithClientTranAndWithAppException", 2, new SQLException());
+      } catch (SQLException e) {
+          e.printStackTrace();
+      }
+      
+      tran.commit();
+      
+      finalRows = bean.countRows();
+      assertTrue("Initial rows: " + initialRows + ", Final rows: " + finalRows, finalRows - initialRows == 2);
+       
+      //Test with client transaction and runtime exception - the user transaction is rolled back
+      initialRows = bean.countRows();
+      
+      tran.begin();
+      bean.insertRow("testWithClientTranAndWithRuntimeException", 1);
+      
+      try {
+          bean.insertRow("testWithClientTranAndWithRuntimeException", 2, new RuntimeException());
+      } catch (RuntimeException e) {
+          e.printStackTrace();
+      }
+      
+      try {
+          tran.commit();
+          fail("RollbackException not thrown");
+      } catch (RollbackException e) {
+          e.printStackTrace();
+      }
+      
+      finalRows = bean.countRows();
+      assertTrue("Initial rows: " + initialRows + ", Final rows: " + finalRows, finalRows - initialRows == 0);
+      
+      //Test without client exception - a container transaction is used to insert the row
+      initialRows = bean.countRows();
+      
+      bean.insertRow("testWithoutClientTran", 1);
+      
+      finalRows = bean.countRows();
+      assertTrue("Initial rows: " + initialRows + ", Final rows: " + finalRows, finalRows - initialRows == 1);
+      
+      //Test without client exception and with application exception - the container transaction is not rolled back
+      initialRows = bean.countRows();
+      
+      try {
+          bean.insertRow("testWithoutClientTranAndWithAppException", 1, new SQLException("Dummy exception"));
+      } catch (Exception e) {
+          e.printStackTrace();
+      }
+      
+      finalRows = bean.countRows();
+      assertTrue("Initial rows: " + initialRows + ", Final rows: " + finalRows, finalRows - initialRows == 1);
+      
+      //Test without client transaction and with runtime exception - the container transaction is rolled back
+      initialRows = bean.countRows();
+      
+      try {
+          bean.insertRow("testWithoutClientTranAndWithRuntimeException", 1, new RuntimeException("Dummy exception"));
+      } catch (Exception e) {
+          e.printStackTrace();
+      }
+      
+      finalRows = bean.countRows();
+      assertTrue("Initial rows: " + initialRows + ", Final rows: " + finalRows, finalRows - initialRows == 0);
+  }
+}

Propchange: incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/RequiredTranAttributeTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/RequiredTranAttributeTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/RequiredTranAttributeTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/RequiresNewTranAttributeTest.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/RequiresNewTranAttributeTest.java?rev=963787&view=auto
==============================================================================
--- incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/RequiresNewTranAttributeTest.java (added)
+++ incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/RequiresNewTranAttributeTest.java Tue Jul 13 16:33:30 2010
@@ -0,0 +1,113 @@
+/*  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.aries.transaction.itests;
+
+import static org.junit.Assert.assertTrue;
+
+import java.sql.SQLException;
+
+import javax.transaction.UserTransaction;
+
+import org.apache.aries.transaction.test.TestBean;
+import org.junit.Test;
+
+public class RequiresNewTranAttributeTest extends AbstractIntegrationTest {
+  
+  @Test
+  public void testRequiresNew() throws Exception {
+      TestBean rnBean = getOsgiService(TestBean.class, "(tranAttribute=RequiresNew)", DEFAULT_TIMEOUT);
+      TestBean rBean = getOsgiService(TestBean.class, "(tranAttribute=Required)", DEFAULT_TIMEOUT);
+      UserTransaction tran = getOsgiService(UserTransaction.class);
+      
+      //Test with client transaction - a container transaction is used to insert the row
+      int initialRows = rnBean.countRows();
+      
+      tran.begin();
+      rnBean.insertRow("testWithClientTran", 1);
+      tran.rollback();
+      
+      int finalRows = rnBean.countRows();
+      assertTrue("Initial rows: " + initialRows + ", Final rows: " + finalRows, finalRows - initialRows == 1);
+      
+      //Test with client transaction and application exception - the container transaction is committed,
+      //the user transaction is not affected.
+      initialRows = rnBean.countRows();
+      
+      tran.begin();
+      rBean.insertRow("testWithClientTranAndWithAppException", 1);
+      
+      try {
+          rnBean.insertRow("testWithClientTranAndWithAppException", 2, new SQLException("Dummy exception"));
+      } catch (SQLException e) {
+          e.printStackTrace();
+      }
+      
+      tran.commit();
+      
+      finalRows = rnBean.countRows();
+      assertTrue("Initial rows: " + initialRows + ", Final rows: " + finalRows, finalRows - initialRows == 2);
+      
+      //Test with client transaction and runtime exception - the container transaction is rolled back,
+      //the user transaction is not affected
+      initialRows = rnBean.countRows();
+      
+      tran.begin();
+      rBean.insertRow("testWithClientTranAndWithRuntimeException", 1);
+      
+      try {
+          rnBean.insertRow("testWithClientTranAndWithRuntimeException", 2, new RuntimeException("Dummy exception"));
+      } catch (RuntimeException e) {
+          e.printStackTrace();
+      }
+      
+      tran.commit();
+      
+      finalRows = rnBean.countRows();
+      assertTrue("Initial rows: " + initialRows + ", Final rows: " + finalRows, finalRows - initialRows == 1);
+      
+      //Test without client transaction - a container transaction is used to insert the row
+      initialRows = rnBean.countRows();
+      
+      rnBean.insertRow("testWithoutClientTran", 1);
+      
+      finalRows = rnBean.countRows();
+      assertTrue("Initial rows: " + initialRows + ", Final rows: " + finalRows, finalRows - initialRows == 1);
+      
+      //Test without client transaction and with application exception - the container transaction is committed
+      initialRows = rnBean.countRows();
+      
+      try {
+          rnBean.insertRow("testWithoutClientTranAndWithAppException", 1, new SQLException("Dummy exception"));
+      } catch (Exception e) {
+          e.printStackTrace();
+      }
+      
+      finalRows = rnBean.countRows();
+      assertTrue("Initial rows: " + initialRows + ", Final rows: " + finalRows, finalRows - initialRows == 1);
+      
+      //Test without client transaction and with runtime exception - the container transaction is rolled back
+      initialRows = rnBean.countRows();
+      
+      try {
+          rnBean.insertRow("testWithoutClientTranAndWithRuntimeException", 1, new RuntimeException("Dummy exception"));
+      } catch (Exception e) {
+          e.printStackTrace();
+      }
+      
+      finalRows = rnBean.countRows();
+      assertTrue("Initial rows: " + initialRows + ", Final rows: " + finalRows, finalRows - initialRows == 0);
+  }
+}

Propchange: incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/RequiresNewTranAttributeTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/RequiresNewTranAttributeTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/RequiresNewTranAttributeTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/SupportsTranAttributeTest.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/SupportsTranAttributeTest.java?rev=963787&view=auto
==============================================================================
--- incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/SupportsTranAttributeTest.java (added)
+++ incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/SupportsTranAttributeTest.java Tue Jul 13 16:33:30 2010
@@ -0,0 +1,102 @@
+/*  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.aries.transaction.itests;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.sql.SQLException;
+
+import javax.transaction.RollbackException;
+import javax.transaction.UserTransaction;
+
+import org.apache.aries.transaction.test.TestBean;
+import org.junit.Test;
+
+public class SupportsTranAttributeTest extends AbstractIntegrationTest {
+  
+  @Test
+  public void testSupports() throws Exception {
+      TestBean bean = getOsgiService(TestBean.class, "(tranAttribute=Supports)", DEFAULT_TIMEOUT);
+      UserTransaction tran = getOsgiService(UserTransaction.class);
+      
+      //Test with client transaction - the insert succeeds because the bean delegates to
+      //another bean with a transaction strategy of Mandatory, and the user transaction
+      //is delegated
+      int initialRows = bean.countRows();
+      
+      tran.begin();
+      bean.insertRow("testWithClientTran", 1, true);
+      tran.commit();
+      
+      int finalRows = bean.countRows();
+      assertTrue("Initial rows: " + initialRows + ", Final rows: " + finalRows, finalRows - initialRows == 1);
+      
+      //Test with client transaction and application exception - the user transaction is not rolled back
+      initialRows = bean.countRows();
+      
+      tran.begin();
+      bean.insertRow("testWithClientTranAndWithAppException", 1);
+      
+      try {
+          bean.insertRow("testWithClientTranAndWithAppException", 2, new SQLException());
+      } catch (SQLException e) {
+          // TODO Auto-generated catch block
+          e.printStackTrace();
+      }
+      
+      tran.commit();
+      
+      finalRows = bean.countRows();
+      assertTrue("Initial rows: " + initialRows + ", Final rows: " + finalRows, finalRows - initialRows == 2);
+      
+      //Test with client transaction and runtime exception - the user transaction is rolled back
+      initialRows = bean.countRows();
+      
+      tran.begin();
+      bean.insertRow("testWithClientTranAndWithRuntimeException", 1);
+      
+      try {
+          bean.insertRow("testWithClientTranAndWithRuntimeException", 2, new RuntimeException());
+      } catch (RuntimeException e) {
+          e.printStackTrace();
+      }
+      
+      try {
+          tran.commit();
+          fail("RollbackException not thrown");
+      } catch (RollbackException e) {
+          e.printStackTrace();
+      }
+      
+      finalRows = bean.countRows();
+      assertTrue("Initial rows: " + initialRows + ", Final rows: " + finalRows, finalRows - initialRows == 0);
+      
+      //Test without client transaction - the insert fails because the bean delegates to
+      //another bean with a transaction strategy of Mandatory, and no transaction is available
+      initialRows = bean.countRows();
+      
+      try {
+          bean.insertRow("testWithoutClientTran", 1, true);
+          fail("Exception not thrown");
+      } catch (Exception e) {
+          e.printStackTrace();
+      }
+      
+      finalRows = bean.countRows();
+      assertTrue("Initial rows: " + initialRows + ", Final rows: " + finalRows, finalRows - initialRows == 0);
+  }
+}

Propchange: incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/SupportsTranAttributeTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/SupportsTranAttributeTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: incubator/aries/trunk/transaction/transaction-itests/src/test/java/org/apache/aries/transaction/itests/SupportsTranAttributeTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain