[seam-commits] Seam SVN: r13428 - in modules/persistence/trunk: api and 13 other directories.

seam-commits at lists.jboss.org seam-commits at lists.jboss.org
Sun Jul 18 04:51:37 EDT 2010


Author: swd847
Date: 2010-07-18 04:51:36 -0400 (Sun, 18 Jul 2010)
New Revision: 13428

Added:
   modules/persistence/trunk/api/
   modules/persistence/trunk/api/pom.xml
   modules/persistence/trunk/api/src/
   modules/persistence/trunk/api/src/main/
   modules/persistence/trunk/api/src/main/java/
   modules/persistence/trunk/api/src/main/resources/
   modules/persistence/trunk/api/src/test/
   modules/persistence/trunk/api/src/test/java/
   modules/persistence/trunk/api/src/test/resources/
   modules/persistence/trunk/impl/
   modules/persistence/trunk/impl/pom.xml
   modules/persistence/trunk/impl/src/
   modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/PersistenceContextExtension.java
   modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/AbstractUserTransaction.java
   modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/AfterTransactionCompletion.java
   modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/BeforeTransactionCompletion.java
   modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/CMTTransaction.java
   modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/EJB.java
   modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/EjbSynchronizations.java
   modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/EntityTransaction.java
   modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/JtaTxInterceptor.java
   modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/LocalEjbSynchronizations.java
   modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/Naming.java
   modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/NoTransaction.java
   modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/SeSynchronizations.java
   modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/SynchronizationRegistry.java
   modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/Synchronizations.java
   modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/Transaction.java
   modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/TransactionExtension.java
   modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/TransactionInterceptor.java
   modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/TransactionPropagation.java
   modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/TransactionQualifier.java
   modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/Transactional.java
   modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/UTTransaction.java
   modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/UserTransaction.java
   modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/Work.java
   modules/persistence/trunk/impl/src/main/resources/META-INF/beans.xml
   modules/persistence/trunk/impl/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension
   modules/persistence/trunk/impl/src/test/java/org/jboss/seam/transactions/
   modules/persistence/trunk/impl/src/test/java/org/jboss/seam/transactions/test/TransactionInterceptorTest.java
   modules/persistence/trunk/impl/src/test/java/org/jboss/seam/transactions/test/TransactionManagedBean.java
   modules/persistence/trunk/impl/src/test/java/org/jboss/seam/transactions/test/TransactionObserver.java
   modules/persistence/trunk/impl/src/test/java/org/jboss/seam/transactions/test/UserTransactionTest.java
   modules/persistence/trunk/impl/src/test/java/org/jboss/seam/transactions/test/util/DontRollBackException.java
   modules/persistence/trunk/impl/src/test/java/org/jboss/seam/transactions/test/util/EntityManagerProvider.java
   modules/persistence/trunk/impl/src/test/resources-glassfish/
   modules/persistence/trunk/impl/src/test/resources-jbossas/
   modules/persistence/trunk/impl/src/test/resources/META-INF/
   modules/persistence/trunk/impl/src/test/resources/arquillian.xml
Removed:
   modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/PersistenceContextExtension.java
   modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/JtaTxInterceptor.java
   modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/TransactionPropagation.java
   modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/Transactional.java
   modules/persistence/trunk/impl/src/main/resources/META-INF/beans.xml
   modules/persistence/trunk/impl/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension
   modules/persistence/trunk/impl/src/test/java/org/jboss/seam/transactions/test/SimpleTest.java
   modules/persistence/trunk/src/
Modified:
   modules/persistence/trunk/pom.xml
Log:
change module structure to follow guidelines




Property changes on: modules/persistence/trunk/api
___________________________________________________________________
Name: svn:ignore
   + target
.classpath
.project
.settings


Added: modules/persistence/trunk/api/pom.xml
===================================================================
--- modules/persistence/trunk/api/pom.xml	                        (rev 0)
+++ modules/persistence/trunk/api/pom.xml	2010-07-18 08:51:36 UTC (rev 13428)
@@ -0,0 +1,27 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+   <parent>
+      <artifactId>seam-persistence-parent</artifactId>
+      <groupId>org.jboss.seam.persistence</groupId>
+      <version>3.0.0-SNAPSHOT</version>
+   </parent>
+
+   <modelVersion>4.0.0</modelVersion>
+   <groupId>org.jboss.seam</groupId>
+   <artifactId>seam-persistence-api</artifactId>
+   <packaging>jar</packaging>
+   <version>3.0.0-SNAPSHOT</version>
+   <name>Seam Persistence API</name>
+
+   <prerequisites>
+      <maven>3.0</maven>
+   </prerequisites>
+
+   <scm>
+      <connection>scm:svn:http://anonsvn.jboss.org/repos/seam/modules/persistence/trunk/api</connection>
+      <developerConnection>scm:svn:https://svn.jboss.org/repos/seam/modules/persistence/trunk/api</developerConnection>
+      <url>http://fisheye.jboss.org/browse/Seam/modules/persistence/trunk/api</url>
+   </scm>
+
+</project>
+


Property changes on: modules/persistence/trunk/impl
___________________________________________________________________
Name: svn:ignore
   + .classpath
.settings
target
.project
transaction.log


Copied: modules/persistence/trunk/impl/pom.xml (from rev 13405, modules/persistence/trunk/pom.xml)
===================================================================
--- modules/persistence/trunk/impl/pom.xml	                        (rev 0)
+++ modules/persistence/trunk/impl/pom.xml	2010-07-18 08:51:36 UTC (rev 13428)
@@ -0,0 +1,242 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+   <parent>
+      <artifactId>seam-persistence-parent</artifactId>
+      <groupId>org.jboss.seam.persistence</groupId>
+      <version>3.0.0-SNAPSHOT</version>
+      <relativePath>../pom.xml</relativePath>
+   </parent>
+
+   <modelVersion>4.0.0</modelVersion>
+   <groupId>org.jboss.seam</groupId>
+   <artifactId>seam-persistence</artifactId>
+   <packaging>jar</packaging>
+   <version>3.0.0-SNAPSHOT</version>
+   <name>Seam Persistence</name>
+
+   <properties>
+      <seam.version>3.0.0.b01</seam.version>
+      <arquillian.version>1.0.0-SNAPSHOT</arquillian.version>
+      <junit.version>4.8.1</junit.version>
+      <jboss.home>${env.JBOSS_HOME}</jboss.home>
+      <jboss.domain>default</jboss.domain>
+      <glassfish.version>3.0.1-b19</glassfish.version>
+      <jboss-as-client.version>6.0.0-SNAPSHOT</jboss-as-client.version>
+      <jboss-javaee6-spec.version>1.0.0.Beta4</jboss-javaee6-spec.version>
+      <jboss-server-manager.version>1.0.3.GA</jboss-server-manager.version>
+   </properties>
+
+   <prerequisites>
+      <maven>3.0</maven>
+   </prerequisites>
+
+   <dependencyManagement>
+      <dependencies>
+         <dependency>
+            <groupId>org.jboss.seam</groupId>
+            <artifactId>seam</artifactId>
+            <version>${seam.version}</version>
+            <type>pom</type>
+            <scope>import</scope>
+         </dependency>
+
+         <dependency>
+            <groupId>org.jboss.arquillian</groupId>
+            <artifactId>arquillian-junit</artifactId>
+            <version>${arquillian.version}</version>
+            <scope>test</scope>
+         </dependency>
+
+         <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>${junit.version}</version>
+         </dependency>
+
+      </dependencies>
+
+
+   </dependencyManagement>
+
+   <dependencies>
+      <dependency>
+         <groupId>junit</groupId>
+         <artifactId>junit</artifactId>
+      </dependency>
+      
+      <dependency>
+         <groupId>org.hibernate</groupId>
+         <artifactId>hibernate-core</artifactId>
+      </dependency>
+
+      <dependency>
+         <groupId>org.hibernate.javax.persistence</groupId>
+         <artifactId>hibernate-jpa-2.0-api</artifactId>
+      </dependency>
+
+      <dependency>
+         <groupId>org.jboss.spec.javax.interceptor</groupId>
+         <artifactId>jboss-interceptors-api_1.1_spec</artifactId>
+         <scope>provided</scope>
+      </dependency>
+
+      <dependency>
+         <groupId>javax.transaction</groupId>
+         <artifactId>jta</artifactId>
+      </dependency>
+
+      <dependency>
+         <groupId>javax.enterprise</groupId>
+         <artifactId>cdi-api</artifactId>
+      </dependency>
+
+      <dependency>
+         <groupId>org.slf4j</groupId>
+         <artifactId>slf4j-api</artifactId>
+         <scope>provided</scope>
+      </dependency>
+
+       <dependency>
+          <groupId>org.jboss.spec</groupId>
+          <artifactId>jboss-javaee-6.0</artifactId>
+          <version>${jboss-javaee6-spec.version}</version>
+          <type>pom</type>
+          <scope>provided</scope>
+       </dependency>
+
+      <dependency>
+         <groupId>org.jboss.weld</groupId>
+         <artifactId>weld-extensions</artifactId>
+         <version>1.0.0-SNAPSHOT</version>
+         <type>jar</type>
+         <scope>compile</scope>
+      </dependency>
+
+      <dependency>
+         <groupId>org.jboss.arquillian</groupId>
+         <artifactId>arquillian-junit</artifactId>
+         <scope>test</scope>
+      </dependency>
+   </dependencies>
+
+
+   <profiles>
+      <profile>
+         <id>default</id>
+         <activation>
+            <activeByDefault>true</activeByDefault>
+         </activation>
+         <build>
+            <plugins>
+               <plugin>
+                  <artifactId>maven-surefire-plugin</artifactId>
+                  <configuration>
+                     <skip>true</skip>
+                  </configuration>
+               </plugin>            
+           </plugins>
+         </build>
+      </profile>
+   
+      <profile>
+         <id>jbossas-remote-60</id>
+         <dependencies>
+            <dependency>
+               <groupId>org.jboss.arquillian.container</groupId>
+               <artifactId>arquillian-jbossas-remote-6</artifactId>
+               <version>${arquillian.version}</version>
+               <scope>test</scope>
+            </dependency>
+            <dependency>
+               <groupId>org.jboss.spec</groupId>
+               <artifactId>jboss-javaee-6.0</artifactId>
+               <version>${jboss-javaee6-spec.version}</version>
+               <type>pom</type>
+               <scope>provided</scope>
+            </dependency>
+            <!-- need for org.jnp.interfaces.NamingContextFactory -->
+            <dependency>
+               <groupId>org.jboss.jbossas</groupId>
+               <artifactId>jboss-as-client</artifactId>
+               <version>${jboss-as-client.version}</version>
+               <type>pom</type>
+               <scope>test</scope>
+            </dependency>
+         </dependencies>
+         <build>
+            <testResources>
+               <testResource>
+                  <directory>src/test/resources</directory>
+               </testResource>
+               <testResource>
+                  <directory>src/test/resources-jbossas</directory>
+               </testResource>
+            </testResources>
+         </build>
+      </profile>
+
+      <profile>
+         <id>glassfish-embedded-30</id>
+         <dependencies>
+            <dependency>
+               <groupId>org.jboss.arquillian.container</groupId>
+               <artifactId>arquillian-glassfish-embedded-30</artifactId>
+               <version>${arquillian.version}</version>
+               <scope>test</scope>
+            </dependency>
+            <dependency>
+               <groupId>org.glassfish.extras</groupId>
+               <artifactId>glassfish-embedded-all</artifactId>
+               <version>${glassfish.version}</version>
+               <scope>provided</scope>
+            </dependency>
+         </dependencies>
+         <build>
+            <testResources>
+               <testResource>
+                  <directory>src/test/resources</directory>
+               </testResource>
+               <testResource>
+                  <directory>src/test/resources-glassfish</directory>
+               </testResource>
+            </testResources>
+         </build>
+      </profile>
+
+      <profile>
+         <id>glassfish-remote-30</id>
+         <dependencies>
+            <dependency>
+               <groupId>org.jboss.arquillian.container</groupId>
+               <artifactId>arquillian-glassfish-remote-30</artifactId>
+               <version>${arquillian.version}</version>
+               <scope>test</scope>
+            </dependency>
+            <dependency>
+               <groupId>org.glassfish.extras</groupId>
+               <artifactId>glassfish-embedded-all</artifactId>
+               <version>${glassfish.version}</version>
+               <scope>provided</scope>
+            </dependency>
+         </dependencies>
+         <build>
+            <testResources>
+               <testResource>
+                  <directory>src/test/resources</directory>
+               </testResource>
+               <testResource>
+                  <directory>src/test/resources-glassfish</directory>
+               </testResource>
+            </testResources>
+         </build>
+      </profile>
+   </profiles>
+
+   <scm>
+      <connection>scm:svn:http://anonsvn.jboss.org/repos/seam/modules/persistence/trunk</connection>
+      <developerConnection>scm:svn:https://svn.jboss.org/repos/seam/modules/persistence/trunk</developerConnection>
+      <url>http://fisheye.jboss.org/browse/Seam/modules/persistence/trunk</url>
+   </scm>
+
+</project>
+

Copied: modules/persistence/trunk/impl/src (from rev 13402, modules/persistence/trunk/src)

