[jbpm-commits] JBoss JBPM SVN: r5951 - in jbpm4/trunk/modules: pvm/src/main/java/org/jbpm/pvm/internal/env and 10 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Fri Dec 11 07:38:23 EST 2009


Author: jbarrez
Date: 2009-12-11 07:38:22 -0500 (Fri, 11 Dec 2009)
New Revision: 5951

Added:
   jbpm4/trunk/modules/test-cfg/src/test/java/org/jbpm/test/spring/
   jbpm4/trunk/modules/test-cfg/src/test/java/org/jbpm/test/spring/transactionmanager/
   jbpm4/trunk/modules/test-cfg/src/test/java/org/jbpm/test/spring/transactionmanager/ResolveTransactionManagerTest.java
   jbpm4/trunk/modules/test-cfg/src/test/resources/org/jbpm/test/spring/
   jbpm4/trunk/modules/test-cfg/src/test/resources/org/jbpm/test/spring/transactionmanager/
   jbpm4/trunk/modules/test-cfg/src/test/resources/org/jbpm/test/spring/transactionmanager/applicationContext.xml
   jbpm4/trunk/modules/test-cfg/src/test/resources/org/jbpm/test/spring/transactionmanager/jbpm.cfg.xml
   jbpm4/trunk/modules/test-cfg/src/test/resources/org/jbpm/test/spring/transactionmanager/jbpm.hibernate.cfg.xml
   jbpm4/trunk/modules/test-cfg/src/test/resources/org/jbpm/test/spring/transactionmanager/log4j.properties
   jbpm4/trunk/modules/test-cfg/src/test/resources/org/jbpm/test/spring/transactionmanager/process.jpdl.xml
Modified:
   jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/cfg/SpringConfiguration.java
   jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/env/SpringContext.java
   jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/tx/SpringTransactionInterceptor.java
   jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/SpringTransactionInterceptorBinding.java
   jbpm4/trunk/modules/pvm/src/main/resources/jbpm.tx.spring.cfg.xml
   jbpm4/trunk/modules/test-cfg/pom.xml
Log:
JBPM-2558: resolve Spring transaction manager by name

Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/cfg/SpringConfiguration.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/cfg/SpringConfiguration.java	2009-12-11 10:55:27 UTC (rev 5950)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/cfg/SpringConfiguration.java	2009-12-11 12:38:22 UTC (rev 5951)
@@ -50,8 +50,6 @@
 
   private ApplicationContext applicationContext;
 
-  private String jbpmConfigurationLocation;
-
   /**
    * Instantiates a new spring configuration.
    */
