Return-Path: X-Original-To: apmail-aries-commits-archive@www.apache.org Delivered-To: apmail-aries-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 1815218BA1 for ; Tue, 12 Jan 2016 13:42:36 +0000 (UTC) Received: (qmail 84684 invoked by uid 500); 12 Jan 2016 13:42:36 -0000 Delivered-To: apmail-aries-commits-archive@aries.apache.org Received: (qmail 84619 invoked by uid 500); 12 Jan 2016 13:42:36 -0000 Mailing-List: contact commits-help@aries.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@aries.apache.org Delivered-To: mailing list commits@aries.apache.org Received: (qmail 84608 invoked by uid 99); 12 Jan 2016 13:42:35 -0000 Received: from Unknown (HELO spamd2-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 12 Jan 2016 13:42:35 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd2-us-west.apache.org (ASF Mail Server at spamd2-us-west.apache.org) with ESMTP id 7DDF41A0761 for ; Tue, 12 Jan 2016 13:42:35 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd2-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: 1.246 X-Spam-Level: * X-Spam-Status: No, score=1.246 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, KAM_LAZY_DOMAIN_SECURITY=1, RP_MATCHES_RCVD=-0.554] autolearn=disabled Received: from mx1-us-west.apache.org ([10.40.0.8]) by localhost (spamd2-us-west.apache.org [10.40.0.9]) (amavisd-new, port 10024) with ESMTP id T_B3RXdoJeQV for ; Tue, 12 Jan 2016 13:42:30 +0000 (UTC) Received: from mailrelay1-us-west.apache.org (mailrelay1-us-west.apache.org [209.188.14.139]) by mx1-us-west.apache.org (ASF Mail Server at mx1-us-west.apache.org) with ESMTP id 50DCD20498 for ; Tue, 12 Jan 2016 13:42:30 +0000 (UTC) Received: from svn01-us-west.apache.org (svn.apache.org [10.41.0.6]) by mailrelay1-us-west.apache.org (ASF Mail Server at mailrelay1-us-west.apache.org) with ESMTP id D5895E0361 for ; Tue, 12 Jan 2016 13:42:29 +0000 (UTC) Received: from svn01-us-west.apache.org (localhost [127.0.0.1]) by svn01-us-west.apache.org (ASF Mail Server at svn01-us-west.apache.org) with ESMTP id D48963A0176 for ; Tue, 12 Jan 2016 13:42:29 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: 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... Date: Tue, 12 Jan 2016 13:42:29 -0000 To: commits@aries.apache.org From: cschneider@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20160112134229.D48963A0176@svn01-us-west.apache.org> 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 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 the transactional annotation type. + */ +public abstract class AbstractTransactionalFactory +{ + /** + * 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 create(Class clazz) { + Set transactionalDefs = new HashSet(); + 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 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 properties; public Field[] persistenceFields; - public TransactionalDef transactionDef; + public Set transactionDefs = new HashSet(); 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(); } 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 { private static HashMap 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 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 txTypeNames; +import com.google.common.base.CaseFormat; - static { - txTypeNames = new HashMap(); - txTypeNames.put(Propagation.REQUIRED, TransactionalDef.TYPE_REQUIRED); - txTypeNames.put(Propagation.REQUIRES_NEW, TransactionalDef.TYPE_REQUIRES_NEW); +public class SpringTransactionFactory extends AbstractTransactionalFactory { + @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 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 defs = new HashSet(); + 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 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 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 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 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() { + } }