Deleted: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/PersistenceContextExtension.java
===================================================================
--- modules/persistence/trunk/src/main/java/org/jboss/seam/persistence/PersistenceContextExtension.java	2010-07-15 04:17:18 UTC (rev 13402)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/PersistenceContextExtension.java	2010-07-18 08:51:36 UTC (rev 13428)
@@ -1,256 +0,0 @@
-package org.jboss.seam.persistence;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Type;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import javax.enterprise.context.ApplicationScoped;
-import javax.enterprise.context.spi.CreationalContext;
-import javax.enterprise.event.Observes;
-import javax.enterprise.inject.Alternative;
-import javax.enterprise.inject.Any;
-import javax.enterprise.inject.Default;
-import javax.enterprise.inject.spi.AfterBeanDiscovery;
-import javax.enterprise.inject.spi.AnnotatedField;
-import javax.enterprise.inject.spi.Bean;
-import javax.enterprise.inject.spi.BeanManager;
-import javax.enterprise.inject.spi.Extension;
-import javax.enterprise.inject.spi.InjectionPoint;
-import javax.enterprise.inject.spi.ProcessProducer;
-import javax.enterprise.inject.spi.Producer;
-import javax.enterprise.util.AnnotationLiteral;
-import javax.inject.Qualifier;
-import javax.persistence.EntityManager;
-import javax.persistence.EntityManagerFactory;
-import javax.persistence.Persistence;
-import javax.persistence.PersistenceContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Support for managed persistence contexts in a Java SE environment or Servlet container.
- *
- * <p>Unlike with standard Java EE, the unitName attribute on {@link PersistenceContext} must
- * be provided if the persistence unit is assigned a name in persistence.xml. This
- * class supports multiple persistence units, but it does not permit multiple
- * producers for the same persistence unit (naturally).</p>
- * 
- * @author Gavin King
- * @author Dan Allen
- */
-public class PersistenceContextExtension implements Extension
-{
-   private static final Logger log = LoggerFactory.getLogger(PersistenceContextExtension.class);
-
-   private Map<String, Bean<EntityManagerFactory>> emfBeans = new HashMap<String, Bean<EntityManagerFactory>>();
-
-   private Boolean bootstrapRequired;
-
-   /**
-    * For @PersistenceContext producer fields, make a bean for the EMF, then
-    * wrap the producer CDI creates, to get the EM from the EMF bean we made
-    * instead of trying to get it from the Java EE component environment.
-    */
-   void processProducer(@Observes ProcessProducer<?, EntityManager> pp, final BeanManager bm)
-   {
-      if (Boolean.FALSE.equals(bootstrapRequired))
-      {
-         return;
-      }
-      else if (bootstrapRequired == null)
-      {
-         if (isPersistenceContainerManaged())
-         {
-            bootstrapRequired = false;
-            return;
-         }
-         else
-         {
-            bootstrapRequired = true;
-            log.info("Java SE persistence bootstrap required");
-         }
-      }
-
-      if (pp.getAnnotatedMember().isAnnotationPresent(PersistenceContext.class))
-      {
-         AnnotatedField<?> field = (AnnotatedField<?>) pp.getAnnotatedMember();
-         final String unitName = field.getAnnotation(PersistenceContext.class).unitName();
-         if (!emfBeans.containsKey(unitName))
-         {
-            log.info("Found persistence context producer for persistence unit: " + unitName);
-            final Class<?> module = field.getJavaMember().getDeclaringClass();
-            final Set<Annotation> qualifiers = new HashSet<Annotation>();
-            for (Annotation ann : field.getAnnotations())
-            {
-               Class<? extends Annotation> annotationType = ann.annotationType();
-               // if ( bm.isQualifier(annotationType)) {
-               if (annotationType.isAnnotationPresent(Qualifier.class))
-               { // work around bug in Weld
-                  qualifiers.add(ann);
-               }
-            }
-            if (qualifiers.isEmpty())
-            {
-               qualifiers.add(new AnnotationLiteral<Default>()
-               {
-                  /** default value. Added only to suppress compiler warnings. */
-                  private static final long serialVersionUID = 1L;
-               });
-            }
-            qualifiers.add(new AnnotationLiteral<Any>()
-            {
-               /** default value. Added only to suppress compiler warnings. */
-               private static final long serialVersionUID = 1L;
-            });
-            final boolean alternative = field.isAnnotationPresent(Alternative.class);
-            final Set<Type> types = new HashSet<Type>()
-            {
-               /** default value. Added only to suppress compiler warnings. */
-               private static final long serialVersionUID = 1L;
-               {
-                  add(EntityManagerFactory.class);
-                  add(Object.class);
-               }
-            };
-
-            // create and register a bean for the EMF
-            emfBeans.put(unitName, new Bean<EntityManagerFactory>()
-            {
-               public Set<Type> getTypes()
-               {
-                  return types;
-               }
-
-               public Class<? extends Annotation> getScope()
-               {
-                  return ApplicationScoped.class;
-               }
-
-               public EntityManagerFactory create(CreationalContext<EntityManagerFactory> ctx)
-               {
-                  return Persistence.createEntityManagerFactory(unitName);
-               }
-
-               public void destroy(EntityManagerFactory emf, CreationalContext<EntityManagerFactory> ctx)
-               {
-                  emf.close();
-                  ctx.release();
-               }
-
-               public Class<?> getBeanClass()
-               {
-                  return module;
-               }
-
-               public Set<InjectionPoint> getInjectionPoints()
-               {
-                  return Collections.emptySet();
-               }
-
-               public String getName()
-               {
-                  return null;
-               }
-
-               public Set<Annotation> getQualifiers()
-               {
-                  return qualifiers;
-               }
-
-               public Set<Class<? extends Annotation>> getStereotypes()
-               {
-                  return Collections.emptySet();
-
-               }
-
-               public boolean isAlternative()
-               {
-                  return alternative;
-               }
-
-               public boolean isNullable()
-               {
-                  return false;
-               }
-            });
-
-         }
-         else
-         {
-            throw new RuntimeException("There can only be one producer per persistence unit");
-         }
-
-         Producer<EntityManager> producer = new Producer<EntityManager>()
-         {
-            public Set<InjectionPoint> getInjectionPoints()
-            {
-               return Collections.emptySet();
-            }
-
-            public EntityManager produce(CreationalContext<EntityManager> ctx)
-            {
-               return getFactory(ctx).createEntityManager();
-            }
-
-            private EntityManagerFactory getFactory(CreationalContext<EntityManager> ctx)
-            {
-               return (EntityManagerFactory) bm.getReference(emfBeans.get(unitName), EntityManagerFactory.class, ctx);
-            }
-
-            public void dispose(EntityManager em)
-            {
-               if (em.isOpen()) // work around what I suspect is a bug in Weld
-               {
-                  em.close();
-               }
-            }
-         };
-         pp.setProducer(producer);
-      }
-   }
-
-   /**
-    * Register the EMF bean with the container.
-    */
-   void afterBeanDiscovery(@Observes AfterBeanDiscovery abd)
-   {
-      for (Bean<EntityManagerFactory> emfBean : emfBeans.values())
-      {
-         abd.addBean(emfBean);
-      }
-   }
-
-   /**
-    * Check whether persistence is container managed. For now, this simply
-    * checks for the presence of the EJB API. If it's present, we assume
-    * this is an EE environment and that persistence is container managed.
-    */
-   boolean isPersistenceContainerManaged() {
-      boolean eeEnv = true;
-      try
-      {
-         if (Thread.currentThread().getContextClassLoader() != null)
-         {
-            Thread.currentThread().getContextClassLoader().loadClass("javax.ejb.Stateless");
-         }
-         else
-         {
-            Class.forName("javax.ejb.Stateless");
-         }
-      }
-      catch (ClassNotFoundException e)
-      {
-         eeEnv = false;
-      }
-      catch (NoClassDefFoundError e)
-      {
-         eeEnv = false;
-      }
-
-      return eeEnv;
-   }
-}

Copied: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/PersistenceContextExtension.java (from rev 13427, modules/persistence/trunk/src/main/java/org/jboss/seam/persistence/PersistenceContextExtension.java)
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/PersistenceContextExtension.java	                        (rev 0)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/PersistenceContextExtension.java	2010-07-18 08:51:36 UTC (rev 13428)
@@ -0,0 +1,278 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.persistence;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.event.Observes;
+import javax.enterprise.inject.Alternative;
+import javax.enterprise.inject.Any;
+import javax.enterprise.inject.Default;
+import javax.enterprise.inject.spi.AfterBeanDiscovery;
+import javax.enterprise.inject.spi.AnnotatedField;
+import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.BeanManager;
+import javax.enterprise.inject.spi.Extension;
+import javax.enterprise.inject.spi.InjectionPoint;
+import javax.enterprise.inject.spi.ProcessProducer;
+import javax.enterprise.inject.spi.Producer;
+import javax.enterprise.util.AnnotationLiteral;
+import javax.inject.Qualifier;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+import javax.persistence.PersistenceContext;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Support for managed persistence contexts in a Java SE environment or Servlet container.
+ *
+ * <p>Unlike with standard Java EE, the unitName attribute on {@link PersistenceContext} must
+ * be provided if the persistence unit is assigned a name in persistence.xml. This
+ * class supports multiple persistence units, but it does not permit multiple
+ * producers for the same persistence unit (naturally).</p>
+ * 
+ * @author Gavin King
+ * @author Dan Allen
+ */
+public class PersistenceContextExtension implements Extension
+{
+   private static final Logger log = LoggerFactory.getLogger(PersistenceContextExtension.class);
+
+   private Map<String, Bean<EntityManagerFactory>> emfBeans = new HashMap<String, Bean<EntityManagerFactory>>();
+
+   private Boolean bootstrapRequired;
+
+   /**
+    * For @PersistenceContext producer fields, make a bean for the EMF, then
+    * wrap the producer CDI creates, to get the EM from the EMF bean we made
+    * instead of trying to get it from the Java EE component environment.
+    */
+   void processProducer(@Observes ProcessProducer<?, EntityManager> pp, final BeanManager bm)
+   {
+      if (Boolean.FALSE.equals(bootstrapRequired))
+      {
+         return;
+      }
+      else if (bootstrapRequired == null)
+      {
+         if (isPersistenceContainerManaged())
+         {
+            bootstrapRequired = false;
+            return;
+         }
+         else
+         {
+            bootstrapRequired = true;
+            log.info("Java SE persistence bootstrap required");
+         }
+      }
+
+      if (pp.getAnnotatedMember().isAnnotationPresent(PersistenceContext.class))
+      {
+         AnnotatedField<?> field = (AnnotatedField<?>) pp.getAnnotatedMember();
+         final String unitName = field.getAnnotation(PersistenceContext.class).unitName();
+         if (!emfBeans.containsKey(unitName))
+         {
+            log.info("Found persistence context producer for persistence unit: " + unitName);
+            final Class<?> module = field.getJavaMember().getDeclaringClass();
+            final Set<Annotation> qualifiers = new HashSet<Annotation>();
+            for (Annotation ann : field.getAnnotations())
+            {
+               Class<? extends Annotation> annotationType = ann.annotationType();
+               // if ( bm.isQualifier(annotationType)) {
+               if (annotationType.isAnnotationPresent(Qualifier.class))
+               { // work around bug in Weld
+                  qualifiers.add(ann);
+               }
+            }
+            if (qualifiers.isEmpty())
+            {
+               qualifiers.add(new AnnotationLiteral<Default>()
+               {
+                  /** default value. Added only to suppress compiler warnings. */
+                  private static final long serialVersionUID = 1L;
+               });
+            }
+            qualifiers.add(new AnnotationLiteral<Any>()
+            {
+               /** default value. Added only to suppress compiler warnings. */
+               private static final long serialVersionUID = 1L;
+            });
+            final boolean alternative = field.isAnnotationPresent(Alternative.class);
+            final Set<Type> types = new HashSet<Type>()
+            {
+               /** default value. Added only to suppress compiler warnings. */
+               private static final long serialVersionUID = 1L;
+               {
+                  add(EntityManagerFactory.class);
+                  add(Object.class);
+               }
+            };
+
+            // create and register a bean for the EMF
+            emfBeans.put(unitName, new Bean<EntityManagerFactory>()
+            {
+               public Set<Type> getTypes()
+               {
+                  return types;
+               }
+
+               public Class<? extends Annotation> getScope()
+               {
+                  return ApplicationScoped.class;
+               }
+
+               public EntityManagerFactory create(CreationalContext<EntityManagerFactory> ctx)
+               {
+                  return Persistence.createEntityManagerFactory(unitName);
+               }
+
+               public void destroy(EntityManagerFactory emf, CreationalContext<EntityManagerFactory> ctx)
+               {
+                  emf.close();
+                  ctx.release();
+               }
+
+               public Class<?> getBeanClass()
+               {
+                  return module;
+               }
+
+               public Set<InjectionPoint> getInjectionPoints()
+               {
+                  return Collections.emptySet();
+               }
+
+               public String getName()
+               {
+                  return null;
+               }
+
+               public Set<Annotation> getQualifiers()
+               {
+                  return qualifiers;
+               }
+
+               public Set<Class<? extends Annotation>> getStereotypes()
+               {
+                  return Collections.emptySet();
+
+               }
+
+               public boolean isAlternative()
+               {
+                  return alternative;
+               }
+
+               public boolean isNullable()
+               {
+                  return false;
+               }
+            });
+
+         }
+         else
+         {
+            throw new RuntimeException("There can only be one producer per persistence unit");
+         }
+
+         Producer<EntityManager> producer = new Producer<EntityManager>()
+         {
+            public Set<InjectionPoint> getInjectionPoints()
+            {
+               return Collections.emptySet();
+            }
+
+            public EntityManager produce(CreationalContext<EntityManager> ctx)
+            {
+               return getFactory(ctx).createEntityManager();
+            }
+
+            private EntityManagerFactory getFactory(CreationalContext<EntityManager> ctx)
+            {
+               return (EntityManagerFactory) bm.getReference(emfBeans.get(unitName), EntityManagerFactory.class, ctx);
+            }
+
+            public void dispose(EntityManager em)
+            {
+               if (em.isOpen()) // work around what I suspect is a bug in Weld
+               {
+                  em.close();
+               }
+            }
+         };
+         pp.setProducer(producer);
+      }
+   }
+
+   /**
+    * Register the EMF bean with the container.
+    */
+   void afterBeanDiscovery(@Observes AfterBeanDiscovery abd)
+   {
+      for (Bean<EntityManagerFactory> emfBean : emfBeans.values())
+      {
+         abd.addBean(emfBean);
+      }
+   }
+
+   /**
+    * Check whether persistence is container managed. For now, this simply
+    * checks for the presence of the EJB API. If it's present, we assume
+    * this is an EE environment and that persistence is container managed.
+    */
+   boolean isPersistenceContainerManaged() {
+      boolean eeEnv = true;
+      try
+      {
+         if (Thread.currentThread().getContextClassLoader() != null)
+         {
+            Thread.currentThread().getContextClassLoader().loadClass("javax.ejb.Stateless");
+         }
+         else
+         {
+            Class.forName("javax.ejb.Stateless");
+         }
+      }
+      catch (ClassNotFoundException e)
+      {
+         eeEnv = false;
+      }
+      catch (NoClassDefFoundError e)
+      {
+         eeEnv = false;
+      }
+
+      return eeEnv;
+   }
+}