@@ -121,7 +119,6 @@
 
   /**
    * {@inheritDoc)
-
    */
   public void setApplicationContext(ApplicationContext applicationContext) {
     this.applicationContext = applicationContext;

Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/env/SpringContext.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/env/SpringContext.java	2009-12-11 10:55:27 UTC (rev 5950)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/env/SpringContext.java	2009-12-11 12:38:22 UTC (rev 5951)
@@ -25,6 +25,7 @@
 import java.util.HashSet;
 import java.util.Set;
 
+import org.jbpm.internal.log.Log;
 import org.springframework.context.ApplicationContext;
 
 /**
@@ -32,6 +33,8 @@
  * 
  */
 public class SpringContext implements Context {
+  
+  private static final Log LOG = Log.getLog(SpringContext.class.getName());
 
 	private ApplicationContext applicationContext;
 
@@ -54,9 +57,13 @@
 	@SuppressWarnings("unchecked")
 	public <T> T get(Class<T> type) {
 		String[] names = applicationContext.getBeanNamesForType(type);
-		if (names.length == 1) {
-			return (T) applicationContext.getBean(names[0]);
+		if (names.length > 1 && LOG.isWarnEnabled()) {
+		    LOG.warn("Multiple Spring beans found for type " + type + " returning the first one found");
 		}
+		
+		if (names.length >= 1) {
+		  return (T) applicationContext.getBean(names[0]);
+		} 
 		return null;
 	}
 
@@ -84,7 +91,7 @@
 	 * @see org.jbpm.api.env.Context#keys()
 	 */
 	public Set<String> keys() {
-		Set set = new HashSet<String>(Arrays.asList(applicationContext.getBeanDefinitionNames()));
+		Set<String> set = new HashSet<String>(Arrays.asList(applicationContext.getBeanDefinitionNames()));
 		return set;
 	}
 

Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/tx/SpringTransactionInterceptor.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/tx/SpringTransactionInterceptor.java	2009-12-11 10:55:27 UTC (rev 5950)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/tx/SpringTransactionInterceptor.java	2009-12-11 12:38:22 UTC (rev 5951)
@@ -41,10 +41,13 @@
  */
 public class SpringTransactionInterceptor extends Interceptor {
 
+  @SuppressWarnings("unused")
   private static final Log log = Log.getLog(SpringTransactionInterceptor.class.getName());
 
   private boolean useCurrent;
 
+  private String transactionManagerName;
+
   @SuppressWarnings("unchecked")
   public <T> T execute(Command<T> command) {
     EnvironmentImpl environment = EnvironmentImpl.getCurrent();
@@ -53,8 +56,7 @@
     }
 
     StandardTransaction standardTransaction = environment.get(StandardTransaction.class);
-
-    PlatformTransactionManager platformTransactionManager = environment.get(PlatformTransactionManager.class);
+    PlatformTransactionManager platformTransactionManager = resolveTransactionManager(environment);
     if (platformTransactionManager == null) {
       throw new JbpmException("No platformTransaction manager defined.");
     }
@@ -64,22 +66,22 @@
     }
 
     try {
-    	
+
       TransactionTemplate template = new TransactionTemplate(platformTransactionManager);
 
       if (useCurrent) {
-    	  template.setPropagationBehavior(TransactionDefinition.PROPAGATION_MANDATORY);
+        template.setPropagationBehavior(TransactionDefinition.PROPAGATION_MANDATORY);
       } else {
-    	  template.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
+        template.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
       }
 
       TransactionCallback transactionCallback = new CommandTransactionCallback<T>(command, next, platformTransactionManager);
       T t = (T) template.execute(transactionCallback);
 
       Session session = environment.get(Session.class);
-      
+
       if (session.isOpen()) {
-    	  session.flush();    	  
+        session.flush();
       }
       return t;
     } catch (RuntimeException e) {
@@ -95,7 +97,31 @@
     }
   }
 
+  /**
+   * Resolves the transaction manager from the environment.
+   * @param environment
+   * @return the transaction manager
+   */
+  private PlatformTransactionManager resolveTransactionManager(EnvironmentImpl environment) {
+    PlatformTransactionManager platformTransactionManager;
+
+    if (transactionManagerName != null && transactionManagerName.length() > 0) {
+      platformTransactionManager = (PlatformTransactionManager) environment.get(transactionManagerName);
+
+      if (platformTransactionManager == null) {
+        throw new JbpmException("No platformTransaction manager defined for name '" + platformTransactionManager + "'");
+      }
+    } else {
+      platformTransactionManager = environment.get(PlatformTransactionManager.class);
+    }
+    return platformTransactionManager;
+  }
+
   public void setUseCurrent(Boolean useCurrent) {
     this.useCurrent = useCurrent;
   }
+
+  public void setTransactionManagerName(String transactionManagerName) {
+    this.transactionManagerName = transactionManagerName;
+  }
 }

Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/SpringTransactionInterceptorBinding.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/SpringTransactionInterceptorBinding.java	2009-12-11 10:55:27 UTC (rev 5950)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/SpringTransactionInterceptorBinding.java	2009-12-11 12:38:22 UTC (rev 5951)
@@ -50,6 +50,11 @@
       springTransactionInterceptor.setUseCurrent(useCurrent);
     }
     
