You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by cs...@apache.org on 2016/01/12 14:42:29 UTC

svn commit: r1724230 - in /aries/trunk/blueprint/blueprint-maven-plugin/src: main/java/org/apache/aries/blueprint/plugin/ main/java/org/apache/aries/blueprint/plugin/model/ test/java/org/apache/aries/blueprint/plugin/ test/java/org/apache/aries/bluepri...

Author: cschneider
Date: Tue Jan 12 13:42:29 2016
New Revision: 1724230

URL: http://svn.apache.org/viewvc?rev=1724230&view=rev
Log:
[ARIES-1475] Implement per-method transaction support.

Added:
    aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/AbstractTransactionalFactory.java
    aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/bad/BadBean3.java
      - copied, changed from r1724229, aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/ParentBean.java
Modified:
    aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/Generator.java
    aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Bean.java
    aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/JavaxTransactionFactory.java
    aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/SpringTransactionFactory.java
    aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/TransactionalDef.java
    aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/GeneratorTest.java
    aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/model/BeanTest.java
    aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyBean1.java
    aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyBean3.java
    aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyBean4.java
    aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/ParentBean.java

Modified: aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/Generator.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/Generator.java?rev=1724230&r1=1724229&r2=1724230&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/Generator.java (original)
+++ aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/Generator.java Tue Jan 12 13:42:29 2016
@@ -44,7 +44,7 @@ public class Generator implements Proper
     public static final String NS_JPA2 = "http://aries.apache.org/xmlns/jpa/v2.0.0";
     public static final String NS_TX = "http://aries.apache.org/xmlns/transactions/v1.2.0";
     public static final String NS_TX2 = "http://aries.apache.org/xmlns/transactions/v2.0.0";
-    
+
     private Context context;
     private XMLStreamWriter writer;
     private Set<String> namespaces;
@@ -65,7 +65,7 @@ public class Generator implements Proper
             writer.writeCharacters("\n");
             writeBlueprint();
             writer.writeCharacters("\n");
-            
+
             if (namespaces.contains(NS_JPA2) && isJpaUsed()) {
                 writer.writeEmptyElement(NS_JPA2, "enable");
                 writer.writeCharacters("\n");
@@ -84,10 +84,10 @@ public class Generator implements Proper
                 writer.writeEndElement();
                 writer.writeCharacters("\n");
             }
-            
+
             new OsgiServiceRefWriter(writer).write(context.getServiceRefs());
             new OsgiServiceProviderWriter(writer).write(context.getBeans());
-            
+
             writer.writeEndElement();
             writer.writeCharacters("\n");
             writer.writeEndDocument();
@@ -109,14 +109,12 @@ public class Generator implements Proper
     }
 
     private boolean isJtaUsed() {
-        boolean jtaUsed = false;
         for (Bean bean : context.getBeans()) {
-            if (bean.transactionDef != null) {
-                jtaUsed = true;
+            if (!bean.transactionDefs.isEmpty()) {
+                return true;
             }
-
         }
-        return jtaUsed;
+        return false;
     }
 
     private void writeBlueprint() throws XMLStreamException {
@@ -128,7 +126,7 @@ public class Generator implements Proper
             writer.writeNamespace(prefix, namespace);
         }
     }
-    
+
     private String getPrefixForNamesapace(String namespace) {
         if (namespace.contains("jpa")) {
             return "jpa";
@@ -156,15 +154,17 @@ public class Generator implements Proper
             writer.writeAttribute("destroy-method", bean.destroyMethod);
         }
         writer.writeCharacters("\n");
-        
+
         if (namespaces.contains(NS_TX)) {
-            writeTransactional(bean.transactionDef);
+            for (TransactionalDef transactionalDef : bean.transactionDefs) {
+                writeTransactional(transactionalDef);
+            }
         }
         if (namespaces.contains(NS_JPA)) {
             writePersistenceFields(bean.persistenceFields);
         }
     }
-    
+
     private void writeFactory(ProducedBean bean) throws XMLStreamException {
         writer.writeAttribute("factory-ref", bean.factoryBean.id);
         writer.writeAttribute("factory-method", bean.factoryMethod);
@@ -181,7 +181,7 @@ public class Generator implements Proper
         }
     }
 