Copied: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/AbstractUserTransaction.java (from rev 13427, modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/AbstractUserTransaction.java)
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/AbstractUserTransaction.java	                        (rev 0)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/AbstractUserTransaction.java	2010-07-18 08:51:36 UTC (rev 13428)
@@ -0,0 +1,107 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.transaction;
+
+import static javax.transaction.Status.STATUS_ACTIVE;
+import static javax.transaction.Status.STATUS_COMMITTED;
+import static javax.transaction.Status.STATUS_MARKED_ROLLBACK;
+import static javax.transaction.Status.STATUS_NO_TRANSACTION;
+import static javax.transaction.Status.STATUS_ROLLEDBACK;
+
+import javax.persistence.EntityManager;
+import javax.transaction.Synchronization;
+import javax.transaction.SystemException;
+
+/**
+ * Base implementation of UserTransaction
+ * 
+ * @author Gavin King
+ * 
+ */
+public abstract class AbstractUserTransaction implements UserTransaction
+{
+
+   private final Synchronizations synchronizations;
+
+   public AbstractUserTransaction(Synchronizations synchronizations)
+   {
+      this.synchronizations = synchronizations;
+   }
+
+   public boolean isActive() throws SystemException
+   {
+      return getStatus() == STATUS_ACTIVE;
+   }
+
+   public boolean isActiveOrMarkedRollback() throws SystemException
+   {
+      int status = getStatus();
+      return status == STATUS_ACTIVE || status == STATUS_MARKED_ROLLBACK;
+   }
+
+   public boolean isRolledBackOrMarkedRollback() throws SystemException
+   {
+      int status = getStatus();
+      return status == STATUS_ROLLEDBACK || status == STATUS_MARKED_ROLLBACK;
+   }
+
+   public boolean isMarkedRollback() throws SystemException
+   {
+      return getStatus() == STATUS_MARKED_ROLLBACK;
+   }
+
+   public boolean isNoTransaction() throws SystemException
+   {
+      return getStatus() == STATUS_NO_TRANSACTION;
+   }
+
+   public boolean isRolledBack() throws SystemException
+   {
+      return getStatus() == STATUS_ROLLEDBACK;
+   }
+
+   public boolean isCommitted() throws SystemException
+   {
+      return getStatus() == STATUS_COMMITTED;
+   }
+
+   public boolean isConversationContextRequired()
+   {
+      return false;
+   }
+
+   public abstract void registerSynchronization(Synchronization sync);
+
+   public void enlist(EntityManager entityManager) throws SystemException
+   {
+      if (isActiveOrMarkedRollback())
+      {
+         entityManager.joinTransaction();
+      }
+   }
+
+   public Synchronizations getSynchronizations()
+   {
+      return synchronizations;
+   }
+
+}

Copied: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/AfterTransactionCompletion.java (from rev 13427, modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/AfterTransactionCompletion.java)
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/AfterTransactionCompletion.java	                        (rev 0)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/AfterTransactionCompletion.java	2010-07-18 08:51:36 UTC (rev 13428)
@@ -0,0 +1,37 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.transaction;
+
+public class AfterTransactionCompletion
+{
+   private final boolean success;
+
+   public AfterTransactionCompletion(boolean success)
+   {
+      this.success = success;
+   }
+
+   public boolean success()
+   {
+      return success;
+   }
+}

Copied: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/BeforeTransactionCompletion.java (from rev 13427, modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/BeforeTransactionCompletion.java)
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/BeforeTransactionCompletion.java	                        (rev 0)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/BeforeTransactionCompletion.java	2010-07-18 08:51:36 UTC (rev 13428)
@@ -0,0 +1,27 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.transaction;
+
+public class BeforeTransactionCompletion
+{
+
+}

Copied: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/CMTTransaction.java (from rev 13427, modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/CMTTransaction.java)
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/CMTTransaction.java	                        (rev 0)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/CMTTransaction.java	2010-07-18 08:51:36 UTC (rev 13428)
@@ -0,0 +1,149 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.transaction;
+
+import javax.ejb.EJBContext;
+import javax.transaction.HeuristicMixedException;
+import javax.transaction.HeuristicRollbackException;
+import javax.transaction.NotSupportedException;
+import javax.transaction.RollbackException;
+import javax.transaction.Status;
+import javax.transaction.Synchronization;
+import javax.transaction.SystemException;
+import javax.transaction.UserTransaction;
+
+import org.jboss.weld.extensions.core.Veto;
+
+/**
+ * Wraps EJBContext transaction management in a UserTransaction interface. Note
+ * that container managed transactions cannot be controlled by the application,
+ * so begin(), commit() and rollback() are disallowed in a CMT.
+ * 
+ * @author Mike Youngstrom
+ * @author Gavin King
+ * @author Stuart Douglas
+ * 
+ */
+ at Veto
+public class CMTTransaction extends AbstractUserTransaction
+{
+
+   private final EJBContext ejbContext;
+
+   public CMTTransaction(EJBContext ejbContext, Synchronizations sync)
+   {
+      super(sync);
+      this.ejbContext = ejbContext;
+      if (ejbContext == null)
+      {
+         throw new IllegalArgumentException("null EJBContext");
+      }
+   }
+
+   public void begin() throws NotSupportedException, SystemException
+   {
+      ejbContext.getUserTransaction().begin();
+      getSynchronizations().afterTransactionBegin();
+   }
+
+   public void commit() throws RollbackException, HeuristicMixedException, HeuristicRollbackException, SecurityException, IllegalStateException, SystemException
+   {
+      UserTransaction userTransaction = ejbContext.getUserTransaction();
+      boolean success = false;
+      Synchronizations synchronizations = getSynchronizations();
+      synchronizations.beforeTransactionCommit();
+      try
+      {
+         userTransaction.commit();
+         success = true;
+      }
+      finally
+      {
+         synchronizations.afterTransactionCommit(success);
+      }
+   }
+
+   public void rollback() throws IllegalStateException, SecurityException, SystemException
+   {
+      UserTransaction userTransaction = ejbContext.getUserTransaction();
+      try
+      {
+         userTransaction.rollback();
+      }
+      finally
+      {
+         getSynchronizations().afterTransactionRollback();
+      }
+   }
+
+   public int getStatus() throws SystemException
+   {
+      try
+      {
+         // TODO: not correct for SUPPORTS or NEVER!
+         if (!ejbContext.getRollbackOnly())
+         {
+            return Status.STATUS_ACTIVE;
+         }
+         else
+         {
+            return Status.STATUS_MARKED_ROLLBACK;
+         }
+      }
+      catch (IllegalStateException ise)
+      {
+         try
+         {
+            return ejbContext.getUserTransaction().getStatus();
+         }
+         catch (IllegalStateException is)
+         {
+            return Status.STATUS_NO_TRANSACTION;
+         }
+      }
+   }
+
+   public void setRollbackOnly() throws IllegalStateException, SystemException
+   {
+      ejbContext.setRollbackOnly();
+   }
+
+   public void setTransactionTimeout(int timeout) throws SystemException
+   {
+      ejbContext.getUserTransaction().setTransactionTimeout(timeout);
+   }
+
+   @Override
+   public void registerSynchronization(Synchronization sync)
+   {
+      Synchronizations synchronizations = getSynchronizations();
+      if (synchronizations.isAwareOfContainerTransactions())
+      {
+         synchronizations.registerSynchronization(sync);
+      }
+      else
+      {
+         throw new UnsupportedOperationException("cannot register synchronization with container transaction, use <transaction:ejb-transaction/>");
+      }
+   }
+
+}

Copied: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/EJB.java (from rev 13427, modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/EJB.java)
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/EJB.java	                        (rev 0)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/EJB.java	2010-07-18 08:51:36 UTC (rev 13428)
@@ -0,0 +1,60 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.transaction;
+
+import javax.ejb.EJBContext;
+import javax.naming.NameNotFoundException;
+import javax.naming.NamingException;
+
+/**
+ * utility class to look up the EJBContext
+ * 
+ * 
+ */
+public class EJB
+{
+   public static String ejbContextName = "java:comp.ejb3/EJBContext";
+   public static final String STANDARD_EJB_CONTEXT_NAME = "java:comp/EJBContext";
+
+   public static EJBContext getEJBContext() throws NamingException
+   {
+      try
+      {
+         return (EJBContext) Naming.getInitialContext().lookup(ejbContextName);
+      }
+      catch (NameNotFoundException nnfe)
+      {
+         return (EJBContext) Naming.getInitialContext().lookup(STANDARD_EJB_CONTEXT_NAME);
+      }
+   }
+
+   protected static String getEjbContextName()
+   {
+      return ejbContextName;
+   }
+
+   protected static void setEjbContextName(String ejbContextName)
+   {
+      EJB.ejbContextName = ejbContextName;
+   }
+
+}

Copied: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/EjbSynchronizations.java (from rev 13427, modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/EjbSynchronizations.java)
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/EjbSynchronizations.java	                        (rev 0)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/EjbSynchronizations.java	2010-07-18 08:51:36 UTC (rev 13428)
@@ -0,0 +1,135 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.transaction;
+
+import java.rmi.RemoteException;
+import java.util.LinkedList;
+
+import javax.ejb.EJBException;
+import javax.ejb.Remove;
+import javax.ejb.SessionSynchronization;
+import javax.ejb.Stateful;
+import javax.ejb.TransactionAttribute;
+import javax.ejb.TransactionAttributeType;
+import javax.enterprise.context.RequestScoped;
+import javax.enterprise.inject.spi.BeanManager;
+import javax.inject.Inject;
+import javax.transaction.Synchronization;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Receives JTA transaction completion notifications from the EJB container, and
+ * passes them on to the registered Synchronizations. This implementation is
+ * fully aware of container managed transactions and is able to register
+ * Synchronizations for the container transaction.
+ * 
+ * @author Gavin King
+ * 
+ */
+ at Stateful
+ at RequestScoped
+ at TransactionAttribute(TransactionAttributeType.SUPPORTS)
+public class EjbSynchronizations implements LocalEjbSynchronizations, SessionSynchronization
+{
+   private static final Logger log = LoggerFactory.getLogger(EjbSynchronizations.class);
+
+   @Inject
+   private BeanManager beanManager;
+
+   // maintain two lists to work around a bug in JBoss EJB3 where a new
+   // SessionSynchronization
+   // gets registered each time the bean is called
+   protected LinkedList<SynchronizationRegistry> synchronizations = new LinkedList<SynchronizationRegistry>();
+   protected LinkedList<SynchronizationRegistry> committing = new LinkedList<SynchronizationRegistry>();
+
+   public void afterBegin()
+   {
+      log.debug("afterBegin");
+      synchronizations.addLast(new SynchronizationRegistry(beanManager));
+   }
+
+   public void beforeCompletion() throws EJBException, RemoteException
+   {
+      log.debug("beforeCompletion");
+      SynchronizationRegistry sync = synchronizations.removeLast();
+      sync.beforeTransactionCompletion();
+      committing.addLast(sync);
+   }
+
+   public void afterCompletion(boolean success) throws EJBException, RemoteException
+   {
+      log.debug("afterCompletion");
+      if (committing.isEmpty())
+      {
+         if (success)
+         {
+            throw new IllegalStateException("beforeCompletion was never called");
+         }
+         else
+         {
+            synchronizations.removeLast().afterTransactionCompletion(false);
+         }
+      }
+      else
+      {
+         committing.removeFirst().afterTransactionCompletion(success);
+      }
+   }
+
+   public boolean isAwareOfContainerTransactions()
+   {
+      return true;
+   }
+
+   public void afterTransactionBegin()
+   {
+      // noop, let JTA notify us
+   }
+
+   public void afterTransactionCommit(boolean success)
+   {
+      // noop, let JTA notify us
+   }
+
+   public void afterTransactionRollback()
+   {
+      // noop, let JTA notify us
+   }
+
+   public void beforeTransactionCommit()
+   {
+      // noop, let JTA notify us
+   }
+
+   public void registerSynchronization(Synchronization sync)
+   {
+      synchronizations.getLast().registerSynchronization(sync);
+   }
+
+   @Remove
+   public void destroy()
+   {
+   }
+
+}

Copied: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/EntityTransaction.java (from rev 13427, modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/EntityTransaction.java)
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/EntityTransaction.java	                        (rev 0)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/EntityTransaction.java	2010-07-18 08:51:36 UTC (rev 13428)
@@ -0,0 +1,181 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.transaction;
+
+import javax.enterprise.context.RequestScoped;
+import javax.inject.Inject;
+import javax.persistence.EntityManager;
+import javax.transaction.HeuristicMixedException;
+import javax.transaction.HeuristicRollbackException;
+import javax.transaction.NotSupportedException;
+import javax.transaction.RollbackException;
+import javax.transaction.Status;
+import javax.transaction.Synchronization;
+import javax.transaction.SystemException;
+
+import org.jboss.weld.extensions.core.Veto;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Support for the JPA EntityTransaction API.
+ * 
+ * Adapts JPA transaction management to a Seam UserTransaction 
+ * interface.For use in non-JTA-capable environments.
+ * 
+ * @author Gavin King
+ * 
+ */
+ at RequestScoped
+ at Veto
+public class EntityTransaction extends AbstractUserTransaction
+{
+   private static final Logger log = LoggerFactory.getLogger(EntityTransaction.class);
+   
+   @Inject
+   private EntityManager entityManager;
+   
+   
+   @Inject
+   public EntityTransaction(Synchronizations sync)
+   {
+      super(sync);
+   }
+
+   private javax.persistence.EntityTransaction getDelegate()
+   {
+      return entityManager.getTransaction();
+   }
+
+   public void begin() throws NotSupportedException, SystemException
+   {
+      log.debug("beginning JPA resource-local transaction");
+      //TODO: translate exceptions that occur into the correct JTA exception
+      try
+      {
+         getDelegate().begin();
+         getSynchronizations().afterTransactionBegin();
+      }
+      catch (RuntimeException re)
+      {
+         throw re;
+      }
+   }
+
+   public void commit() throws RollbackException, HeuristicMixedException,
+            HeuristicRollbackException, SecurityException, IllegalStateException, SystemException
+   {
+      log.debug("committing JPA resource-local transaction");
+      javax.persistence.EntityTransaction delegate = getDelegate();
+      boolean success = false;
+      try
+      {
+         if ( delegate.getRollbackOnly() )
+         {
+            delegate.rollback();
+            throw new RollbackException();
+         }
+         else
+         {
+            getSynchronizations().beforeTransactionCommit();
+            delegate.commit();
+            success = true;
+         }
+      }
+      finally
+      {
+         getSynchronizations().afterTransactionCommit(success);
+      }
+   }
+
+   public void rollback() throws IllegalStateException, SecurityException, SystemException
+   {
+      log.debug("rolling back JPA resource-local transaction");
+      //TODO: translate exceptions that occur into the correct JTA exception
+      javax.persistence.EntityTransaction delegate = getDelegate();
+      try
+      {
+         delegate.rollback();
+      }
+      finally
+      {
+         getSynchronizations().afterTransactionRollback();
+      }
+   }
+
+   public void setRollbackOnly() throws IllegalStateException, SystemException
+   {
+      log.debug("marking JPA resource-local transaction for rollback");
+      getDelegate().setRollbackOnly();
+   }
+
+   public int getStatus() throws SystemException
+   {
+      if (getDelegate().getRollbackOnly())
+      {
+         return Status.STATUS_MARKED_ROLLBACK;
+      }
+      else if (getDelegate().isActive())
+      {
+         return Status.STATUS_ACTIVE;
+      }
+      else
+      {
+         return Status.STATUS_NO_TRANSACTION;
+      }
+   }
+
+   public void setTransactionTimeout(int timeout) throws SystemException
+   {
+      throw new UnsupportedOperationException();
+   }
+
+   @Override
+   public void registerSynchronization(Synchronization sync)
+   {
+      if ( log.isDebugEnabled() )
+      {
+         log.debug("registering synchronization: " + sync);
+      }
+      //try to register the synchronization directly with the
+      //persistence provider, but if this fails, just hold
+      //on to it myself
+      // if ( !PersistenceProvider.instance().registerSynchronization(sync,
+      // currentEntityManager) )
+      // {
+      // getSynchronizations().registerSynchronization(sync);
+      // }
+   }
+
+   @Override
+   public boolean isConversationContextRequired()
+   {
+      return true;
+   }
+
+   @Override
+   public void enlist(EntityManager entityManager)
+   {
+      //no-op
+   }
+
+}