+    String transactionManagerName = XmlUtil.attribute(element, "transaction-manager");
+    if (transactionManagerName!=null) {
+      springTransactionInterceptor.setTransactionManagerName(transactionManagerName);
+    }
+    
     return new ProvidedObjectDescriptor(springTransactionInterceptor);
   }
 }

Modified: jbpm4/trunk/modules/pvm/src/main/resources/jbpm.tx.spring.cfg.xml
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/resources/jbpm.tx.spring.cfg.xml	2009-12-11 10:55:27 UTC (rev 5950)
+++ jbpm4/trunk/modules/pvm/src/main/resources/jbpm.tx.spring.cfg.xml	2009-12-11 12:38:22 UTC (rev 5951)
@@ -7,7 +7,7 @@
     <command-service name="newTxRequiredCommandService">
       <retry-interceptor />
       <environment-interceptor policy="requiresNew" />
-      <standard-transaction-interceptor />
+      <spring-transaction-interceptor />
     </command-service>
     
     <!-- Default command service has a Spring transaction interceptor-->

Modified: jbpm4/trunk/modules/test-cfg/pom.xml
===================================================================
--- jbpm4/trunk/modules/test-cfg/pom.xml	2009-12-11 10:55:27 UTC (rev 5950)
+++ jbpm4/trunk/modules/test-cfg/pom.xml	2009-12-11 12:38:22 UTC (rev 5951)
@@ -45,6 +45,11 @@
     </dependency>
     <dependency>
       <groupId>org.jbpm.jbpm4</groupId>
+      <artifactId>jbpm-bpmn</artifactId>
+      <scope>runtime</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jbpm.jbpm4</groupId>
       <artifactId>jbpm-test-base</artifactId>
       <scope>test</scope>
     </dependency>
@@ -53,6 +58,11 @@
       <artifactId>spring</artifactId>
       <scope>test</scope>
     </dependency>
+     <dependency>
+        <groupId>org.springframework</groupId>
+        <artifactId>spring-mock</artifactId>
+        <scope>test</scope>
+      </dependency>
   </dependencies>
   
 </project>

Added: jbpm4/trunk/modules/test-cfg/src/test/java/org/jbpm/test/spring/transactionmanager/ResolveTransactionManagerTest.java
===================================================================
--- jbpm4/trunk/modules/test-cfg/src/test/java/org/jbpm/test/spring/transactionmanager/ResolveTransactionManagerTest.java	                        (rev 0)
+++ jbpm4/trunk/modules/test-cfg/src/test/java/org/jbpm/test/spring/transactionmanager/ResolveTransactionManagerTest.java	2009-12-11 12:38:22 UTC (rev 5951)
@@ -0,0 +1,66 @@
+package org.jbpm.test.spring.transactionmanager;
+
+import org.jbpm.api.ExecutionService;
+import org.jbpm.api.ProcessEngine;
+import org.jbpm.api.ProcessInstance;
+import org.jbpm.api.RepositoryService;
+import org.jbpm.test.AbstractTransactionalSpringJbpmTestCase;
+import org.springframework.test.AbstractDependencyInjectionSpringContextTests;
+import org.springframework.transaction.PlatformTransactionManager;
+
+/**
+ * Note: cannot use {@link AbstractTransactionalSpringJbpmTestCase}, since this autowires
+ * by name and expects a 'transactionManager' bean to be defined, which is exactly what we don't
+ * want here.
+ * 
+ * Test case created because of JBPM-2558: when using multiple transaction managers in Spring,
+ * it is required to be able to declare which transaction manager should be used.
+ * 
+ * @author Joram Barrez
+ */
+public class ResolveTransactionManagerTest extends AbstractDependencyInjectionSpringContextTests {
+  
+  protected ProcessEngine processEngine;
+  
+  private ExecutionService executionService;
+  
+  private RepositoryService repositoryService;
+  
+  
+  public ResolveTransactionManagerTest() {
+    setPopulateProtectedVariables(true);
+  }
+  
+  @Override
+  protected void onSetUp() throws Exception {
+    super.onSetUp();
+    this.executionService = processEngine.getExecutionService();
+    this.repositoryService = processEngine.getRepositoryService();
+  }
+  
+  @Override
+  protected String getConfigPath() {
+    return "applicationContext.xml";
+  }
+  
+  public void testGetTransactionManagerByName() {
+    assertNotNull(processEngine.get("someOtherTransactionManager"));
+    assertNotNull(processEngine.get("transactionManager"));
+  }
+  
+  // Execute a simple process to verify the correct working of the transactionManager
+  public void testExecuteSimpleProcess() {
+    
+    String deployId = repositoryService.createDeployment()
+      .addResourceFromClasspath("org/jbpm/test/spring/transactionmanager/process.jpdl.xml")
+      .deploy();
+    
+    ProcessInstance pi = executionService.startProcessInstanceByKey("simpleProcess");
+    pi = executionService.signalExecutionById(pi.findActiveExecutionIn("a").getId());
+    pi = executionService.signalExecutionById(pi.findActiveExecutionIn("b").getId());
+    assertTrue(executionService.findProcessInstanceById(pi.getId()) == null);
+    
+    repositoryService.deleteDeploymentCascade(deployId);
+  } 
+
+}