-    
+
     private void writePersistenceFields(Field[] fields) throws XMLStreamException {
         for (Field field : fields) {
             writePersistenceField(field);

Added: aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/AbstractTransactionalFactory.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/AbstractTransactionalFactory.java?rev=1724230&view=auto
==============================================================================
--- aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/AbstractTransactionalFactory.java (added)
+++ aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/AbstractTransactionalFactory.java Tue Jan 12 13:42:29 2016
@@ -0,0 +1,65 @@
+/**
+ * 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.blueprint.plugin.model;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Method;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Abstract factory for creating {@link TransactionalDef} for a given class.
+ *
+ * @param <A> the transactional annotation type.
+ */
+public abstract class AbstractTransactionalFactory<A extends Annotation>
+{
+    /**
+     * Create {@link TransactionalDef} objects for the given class, inspecting
+     * class and methods for transaction annotations.
+     *
+     * @param clazz the class to inspect.
+     * @return a set of {@link TransactionalDef} objects.
+     */
+    public Set<TransactionalDef> create(Class<?> clazz) {
+        Set<TransactionalDef> transactionalDefs = new HashSet<TransactionalDef>();
+        A transactional = clazz.getAnnotation(getTransactionalClass());
+        if (transactional != null) {
+            transactionalDefs.add(new TransactionalDef("*", getTransactionTypeName(transactional)));
+        }
+        for (Method method : clazz.getMethods()) {
+            transactional = method.getAnnotation(getTransactionalClass());
+            if (transactional != null) {
+                transactionalDefs.add(new TransactionalDef(method.getName(), getTransactionTypeName(transactional)));
+            }
+        }
+        return transactionalDefs;
+    }
+
+    /**
+     * @param transactional the transactional annotation.
+     * @return the blueprint-compatible name of the transaction type.
+     */
+    public abstract String getTransactionTypeName(A transactional);
+
+    /**
+     * @return the annotation class to search for.
+     */
+    public abstract Class<A> getTransactionalClass();
+}

Modified: aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Bean.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Bean.java?rev=1724230&r1=1724229&r2=1724230&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Bean.java (original)
+++ aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Bean.java Tue Jan 12 13:42:29 2016
@@ -22,7 +22,9 @@ import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 import java.util.SortedSet;
 import java.util.TreeSet;
 
@@ -42,7 +44,7 @@ public class Bean extends BeanRef {
     public String destroyMethod;
     public SortedSet<Property> properties;
     public Field[] persistenceFields;
-    public TransactionalDef transactionDef;
+    public Set<TransactionalDef> transactionDefs = new HashSet<TransactionalDef>();
     public boolean isPrototype;
 
     public Bean(Class<?> clazz) {
@@ -59,12 +61,12 @@ public class Bean extends BeanRef {
         if (destroyMethod != null) {
             this.destroyMethod = destroyMethod.getName();
         }
+
+        // Transactional methods
+        transactionDefs.addAll(new JavaxTransactionFactory().create(clazz));
+        transactionDefs.addAll(new SpringTransactionFactory().create(clazz));
         this.isPrototype = isPrototype(clazz);
         this.persistenceFields = getPersistenceFields();
-        this.transactionDef = new JavaxTransactionFactory().create(clazz);
-        if (this.transactionDef == null) {
-            this.transactionDef = new SpringTransactionFactory().create(clazz);
-        }
         properties = new TreeSet<Property>();
     }
 

Modified: aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/JavaxTransactionFactory.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/JavaxTransactionFactory.java?rev=1724230&r1=1724229&r2=1724230&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/JavaxTransactionFactory.java (original)
+++ aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/JavaxTransactionFactory.java Tue Jan 12 13:42:29 2016
@@ -23,7 +23,9 @@ import java.util.HashMap;
 import javax.transaction.Transactional;
 import javax.transaction.Transactional.TxType;
 
-public class JavaxTransactionFactory {
+import com.google.common.base.CaseFormat;
+
+public class JavaxTransactionFactory extends AbstractTransactionalFactory<Transactional> {
     private static HashMap<TxType, String> txTypeNames;
 
     static {
@@ -31,10 +33,16 @@ public class JavaxTransactionFactory {
         txTypeNames.put(TxType.REQUIRED, TransactionalDef.TYPE_REQUIRED);
         txTypeNames.put(TxType.REQUIRES_NEW, TransactionalDef.TYPE_REQUIRES_NEW);
     }
-    
-    TransactionalDef create(Class<?> clazz) {
-        Transactional transactional = clazz.getAnnotation(Transactional.class);
-        return transactional != null ? 
-                new TransactionalDef("*", txTypeNames.get(transactional.value())) : null;
+
+    @Override
+    public String getTransactionTypeName(Transactional transactional)
+    {
+        return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, transactional.value().name());
+    }
+
+    @Override
+    public Class<Transactional> getTransactionalClass()
+    {
+        return Transactional.class;
     }
 }

Modified: aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/SpringTransactionFactory.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/SpringTransactionFactory.java?rev=1724230&r1=1724229&r2=1724230&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/SpringTransactionFactory.java (original)
+++ aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/SpringTransactionFactory.java Tue Jan 12 13:42:29 2016
@@ -18,23 +18,25 @@
  */
 package org.apache.aries.blueprint.plugin.model;
 
-import java.util.HashMap;
-
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
-public class SpringTransactionFactory {
-    private static HashMap<Propagation, String> txTypeNames;
+import com.google.common.base.CaseFormat;
 
-    static {
-        txTypeNames = new HashMap<Propagation, String>();
-        txTypeNames.put(Propagation.REQUIRED, TransactionalDef.TYPE_REQUIRED);
-        txTypeNames.put(Propagation.REQUIRES_NEW, TransactionalDef.TYPE_REQUIRES_NEW);
+public class SpringTransactionFactory extends AbstractTransactionalFactory<Transactional> {
+    @Override
+    public String getTransactionTypeName(Transactional transactional)
+    {
+        Propagation propagation = transactional.propagation();
+        if (propagation == Propagation.NESTED) {
+            throw new UnsupportedOperationException("Nested transactions not supported");
+        }
+        return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, propagation.name());
     }
 
-    TransactionalDef create(Class<?> clazz) {
-        Transactional transactional = clazz.getAnnotation(Transactional.class);
-        return transactional != null ? 
-                new TransactionalDef("*", txTypeNames.get(transactional.propagation())) : null;
+    @Override
+    public Class<Transactional> getTransactionalClass()
+    {
+        return Transactional.class;
     }
 }

Modified: aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/TransactionalDef.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/TransactionalDef.java?rev=1724230&r1=1724229&r2=1724230&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/TransactionalDef.java (original)
+++ aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/TransactionalDef.java Tue Jan 12 13:42:29 2016
@@ -18,13 +18,14 @@
  */
 package org.apache.aries.blueprint.plugin.model;
 
+import com.google.common.base.Objects;
 
 public class TransactionalDef {
     public static final String TYPE_REQUIRED = "Required";
     public static final String TYPE_REQUIRES_NEW = "RequiresNew";
     private String method;
     private String type;
-    
+
     public TransactionalDef(String method, String type) {
         this.method = method;
         this.type = type;
@@ -33,8 +34,35 @@ public class TransactionalDef {
     public String getMethod() {
         return method;
     }
-    
+
     public String getType() {
         return type;
     }
+
+    @Override
+    public boolean equals(Object o)
+    {
+        if (this == o)
+        {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass())
+        {
+            return false;
+        }
+        TransactionalDef that = (TransactionalDef) o;
+        return Objects.equal(method, that.method) && Objects.equal(type, that.type);
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return Objects.hashCode(method, type);
+    }
+
+    @Override
+    public String toString()
+    {
+        return Objects.toStringHelper(this).add("method", method).add("type", type).toString();
+    }
 }

Modified: aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/GeneratorTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/GeneratorTest.java?rev=1724230&r1=1724229&r2=1724230&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/GeneratorTest.java (original)
+++ aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/GeneratorTest.java Tue Jan 12 13:42:29 2016
@@ -36,6 +36,7 @@ import javax.xml.xpath.XPathConstants;
 import javax.xml.xpath.XPathFactory;
 
 import org.apache.aries.blueprint.plugin.model.Context;
+import org.apache.aries.blueprint.plugin.model.TransactionalDef;
 import org.apache.aries.blueprint.plugin.test.MyBean1;
 import org.apache.commons.io.output.ByteArrayOutputStream;
 import org.apache.xbean.finder.ClassFinder;
@@ -43,8 +44,11 @@ import org.junit.Assert;
 import org.junit.Test;
 import org.w3c.dom.Document;
 import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
 import org.xml.sax.SAXException;
 
+import com.google.common.collect.Sets;
+
 public class GeneratorTest {
 
     private XPath xpath;
@@ -73,19 +77,31 @@ public class GeneratorTest {
         Assert.assertEquals("destroy", xpath.evaluate("@destroy-method", bean1));
         Assert.assertEquals("true", xpath.evaluate("@field-injection", bean1));
         Assert.assertEquals("", xpath.evaluate("@scope", bean1));
-        
+
         // @Transactional
-        Assert.assertEquals("*", xpath.evaluate("transaction/@method", bean1));
-        Assert.assertEquals("Required", xpath.evaluate("transaction/@value", bean1));
+        NodeList txs = (NodeList) xpath.evaluate("transaction", bean1, XPathConstants.NODESET);
+        Set<TransactionalDef> defs = new HashSet<TransactionalDef>();
+        for (int i = 0; i < txs.getLength(); ++i) {
+            Node tx = txs.item(i);
+            defs.add(new TransactionalDef(xpath.evaluate("@method", tx), xpath.evaluate("@value", tx)));
+        }
+        Set<TransactionalDef> expectedDefs = Sets.newHashSet(new TransactionalDef("*", "RequiresNew"),
+                                                             new TransactionalDef("txNotSupported", "NotSupported"),
+                                                             new TransactionalDef("txMandatory", "Mandatory"),
+                                                             new TransactionalDef("txNever", "Never"),
+                                                             new TransactionalDef("txRequired", "Required"),
+                                                             new TransactionalDef("txOverridenWithRequiresNew", "RequiresNew"),
+                                                             new TransactionalDef("txSupports", "Supports"));
+        Assert.assertEquals(expectedDefs, defs);
 
         // @PersistenceContext
         Assert.assertEquals("person", xpath.evaluate("context/@unitname", bean1));
         Assert.assertEquals("em", xpath.evaluate("context/@property", bean1));
-        
+
         // @PersistenceUnit
         Assert.assertEquals("person", xpath.evaluate("unit/@unitname", bean1));
         Assert.assertEquals("emf", xpath.evaluate("unit/@property", bean1));
-        
+
         // @Autowired
         Assert.assertEquals("my1", xpath.evaluate("property[@name='bean2']/@ref", bean1));
 

Copied: aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/bad/BadBean3.java (from r1724229, aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/ParentBean.java)
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/bad/BadBean3.java?p2=aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/bad/BadBean3.java&p1=aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/ParentBean.java&r1=1724229&r2=1724230&rev=1724230&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/ParentBean.java (original)
+++ aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/bad/BadBean3.java Tue Jan 12 13:42:29 2016
@@ -16,18 +16,15 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.aries.blueprint.plugin.test;
+package org.apache.aries.blueprint.plugin.bad;
 
-import javax.annotation.PostConstruct;
-import javax.annotation.PreDestroy;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
 
-public class ParentBean {
+public class BadBean3
+{
+    @Transactional(propagation = Propagation.NESTED)
+    public void txNestedIsNotSupported() {
 
-    @PostConstruct
-    public void overridenInit() {
-    }
-
-    @PreDestroy
-    public void destroy() {
     }
 }

Modified: aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/model/BeanTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/model/BeanTest.java?rev=1724230&r1=1724229&r2=1724230&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/model/BeanTest.java (original)
+++ aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/model/BeanTest.java Tue Jan 12 13:42:29 2016
@@ -23,10 +23,13 @@ import static org.junit.Assert.assertFal
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
+import java.util.Set;
+
 import javax.inject.Named;
 
 import org.apache.aries.blueprint.plugin.bad.BadBean1;
 import org.apache.aries.blueprint.plugin.bad.BadBean2;
+import org.apache.aries.blueprint.plugin.bad.BadBean3;
 import org.apache.aries.blueprint.plugin.test.MyBean1;
 import org.apache.aries.blueprint.plugin.test.MyBean3;
 import org.apache.aries.blueprint.plugin.test.MyBean4;
@@ -34,6 +37,7 @@ import org.apache.aries.blueprint.plugin
 import org.junit.Assert;
 import org.junit.Test;
 
+import com.google.common.collect.Sets;
 
 public class BeanTest {
 
@@ -48,13 +52,20 @@ public class BeanTest {
         Assert.assertEquals(2, bean.persistenceFields.length);
         assertEquals("em", bean.persistenceFields[0].getName());
         assertEquals("emf", bean.persistenceFields[1].getName());
-        assertEquals("*", bean.transactionDef.getMethod());
-        assertEquals("Required", bean.transactionDef.getType());
         assertEquals(1, bean.properties.size());
         assertFalse(bean.isPrototype);
         Property prop = bean.properties.iterator().next();
         assertEquals("bean2", prop.name);
         assertEquals("serviceA", prop.ref);
+
+        Set<TransactionalDef> expectedTxs = Sets.newHashSet(new TransactionalDef("*", "RequiresNew"),
+                                                            new TransactionalDef("txNotSupported", "NotSupported"),
+                                                            new TransactionalDef("txMandatory", "Mandatory"),
+                                                            new TransactionalDef("txNever", "Never"),
+                                                            new TransactionalDef("txRequired", "Required"),
+                                                            new TransactionalDef("txOverridenWithRequiresNew", "RequiresNew"),
+                                                            new TransactionalDef("txSupports", "Supports"));
+        assertEquals(expectedTxs, bean.transactionDefs);
     }
 
     @Test
@@ -66,10 +77,17 @@ public class BeanTest {
         assertNull("There should be no initMethod", bean.initMethod);
         assertNull("There should be no destroyMethod", bean.destroyMethod);
         assertEquals("There should be no persistence fields", 0, bean.persistenceFields.length);
-        assertEquals("*", bean.transactionDef.getMethod());
-        assertEquals("RequiresNew", bean.transactionDef.getType());
         assertEquals(5, bean.properties.size());
         assertTrue(bean.isPrototype);
+
+        Set<TransactionalDef> expectedTxs = Sets.newHashSet(new TransactionalDef("*", "RequiresNew"),
+                                                            new TransactionalDef("txNotSupported", "NotSupported"),
+                                                            new TransactionalDef("txMandatory", "Mandatory"),
+                                                            new TransactionalDef("txNever", "Never"),
+                                                            new TransactionalDef("txRequired", "Required"),
+                                                            new TransactionalDef("txRequiresNew", "RequiresNew"),
+                                                            new TransactionalDef("txSupports", "Supports"));
+        assertEquals(expectedTxs, bean.transactionDefs);
     }
 
     @Test
@@ -82,7 +100,7 @@ public class BeanTest {
         assertNull("There should be no initMethod", bean.initMethod);
         assertNull("There should be no destroyMethod", bean.destroyMethod);
         assertEquals("There should be no persistence fields", 0, bean.persistenceFields.length);
-        assertNull("There should be no transaction definition", bean.transactionDef);
+        assertTrue("There should be no transaction definition", bean.transactionDefs.isEmpty());
         assertEquals("There should be no properties", 0, bean.properties.size());
         assertTrue(bean.isPrototype);
     }
@@ -95,6 +113,9 @@ public class BeanTest {
         assertEquals("bundleContext", bcProp.name);
         assertEquals("blueprintBundleContext", bcProp.ref);
         assertFalse(bean.isPrototype);
+
+        Set<TransactionalDef> expectedTxs = Sets.newHashSet(new TransactionalDef("txWithoutClassAnnotation", "Supports"));
+        assertEquals(expectedTxs, bean.transactionDefs);
     }
 
     @Test(expected = IllegalArgumentException.class)
@@ -106,4 +127,9 @@ public class BeanTest {
     public void testMultipleDestroyMethods() {
         new Bean(BadBean2.class);
     }
+
+    @Test(expected = UnsupportedOperationException.class)
+    public void testSpringNestedTransactionNotSupported() {
+        new Bean(BadBean3.class);
+    }
 }

Modified: aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyBean1.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyBean1.java?rev=1724230&r1=1724229&r2=1724230&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyBean1.java (original)
+++ aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyBean1.java Tue Jan 12 13:42:29 2016
@@ -29,7 +29,7 @@ import javax.transaction.Transactional.T
 import org.springframework.beans.factory.annotation.Autowired;
 
 @Singleton
-@Transactional(value=TxType.REQUIRED)
+@Transactional(value=TxType.REQUIRES_NEW)
 public class MyBean1 extends ParentBean {
 
     @Autowired
@@ -48,9 +48,30 @@ public class MyBean1 extends ParentBean
 
     @PostConstruct
     public void init() {
+
+    }
+
+    @Transactional(TxType.NOT_SUPPORTED)
+    public void txNotSupported() {
+    }
+
+    @Transactional(TxType.MANDATORY)
+    public void txMandatory() {
     }
 
-    public void saveData() {
+    @Transactional(TxType.NEVER)
+    public void txNever() {
+    }
+
+    @Transactional(TxType.REQUIRED)
+    public void txRequired() {
+    }
+
+    @Override
+    public void txOverridenWithoutTransactional() {
+    }
 
+    @Transactional(TxType.REQUIRES_NEW)
+    public void txOverridenWithRequiresNew() {
     }
 }

Modified: aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyBean3.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyBean3.java?rev=1724230&r1=1724229&r2=1724230&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyBean3.java (original)
+++ aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyBean3.java Tue Jan 12 13:42:29 2016
@@ -39,11 +39,35 @@ public class MyBean3 {
 
     @Inject
     ServiceB serviceB;
-    
+
     @Inject
     @Named("serviceB2Id")
     ServiceB serviceB2;
-    
+
     @Inject
     MyProduced myProduced;
+
+    @Transactional(propagation = Propagation.NOT_SUPPORTED)
+    public void txNotSupported() {
+    }
+
+    @Transactional(propagation = Propagation.MANDATORY)
+    public void txMandatory() {
+    }
+
+    @Transactional(propagation = Propagation.NEVER)
+    public void txNever() {
+    }
+
+    @Transactional(propagation = Propagation.REQUIRED)
+    public void txRequired() {
+    }
+
+    @Transactional(propagation = Propagation.REQUIRES_NEW)
+    public void txRequiresNew() {
+    }
+
+    @Transactional(propagation = Propagation.SUPPORTS)
+    public void txSupports() {
+    }
 }

Modified: aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyBean4.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyBean4.java?rev=1724230&r1=1724229&r2=1724230&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyBean4.java (original)
+++ aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyBean4.java Tue Jan 12 13:42:29 2016
@@ -4,10 +4,17 @@ import javax.inject.Inject;
 
 import org.osgi.framework.BundleContext;
 import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
 
 @Component
 public class MyBean4 {
 
     @Inject
     BundleContext bundleContext;
+
+    @Transactional(propagation = Propagation.SUPPORTS)
+    public void txWithoutClassAnnotation() {
+
+    }
 }

Modified: aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/ParentBean.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/ParentBean.java?rev=1724230&r1=1724229&r2=1724230&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/ParentBean.java (original)
+++ aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/ParentBean.java Tue Jan 12 13:42:29 2016
@@ -20,6 +20,7 @@ package org.apache.aries.blueprint.plugi
 
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
+import javax.transaction.Transactional;
 
 public class ParentBean {
 
@@ -30,4 +31,16 @@ public class ParentBean {
     @PreDestroy
     public void destroy() {
     }
+
+    @Transactional(Transactional.TxType.REQUIRES_NEW)
+    public void txOverridenWithoutTransactional() {
+    }
+
+    @Transactional(Transactional.TxType.SUPPORTS)
+    public void txSupports() {
+    }
+
+    @Transactional(Transactional.TxType.NEVER)
+    public void txOverridenWithRequiresNew() {
+    }
 }