Deleted: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/JtaTxInterceptor.java
===================================================================
--- modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/JtaTxInterceptor.java	2010-07-15 04:17:18 UTC (rev 13402)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/JtaTxInterceptor.java	2010-07-18 08:51:36 UTC (rev 13428)
@@ -1,123 +0,0 @@
-package org.jboss.seam.transaction;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Method;
-import javax.inject.Inject;
-import javax.interceptor.AroundInvoke;
-import javax.interceptor.Interceptor;
-import javax.interceptor.InvocationContext;
-import javax.transaction.Status;
-import javax.transaction.UserTransaction;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * A rudimentary transaction interceptor implementation, intended as a proof
- * of concept.
- *
- * @author Matt Corey
- * @author Dan Allen
- */
-public @Transactional @Interceptor class JtaTxInterceptor {
-
-   private static final Logger log = LoggerFactory.getLogger(JtaTxInterceptor.class);
-
-   @Inject private UserTransaction utx;
-
-   /**
-    * Super quick impl. Needs to be done correctly.
-    */
-   @AroundInvoke
-   public Object workInTransaction(InvocationContext ic) throws Exception {
-      // TODO cache this information
-      TransactionPropagation type = getTransactionPropagation(ic.getMethod());
-
-      int status = utx.getStatus();
-      boolean transactionActive = (status == Status.STATUS_ACTIVE || status == Status.STATUS_MARKED_ROLLBACK);
-      boolean beginTransaction = isNewTransactionRequired(type, transactionActive);
-
-      if (beginTransaction) {
-         log.debug("Beginning transaction");
-         utx.begin();
-      }
-
-      Object result = null;
-      try {
-         result = ic.proceed();
-
-         if (beginTransaction) {
-            if (utx.getStatus() == Status.STATUS_MARKED_ROLLBACK) {
-               log.debug("Rolling back transaction marked for rollback");
-               utx.rollback();
-            }
-            else {
-               log.debug("Committing transaction");
-               utx.commit();
-            }
-         }
-
-         return result;
-      } catch (Exception e) {
-         if (beginTransaction && utx.getStatus() != Status.STATUS_NO_TRANSACTION) {
-            // FIXME don't rollback if this is an application exception which indicates no rollback
-            log.debug("Rolling back transaction as the result of an exception");
-            utx.rollback();
-         }
-
-         throw e;
-      }
-   }
-
-    /**
-     * Get the TransactionPropagation value
-     * FIXME cache this information
-     */
-    private TransactionPropagation getTransactionPropagation(Method m) {
-       // first look at the explicit method-level annotation
-       if (m.isAnnotationPresent(Transactional.class)) {
-          return m.getAnnotation(Transactional.class).value();
-       }
-        // now look at the method-level meta-annotations
-        for (Annotation a: m.getAnnotations()) {
-            if (a.annotationType().isAnnotationPresent(Transactional.class)) {
-                return a.annotationType().getAnnotation(Transactional.class).value();
-            }
-        }
-        // now try the explicit class-level annotation
-        if (m.getDeclaringClass().isAnnotationPresent(Transactional.class)) {
-           return m.getDeclaringClass().getAnnotation(Transactional.class).value();
-        }
-        // finally, try the class-level meta-annotations
-        for (Annotation a: m.getDeclaringClass().getAnnotations()) {
-            if (a.annotationType().isAnnotationPresent(Transactional.class)) {
-                return a.annotationType().getAnnotation(Transactional.class).value();
-            }
-        }
-        return null;
-    }
-
-   private boolean isNewTransactionRequired(TransactionPropagation type, boolean transactionActive) {
-      switch (type) {
-         case REQUIRED:
-            return !transactionActive;
-         case SUPPORTS:
-            return false;
-         case MANDATORY:
-            if (!transactionActive) {
-               throw new IllegalStateException("No transaction active on call to method that requires a transaction.");
-            }
-            else {
-               return false;
-            }
-         case NEVER:
-            if (transactionActive) {
-               throw new IllegalStateException("Transaction active on call to method that does not support transactions.");
-            }
-            else {
-               return false;
-            }
-         default:
-            throw new IllegalArgumentException("Unknown transaction type " + type);
-      }
-   }
-}
\ No newline at end of file

Copied: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/JtaTxInterceptor.java (from rev 13427, modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/JtaTxInterceptor.java)
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/JtaTxInterceptor.java	                        (rev 0)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/JtaTxInterceptor.java	2010-07-18 08:51:36 UTC (rev 13428)
@@ -0,0 +1,146 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.transaction;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Method;
+
+import javax.inject.Inject;
+import javax.interceptor.AroundInvoke;
+import javax.interceptor.Interceptor;
+import javax.interceptor.InvocationContext;
+import javax.transaction.Status;
+import javax.transaction.UserTransaction;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * A rudimentary transaction interceptor implementation, intended as a proof
+ * of concept.
+ *
+ * @author Matt Corey
+ * @author Dan Allen
+ */
+public @Transactional @Interceptor class JtaTxInterceptor {
+
+   private static final Logger log = LoggerFactory.getLogger(JtaTxInterceptor.class);
+
+   @Inject private UserTransaction utx;
+
+   /**
+    * Super quick impl. Needs to be done correctly.
+    */
+   @AroundInvoke
+   public Object workInTransaction(InvocationContext ic) throws Exception {
+      // TODO cache this information
+      TransactionPropagation type = getTransactionPropagation(ic.getMethod());
+
+      int status = utx.getStatus();
+      boolean transactionActive = (status == Status.STATUS_ACTIVE || status == Status.STATUS_MARKED_ROLLBACK);
+      boolean beginTransaction = isNewTransactionRequired(type, transactionActive);
+
+      if (beginTransaction) {
+         log.debug("Beginning transaction");
+         utx.begin();
+      }
+
+      Object result = null;
+      try {
+         result = ic.proceed();
+
+         if (beginTransaction) {
+            if (utx.getStatus() == Status.STATUS_MARKED_ROLLBACK) {
+               log.debug("Rolling back transaction marked for rollback");
+               utx.rollback();
+            }
+            else {
+               log.debug("Committing transaction");
+               utx.commit();
+            }
+         }
+
+         return result;
+      } catch (Exception e) {
+         if (beginTransaction && utx.getStatus() != Status.STATUS_NO_TRANSACTION) {
+            // FIXME don't rollback if this is an application exception which indicates no rollback
+            log.debug("Rolling back transaction as the result of an exception");
+            utx.rollback();
+         }
+
+         throw e;
+      }
+   }
+
+    /**
+     * Get the TransactionPropagation value
+     * FIXME cache this information
+     */
+    private TransactionPropagation getTransactionPropagation(Method m) {
+       // first look at the explicit method-level annotation
+       if (m.isAnnotationPresent(Transactional.class)) {
+          return m.getAnnotation(Transactional.class).value();
+       }
+        // now look at the method-level meta-annotations
+        for (Annotation a: m.getAnnotations()) {
+            if (a.annotationType().isAnnotationPresent(Transactional.class)) {
+                return a.annotationType().getAnnotation(Transactional.class).value();
+            }
+        }
+        // now try the explicit class-level annotation
+        if (m.getDeclaringClass().isAnnotationPresent(Transactional.class)) {
+           return m.getDeclaringClass().getAnnotation(Transactional.class).value();
+        }
+        // finally, try the class-level meta-annotations
+        for (Annotation a: m.getDeclaringClass().getAnnotations()) {
+            if (a.annotationType().isAnnotationPresent(Transactional.class)) {
+                return a.annotationType().getAnnotation(Transactional.class).value();
+            }
+        }
+        return null;
+    }
+
+   private boolean isNewTransactionRequired(TransactionPropagation type, boolean transactionActive) {
+      switch (type) {
+         case REQUIRED:
+            return !transactionActive;
+         case SUPPORTS:
+            return false;
+         case MANDATORY:
+            if (!transactionActive) {
+               throw new IllegalStateException("No transaction active on call to method that requires a transaction.");
+            }
+            else {
+               return false;
+            }
+         case NEVER:
+            if (transactionActive) {
+               throw new IllegalStateException("Transaction active on call to method that does not support transactions.");
+            }
+            else {
+               return false;
+            }
+         default:
+            throw new IllegalArgumentException("Unknown transaction type " + type);
+      }
+   }
+}
\ No newline at end of file

Copied: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/LocalEjbSynchronizations.java (from rev 13427, modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/LocalEjbSynchronizations.java)
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/LocalEjbSynchronizations.java	                        (rev 0)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/LocalEjbSynchronizations.java	2010-07-18 08:51:36 UTC (rev 13428)
@@ -0,0 +1,36 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.transaction;
+
+import javax.ejb.Local;
+
+/**
+ * Local interface for EjbTransaction
+ * 
+ * @author Gavin King
+ * 
+ */
+ at Local
+public interface LocalEjbSynchronizations extends Synchronizations
+{
+   public void destroy();
+}

Copied: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/Naming.java (from rev 13427, modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/Naming.java)
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/Naming.java	                        (rev 0)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/Naming.java	2010-07-18 08:51:36 UTC (rev 13428)
@@ -0,0 +1,104 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.transaction;
+
+import java.util.Hashtable;
+
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * this has been ported to seam and hacked to make it work
+ * 
+ * we need to figure out what we are doing with JNDI in seam 3 and make this go
+ * away
+ * 
+ * @author stuart
+ * 
+ */
+public final class Naming
+{
+   private static final Logger log = LoggerFactory.getLogger(Naming.class);
+   private static Hashtable initialContextProperties;
+
+   private static InitialContext initialContext;
+
+   public static InitialContext getInitialContext(Hashtable<String, String> props) throws NamingException
+   {
+      if (props == null)
+      {
+         // throw new
+         // IllegalStateException("JNDI properties not initialized, Seam was not started correctly");
+      }
+      props = new Hashtable<String, String>();
+
+      if (log.isDebugEnabled())
+      {
+         log.debug("JNDI InitialContext properties:" + props);
+      }
+
+      try
+      {
+         return props.size() == 0 ? new InitialContext() : new InitialContext(props);
+      }
+      catch (NamingException e)
+      {
+         log.debug("Could not obtain initial context");
+         throw e;
+      }
+
+   }
+
+   public static InitialContext getInitialContext() throws NamingException
+   {
+      if (initialContext == null)
+         initInitialContext();
+
+      return initialContext;
+   }
+
+   private static synchronized void initInitialContext() throws NamingException
+   {
+      if (initialContext == null)
+      {
+         initialContext = getInitialContext(initialContextProperties);
+      }
+   }
+
+   private Naming()
+   {
+   }
+
+   public static void setInitialContextProperties(Hashtable initialContextProperties)
+   {
+      Naming.initialContextProperties = initialContextProperties;
+      initialContext = null;
+   }
+
+   public static Hashtable getInitialContextProperties()
+   {
+      return initialContextProperties;
+   }
+}

Copied: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/NoTransaction.java (from rev 13427, modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/NoTransaction.java)
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/NoTransaction.java	                        (rev 0)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/NoTransaction.java	2010-07-18 08:51:36 UTC (rev 13428)
@@ -0,0 +1,93 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.transaction;
+
+import javax.persistence.EntityManager;
+import javax.transaction.HeuristicMixedException;
+import javax.transaction.HeuristicRollbackException;
+import javax.transaction.NotSupportedException;
+import javax.transaction.RollbackException;
+import javax.transaction.Status;
+import javax.transaction.Synchronization;
+import javax.transaction.SystemException;
+
+import org.jboss.weld.extensions.core.Veto;
+
+/**
+ * When no kind of transaction management exists.
+ * 
+ * @author Mike Youngstrom
+ * @author Gavin King
+ * 
+ */
+ at Veto
+public class NoTransaction extends AbstractUserTransaction
+{
+
+   public NoTransaction()
+   {
+      super(null);
+   }
+
+   public void begin() throws NotSupportedException, SystemException
+   {
+      throw new UnsupportedOperationException("no transaction");
+   }
+
+   public void commit() throws RollbackException, HeuristicMixedException, HeuristicRollbackException, SecurityException, IllegalStateException, SystemException
+   {
+      throw new UnsupportedOperationException("no transaction");
+   }
+
+   public int getStatus() throws SystemException
+   {
+      return Status.STATUS_NO_TRANSACTION;
+   }
+
+   public void rollback() throws IllegalStateException, SecurityException, SystemException
+   {
+      throw new UnsupportedOperationException("no transaction");
+   }
+
+   public void setRollbackOnly() throws IllegalStateException, SystemException
+   {
+      throw new UnsupportedOperationException("no transaction");
+   }
+
+   public void setTransactionTimeout(int timeout) throws SystemException
+   {
+      throw new UnsupportedOperationException("no transaction");
+   }
+
+   @Override
+   public void registerSynchronization(Synchronization sync)
+   {
+      throw new UnsupportedOperationException("no transaction");
+   }
+
+   @Override
+   public void enlist(EntityManager entityManager) throws SystemException
+   {
+      // no-op
+   }
+
+}

