Author: rebody
Date: 2010-06-14 21:58:05 -0400 (Mon, 14 Jun 2010)
New Revision: 6413
Added:
jbpm4/trunk/modules/pvm/src/test/java/org/jbpm/pvm/internal/wire/binding/TransactionBindingTest.java
Modified:
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/tx/JtaTransaction.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/TransactionBinding.java
Log:
JBPM-2694 let JtaTransaction's attributes configurable.
Modified:
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/tx/JtaTransaction.java
===================================================================
---
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/tx/JtaTransaction.java 2010-06-15
01:07:58 UTC (rev 6412)
+++
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/tx/JtaTransaction.java 2010-06-15
01:58:05 UTC (rev 6413)
@@ -1,152 +1,161 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2005, JBoss Inc., and individual contributors as indicated
- * 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.jbpm.pvm.internal.tx;
-
-import javax.naming.InitialContext;
-import javax.transaction.Status;
-import javax.transaction.Synchronization;
-import javax.transaction.SystemException;
-import javax.transaction.TransactionManager;
-import javax.transaction.UserTransaction;
-
-import org.jbpm.api.JbpmException;
-import org.jbpm.internal.log.Log;
-
-
-/**
- * @author Tom Baeyens
- */
-public class JtaTransaction extends AbstractTransaction implements Transaction {
-
- private static Log log = Log.getLog(JtaTransaction.class.getName());
-
- public static final String JNDINAME_USERTRANSACTION_JBOSS_GLOBAL =
"UserTransaction";
- public static final String JNDINAME_TRANSACTIONMANAGER_JBOSS_GLOBAL =
"java:/TransactionManager";
-
- protected String userTransactionJndiName = JNDINAME_USERTRANSACTION_JBOSS_GLOBAL;
- protected String transactionManagerJndiName =
JNDINAME_TRANSACTIONMANAGER_JBOSS_GLOBAL;
-
- public boolean isRollbackOnly() {
- try {
- return lookupJeeUserTransaction().getStatus()==Status.STATUS_MARKED_ROLLBACK;
- } catch (SystemException e) {
- throw new JbpmException("couldn't get status of user transaction:
"+e.getMessage(), e);
- }
- }
-
- public void setRollbackOnly() {
- try {
- lookupJeeUserTransaction().setRollbackOnly();
- } catch (Exception e) {
- throw new JbpmException("couldn't set user transaction to rollback only:
"+e.getMessage(), e);
- }
- }
-
- public void registerSynchronization(Synchronization synchronization) {
- try {
- lookupJeeTransaction().registerSynchronization(synchronization);
- } catch (Exception e) {
- throw new JbpmException("couldn't register synchronization:
"+e.getMessage(), e);
- }
- }
-
- public void begin() {
- try {
- lookupJeeUserTransaction().begin();
- } catch (Exception e) {
- throw new JbpmException("couldn't begin transaction:
"+e.getMessage(), e);
- }
- }
-
- public void rollback() {
- try {
- lookupJeeUserTransaction().rollback();
- } catch (Exception e) {
- throw new JbpmException("couldn't rollback: "+e.getMessage(), e);
- }
- }
-
- public void commit() {
- try {
- flushDeserializedObjects();
-
- lookupJeeUserTransaction().commit();
- } catch (Exception e) {
- throw new JbpmException("couldn't commit: "+e.getMessage(), e);
- }
- }
-
- public javax.transaction.Transaction suspend() {
- try {
- return lookupJeeTransactionManager().suspend();
- } catch (Exception e) {
- throw new JbpmException("couldn't suspend: "+e.getMessage(), e);
- }
- }
-
- public void resume(javax.transaction.Transaction transaction) {
- try {
- lookupJeeTransactionManager().resume(transaction);
- } catch (Exception e) {
- throw new JbpmException("couldn't resume: "+e.getMessage(), e);
- }
- }
-
- // lookups //////////////////////////////////////////////////////////////////
-
- public UserTransaction lookupJeeUserTransaction() {
- return (UserTransaction) lookupFromJndi(userTransactionJndiName);
- }
-
- public javax.transaction.Transaction lookupJeeTransaction() {
- try {
- TransactionManager transactionManager = lookupJeeTransactionManager();
- return transactionManager.getTransaction();
- } catch (Exception e) {
- throw new JbpmException("couldn't get transaction from transaction manager
"+transactionManagerJndiName+": "+e.getMessage(), e);
- }
- }
-
- public TransactionManager lookupJeeTransactionManager() {
- return (TransactionManager) lookupFromJndi(transactionManagerJndiName);
- }
-
- public static Object lookupFromJndi(String jndiName) {
- try {
- InitialContext initialContext = new InitialContext();
- return initialContext.lookup(jndiName);
- } catch (Exception e) {
- throw new JbpmException("couldn't lookup '"+jndiName+"'
from jndi: "+e.getMessage()+": "+e.getMessage(), e);
- }
- }
-
- public static int getUserTransactionStatus(UserTransaction userTransaction) {
- int status = -1;
- try {
- status = userTransaction.getStatus();
- } catch (SystemException e) {
- throw new JbpmException("couldn't get transaction status:
"+e.getMessage(), e);
- }
- log.trace("jta transaction status: "+JtaStatusHelper.toString(status));
- return status;
- }
-}
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * 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.jbpm.pvm.internal.tx;
+
+import javax.naming.InitialContext;
+import javax.transaction.Status;
+import javax.transaction.Synchronization;
+import javax.transaction.SystemException;
+import javax.transaction.TransactionManager;
+import javax.transaction.UserTransaction;
+
+import org.jbpm.api.JbpmException;
+import org.jbpm.internal.log.Log;
+
+
+/**
+ * @author Tom Baeyens
+ * @author Huisheng Xu
+ */
+public class JtaTransaction extends AbstractTransaction implements Transaction {
+
+ private static Log log = Log.getLog(JtaTransaction.class.getName());
+
+ public static final String JNDINAME_USERTRANSACTION_JBOSS_GLOBAL =
"UserTransaction";
+ public static final String JNDINAME_TRANSACTIONMANAGER_JBOSS_GLOBAL =
"java:/TransactionManager";
+
+ protected String userTransactionJndiName = JNDINAME_USERTRANSACTION_JBOSS_GLOBAL;
+ protected String transactionManagerJndiName =
JNDINAME_TRANSACTIONMANAGER_JBOSS_GLOBAL;
+
+ public boolean isRollbackOnly() {
+ try {
+ return lookupJeeUserTransaction().getStatus()==Status.STATUS_MARKED_ROLLBACK;
+ } catch (SystemException e) {
+ throw new JbpmException("couldn't get status of user transaction:
"+e.getMessage(), e);
+ }
+ }
+
+ public void setRollbackOnly() {
+ try {
+ lookupJeeUserTransaction().setRollbackOnly();
+ } catch (Exception e) {
+ throw new JbpmException("couldn't set user transaction to rollback only:
"+e.getMessage(), e);
+ }
+ }
+
+ public void registerSynchronization(Synchronization synchronization) {
+ try {
+ lookupJeeTransaction().registerSynchronization(synchronization);
+ } catch (Exception e) {
+ throw new JbpmException("couldn't register synchronization:
"+e.getMessage(), e);
+ }
+ }
+
+ public void begin() {
+ try {
+ lookupJeeUserTransaction().begin();
+ } catch (Exception e) {
+ throw new JbpmException("couldn't begin transaction:
"+e.getMessage(), e);
+ }
+ }
+
+ public void rollback() {
+ try {
+ lookupJeeUserTransaction().rollback();
+ } catch (Exception e) {
+ throw new JbpmException("couldn't rollback: "+e.getMessage(), e);
+ }
+ }
+
+ public void commit() {
+ try {
+ flushDeserializedObjects();
+
+ lookupJeeUserTransaction().commit();
+ } catch (Exception e) {
+ throw new JbpmException("couldn't commit: "+e.getMessage(), e);
+ }
+ }
+
+ public javax.transaction.Transaction suspend() {
+ try {
+ return lookupJeeTransactionManager().suspend();
+ } catch (Exception e) {
+ throw new JbpmException("couldn't suspend: "+e.getMessage(), e);
+ }
+ }
+
+ public void resume(javax.transaction.Transaction transaction) {
+ try {
+ lookupJeeTransactionManager().resume(transaction);
+ } catch (Exception e) {
+ throw new JbpmException("couldn't resume: "+e.getMessage(), e);
+ }
+ }
+
+ // lookups //////////////////////////////////////////////////////////////////
+
+ public UserTransaction lookupJeeUserTransaction() {
+ return (UserTransaction) lookupFromJndi(userTransactionJndiName);
+ }
+
+ public javax.transaction.Transaction lookupJeeTransaction() {
+ try {
+ TransactionManager transactionManager = lookupJeeTransactionManager();
+ return transactionManager.getTransaction();
+ } catch (Exception e) {
+ throw new JbpmException("couldn't get transaction from transaction manager
"+transactionManagerJndiName+": "+e.getMessage(), e);
+ }
+ }
+
+ public TransactionManager lookupJeeTransactionManager() {
+ return (TransactionManager) lookupFromJndi(transactionManagerJndiName);
+ }
+
+ public static Object lookupFromJndi(String jndiName) {
+ try {
+ InitialContext initialContext = new InitialContext();
+ return initialContext.lookup(jndiName);
+ } catch (Exception e) {
+ throw new JbpmException("couldn't lookup '"+jndiName+"'
from jndi: "+e.getMessage()+": "+e.getMessage(), e);
+ }
+ }
+
+ public static int getUserTransactionStatus(UserTransaction userTransaction) {
+ int status = -1;
+ try {
+ status = userTransaction.getStatus();
+ } catch (SystemException e) {
+ throw new JbpmException("couldn't get transaction status:
"+e.getMessage(), e);
+ }
+ log.trace("jta transaction status: "+JtaStatusHelper.toString(status));
+ return status;
+ }
+
+ public String getUserTransactionJndiName() {
+ return userTransactionJndiName;
+ }
+
+ public String getTransactionManagerJndiName() {
+ return transactionManagerJndiName;
+ }
+}
Modified:
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/TransactionBinding.java
===================================================================
---
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/TransactionBinding.java 2010-06-15
01:07:58 UTC (rev 6412)
+++
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/binding/TransactionBinding.java 2010-06-15
01:58:05 UTC (rev 6413)
@@ -21,23 +21,32 @@
*/
package org.jbpm.pvm.internal.wire.binding;
+import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.env.EnvironmentImpl;
import org.jbpm.pvm.internal.tx.JtaTransaction;
import org.jbpm.pvm.internal.tx.SpringTransaction;
import org.jbpm.pvm.internal.tx.StandardTransaction;
import org.jbpm.pvm.internal.tx.Transaction;
import org.jbpm.pvm.internal.wire.descriptor.ObjectDescriptor;
+import org.jbpm.pvm.internal.wire.descriptor.StringDescriptor;
+import org.jbpm.pvm.internal.wire.operation.FieldOperation;
import org.jbpm.pvm.internal.xml.Parse;
import org.jbpm.pvm.internal.xml.Parser;
+import org.hibernate.cfg.Configuration;
import org.w3c.dom.Element;
+
/** parses a descriptor for creating a {@link Transaction}.
- *
+ *
* See schema docs for more details.
*
* @author Tom Baeyens
+ * @author Huisheng Xu
*/
public class TransactionBinding extends WireDescriptorBinding {
+ private static Log log = Log.getLog(TransactionBinding.class.getName());
+
public TransactionBinding() {
super("transaction");
}
@@ -49,17 +58,92 @@
if (element.hasAttribute("type")) {
type = element.getAttribute("type");
}
-
+
if ("standard".equals(type)) {
transactionDescriptor = new ObjectDescriptor(StandardTransaction.class);
} else if ("jta".equals(type)){
transactionDescriptor = new ObjectDescriptor(JtaTransaction.class);
+
+ this.autoDetectOrParseAttribute(transactionDescriptor, element);
} else if ("spring".equals(type)){
transactionDescriptor = new ObjectDescriptor(SpringTransaction.class);
} else {
parse.addProblem("unsupported transaction type: "+type, element);
}
-
+
return transactionDescriptor;
}
+
+ protected void autoDetectOrParseAttribute(ObjectDescriptor transactionDescriptor,
Element element) {
+ if (element.hasAttribute("user-transaction")) {
+ String userTransactionValue = element.getAttribute("user-transaction");
+
+ if (log.isDebugEnabled()) {
+ log.debug("get user-transaction from xml: [" + userTransactionValue +
"]");
+ }
+
+ this.parseFieldOperation(transactionDescriptor, element,
+ "userTransactionJndiName", userTransactionValue);
+ } else {
+ String userTransactionValue =
this.autoDetectHibernateConfiguration("jta.UserTransaction");
+
+ if (userTransactionValue != null) {
+ if (log.isDebugEnabled()) {
+ log.debug("get user-transaction from hibernate configuration: [" +
userTransactionValue + "]");
+ }
+
+ this.parseFieldOperation(transactionDescriptor, element,
+ "userTransactionJndiName", userTransactionValue);
+ } else {
+ if (log.isDebugEnabled()) {
+ log.debug("use default user-transaction: ["
+ + JtaTransaction.JNDINAME_USERTRANSACTION_JBOSS_GLOBAL + "]");
+ }
+ }
+ }
+
+ if (element.hasAttribute("transaction-manager")) {
+ String transactionManagerValue =
element.getAttribute("transaction-manager");
+
+ if (log.isDebugEnabled()) {
+ log.debug("get transaction-manager from xml: [" +
transactionManagerValue + "]");
+ }
+
+ this.parseFieldOperation(transactionDescriptor, element,
+ "transactionManagerJndiName", transactionManagerValue);
+ } else {
+ String transactionManagerValue =
+
this.autoDetectHibernateConfiguration("hibernate.transaction.manager_lookup_class");
+
+ if (log.isDebugEnabled()) {
+ log.debug("get transaction-manager from hibernate configuration: [" +
transactionManagerValue + "]");
+ }
+
+ if (transactionManagerValue != null) {
+ this.parseFieldOperation(transactionDescriptor, element,
+ "transactionManagerJndiName", transactionManagerValue);
+ } else {
+ if (log.isDebugEnabled()) {
+ log.debug("use default transaction-manager: ["
+ + JtaTransaction.JNDINAME_TRANSACTIONMANAGER_JBOSS_GLOBAL + "]");
+ }
+ }
+ }
+ }
+
+ protected void parseFieldOperation(ObjectDescriptor objectDescriptor,
+ Element element, String fieldName, String fieldValue) {
+ FieldOperation fieldOperation = new FieldOperation();
+ fieldOperation.setFieldName(fieldName);
+ fieldOperation.setDescriptor(new StringDescriptor(fieldValue));
+ objectDescriptor.addOperation(fieldOperation);
+ }
+
+ protected String autoDetectHibernateConfiguration(String propertyName) {
+ Configuration cfg = EnvironmentImpl.getFromCurrent(Configuration.class, false);
+ if (cfg == null) {
+ return null;
+ }
+ return cfg.getProperty(propertyName);
+ }
}
Added:
jbpm4/trunk/modules/pvm/src/test/java/org/jbpm/pvm/internal/wire/binding/TransactionBindingTest.java
===================================================================
---
jbpm4/trunk/modules/pvm/src/test/java/org/jbpm/pvm/internal/wire/binding/TransactionBindingTest.java
(rev 0)
+++
jbpm4/trunk/modules/pvm/src/test/java/org/jbpm/pvm/internal/wire/binding/TransactionBindingTest.java 2010-06-15
01:58:05 UTC (rev 6413)
@@ -0,0 +1,81 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * 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.jbpm.pvm.internal.wire.binding;
+
+import java.util.List;
+import org.jbpm.test.BaseJbpmTestCase;
+import org.jbpm.pvm.internal.tx.JtaTransaction;
+import org.jbpm.pvm.internal.xml.Parser;
+import org.jbpm.pvm.internal.xml.Bindings;
+import org.jbpm.pvm.internal.xml.Problem;
+import org.jbpm.pvm.internal.wire.WireContext;
+import org.jbpm.pvm.internal.wire.descriptor.ObjectDescriptor;
+
+
+/**
+ * @author Huisheng Xu
+ */
+public class TransactionBindingTest extends BaseJbpmTestCase {
+ public void testDefaultJndiName() {
+ Parser parser = new Parser();
+ Bindings bindings = new Bindings();
+ parser.setBindings(bindings);
+ parser.getBindings().addBinding(new TransactionBinding());
+
+ // jndi for jboss
+ String xml = "<transaction type='jta' />";
+
+ ObjectDescriptor objectDescriptor = (ObjectDescriptor) parser
+ .createParse()
+ .setString(xml)
+ .execute()
+ .getDocumentObject();
+
+ JtaTransaction jtaTransaction = (JtaTransaction)
WireContext.create(objectDescriptor);
+
+ assertEquals("UserTransaction",
jtaTransaction.getUserTransactionJndiName());
+ assertEquals("java:/TransactionManager",
jtaTransaction.getTransactionManagerJndiName());
+ }
+
+ public void testCustomJndiName() {
+ Parser parser = new Parser();
+ Bindings bindings = new Bindings();
+ parser.setBindings(bindings);
+ parser.getBindings().addBinding(new TransactionBinding());
+
+ // jndi for jotm on tomcat
+ String xml = "<transaction type='jta'"
+ + " user-transaction='java:comp/UserTransaction'"
+ + " transaction-manager='java:comp/UserTransaction' />";
+
+ ObjectDescriptor objectDescriptor = (ObjectDescriptor) parser
+ .createParse()
+ .setString(xml)
+ .execute()
+ .getDocumentObject();
+
+ JtaTransaction jtaTransaction = (JtaTransaction)
WireContext.create(objectDescriptor);
+
+ assertEquals("java:comp/UserTransaction",
jtaTransaction.getUserTransactionJndiName());
+ assertEquals("java:comp/UserTransaction",
jtaTransaction.getTransactionManagerJndiName());
+ }
+}