Added: jbpm4/trunk/modules/test-cfg/src/test/resources/org/jbpm/test/spring/transactionmanager/applicationContext.xml
===================================================================
--- jbpm4/trunk/modules/test-cfg/src/test/resources/org/jbpm/test/spring/transactionmanager/applicationContext.xml	                        (rev 0)
+++ jbpm4/trunk/modules/test-cfg/src/test/resources/org/jbpm/test/spring/transactionmanager/applicationContext.xml	2009-12-11 12:38:22 UTC (rev 5951)
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<beans xmlns="http://www.springframework.org/schema/beans" 
+	     xmlns:aop="http://www.springframework.org/schema/aop" 
+	     xmlns:context="http://www.springframework.org/schema/context"
+	     xmlns:tx="http://www.springframework.org/schema/tx"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	     xsi:schemaLocation="
+          http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+          http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
+          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
+          http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
+
+  <bean id="jbpmConfiguration" class="org.jbpm.pvm.internal.cfg.SpringConfiguration">
+      <constructor-arg value="org/jbpm/test/spring/transactionmanager/jbpm.cfg.xml" />
+  </bean>
+  
+  <bean id="processEngine" factory-bean="jbpmConfiguration" factory-method="buildProcessEngine" />
+
+	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
+		<property name="configLocation" value="classpath:org/jbpm/test/spring/transactionmanager/jbpm.hibernate.cfg.xml" />
+		<!-- A best practice should be to keep split the config into multiple files
+			<property name="configLocations" value="hibernate.cfg.xml, hibernate.jbpm.cfg.xml" />
+		 -->
+		 <property name="dataSource" ref="dataSource" />
+	</bean>
+
+	<bean id="someOtherTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
+		<property name="sessionFactory" ref="sessionFactory" />
+		<property name="dataSource" ref="dataSource" />
+	</bean>
+	
+	<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
+    <property name="sessionFactory" ref="sessionFactory" />
+    <property name="dataSource" ref="dataSource" />
+  </bean>
+
+	<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
+		<property name="driverClassName" value="org.hsqldb.jdbcDriver" />
+		<property name="url" value="jdbc:hsqldb:mem:." />
+		<property name="username" value="sa" />
+		<property name="password" value="" />
+	</bean>
+
+</beans>
\ No newline at end of file