Copied: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/SeSynchronizations.java (from rev 13427, modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/SeSynchronizations.java)
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/SeSynchronizations.java	                        (rev 0)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/SeSynchronizations.java	2010-07-18 08:51:36 UTC (rev 13428)
@@ -0,0 +1,97 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.transaction;
+
+import java.util.Stack;
+
+import javax.enterprise.context.RequestScoped;
+import javax.enterprise.inject.Alternative;
+import javax.enterprise.inject.spi.BeanManager;
+import javax.inject.Inject;
+import javax.transaction.Synchronization;
+
+/**
+ * This implementation does not have access to the JTA TransactionManager, so it
+ * is not fully aware of container managed transaction lifecycle, and is not
+ * able to register Synchronizations with a container managed transaction.
+ * 
+ * This is an alternative, and as such must be enabled in beans.xml.
+ * 
+ * @author Gavin King
+ * @author Stuart Douglas
+ */
+ at RequestScoped
+ at Alternative
+public class SeSynchronizations implements Synchronizations
+{
+   protected Stack<SynchronizationRegistry> synchronizations = new Stack<SynchronizationRegistry>();
+
+   @Inject
+   private BeanManager beanManager;
+
+   public void afterTransactionBegin()
+   {
+      synchronizations.push(new SynchronizationRegistry(beanManager));
+   }
+
+   public void afterTransactionCommit(boolean success)
+   {
+      if (!synchronizations.isEmpty())
+      {
+         synchronizations.pop().afterTransactionCompletion(success);
+      }
+   }
+
+   public void afterTransactionRollback()
+   {
+      if (!synchronizations.isEmpty())
+      {
+         synchronizations.pop().afterTransactionCompletion(false);
+      }
+   }
+
+   public void beforeTransactionCommit()
+   {
+      if (!synchronizations.isEmpty())
+      {
+         synchronizations.peek().beforeTransactionCompletion();
+      }
+   }
+
+   public void registerSynchronization(Synchronization sync)
+   {
+      if (synchronizations.isEmpty())
+      {
+         throw new IllegalStateException("Transaction begin not detected, try installing transaction:ejb-transaction in components.xml");
+      }
+      else
+      {
+         synchronizations.peek().registerSynchronization(sync);
+      }
+   }
+
+   public boolean isAwareOfContainerTransactions()
+   {
+      return false;
+   }
+
+}

Copied: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/SynchronizationRegistry.java (from rev 13427, modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/SynchronizationRegistry.java)
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/SynchronizationRegistry.java	                        (rev 0)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/SynchronizationRegistry.java	2010-07-18 08:51:36 UTC (rev 13428)
@@ -0,0 +1,94 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.transaction;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.enterprise.inject.spi.BeanManager;
+import javax.transaction.Status;
+import javax.transaction.Synchronization;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * A list of Synchronizations to be invoked before and after transaction
+ * completion. This class is used when we can't register a synchronization
+ * directly with JTA.
+ * 
+ * @author Gavin King
+ * 
+ */
+class SynchronizationRegistry
+{
+
+   private final BeanManager beanManager;
+
+   public SynchronizationRegistry(BeanManager beanManager)
+   {
+      this.beanManager = beanManager;
+   }
+
+   private static final Logger log = LoggerFactory.getLogger(SynchronizationRegistry.class);
+
+   private List<Synchronization> synchronizations = new ArrayList<Synchronization>();
+
+   void registerSynchronization(Synchronization sync)
+   {
+      synchronizations.add(sync);
+   }
+
+   void afterTransactionCompletion(boolean success)
+   {
+      beanManager.fireEvent(new AfterTransactionCompletion(success));
+      for (Synchronization sync : synchronizations)
+      {
+         try
+         {
+            sync.afterCompletion(success ? Status.STATUS_COMMITTED : Status.STATUS_ROLLEDBACK);
+         }
+         catch (Exception e)
+         {
+            log.error("Exception processing transaction Synchronization after completion", e);
+         }
+      }
+      synchronizations.clear();
+   }
+
+   void beforeTransactionCompletion()
+   {
+      beanManager.fireEvent(new BeforeTransactionCompletion());
+      for (Synchronization sync : synchronizations)
+      {
+         try
+         {
+            sync.beforeCompletion();
+         }
+         catch (Exception e)
+         {
+            log.error("Exception processing transaction Synchronization before completion", e);
+         }
+      }
+   }
+
+}

Copied: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/Synchronizations.java (from rev 13427, modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/Synchronizations.java)
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/Synchronizations.java	                        (rev 0)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/Synchronizations.java	2010-07-18 08:51:36 UTC (rev 13428)
@@ -0,0 +1,45 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.transaction;
+
+import javax.transaction.Synchronization;
+
+/**
+ * Interface for registering transaction synchronizations
+ * 
+ * @author Gavin King
+ * 
+ */
+public interface Synchronizations
+{
+   public void afterTransactionBegin();
+
+   public void afterTransactionCommit(boolean success);
+
+   public void afterTransactionRollback();
+
+   public void beforeTransactionCommit();
+
+   public void registerSynchronization(Synchronization sync);
+
+   public boolean isAwareOfContainerTransactions();
+}
\ No newline at end of file

Copied: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/Transaction.java (from rev 13427, modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/Transaction.java)
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/Transaction.java	                        (rev 0)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/Transaction.java	2010-07-18 08:51:36 UTC (rev 13428)
@@ -0,0 +1,109 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.transaction;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.inject.Inject;
+import javax.naming.InitialContext;
+import javax.naming.NameNotFoundException;
+import javax.naming.NamingException;
+
+import org.jboss.weld.extensions.managedproducer.ManagedProducer;
+
+/**
+ * Supports injection of a Seam UserTransaction object that wraps the current
+ * JTA transaction or EJB container managed transaction.
+ * 
+ * @author Mike Youngstrom
+ * @author Gavin King
+ * @author Stuart Douglas
+ * 
+ */
+ at ApplicationScoped
+public class Transaction
+{
+
+   @Inject
+   Synchronizations synchronizations;
+
+   @ManagedProducer
+   @TransactionQualifier
+   public UserTransaction getTransaction() throws NamingException
+   {
+      try
+      {
+         return createUTTransaction();
+      }
+      catch (NameNotFoundException nnfe)
+      {
+         try
+         {
+            return createCMTTransaction();
+         }
+         catch (NameNotFoundException nnfe2)
+         {
+            return createNoTransaction();
+         }
+      }
+   }
+
+   protected UserTransaction createNoTransaction()
+   {
+      return new NoTransaction();
+   }
+
+   protected UserTransaction createCMTTransaction() throws NamingException
+   {
+      return new CMTTransaction(EJB.getEJBContext(), synchronizations);
+   }
+
+   protected UserTransaction createUTTransaction() throws NamingException
+   {
+      return new UTTransaction(getUserTransaction(), synchronizations);
+   }
+
+   protected javax.transaction.UserTransaction getUserTransaction() throws NamingException
+   {
+      InitialContext context = Naming.getInitialContext();
+      try
+      {
+         return (javax.transaction.UserTransaction) context.lookup("java:comp/UserTransaction");
+      }
+      catch (NameNotFoundException nnfe)
+      {
+         try
+         {
+            // Embedded JBoss has no java:comp/UserTransaction
+            javax.transaction.UserTransaction ut = (javax.transaction.UserTransaction) context.lookup("UserTransaction");
+            ut.getStatus(); // for glassfish, which can return an unusable UT
+            return ut;
+         }
+         catch (Exception e)
+         {
+            throw nnfe;
+         }
+      }
+   }
+
+}
+
+

Copied: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/TransactionExtension.java (from rev 13427, modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/TransactionExtension.java)
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/TransactionExtension.java	                        (rev 0)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/TransactionExtension.java	2010-07-18 08:51:36 UTC (rev 13428)
@@ -0,0 +1,157 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.transaction;
+
+import java.util.Collections;
+import java.util.Set;
+
+import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.event.Observes;
+import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.BeanManager;
+import javax.enterprise.inject.spi.BeforeBeanDiscovery;
+import javax.enterprise.inject.spi.Extension;
+import javax.enterprise.inject.spi.InjectionPoint;
+import javax.enterprise.inject.spi.InjectionTarget;
+
+import org.jboss.weld.extensions.annotated.AnnotatedTypeBuilder;
+import org.jboss.weld.extensions.bean.BeanBuilder;
+import org.jboss.weld.extensions.bean.BeanImpl;
+import org.jboss.weld.extensions.bean.BeanLifecycle;
+import org.jboss.weld.extensions.defaultbean.DefaultBeanExtension;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Extension than provides a {@link UserTransaction} if no other UserTransaction
+ * has been registered.
+ * 
+ * This allows the user to register a transaction via seam XML and have it
+ * automatically replace the default UserTransaction implementation
+ * 
+ * This is not done with alternatives, because that would require specifying the
+ * transaction manager on a per module basis, and some of the UserTransaction
+ * implementations need to be configured via seam xml anyway, so they would have
+ * to be configured twice
+ * 
+ * @author Stuart Douglas
+ * 
+ */
+public class TransactionExtension implements Extension
+{
+   private boolean transactionRegistered = false;
+
+   private static final Logger log = LoggerFactory.getLogger(TransactionExtension.class);
+
+   public void beforeBeanDiscovery(@Observes BeforeBeanDiscovery event,BeanManager manager)
+   {
+      AnnotatedTypeBuilder<UserTransaction> utbuilder = AnnotatedTypeBuilder.newInstance(UserTransaction.class);
+      BeanBuilder<UserTransaction> builder = new BeanBuilder<UserTransaction>(utbuilder.create(), manager);
+      builder.defineBeanFromAnnotatedType();
+
+      builder.setBeanLifecycle(new TransactionLifecycle(manager));
+      builder.setInjectionTarget(new NoOpInjectionTarget());
+      DefaultBeanExtension.addDefaultBean(UserTransaction.class, builder.create());
+   }
+
+   private static class TransactionLifecycle implements BeanLifecycle<UserTransaction>
+   {
+
+      private final BeanManager manager;
+
+      private Bean<?> transactionBean;
+
+      public TransactionLifecycle(BeanManager manager)
+      {
+         this.manager = manager;
+      }
+
+      public UserTransaction create(BeanImpl<UserTransaction> bean, CreationalContext<UserTransaction> ctx)
+      {
+         if (transactionBean == null)
+         {
+            // this does not need to be thread safe, it does not matter if this
+            // is initialised twice
+            setupBeanDefinition();
+         }
+         return (UserTransaction) manager.getReference(transactionBean, UserTransaction.class, ctx);
+      }
+
+      public void destroy(BeanImpl<UserTransaction> bean, UserTransaction arg0, CreationalContext<UserTransaction> arg1)
+      {
+         arg1.release();
+      }
+
+      /**
+       * we need to init the bean definition lazily
+       */
+      private void setupBeanDefinition()
+      {
+         Set<Bean<?>> beans = manager.getBeans(UserTransaction.class, new TransactionQualifier.TransactionQualifierLiteral());
+         if (beans.isEmpty())
+         {
+            log.error("No bean with type " + UserTransaction.class.getName() + " and qualifier " + TransactionQualifier.class.getName() + " registered, SEAM TRANSACTIONS ARE DISABLED");
+         }
+         else if (beans.size() > 1)
+         {
+            log.error("More than 1 bean with type " + UserTransaction.class.getName() + " and qualifier " + TransactionQualifier.class.getName() + " registered, SEAM TRANSACTIONS ARE DISABLED");
+         }
+         transactionBean = beans.iterator().next();
+      }
+
+   }
+
+   private static class NoOpInjectionTarget implements InjectionTarget<UserTransaction>
+   {
+
+      public UserTransaction produce(CreationalContext<UserTransaction> ctx)
+      {
+         return null;
+      }
+
+      public Set<InjectionPoint> getInjectionPoints()
+      {
+         return Collections.emptySet();
+      }
+
+      public void dispose(UserTransaction instance)
+      {
+
+      }
+
+      public void preDestroy(UserTransaction instance)
+      {
+
+      }
+
+      public void postConstruct(UserTransaction instance)
+      {
+
+      }
+
+      public void inject(UserTransaction instance, CreationalContext<UserTransaction> ctx)
+      {
+
+      }
+
+   }
+}

