[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