Added: jbpm4/trunk/modules/test-cfg/src/test/resources/org/jbpm/test/spring/transactionmanager/jbpm.cfg.xml
===================================================================
--- jbpm4/trunk/modules/test-cfg/src/test/resources/org/jbpm/test/spring/transactionmanager/jbpm.cfg.xml	                        (rev 0)
+++ jbpm4/trunk/modules/test-cfg/src/test/resources/org/jbpm/test/spring/transactionmanager/jbpm.cfg.xml	2009-12-11 12:38:22 UTC (rev 5951)
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<jbpm-configuration>
+
+	<import resource="jbpm.default.cfg.xml" />
+	<import resource="jbpm.jpdl.cfg.xml" />
+	<import resource="jbpm.bpmn.cfg.xml" />
+	<import resource="jbpm.identity.cfg.xml" />
+	<import resource="jbpm.businesscalendar.cfg.xml" />
+	<import resource="jbpm.console.cfg.xml" />
+
+	<!-- Spring specific configuration -->
+	<process-engine-context>
+
+		<command-service name="newTxRequiredCommandService">
+			<retry-interceptor />
+			<environment-interceptor policy="requiresNew" />
+			<spring-transaction-interceptor transaction-manager="someOtherTransactionManager"/>
+		</command-service>
+
+		<command-service name="txRequiredCommandService">
+			<retry-interceptor />
+			<environment-interceptor />
+			<spring-transaction-interceptor transaction-manager="someOtherTransactionManager"/>
+		</command-service>
+
+	</process-engine-context>
+
+	<transaction-context>
+		<transaction />
+		<hibernate-session />
+	</transaction-context>
+
+</jbpm-configuration>

Added: jbpm4/trunk/modules/test-cfg/src/test/resources/org/jbpm/test/spring/transactionmanager/jbpm.hibernate.cfg.xml
===================================================================
--- jbpm4/trunk/modules/test-cfg/src/test/resources/org/jbpm/test/spring/transactionmanager/jbpm.hibernate.cfg.xml	                        (rev 0)
+++ jbpm4/trunk/modules/test-cfg/src/test/resources/org/jbpm/test/spring/transactionmanager/jbpm.hibernate.cfg.xml	2009-12-11 12:38:22 UTC (rev 5951)
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!DOCTYPE hibernate-configuration PUBLIC
+          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
+          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
+
+<hibernate-configuration>
+  <session-factory>
+  
+     <property name="hibernate.dialect">org.hibernate.dialect.HSQLDialect</property>
+     <property name="hibernate.format_sql">true</property>
+     
+     <property name="hibernate.hbm2ddl.auto">create-drop</property>
+ 
+     <mapping resource="jbpm.repository.hbm.xml" />
+     <mapping resource="jbpm.execution.hbm.xml" />
+     <mapping resource="jbpm.history.hbm.xml" />
+     <mapping resource="jbpm.task.hbm.xml" />
+     <mapping resource="jbpm.identity.hbm.xml" />
+     
+  </session-factory>
+</hibernate-configuration>

Added: jbpm4/trunk/modules/test-cfg/src/test/resources/org/jbpm/test/spring/transactionmanager/log4j.properties
===================================================================
--- jbpm4/trunk/modules/test-cfg/src/test/resources/org/jbpm/test/spring/transactionmanager/log4j.properties	                        (rev 0)
+++ jbpm4/trunk/modules/test-cfg/src/test/resources/org/jbpm/test/spring/transactionmanager/log4j.properties	2009-12-11 12:38:22 UTC (rev 5951)
@@ -0,0 +1,4 @@
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
+log4j.rootLogger=info, stdout
\ No newline at end of file

Added: jbpm4/trunk/modules/test-cfg/src/test/resources/org/jbpm/test/spring/transactionmanager/process.jpdl.xml
===================================================================
--- jbpm4/trunk/modules/test-cfg/src/test/resources/org/jbpm/test/spring/transactionmanager/process.jpdl.xml	                        (rev 0)
+++ jbpm4/trunk/modules/test-cfg/src/test/resources/org/jbpm/test/spring/transactionmanager/process.jpdl.xml	2009-12-11 12:38:22 UTC (rev 5951)
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<process name='simpleProcess'>
+  <start>
+    <transition to='a' />
+  </start>
+  <state name='a'>
+    <transition to='b' />
+  </state>
+  <state name='b'>
+    <transition to='c' />
+  </state>
+  <end name='c' />
+</process>
\ No newline at end of file



More information about the jbpm-commits mailing list