Copied: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/TransactionInterceptor.java (from rev 13427, modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/TransactionInterceptor.java)
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/TransactionInterceptor.java	                        (rev 0)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/TransactionInterceptor.java	2010-07-18 08:51:36 UTC (rev 13428)
@@ -0,0 +1,141 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.transaction;
+
+import java.lang.reflect.AnnotatedElement;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.inject.Inject;
+import javax.interceptor.AroundInvoke;
+import javax.interceptor.Interceptor;
+import javax.interceptor.InvocationContext;
+
+/**
+ * Implements transaction propagation rules for Seam JavaBean components.
+ * 
+ * @author Gavin King
+ * @author Shane Bryzak
+ */
+ at Transactional
+ at Interceptor
+public class TransactionInterceptor
+{
+   private static final long serialVersionUID = -4364203056333738988L;
+
+   transient private Map<AnnotatedElement, TransactionMetadata> transactionMetadata = new HashMap<AnnotatedElement, TransactionMetadata>();
+
+   @Inject
+   UserTransaction transaction;
+
+   private class TransactionMetadata
+   {
+      private boolean annotationPresent;
+      TransactionPropagation propType;
+
+      public TransactionMetadata(AnnotatedElement element)
+      {
+         annotationPresent = element.isAnnotationPresent(Transactional.class);
+
+         if (annotationPresent)
+         {
+            propType = element.getAnnotation(Transactional.class).value();
+         }
+      }
+
+      public boolean isAnnotationPresent()
+      {
+         return annotationPresent;
+      }
+
+      public boolean isNewTransactionRequired(boolean transactionActive)
+      {
+         return propType != null && propType.isNewTransactionRequired(transactionActive);
+      }
+   }
+
+   private TransactionMetadata lookupTransactionMetadata(AnnotatedElement element)
+   {
+      if (transactionMetadata == null)
+      {
+         transactionMetadata = new HashMap<AnnotatedElement, TransactionMetadata>();
+      }
+
+      TransactionMetadata metadata = transactionMetadata.get(element);
+
+      if (metadata == null)
+      {
+         metadata = loadMetadata(element);
+      }
+
+      return metadata;
+   }
+
+   private synchronized TransactionMetadata loadMetadata(AnnotatedElement element)
+   {
+      if (!transactionMetadata.containsKey(element))
+      {
+         TransactionMetadata metadata = new TransactionMetadata(element);
+         transactionMetadata.put(element, metadata);
+         return metadata;
+      }
+
+      return transactionMetadata.get(element);
+   }
+
+   @AroundInvoke
+   public Object aroundInvoke(final InvocationContext invocation) throws Exception
+   {
+      return new Work()
+      {
+
+         @Override
+         protected Object work() throws Exception
+         {
+            return invocation.proceed();
+         }
+
+         @Override
+         protected boolean isNewTransactionRequired(boolean transactionActive)
+         {
+            return isNewTransactionRequired(invocation.getMethod(), invocation.getTarget().getClass(), transactionActive);
+         }
+
+         private boolean isNewTransactionRequired(Method method, Class<?> beanClass, boolean transactionActive)
+         {
+            TransactionMetadata metadata = lookupTransactionMetadata(method);
+            if (metadata.isAnnotationPresent())
+            {
+               return metadata.isNewTransactionRequired(transactionActive);
+            }
+            else
+            {
+               metadata = lookupTransactionMetadata(beanClass);
+               return metadata.isNewTransactionRequired(transactionActive);
+            }
+         }
+
+      }.workInTransaction(transaction);
+   }
+
+}

Deleted: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/TransactionPropagation.java
===================================================================
--- modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/TransactionPropagation.java	2010-07-15 04:17:18 UTC (rev 13402)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/TransactionPropagation.java	2010-07-18 08:51:36 UTC (rev 13428)
@@ -1,8 +0,0 @@
-package org.jboss.seam.transaction;
-
-/**
- * @author Dan Allen
- */
-public enum TransactionPropagation {
-   REQUIRED, SUPPORTS, MANDATORY, NEVER;
-}
\ No newline at end of file

Copied: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/TransactionPropagation.java (from rev 13427, modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/TransactionPropagation.java)
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/TransactionPropagation.java	                        (rev 0)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/TransactionPropagation.java	2010-07-18 08:51:36 UTC (rev 13428)
@@ -0,0 +1,61 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.transaction;
+
+/**
+ * @author Dan Allen
+ */
+public enum TransactionPropagation
+{
+   REQUIRED, SUPPORTS, MANDATORY, NEVER;
+
+   public boolean isNewTransactionRequired(boolean transactionActive)
+   {
+      switch (this)
+      {
+      case REQUIRED:
+         return !transactionActive;
+      case SUPPORTS:
+         return false;
+      case MANDATORY:
+         if (!transactionActive)
+         {
+            throw new IllegalStateException("No transaction active on call to MANDATORY method");
+         }
+         else
+         {
+            return false;
+         }
+      case NEVER:
+         if (transactionActive)
+         {
+            throw new IllegalStateException("Transaction active on call to NEVER method");
+         }
+         else
+         {
+            return false;
+         }
+      default:
+         throw new IllegalArgumentException();
+      }
+   }
+}
\ No newline at end of file

Copied: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/TransactionQualifier.java (from rev 13427, modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/TransactionQualifier.java)
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/TransactionQualifier.java	                        (rev 0)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/TransactionQualifier.java	2010-07-18 08:51:36 UTC (rev 13428)
@@ -0,0 +1,44 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.transaction;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+import javax.enterprise.util.AnnotationLiteral;
+import javax.inject.Qualifier;
+
+/**
+ * Internal qualifier that is used to stop some beans from being exposed to the
+ * user
+ * 
+ * @author Stuart Douglas
+ * 
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+ at Qualifier
+ at interface TransactionQualifier
+{
+   public static class TransactionQualifierLiteral extends AnnotationLiteral<TransactionQualifier> implements TransactionQualifier
+   {
+   }
+}

Deleted: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/Transactional.java
===================================================================
--- modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/Transactional.java	2010-07-15 04:17:18 UTC (rev 13402)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/Transactional.java	2010-07-18 08:51:36 UTC (rev 13428)
@@ -1,25 +0,0 @@
-package org.jboss.seam.transaction;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import javax.enterprise.util.Nonbinding;
-import javax.interceptor.InterceptorBinding;
-
-/**
- * @author Dan Allen
- */
- at Inherited
- at InterceptorBinding
- at Retention(RetentionPolicy.RUNTIME)
- at Target({ElementType.METHOD, ElementType.TYPE})
-public @interface Transactional {
-   /**
-    * The transaction propagation type.
-    *
-    * @return REQUIRED by default
-    */
-   @Nonbinding TransactionPropagation value() default TransactionPropagation.REQUIRED;
-}
\ No newline at end of file

Copied: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/Transactional.java (from rev 13427, modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/Transactional.java)
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/Transactional.java	                        (rev 0)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/Transactional.java	2010-07-18 08:51:36 UTC (rev 13428)
@@ -0,0 +1,49 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.transaction;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import javax.enterprise.util.Nonbinding;
+import javax.interceptor.InterceptorBinding;
+
+/**
+ * @author Dan Allen
+ */
+ at Inherited
+ at InterceptorBinding
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target( { ElementType.METHOD, ElementType.TYPE })
+public @interface Transactional
+{
+   /**
+    * The transaction propagation type.
+    * 
+    * @return REQUIRED by default
+    */
+   @Nonbinding
+   TransactionPropagation value() default TransactionPropagation.REQUIRED;
+}
\ No newline at end of file

Copied: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/UTTransaction.java (from rev 13427, modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/UTTransaction.java)
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/UTTransaction.java	                        (rev 0)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/UTTransaction.java	2010-07-18 08:51:36 UTC (rev 13428)
@@ -0,0 +1,117 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.transaction;
+
+import javax.transaction.HeuristicMixedException;
+import javax.transaction.HeuristicRollbackException;
+import javax.transaction.NotSupportedException;
+import javax.transaction.RollbackException;
+import javax.transaction.Synchronization;
+import javax.transaction.SystemException;
+
+import org.jboss.weld.extensions.core.Veto;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Wraps JTA transaction management in a Seam UserTransaction interface.
+ * 
+ * @author Mike Youngstrom
+ * @author Gavin King
+ * 
+ */
+ at Veto
+public class UTTransaction extends AbstractUserTransaction
+{
+   private static final Logger log = LoggerFactory.getLogger(UTTransaction.class);
+
+   private final javax.transaction.UserTransaction delegate;
+
+   UTTransaction(javax.transaction.UserTransaction delegate, Synchronizations sync)
+   {
+      super(sync);
+      this.delegate = delegate;
+      if (delegate == null)
+      {
+         throw new IllegalArgumentException("null UserTransaction");
+      }
+   }
+
+   public void begin() throws NotSupportedException, SystemException
+   {
+      log.debug("beginning JTA transaction");
+      delegate.begin();
+      getSynchronizations().afterTransactionBegin();
+   }
+
+   public void commit() throws RollbackException, HeuristicMixedException, HeuristicRollbackException, SecurityException, IllegalStateException, SystemException
+   {
+      log.debug("committing JTA transaction");
+      boolean success = false;
+      Synchronizations synchronizations = getSynchronizations();
+      synchronizations.beforeTransactionCommit();
+      try
+      {
+         delegate.commit();
+         success = true;
+      }
+      finally
+      {
+         synchronizations.afterTransactionCommit(success);
+      }
+   }
+
+   public void rollback() throws IllegalStateException, SecurityException, SystemException
+   {
+      log.debug("rolling back JTA transaction");
+      try
+      {
+         delegate.rollback();
+      }
+      finally
+      {
+         getSynchronizations().afterTransactionRollback();
+      }
+   }
+
+   public int getStatus() throws SystemException
+   {
+      return delegate.getStatus();
+   }
+
+   public void setRollbackOnly() throws IllegalStateException, SystemException
+   {
+      delegate.setRollbackOnly();
+   }
+
+   public void setTransactionTimeout(int timeout) throws SystemException
+   {
+      delegate.setTransactionTimeout(timeout);
+   }
+
+   @Override
+   public void registerSynchronization(Synchronization sync)
+   {
+      getSynchronizations().registerSynchronization(sync);
+   }
+
+}

Copied: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/UserTransaction.java (from rev 13427, modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/UserTransaction.java)
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/UserTransaction.java	                        (rev 0)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/UserTransaction.java	2010-07-18 08:51:36 UTC (rev 13428)
@@ -0,0 +1,57 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.transaction;
+
+import javax.persistence.EntityManager;
+import javax.transaction.Synchronization;
+import javax.transaction.SystemException;
+
+/**
+ * Extends the standard UserTransaction interface with a couple of helpful
+ * methods.
+ * 
+ * @author Gavin King
+ * 
+ */
+public interface UserTransaction extends javax.transaction.UserTransaction
+{
+
+   public boolean isActive() throws SystemException;
+
+   public boolean isActiveOrMarkedRollback() throws SystemException;
+
+   public boolean isRolledBackOrMarkedRollback() throws SystemException;
+
+   public boolean isMarkedRollback() throws SystemException;
+
+   public boolean isNoTransaction() throws SystemException;
+
+   public boolean isRolledBack() throws SystemException;
+
+   public boolean isCommitted() throws SystemException;
+
+   public boolean isConversationContextRequired();
+
+   public abstract void registerSynchronization(Synchronization sync);
+
+   public void enlist(EntityManager entityManager) throws SystemException;
+}

Copied: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/Work.java (from rev 13427, modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/Work.java)
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/Work.java	                        (rev 0)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/transaction/Work.java	2010-07-18 08:51:36 UTC (rev 13428)
@@ -0,0 +1,118 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.transaction;
+
+import javax.ejb.ApplicationException;
+import javax.transaction.Status;
+import javax.transaction.UserTransaction;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Performs work in a JTA transaction.
+ * 
+ * @author Gavin King
+ */
+public abstract class Work<T>
+{
+   private static final Logger log = LoggerFactory.getLogger(Work.class);
+
+   protected abstract T work() throws Exception;
+
+   protected boolean isNewTransactionRequired(boolean transactionActive)
+   {
+      return !transactionActive;
+   }
+
+   public final T workInTransaction(org.jboss.seam.transaction.UserTransaction transaction) throws Exception
+   {
+      boolean transactionActive = transaction.isActiveOrMarkedRollback() || transaction.isRolledBack();
+      // TODO: temp workaround, what should we really do in this case??
+      boolean newTransactionRequired = isNewTransactionRequired(transactionActive);
+      UserTransaction userTransaction = newTransactionRequired ? transaction : null;
+
+      try
+      {
+         if (newTransactionRequired)
+         {
+            log.debug("beginning transaction");
+            userTransaction.begin();
+         }
+
+         T result = work();
+         if (newTransactionRequired)
+         {
+            if (transaction.isMarkedRollback())
+            {
+               log.debug("rolling back transaction");
+               userTransaction.rollback();
+            }
+            else
+            {
+               log.debug("committing transaction");
+               userTransaction.commit();
+            }
+         }
+         return result;
+      }
+      catch (Exception e)
+      {
+         if (newTransactionRequired && userTransaction.getStatus() != Status.STATUS_NO_TRANSACTION )
+         {
+            if(isRollbackRequired(e, true))
+            {
+               log.debug("rolling back transaction");
+               userTransaction.rollback();
+            }
+            else
+            {
+               log.debug("committing transaction after ApplicationException(rollback=false):" + e.getMessage());
+               userTransaction.commit();
+            }
+         }
+         else if (userTransaction.getStatus() != Status.STATUS_NO_TRANSACTION && isRollbackRequired(e, true))
+         {
+            userTransaction.setRollbackOnly();
+         }
+
+         throw e;
+      }
+
+   }
+
+   public static boolean isRollbackRequired(Exception e, boolean isJavaBean)
+   {
+      Class<? extends Exception> clazz = e.getClass();
+      return (isSystemException(e, isJavaBean, clazz)) || (clazz.isAnnotationPresent(ApplicationException.class) && clazz.getAnnotation(ApplicationException.class).rollback());
+   }
+
+   private static boolean isSystemException(Exception e, boolean isJavaBean, Class<? extends Exception> clazz)
+   {
+      return isJavaBean && (e instanceof RuntimeException) && !clazz.isAnnotationPresent(ApplicationException.class);
+      // &&
+      // TODO: this is hackish, maybe just turn off RollackInterceptor for
+      // @Converter/@Validator components
+      // !JSF.VALIDATOR_EXCEPTION.isInstance(e) &&
+      // !JSF.CONVERTER_EXCEPTION.isInstance(e);
+   }
+}

Deleted: modules/persistence/trunk/impl/src/main/resources/META-INF/beans.xml
===================================================================
--- modules/persistence/trunk/src/main/resources/META-INF/beans.xml	2010-07-15 04:17:18 UTC (rev 13402)
+++ modules/persistence/trunk/impl/src/main/resources/META-INF/beans.xml	2010-07-18 08:51:36 UTC (rev 13428)
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   The contents of this file is permitted to be empty.
-   The schema definition is provided for your convenience.
--->
-<beans xmlns="http://java.sun.com/xml/ns/javaee"
-   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-   xsi:schemaLocation="
-      http://java.sun.com/xml/ns/javaee 
-      http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
-</beans>

Copied: modules/persistence/trunk/impl/src/main/resources/META-INF/beans.xml (from rev 13406, modules/persistence/trunk/src/main/resources/META-INF/beans.xml)
===================================================================
--- modules/persistence/trunk/impl/src/main/resources/META-INF/beans.xml	                        (rev 0)
+++ modules/persistence/trunk/impl/src/main/resources/META-INF/beans.xml	2010-07-18 08:51:36 UTC (rev 13428)
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   The contents of this file is permitted to be empty.
+   The schema definition is provided for your convenience.
+-->
+<beans xmlns="http://java.sun.com/xml/ns/javaee"
+   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+   xsi:schemaLocation="
+      http://java.sun.com/xml/ns/javaee 
+      http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
+      <interceptors>
+         <class>org.jboss.seam.transaction.TransactionInterceptor</class>
+      </interceptors>
+</beans>

Deleted: modules/persistence/trunk/impl/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension
===================================================================
--- modules/persistence/trunk/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension	2010-07-15 04:17:18 UTC (rev 13402)
+++ modules/persistence/trunk/impl/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension	2010-07-18 08:51:36 UTC (rev 13428)
@@ -1 +0,0 @@
-org.jboss.seam.persistence.PersistenceContextExtension

Copied: modules/persistence/trunk/impl/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension (from rev 13415, modules/persistence/trunk/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension)
===================================================================
--- modules/persistence/trunk/impl/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension	                        (rev 0)
+++ modules/persistence/trunk/impl/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension	2010-07-18 08:51:36 UTC (rev 13428)
@@ -0,0 +1,2 @@
+org.jboss.seam.persistence.PersistenceContextExtension
+org.jboss.seam.transaction.TransactionExtension
\ No newline at end of file

Copied: modules/persistence/trunk/impl/src/test/java/org/jboss/seam/transactions (from rev 13405, modules/persistence/trunk/src/test/java/org/jboss/seam/transactions)

Deleted: modules/persistence/trunk/impl/src/test/java/org/jboss/seam/transactions/test/SimpleTest.java
===================================================================
--- modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/SimpleTest.java	2010-07-15 12:52:34 UTC (rev 13405)
+++ modules/persistence/trunk/impl/src/test/java/org/jboss/seam/transactions/test/SimpleTest.java	2010-07-18 08:51:36 UTC (rev 13428)
@@ -1,75 +0,0 @@
-package org.jboss.seam.transactions.test;
-
-import java.util.List;
-
-import javax.inject.Inject;
-import javax.persistence.EntityManager;
-import javax.persistence.EntityManagerFactory;
-import javax.persistence.PersistenceUnit;
-import javax.transaction.HeuristicMixedException;
-import javax.transaction.HeuristicRollbackException;
-import javax.transaction.NotSupportedException;
-import javax.transaction.RollbackException;
-import javax.transaction.SystemException;
-
-import junit.framework.Assert;
-
-import org.jboss.arquillian.api.Deployment;
-import org.jboss.arquillian.junit.Arquillian;
-import org.jboss.seam.transaction.Transaction;
-import org.jboss.seam.transaction.UserTransaction;
-import org.jboss.seam.transactions.test.util.ArtifactNames;
-import org.jboss.seam.transactions.test.util.MavenArtifactResolver;
-import org.jboss.shrinkwrap.api.Archive;
-import org.jboss.shrinkwrap.api.ShrinkWrap;
-import org.jboss.shrinkwrap.api.asset.ByteArrayAsset;
-import org.jboss.shrinkwrap.api.spec.WebArchive;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
- at RunWith(Arquillian.class)
-public class SimpleTest
-{
-   @Deployment
-   public static Archive<?> createTestArchive()
-   {
-
-      WebArchive war = ShrinkWrap.create("test.war", WebArchive.class).addLibraries(MavenArtifactResolver.resolve(ArtifactNames.WELD_EXTENSIONS)).addPackage(Transaction.class.getPackage()).addPackage(SimpleTest.class.getPackage()).addWebResource("META-INF/persistence.xml", "classes/META-INF/persistence.xml").addWebResource(new ByteArrayAsset(new byte[0]), "beans.xml");
-      
-      return war;
-   }
-
-   @Inject
-   UserTransaction transaction;
-
-   @PersistenceUnit
-   EntityManagerFactory emf;
-
-   @Test
-   public void simpleTest() throws NotSupportedException, SystemException, SecurityException, IllegalStateException, RollbackException, HeuristicMixedException, HeuristicRollbackException
-   {
-      transaction.begin();
-      EntityManager em = emf.createEntityManager();
-      em.joinTransaction();
-      Hotel h = new Hotel("test", "Fake St", "Wollongong", "NSW", "2518", "Australia");
-      em.persist(h);
-      em.flush();
-      transaction.commit();
-
-      transaction.begin();
-      em = emf.createEntityManager();
-      em.joinTransaction();
-      h = new Hotel("test2", "Fake St", "Wollongong", "NSW", "2518", "Australia");
-      em.persist(h);
-      em.flush();
-      transaction.rollback();
-
-      transaction.begin();
-      em = emf.createEntityManager();
-      em.joinTransaction();
-      List<Hotel> hotels = em.createQuery("select h from Hotel h").getResultList();
-      Assert.assertTrue(hotels.size() == 1);
-      transaction.rollback();
-
-   }
-}

Copied: modules/persistence/trunk/impl/src/test/java/org/jboss/seam/transactions/test/TransactionInterceptorTest.java (from rev 13415, modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/TransactionInterceptorTest.java)
===================================================================
--- modules/persistence/trunk/impl/src/test/java/org/jboss/seam/transactions/test/TransactionInterceptorTest.java	                        (rev 0)
+++ modules/persistence/trunk/impl/src/test/java/org/jboss/seam/transactions/test/TransactionInterceptorTest.java	2010-07-18 08:51:36 UTC (rev 13428)
@@ -0,0 +1,108 @@
+package org.jboss.seam.transactions.test;
+
+import java.util.List;
+
+import javax.inject.Inject;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.transaction.HeuristicMixedException;
+import javax.transaction.HeuristicRollbackException;
+import javax.transaction.NotSupportedException;
+import javax.transaction.RollbackException;
+import javax.transaction.SystemException;
+
+import junit.framework.Assert;
+
+import org.jboss.arquillian.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.seam.transaction.Transaction;
+import org.jboss.seam.transaction.TransactionInterceptor;
+import org.jboss.seam.transaction.UserTransaction;
+import org.jboss.seam.transactions.test.util.ArtifactNames;
+import org.jboss.seam.transactions.test.util.DontRollBackException;
+import org.jboss.seam.transactions.test.util.EntityManagerProvider;
+import org.jboss.seam.transactions.test.util.MavenArtifactResolver;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.ByteArrayAsset;
+import org.jboss.shrinkwrap.api.spec.WebArchive;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+ at RunWith(Arquillian.class)
+public class TransactionInterceptorTest
+{
+   @Deployment
+   public static Archive<?> createTestArchive()
+   {
+
+      WebArchive war = ShrinkWrap.create("test.war", WebArchive.class);
+      war.addLibraries(MavenArtifactResolver.resolve(ArtifactNames.WELD_EXTENSIONS));
+      war.addPackage(Transaction.class.getPackage());
+      war.addClasses(TransactionInterceptorTest.class, TransactionManagedBean.class, Hotel.class, EntityManagerProvider.class, DontRollBackException.class, TransactionObserver.class);
+      war.addWebResource("META-INF/persistence.xml", "classes/META-INF/persistence.xml");
+      war.addWebResource(new ByteArrayAsset(("<beans><interceptors><class>" + TransactionInterceptor.class.getName() + "</class></interceptors></beans>").getBytes()), "beans.xml");
+      war.addWebResource("META-INF/services/javax.enterprise.inject.spi.Extension", "classes/META-INF/services/javax.enterprise.inject.spi.Extension");
+      return war;
+   }
+
+   @Inject
+   TransactionManagedBean bean;
+
+   @Inject
+   UserTransaction transaction;
+
+   @PersistenceContext
+   EntityManager em;
+
+   @Inject
+   TransactionObserver observer;
+
+   @Test
+   public void testTransactionInterceptor() throws NotSupportedException, SystemException, SecurityException, IllegalStateException, RollbackException, HeuristicMixedException, HeuristicRollbackException
+   {
+      observer.setEnabled(true);
+      try
+      {
+      observer.reset(true);
+      bean.addHotel();
+      assertHotels(1);
+      observer.verify();
+      observer.reset(false);
+      try
+      {
+         bean.failToAddHotel();
+      }
+      catch (Exception e)
+      {
+      }
+      assertHotels(1);
+      observer.verify();
+      observer.reset(true);
+      try
+      {
+         bean.addHotelWithApplicationException();
+      }
+      catch (DontRollBackException e)
+      {
+      }
+      assertHotels(2);
+      observer.verify();
+      }
+      catch (Exception e)
+      {
+         observer.setEnabled(false);
+         throw new RuntimeException(e);
+      }
+
+   }
+
+   public void assertHotels(int count) throws NotSupportedException, SystemException
+   {
+      transaction.begin();
+      em.joinTransaction();
+      List<Hotel> hotels = em.createQuery("select h from Hotel h").getResultList();
+      Assert.assertTrue("Wrong number of hotels: " + hotels.size(), hotels.size() == count);
+      transaction.rollback();
+   }
+}

Copied: modules/persistence/trunk/impl/src/test/java/org/jboss/seam/transactions/test/TransactionManagedBean.java (from rev 13409, modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/TransactionManagedBean.java)
===================================================================
--- modules/persistence/trunk/impl/src/test/java/org/jboss/seam/transactions/test/TransactionManagedBean.java	                        (rev 0)
+++ modules/persistence/trunk/impl/src/test/java/org/jboss/seam/transactions/test/TransactionManagedBean.java	2010-07-18 08:51:36 UTC (rev 13428)
@@ -0,0 +1,44 @@
+package org.jboss.seam.transactions.test;
+
+import javax.inject.Inject;
+import javax.persistence.EntityManager;
+
+import org.jboss.seam.transaction.TransactionPropagation;
+import org.jboss.seam.transaction.Transactional;
+import org.jboss.seam.transactions.test.util.DontRollBackException;
+
+ at Transactional(TransactionPropagation.REQUIRED)
+public class TransactionManagedBean
+{
+
+   @Inject
+   EntityManager entityManager;
+
+
+   public void addHotel()
+   {
+      entityManager.joinTransaction();
+      Hotel h = new Hotel("test", "Fake St", "Wollongong", "NSW", "2518", "Australia");
+      entityManager.persist(h);
+      entityManager.flush();
+   }
+
+   public void failToAddHotel()
+   {
+      entityManager.joinTransaction();
+      Hotel h = new Hotel("test2", "Fake St", "Wollongong", "NSW", "2518", "Australia");
+      entityManager.persist(h);
+      entityManager.flush();
+      throw new RuntimeException("Roll back transaction");
+   }
+
+   public void addHotelWithApplicationException() throws DontRollBackException
+   {
+      entityManager.joinTransaction();
+      Hotel h = new Hotel("test3", "Fake St", "Wollongong", "NSW", "2518", "Australia");
+      entityManager.persist(h);
+      entityManager.flush();
+      throw new DontRollBackException();
+   }
+
+}

Copied: modules/persistence/trunk/impl/src/test/java/org/jboss/seam/transactions/test/TransactionObserver.java (from rev 13409, modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/TransactionObserver.java)
===================================================================
--- modules/persistence/trunk/impl/src/test/java/org/jboss/seam/transactions/test/TransactionObserver.java	                        (rev 0)
+++ modules/persistence/trunk/impl/src/test/java/org/jboss/seam/transactions/test/TransactionObserver.java	2010-07-18 08:51:36 UTC (rev 13428)
@@ -0,0 +1,63 @@
+package org.jboss.seam.transactions.test;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.event.Observes;
+
+import org.jboss.seam.transaction.AfterTransactionCompletion;
+import org.jboss.seam.transaction.BeforeTransactionCompletion;
+
+ at ApplicationScoped
+public class TransactionObserver
+{
+   private boolean expectSuccess, beforeTransaction, afterTransaction;
+   private boolean enabled = false;
+
+   public boolean isEnabled()
+   {
+      return enabled;
+   }
+
+   public void setEnabled(boolean enabled)
+   {
+      this.enabled = enabled;
+   }
+
+   public void reset(boolean expected)
+   {
+      beforeTransaction = false;
+      afterTransaction = false;
+      expectSuccess = expected;
+   }
+
+   public boolean isBeforeTransaction()
+   {
+      return beforeTransaction;
+   }
+
+   public boolean isAfterTransaction()
+   {
+      return afterTransaction;
+   }
+
+   public void observeBeforeTransactionCommit(@Observes BeforeTransactionCompletion event)
+   {
+      beforeTransaction = true;
+   }
+
+   public void observeBeforeTransactionCommit(@Observes AfterTransactionCompletion event)
+   {
+      afterTransaction = true;
+      if (expectSuccess != event.success())
+      {
+         throw new RuntimeException("Expected success to be " + expectSuccess);
+      }
+   }
+
+   public void verify()
+   {
+      if (!((beforeTransaction || !expectSuccess) && afterTransaction))
+      {
+         throw new RuntimeException("Events not recieved before:" + beforeTransaction + " after:" + afterTransaction);
+      }
+   }
+}

Copied: modules/persistence/trunk/impl/src/test/java/org/jboss/seam/transactions/test/UserTransactionTest.java (from rev 13415, modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/UserTransactionTest.java)
===================================================================
--- modules/persistence/trunk/impl/src/test/java/org/jboss/seam/transactions/test/UserTransactionTest.java	                        (rev 0)
+++ modules/persistence/trunk/impl/src/test/java/org/jboss/seam/transactions/test/UserTransactionTest.java	2010-07-18 08:51:36 UTC (rev 13428)
@@ -0,0 +1,79 @@
+package org.jboss.seam.transactions.test;
+
+import java.util.List;
+
+import javax.inject.Inject;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.PersistenceUnit;
+import javax.transaction.HeuristicMixedException;
+import javax.transaction.HeuristicRollbackException;
+import javax.transaction.NotSupportedException;
+import javax.transaction.RollbackException;
+import javax.transaction.SystemException;
+
+import junit.framework.Assert;
+
+import org.jboss.arquillian.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.seam.transaction.Transaction;
+import org.jboss.seam.transaction.UserTransaction;
+import org.jboss.seam.transactions.test.util.ArtifactNames;
+import org.jboss.seam.transactions.test.util.MavenArtifactResolver;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.ByteArrayAsset;
+import org.jboss.shrinkwrap.api.spec.WebArchive;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+ at RunWith(Arquillian.class)
+public class UserTransactionTest
+{
+   @Deployment
+   public static Archive<?> createTestArchive()
+   {
+
+      WebArchive war = ShrinkWrap.create("test.war", WebArchive.class);
+      war.addLibraries(MavenArtifactResolver.resolve(ArtifactNames.WELD_EXTENSIONS));
+      war.addPackage(Transaction.class.getPackage()).addClasses(UserTransactionTest.class, Hotel.class);
+      war.addWebResource("META-INF/persistence.xml", "classes/META-INF/persistence.xml");
+      war.addWebResource(new ByteArrayAsset(new byte[0]), "beans.xml");
+      war.addWebResource("META-INF/services/javax.enterprise.inject.spi.Extension", "classes/META-INF/services/javax.enterprise.inject.spi.Extension");
+      return war;
+   }
+
+   @Inject
+   UserTransaction transaction;
+
+   @PersistenceUnit
+   EntityManagerFactory emf;
+
+   @Test
+   public void userTransactionTest() throws NotSupportedException, SystemException, SecurityException, IllegalStateException, RollbackException, HeuristicMixedException, HeuristicRollbackException
+   {
+      transaction.begin();
+      EntityManager em = emf.createEntityManager();
+      em.joinTransaction();
+      Hotel h = new Hotel("test", "Fake St", "Wollongong", "NSW", "2518", "Australia");
+      em.persist(h);
+      em.flush();
+      transaction.commit();
+
+      transaction.begin();
+      em = emf.createEntityManager();
+      em.joinTransaction();
+      h = new Hotel("test2", "Fake St", "Wollongong", "NSW", "2518", "Australia");
+      em.persist(h);
+      em.flush();
+      transaction.rollback();
+
+      transaction.begin();
+      em = emf.createEntityManager();
+      em.joinTransaction();
+      List<Hotel> hotels = em.createQuery("select h from Hotel h").getResultList();
+      Assert.assertTrue(hotels.size() == 1);
+      transaction.rollback();
+   }
+
+}

Copied: modules/persistence/trunk/impl/src/test/java/org/jboss/seam/transactions/test/util/DontRollBackException.java (from rev 13408, modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/util/DontRollBackException.java)
===================================================================
--- modules/persistence/trunk/impl/src/test/java/org/jboss/seam/transactions/test/util/DontRollBackException.java	                        (rev 0)
+++ modules/persistence/trunk/impl/src/test/java/org/jboss/seam/transactions/test/util/DontRollBackException.java	2010-07-18 08:51:36 UTC (rev 13428)
@@ -0,0 +1,9 @@
+package org.jboss.seam.transactions.test.util;
+
+import javax.ejb.ApplicationException;
+
+ at ApplicationException(rollback = false)
+public class DontRollBackException extends Exception
+{
+
+}

Copied: modules/persistence/trunk/impl/src/test/java/org/jboss/seam/transactions/test/util/EntityManagerProvider.java (from rev 13406, modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/util/EntityManagerProvider.java)
===================================================================
--- modules/persistence/trunk/impl/src/test/java/org/jboss/seam/transactions/test/util/EntityManagerProvider.java	                        (rev 0)
+++ modules/persistence/trunk/impl/src/test/java/org/jboss/seam/transactions/test/util/EntityManagerProvider.java	2010-07-18 08:51:36 UTC (rev 13428)
@@ -0,0 +1,12 @@
+package org.jboss.seam.transactions.test.util;
+
+import javax.enterprise.inject.Produces;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+public class EntityManagerProvider
+{
+   @PersistenceContext
+   @Produces
+   EntityManager entityManager;
+}

Copied: modules/persistence/trunk/impl/src/test/resources/META-INF (from rev 13405, modules/persistence/trunk/src/test/resources/META-INF)

Copied: modules/persistence/trunk/impl/src/test/resources/arquillian.xml (from rev 13405, modules/persistence/trunk/src/test/resources/arquillian.xml)
===================================================================
--- modules/persistence/trunk/impl/src/test/resources/arquillian.xml	                        (rev 0)
+++ modules/persistence/trunk/impl/src/test/resources/arquillian.xml	2010-07-18 08:51:36 UTC (rev 13428)
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<arquillian xmlns="http://jboss.com/arquillian"
+   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+   xmlns:gfembedded="urn:arq:org.jboss.arquillian.glassfish.embedded30"
+   xmlns:gfremote="urn:arq:org.jboss.arquillian.container.glassfish.remote30">
+
+   <engine>
+      <deploymentExportPath>/tmp/</deploymentExportPath>
+   </engine>
+   
+   <gfremote:container>
+      <gfremote:remoteServerHttpPort>7070</gfremote:remoteServerHttpPort>
+   </gfremote:container>
+
+   <gfembedded:container>
+      <gfembedded:sunResourcesXml>src/test/resources-glassfish/sun-resources.xml</gfembedded:sunResourcesXml>
+   </gfembedded:container>  
+
+</arquillian>

Copied: modules/persistence/trunk/impl/src/test/resources-glassfish (from rev 13405, modules/persistence/trunk/src/test/resources-glassfish)

Copied: modules/persistence/trunk/impl/src/test/resources-jbossas (from rev 13405, modules/persistence/trunk/src/test/resources-jbossas)

Modified: modules/persistence/trunk/pom.xml
===================================================================
--- modules/persistence/trunk/pom.xml	2010-07-18 07:59:16 UTC (rev 13427)
+++ modules/persistence/trunk/pom.xml	2010-07-18 08:51:36 UTC (rev 13428)
@@ -1,241 +1,101 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+   <modelVersion>4.0.0</modelVersion>
+
    <parent>
-      <artifactId>seam-parent</artifactId>
       <groupId>org.jboss.seam</groupId>
-      <version>2</version>
+      <artifactId>seam-parent</artifactId>
+      <version>1</version>
    </parent>
 
-   <modelVersion>4.0.0</modelVersion>
-   <groupId>org.jboss.seam</groupId>
-   <artifactId>seam-persistence</artifactId>
-   <packaging>jar</packaging>
+   <artifactId>seam-persistence-parent</artifactId>
+   <groupId>org.jboss.seam.persistence</groupId>
    <version>3.0.0-SNAPSHOT</version>
-   <name>Seam Persistence</name>
 
-   <properties>
-      <seam.version>3.0.0.b01</seam.version>
-      <arquillian.version>1.0.0-SNAPSHOT</arquillian.version>
-      <junit.version>4.8.1</junit.version>
-      <jboss.home>${env.JBOSS_HOME}</jboss.home>
-      <jboss.domain>default</jboss.domain>
-      <glassfish.version>3.0.1-b19</glassfish.version>
-      <jboss-as-client.version>6.0.0-SNAPSHOT</jboss-as-client.version>
-      <jboss-javaee6-spec.version>1.0.0.Beta4</jboss-javaee6-spec.version>
-      <jboss-server-manager.version>1.0.3.GA</jboss-server-manager.version>
-   </properties>
+   <packaging>pom</packaging>
+   <name>Seam Persistence Module Parent POM</name>
 
    <prerequisites>
       <maven>3.0</maven>
    </prerequisites>
 
+   <description>
+		The Parent for Seam Persistence Modules
+	</description>
+
+   <url>http://www.seamframework.org</url>
+
+   <modules>
+      <module>api</module>
+      <module>impl</module>
+   </modules>
+
+   <properties>
+      <seam.version>3.0.0.b01</seam.version>
+   </properties>
+
    <dependencyManagement>
       <dependencies>
+
          <dependency>
             <groupId>org.jboss.seam</groupId>
             <artifactId>seam</artifactId>
             <version>${seam.version}</version>
-            <type>pom</type>
             <scope>import</scope>
+            <type>pom</type>
          </dependency>
 
+         <!-- Need to use dependencyManagement to override org.jboss.seam:seam for submodules -->
          <dependency>
-            <groupId>org.jboss.arquillian</groupId>
-            <artifactId>arquillian-junit</artifactId>
-            <version>${arquillian.version}</version>
-            <scope>test</scope>
+            <groupId>org.jboss.seam.persistence</groupId>
+            <artifactId>seam-persistence-api</artifactId>
+            <version>${project.version}</version>
          </dependency>
 
+
          <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <version>${junit.version}</version>
+            <groupId>org.jboss.seam.persistence</groupId>
+            <artifactId>seam-persistence</artifactId>
+            <version>${project.version}</version>
          </dependency>
 
       </dependencies>
-
-
    </dependencyManagement>
 
-   <dependencies>
-      <dependency>
-         <groupId>junit</groupId>
-         <artifactId>junit</artifactId>
-      </dependency>
-      
-      <dependency>
-         <groupId>org.hibernate</groupId>
-         <artifactId>hibernate-core</artifactId>
-      </dependency>
-
-      <dependency>
-         <groupId>org.hibernate.javax.persistence</groupId>
-         <artifactId>hibernate-jpa-2.0-api</artifactId>
-      </dependency>
-
-      <dependency>
-         <groupId>org.jboss.spec.javax.interceptor</groupId>
-         <artifactId>jboss-interceptors-api_1.1_spec</artifactId>
-         <scope>provided</scope>
-      </dependency>
-
-      <dependency>
-         <groupId>javax.transaction</groupId>
-         <artifactId>jta</artifactId>
-      </dependency>
-
-      <dependency>
-         <groupId>javax.enterprise</groupId>
-         <artifactId>cdi-api</artifactId>
-      </dependency>
-
-      <dependency>
-         <groupId>org.slf4j</groupId>
-         <artifactId>slf4j-api</artifactId>
-         <scope>provided</scope>
-      </dependency>
-
-       <dependency>
-          <groupId>org.jboss.spec</groupId>
-          <artifactId>jboss-javaee-6.0</artifactId>
-          <version>${jboss-javaee6-spec.version}</version>
-          <type>pom</type>
-          <scope>provided</scope>
-       </dependency>
-
-      <dependency>
-         <groupId>org.jboss.weld</groupId>
-         <artifactId>weld-extensions</artifactId>
-         <version>1.0.0-SNAPSHOT</version>
-         <type>jar</type>
-         <scope>compile</scope>
-      </dependency>
-
-      <dependency>
-         <groupId>org.jboss.arquillian</groupId>
-         <artifactId>arquillian-junit</artifactId>
-         <scope>test</scope>
-      </dependency>
-   </dependencies>
-
-
    <profiles>
       <profile>
-         <id>default</id>
+         <id>distribution</id>
          <activation>
-            <activeByDefault>true</activeByDefault>
+            <property>
+               <name>release</name>
+            </property>
          </activation>
-         <build>
-            <plugins>
-               <plugin>
-                  <artifactId>maven-surefire-plugin</artifactId>
-                  <configuration>
-                     <skip>true</skip>
-                  </configuration>
-               </plugin>            
-           </plugins>
-         </build>
+         <modules>
+            <module>dist</module>
+            <module>docs/reference</module>
+         </modules>
       </profile>
-   
       <profile>
-         <id>jbossas-remote-60</id>
+         <id>arquillian-glassfish-embedded-30</id>
          <dependencies>
             <dependency>
                <groupId>org.jboss.arquillian.container</groupId>
-               <artifactId>arquillian-jbossas-remote-6</artifactId>
-               <version>${arquillian.version}</version>
-               <scope>test</scope>
-            </dependency>
-            <dependency>
-               <groupId>org.jboss.spec</groupId>
-               <artifactId>jboss-javaee-6.0</artifactId>
-               <version>${jboss-javaee6-spec.version}</version>
-               <type>pom</type>
-               <scope>provided</scope>
-            </dependency>
-            <!-- need for org.jnp.interfaces.NamingContextFactory -->
-            <dependency>
-               <groupId>org.jboss.jbossas</groupId>
-               <artifactId>jboss-as-client</artifactId>
-               <version>${jboss-as-client.version}</version>
-               <type>pom</type>
-               <scope>test</scope>
-            </dependency>
-         </dependencies>
-         <build>
-            <testResources>
-               <testResource>
-                  <directory>src/test/resources</directory>
-               </testResource>
-               <testResource>
-                  <directory>src/test/resources-jbossas</directory>
-               </testResource>
-            </testResources>
-         </build>
-      </profile>
-
-      <profile>
-         <id>glassfish-embedded-30</id>
-         <dependencies>
-            <dependency>
-               <groupId>org.jboss.arquillian.container</groupId>
                <artifactId>arquillian-glassfish-embedded-30</artifactId>
-               <version>${arquillian.version}</version>
-               <scope>test</scope>
             </dependency>
-            <dependency>
-               <groupId>org.glassfish.extras</groupId>
-               <artifactId>glassfish-embedded-all</artifactId>
-               <version>${glassfish.version}</version>
-               <scope>provided</scope>
-            </dependency>
          </dependencies>
-         <build>
-            <testResources>
-               <testResource>
-                  <directory>src/test/resources</directory>
-               </testResource>
-               <testResource>
-                  <directory>src/test/resources-glassfish</directory>
-               </testResource>
-            </testResources>
-         </build>
       </profile>
-
-      <profile>
-         <id>glassfish-remote-30</id>
-         <dependencies>
-            <dependency>
-               <groupId>org.jboss.arquillian.container</groupId>
-               <artifactId>arquillian-glassfish-remote-30</artifactId>
-               <version>${arquillian.version}</version>
-               <scope>test</scope>
-            </dependency>
-            <dependency>
-               <groupId>org.glassfish.extras</groupId>
-               <artifactId>glassfish-embedded-all</artifactId>
-               <version>${glassfish.version}</version>
-               <scope>provided</scope>
-            </dependency>
-         </dependencies>
-         <build>
-            <testResources>
-               <testResource>
-                  <directory>src/test/resources</directory>
-               </testResource>
-               <testResource>
-                  <directory>src/test/resources-glassfish</directory>
-               </testResource>
-            </testResources>
-         </build>
-      </profile>
    </profiles>
 
+   <developers>
+      <developer>
+         <name>Stuart Douglas</name>
+         <email>stuart.w.douglas at gmail.com</email>
+      </developer>
+   </developers>
+
    <scm>
-      <connection>scm:svn:http://anonsvn.jboss.org/repos/seam/modules/persistence/trunk</connection>
-      <developerConnection>scm:svn:https://svn.jboss.org/repos/seam/modules/persistence/trunk</developerConnection>
+      <connection>scm:svn:http://anonsvn.jboss.org/repos/seam/modules/persistence/trunk </connection>
+      <developerConnection>scm:svn:https://svn.jboss.org/repos/seam/modules/persistence/trunk </developerConnection>
       <url>http://fisheye.jboss.org/browse/Seam/modules/persistence/trunk</url>
    </scm>
-
 </project>
 



More information about the seam-commits mailing list