You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ofbiz.apache.org by Adrian Crum <ad...@sandglass-software.com> on 2014/08/09 11:24:46 UTC
Re: svn commit: r1616925 - in /ofbiz/trunk: applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/
framework/common/src/org/ofbiz/common/ framework/service/src/org/ofbiz/service/
framework/service/src/org/ofbiz/service/eca/
:(
I thought we stopped using Javolution.
Adrian Crum
Sandglass Software
www.sandglass-software.com
On 8/9/2014 10:00 AM, lektran@apache.org wrote:
> Author: lektran
> Date: Sat Aug 9 09:00:39 2014
> New Revision: 1616925
>
> URL: http://svn.apache.org/r1616925
> Log:
> Replace the ServiceXaWrapper with a simpler Synchronization implementation. Helps pave the way for use of alternative transaction management libraries that don't work well with our XA wrapper implementations. Still DebugXaResource to go.
>
> Added:
> ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java (with props)
> Modified:
> ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java
> ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java
> ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java
> ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java
> ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java
> ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java
>
> Modified: ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java?rev=1616925&r1=1616924&r2=1616925&view=diff
> ==============================================================================
> --- ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java (original)
> +++ ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java Sat Aug 9 09:00:39 2014
> @@ -24,8 +24,6 @@ import java.util.Locale;
> import java.util.Map;
> import java.util.Properties;
>
> -import javax.transaction.xa.XAException;
> -
> import javolution.util.FastMap;
>
> import org.ofbiz.base.util.Debug;
> @@ -48,7 +46,6 @@ import org.ofbiz.service.GenericServiceE
> import org.ofbiz.service.LocalDispatcher;
> import org.ofbiz.service.ModelService;
> import org.ofbiz.service.ServiceUtil;
> -import org.ofbiz.service.ServiceXaWrapper;
>
> /**
> * ValueLinkServices - Integration with ValueLink Gift Cards
> @@ -792,13 +789,11 @@ public class ValueLinkServices {
> // Activate/Rollback is not supported by valuelink
> if (!vlInterface.equals("Activate")) {
> // create the listener
> - ServiceXaWrapper xaw = new ServiceXaWrapper(dctx);
> - xaw.setRollbackService("vlTimeOutReversal", context);
> - //xaw.setCommitService("vlTimeOutReversal", context);
> Debug.logInfo("Set 704 context : " + context, module);
> try {
> - xaw.enlist();
> - } catch (XAException e) {
> + dctx.getDispatcher().addRollbackService("vlTimeOutReversal", context, false);
> + //dctx.getDispatcher().addCommitService("vlTimeOutReversal", context, false);
> + } catch (GenericServiceException e) {
> Debug.logError(e, "Unable to setup 0704 Timeout Reversal", module);
> }
> }
> @@ -1214,14 +1209,10 @@ public class ValueLinkServices {
> }
>
> if (!failure) {
> - // set the void on rollback wrapper
> - ServiceXaWrapper xaw = new ServiceXaWrapper(dctx);
> - activateCtx.put("cardNumber", activateResult.get("cardNumber"));
> - activateCtx.put("pin", activateResult.get("pin"));
> - xaw.setRollbackService("voidActivateGiftCard", activateCtx);
> + // set the void on rollback
> try {
> - xaw.enlist();
> - } catch (XAException e) {
> + dispatcher.addRollbackService("voidActivateGiftCard", activateCtx, false);
> + } catch (GenericServiceException e) {
> Debug.logError(e, "Unable to setup Activate/Void on error", module);
> }
> }
>
> Modified: ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java?rev=1616925&r1=1616924&r2=1616925&view=diff
> ==============================================================================
> --- ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java (original)
> +++ ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java Sat Aug 9 09:00:39 2014
> @@ -40,7 +40,6 @@ import java.util.Set;
> import java.util.TreeSet;
>
> import javax.mail.internet.MimeMessage;
> -import javax.transaction.xa.XAException;
>
> import javolution.util.FastList;
> import javolution.util.FastMap;
> @@ -65,8 +64,8 @@ import org.ofbiz.service.DispatchContext
> import org.ofbiz.service.GenericServiceException;
> import org.ofbiz.service.LocalDispatcher;
> import org.ofbiz.service.ModelService;
> +import org.ofbiz.service.ServiceSynchronization;
> import org.ofbiz.service.ServiceUtil;
> -import org.ofbiz.service.ServiceXaWrapper;
> import org.ofbiz.service.mail.MimeMessageWrapper;
> import org.owasp.esapi.errors.EncodingException;
>
> @@ -142,23 +141,19 @@ public class CommonServices {
> }
>
> public static Map<String, Object> testRollbackListener(DispatchContext dctx, Map<String, ?> context) {
> - Locale locale = (Locale) context.get("locale");
> - ServiceXaWrapper xar = new ServiceXaWrapper(dctx);
> - xar.setRollbackService("testScv", context);
> try {
> - xar.enlist();
> - } catch (XAException e) {
> + ServiceSynchronization.registerRollbackService(dctx, "testScv", null, context, false, false);
> + } catch (GenericServiceException e) {
> Debug.logError(e, module);
> }
> + Locale locale = (Locale) context.get("locale");
> return ServiceUtil.returnError(UtilProperties.getMessage(resource, "CommonTestRollingBack", locale));
> }
>
> public static Map<String, Object> testCommitListener(DispatchContext dctx, Map<String, ?> context) {
> - ServiceXaWrapper xar = new ServiceXaWrapper(dctx);
> - xar.setCommitService("testScv", context);
> try {
> - xar.enlist();
> - } catch (XAException e) {
> + ServiceSynchronization.registerCommitService(dctx, "testScv", null, context, false, false);
> + } catch (GenericServiceException e) {
> Debug.logError(e, module);
> }
> return ServiceUtil.returnSuccess();
>
> Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java?rev=1616925&r1=1616924&r2=1616925&view=diff
> ==============================================================================
> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java (original)
> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java Sat Aug 9 09:00:39 2014
> @@ -22,7 +22,6 @@ import java.util.Date;
> import java.util.Map;
>
> import javax.transaction.Transaction;
> -import javax.transaction.xa.XAException;
>
> import org.ofbiz.service.calendar.RecurrenceRule;
> import org.ofbiz.entity.Delegator;
> @@ -117,14 +116,7 @@ public abstract class GenericAbstractDis
> }
>
> public void addRollbackService(String serviceName, Map<String, ? extends Object> context, boolean persist) throws GenericServiceException {
> - ServiceXaWrapper xa = new ServiceXaWrapper(this.getDispatchContext());
> - xa.setRollbackService(serviceName, context, true, persist);
> - try {
> - xa.enlist();
> - } catch (XAException e) {
> - Debug.logError(e, module);
> - throw new GenericServiceException(e.getMessage(), e);
> - }
> + ServiceSynchronization.registerRollbackService(this.getDispatchContext(), serviceName, null, context, true, persist);
> }
>
> public void addRollbackService(String serviceName, boolean persist, Object... context) throws GenericServiceException {
> @@ -132,14 +124,7 @@ public abstract class GenericAbstractDis
> }
>
> public void addCommitService(String serviceName, Map<String, ? extends Object> context, boolean persist) throws GenericServiceException {
> - ServiceXaWrapper xa = new ServiceXaWrapper(this.getDispatchContext());
> - xa.setCommitService(serviceName, context, true, persist);
> - try {
> - xa.enlist();
> - } catch (XAException e) {
> - Debug.logError(e, module);
> - throw new GenericServiceException(e.getMessage(), e);
> - }
> + ServiceSynchronization.registerCommitService(this.getDispatchContext(), serviceName, null, context, true, persist);
> }
>
> public void addCommitService(String serviceName, boolean persist, Object... context) throws GenericServiceException {
>
> Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java?rev=1616925&r1=1616924&r2=1616925&view=diff
> ==============================================================================
> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java (original)
> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java Sat Aug 9 09:00:39 2014
> @@ -281,7 +281,7 @@ public interface LocalDispatcher {
>
>
> /**
> - * Adds a rollback service to the current TX using the ServiceXaWrapper
> + * Adds a rollback service to the current TX using ServiceSynchronization
> * @param serviceName
> * @param context
> * @param persist
> @@ -291,7 +291,7 @@ public interface LocalDispatcher {
> public void addRollbackService(String serviceName, boolean persist, Object... context) throws GenericServiceException;
>
> /**
> - * Adds a commit service to the current TX using the ServiceXaWrapper
> + * Adds a commit service to the current TX using ServiceSynchronization
> * @param serviceName
> * @param context
> * @param persist
>
> Added: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java?rev=1616925&view=auto
> ==============================================================================
> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java (added)
> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java Sat Aug 9 09:00:39 2014
> @@ -0,0 +1,167 @@
> +package org.ofbiz.service;
> +
> +import java.util.List;
> +import java.util.Map;
> +import java.util.WeakHashMap;
> +
> +import javax.transaction.RollbackException;
> +import javax.transaction.Status;
> +import javax.transaction.Synchronization;
> +import javax.transaction.SystemException;
> +import javax.transaction.Transaction;
> +
> +import javolution.util.FastList;
> +import javolution.util.FastMap;
> +
> +import org.ofbiz.base.util.Debug;
> +import org.ofbiz.entity.transaction.GenericTransactionException;
> +import org.ofbiz.entity.transaction.TransactionFactory;
> +import org.ofbiz.entity.transaction.TransactionUtil;
> +
> +/**
> + * This class is used to execute services when a transaction is either
> + * committed or rolled back. It should generally be accessed via
> + * LocalDispatcher's addCommitService and addRollbackService methods
> + * or by using the service ECA event attribute values global-commit,
> + * global-rollback or global-commit-post-run
> + *
> + */
> +public class ServiceSynchronization implements Synchronization {
> +
> + public static final String MODULE = ServiceSynchronization.class.getName();
> +
> + private static Map<Transaction, ServiceSynchronization> syncingleton = new WeakHashMap<Transaction, ServiceSynchronization>();
> + private List<ServiceExecution> services = FastList.newInstance();
> +
> + public static void registerCommitService(DispatchContext dctx, String serviceName, String runAsUser, Map<String, ? extends Object> context, boolean async, boolean persist) throws GenericServiceException {
> + ServiceSynchronization sync = ServiceSynchronization.getInstance();
> + if (sync != null) {
> + sync.services.add(new ServiceExecution(dctx, serviceName, runAsUser, context, async, persist, false));
> + }
> + }
> +
> + public static void registerRollbackService(DispatchContext dctx, String serviceName, String runAsUser, Map<String, ? extends Object> context, boolean async, boolean persist) throws GenericServiceException {
> + ServiceSynchronization sync = ServiceSynchronization.getInstance();
> + if (sync != null) {
> + sync.services.add(new ServiceExecution(dctx, serviceName, runAsUser, context, async, persist, true));
> + }
> + }
> +
> + protected static ServiceSynchronization getInstance() throws GenericServiceException {
> + ServiceSynchronization sync = null;
> + try {
> + Transaction transaction = TransactionFactory.getTransactionManager().getTransaction();
> + synchronized (transaction) {
> + sync = syncingleton.get(transaction);
> + if (sync == null) {
> + sync = new ServiceSynchronization();
> + transaction.registerSynchronization(sync);
> + syncingleton.put(transaction, sync);
> + }
> + }
> + } catch (SystemException e) {
> + throw new GenericServiceException(e.getMessage(), e);
> + } catch (IllegalStateException e) {
> + throw new GenericServiceException(e.getMessage(), e);
> + } catch (RollbackException e) {
> + throw new GenericServiceException(e.getMessage(), e);
> + }
> + return sync;
> + }
> +
> + @Override
> + public void afterCompletion(int status) {
> + for (ServiceExecution serviceExec : this.services) {
> + serviceExec.runService(status);
> + }
> + }
> +
> + @Override
> + public void beforeCompletion() {
> +
> + }
> +
> + static class ServiceExecution {
> + protected DispatchContext dctx = null;
> + protected String serviceName;
> + protected String runAsUser = null;
> + protected Map<String, ? extends Object> context = null;
> + protected boolean rollback = false;
> + protected boolean persist = true;
> + protected boolean async = false;
> +
> + ServiceExecution(DispatchContext dctx, String serviceName, String runAsUser, Map<String, ? extends Object> context, boolean async, boolean persist, boolean rollback) {
> + this.dctx = dctx;
> + this.serviceName = serviceName;
> + this.runAsUser = runAsUser;
> + this.context = context;
> + this.async = async;
> + this.persist = persist;
> + this.rollback = rollback;
> + }
> +
> + protected void runService(int status) {
> + if ((status == Status.STATUS_COMMITTED && !rollback) || (status == Status.STATUS_ROLLEDBACK && rollback)) {
> + Thread thread = new Thread() {
> + @Override
> + public void run() {
> + String msgPrefix = null;
> + if (rollback) {
> + msgPrefix = "[Rollback] ";
> + } else {
> + msgPrefix = "[Commit] ";
> + }
> +
> + boolean beganTx;
> + try {
> + // begin the new tx
> + beganTx = TransactionUtil.begin();
> + // configure and run the service
> + try {
> + // obtain the model and get the valid context
> + ModelService model = dctx.getModelService(serviceName);
> + Map<String, Object> thisContext;
> + if (model.validate) {
> + thisContext = model.makeValid(context, ModelService.IN_PARAM);
> + } else {
> + thisContext = FastMap.newInstance();
> + thisContext.putAll(context);
> + }
> +
> + // set the userLogin object
> + thisContext.put("userLogin", ServiceUtil.getUserLogin(dctx, thisContext, runAsUser));
> + if (async) {
> + if (Debug.infoOn()) Debug.logInfo(msgPrefix + "Invoking [" + serviceName + "] via runAsync", MODULE);
> + dctx.getDispatcher().runAsync(serviceName, thisContext, persist);
> + } else {
> + if (Debug.infoOn()) Debug.logInfo(msgPrefix + "Invoking [" + serviceName + "] via runSyncIgnore", MODULE);
> + dctx.getDispatcher().runSyncIgnore(serviceName, thisContext);
> + }
> + } catch (Throwable t) {
> + Debug.logError(t, "Problem calling " + msgPrefix + "service : " + serviceName + " / " + context, MODULE);
> + try {
> + TransactionUtil.rollback(beganTx, t.getMessage(), t);
> + } catch (GenericTransactionException e) {
> + Debug.logError(e, MODULE);
> + }
> +
> + } finally {
> + // commit the transaction
> + try {
> + TransactionUtil.commit(beganTx);
> + } catch (GenericTransactionException e) {
> + Debug.logError(e, MODULE);
> + }
> + }
> + } catch (GenericTransactionException e) {
> + Debug.logError(e, MODULE);
> + }
> +
> + }
> + };
> + thread.start();
> + }
> + }
> + }
> +
> +}
>
> Propchange: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java
> ------------------------------------------------------------------------------
> svn:eol-style = native
>
> Propchange: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java
> ------------------------------------------------------------------------------
> svn:keywords = "Date Rev Author URL Id"
>
> Propchange: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java
> ------------------------------------------------------------------------------
> svn:mime-type = text/plain
>
> Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java?rev=1616925&r1=1616924&r2=1616925&view=diff
> ==============================================================================
> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java (original)
> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java Sat Aug 9 09:00:39 2014
> @@ -34,7 +34,9 @@ import org.ofbiz.entity.transaction.Tran
>
> /**
> * ServiceXaWrapper - XA Resource wrapper for running services on commit() or rollback()
> + * @deprecated - Use ServiceSynchronization instead (via LocalDispatcher)
> */
> +@Deprecated
> public class ServiceXaWrapper extends GenericXaResource {
>
> public static final String module = ServiceXaWrapper.class.getName();
>
> Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java?rev=1616925&r1=1616924&r2=1616925&view=diff
> ==============================================================================
> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java (original)
> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java Sat Aug 9 09:00:39 2014
> @@ -22,8 +22,6 @@ import java.util.LinkedList;
> import java.util.List;
> import java.util.Map;
>
> -import javax.transaction.xa.XAException;
> -
> import javolution.util.FastMap;
>
> import org.ofbiz.base.util.Debug;
> @@ -33,8 +31,8 @@ import org.ofbiz.service.DispatchContext
> import org.ofbiz.service.GenericServiceException;
> import org.ofbiz.service.LocalDispatcher;
> import org.ofbiz.service.ModelService;
> +import org.ofbiz.service.ServiceSynchronization;
> import org.ofbiz.service.ServiceUtil;
> -import org.ofbiz.service.ServiceXaWrapper;
> import org.w3c.dom.Element;
>
> /**
> @@ -115,19 +113,12 @@ public class ServiceEcaAction implements
> }
>
> if (eventName.startsWith("global-")) {
> - // XA resource ECA
> - ServiceXaWrapper xaw = new ServiceXaWrapper(dctx);
> if (eventName.equals("global-rollback")) {
> - xaw.setRollbackService(serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates
> + ServiceSynchronization.registerRollbackService(dctx, serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates
> } else if (eventName.equals("global-commit")) {
> - xaw.setCommitService(serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates
> + ServiceSynchronization.registerCommitService(dctx, serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates
> } else if (eventName.equals("global-commit-post-run")) {
> - xaw.setCommitService(serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates
> - }
> - try {
> - xaw.enlist();
> - } catch (XAException e) {
> - throw new GenericServiceException("Unable to enlist ServiceXaWrapper with transaction", e);
> + ServiceSynchronization.registerCommitService(dctx, serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates
> }
> } else {
> // standard ECA
>
>
Re: svn commit: r1616925 - in /ofbiz/trunk: applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/
framework/common/src/org/ofbiz/common/ framework/service/src/org/ofbiz/service/
framework/service/src/org/ofbiz/service/eca/
Posted by Adrian Crum <ad...@sandglass-software.com>.
Thanks Scott!
Javolution is ubiquitous in this project - removing it will require a
lot of work. I removed it from some sections of the project, but there
is still a lot of work to do.
Adrian Crum
Sandglass Software
www.sandglass-software.com
On 8/9/2014 10:44 AM, Scott Gray wrote:
> Fixed in r1616928
>
> Regards
> Scott
>
> On 9/08/2014, at 12:41 pm, Scott Gray <sc...@hotwaxmedia.com> wrote:
>
>> Oh sorry, force of habit I guess. If we've stopped using it, why haven't we removed the libs? That's a sure fire way of preventing its use!
>>
>> Regards
>> Scott
>>
>> On 9/08/2014, at 12:24 pm, Adrian Crum <ad...@sandglass-software.com> wrote:
>>
>>> :(
>>>
>>> I thought we stopped using Javolution.
>>>
>>> Adrian Crum
>>> Sandglass Software
>>> www.sandglass-software.com
>>>
>>> On 8/9/2014 10:00 AM, lektran@apache.org wrote:
>>>> Author: lektran
>>>> Date: Sat Aug 9 09:00:39 2014
>>>> New Revision: 1616925
>>>>
>>>> URL: http://svn.apache.org/r1616925
>>>> Log:
>>>> Replace the ServiceXaWrapper with a simpler Synchronization implementation. Helps pave the way for use of alternative transaction management libraries that don't work well with our XA wrapper implementations. Still DebugXaResource to go.
>>>>
>>>> Added:
>>>> ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java (with props)
>>>> Modified:
>>>> ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java
>>>> ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java
>>>> ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java
>>>> ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java
>>>> ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java
>>>> ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java
>>>>
>>>> Modified: ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java
>>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java?rev=1616925&r1=1616924&r2=1616925&view=diff
>>>> ==============================================================================
>>>> --- ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java (original)
>>>> +++ ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java Sat Aug 9 09:00:39 2014
>>>> @@ -24,8 +24,6 @@ import java.util.Locale;
>>>> import java.util.Map;
>>>> import java.util.Properties;
>>>>
>>>> -import javax.transaction.xa.XAException;
>>>> -
>>>> import javolution.util.FastMap;
>>>>
>>>> import org.ofbiz.base.util.Debug;
>>>> @@ -48,7 +46,6 @@ import org.ofbiz.service.GenericServiceE
>>>> import org.ofbiz.service.LocalDispatcher;
>>>> import org.ofbiz.service.ModelService;
>>>> import org.ofbiz.service.ServiceUtil;
>>>> -import org.ofbiz.service.ServiceXaWrapper;
>>>>
>>>> /**
>>>> * ValueLinkServices - Integration with ValueLink Gift Cards
>>>> @@ -792,13 +789,11 @@ public class ValueLinkServices {
>>>> // Activate/Rollback is not supported by valuelink
>>>> if (!vlInterface.equals("Activate")) {
>>>> // create the listener
>>>> - ServiceXaWrapper xaw = new ServiceXaWrapper(dctx);
>>>> - xaw.setRollbackService("vlTimeOutReversal", context);
>>>> - //xaw.setCommitService("vlTimeOutReversal", context);
>>>> Debug.logInfo("Set 704 context : " + context, module);
>>>> try {
>>>> - xaw.enlist();
>>>> - } catch (XAException e) {
>>>> + dctx.getDispatcher().addRollbackService("vlTimeOutReversal", context, false);
>>>> + //dctx.getDispatcher().addCommitService("vlTimeOutReversal", context, false);
>>>> + } catch (GenericServiceException e) {
>>>> Debug.logError(e, "Unable to setup 0704 Timeout Reversal", module);
>>>> }
>>>> }
>>>> @@ -1214,14 +1209,10 @@ public class ValueLinkServices {
>>>> }
>>>>
>>>> if (!failure) {
>>>> - // set the void on rollback wrapper
>>>> - ServiceXaWrapper xaw = new ServiceXaWrapper(dctx);
>>>> - activateCtx.put("cardNumber", activateResult.get("cardNumber"));
>>>> - activateCtx.put("pin", activateResult.get("pin"));
>>>> - xaw.setRollbackService("voidActivateGiftCard", activateCtx);
>>>> + // set the void on rollback
>>>> try {
>>>> - xaw.enlist();
>>>> - } catch (XAException e) {
>>>> + dispatcher.addRollbackService("voidActivateGiftCard", activateCtx, false);
>>>> + } catch (GenericServiceException e) {
>>>> Debug.logError(e, "Unable to setup Activate/Void on error", module);
>>>> }
>>>> }
>>>>
>>>> Modified: ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java
>>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java?rev=1616925&r1=1616924&r2=1616925&view=diff
>>>> ==============================================================================
>>>> --- ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java (original)
>>>> +++ ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java Sat Aug 9 09:00:39 2014
>>>> @@ -40,7 +40,6 @@ import java.util.Set;
>>>> import java.util.TreeSet;
>>>>
>>>> import javax.mail.internet.MimeMessage;
>>>> -import javax.transaction.xa.XAException;
>>>>
>>>> import javolution.util.FastList;
>>>> import javolution.util.FastMap;
>>>> @@ -65,8 +64,8 @@ import org.ofbiz.service.DispatchContext
>>>> import org.ofbiz.service.GenericServiceException;
>>>> import org.ofbiz.service.LocalDispatcher;
>>>> import org.ofbiz.service.ModelService;
>>>> +import org.ofbiz.service.ServiceSynchronization;
>>>> import org.ofbiz.service.ServiceUtil;
>>>> -import org.ofbiz.service.ServiceXaWrapper;
>>>> import org.ofbiz.service.mail.MimeMessageWrapper;
>>>> import org.owasp.esapi.errors.EncodingException;
>>>>
>>>> @@ -142,23 +141,19 @@ public class CommonServices {
>>>> }
>>>>
>>>> public static Map<String, Object> testRollbackListener(DispatchContext dctx, Map<String, ?> context) {
>>>> - Locale locale = (Locale) context.get("locale");
>>>> - ServiceXaWrapper xar = new ServiceXaWrapper(dctx);
>>>> - xar.setRollbackService("testScv", context);
>>>> try {
>>>> - xar.enlist();
>>>> - } catch (XAException e) {
>>>> + ServiceSynchronization.registerRollbackService(dctx, "testScv", null, context, false, false);
>>>> + } catch (GenericServiceException e) {
>>>> Debug.logError(e, module);
>>>> }
>>>> + Locale locale = (Locale) context.get("locale");
>>>> return ServiceUtil.returnError(UtilProperties.getMessage(resource, "CommonTestRollingBack", locale));
>>>> }
>>>>
>>>> public static Map<String, Object> testCommitListener(DispatchContext dctx, Map<String, ?> context) {
>>>> - ServiceXaWrapper xar = new ServiceXaWrapper(dctx);
>>>> - xar.setCommitService("testScv", context);
>>>> try {
>>>> - xar.enlist();
>>>> - } catch (XAException e) {
>>>> + ServiceSynchronization.registerCommitService(dctx, "testScv", null, context, false, false);
>>>> + } catch (GenericServiceException e) {
>>>> Debug.logError(e, module);
>>>> }
>>>> return ServiceUtil.returnSuccess();
>>>>
>>>> Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java
>>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java?rev=1616925&r1=1616924&r2=1616925&view=diff
>>>> ==============================================================================
>>>> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java (original)
>>>> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java Sat Aug 9 09:00:39 2014
>>>> @@ -22,7 +22,6 @@ import java.util.Date;
>>>> import java.util.Map;
>>>>
>>>> import javax.transaction.Transaction;
>>>> -import javax.transaction.xa.XAException;
>>>>
>>>> import org.ofbiz.service.calendar.RecurrenceRule;
>>>> import org.ofbiz.entity.Delegator;
>>>> @@ -117,14 +116,7 @@ public abstract class GenericAbstractDis
>>>> }
>>>>
>>>> public void addRollbackService(String serviceName, Map<String, ? extends Object> context, boolean persist) throws GenericServiceException {
>>>> - ServiceXaWrapper xa = new ServiceXaWrapper(this.getDispatchContext());
>>>> - xa.setRollbackService(serviceName, context, true, persist);
>>>> - try {
>>>> - xa.enlist();
>>>> - } catch (XAException e) {
>>>> - Debug.logError(e, module);
>>>> - throw new GenericServiceException(e.getMessage(), e);
>>>> - }
>>>> + ServiceSynchronization.registerRollbackService(this.getDispatchContext(), serviceName, null, context, true, persist);
>>>> }
>>>>
>>>> public void addRollbackService(String serviceName, boolean persist, Object... context) throws GenericServiceException {
>>>> @@ -132,14 +124,7 @@ public abstract class GenericAbstractDis
>>>> }
>>>>
>>>> public void addCommitService(String serviceName, Map<String, ? extends Object> context, boolean persist) throws GenericServiceException {
>>>> - ServiceXaWrapper xa = new ServiceXaWrapper(this.getDispatchContext());
>>>> - xa.setCommitService(serviceName, context, true, persist);
>>>> - try {
>>>> - xa.enlist();
>>>> - } catch (XAException e) {
>>>> - Debug.logError(e, module);
>>>> - throw new GenericServiceException(e.getMessage(), e);
>>>> - }
>>>> + ServiceSynchronization.registerCommitService(this.getDispatchContext(), serviceName, null, context, true, persist);
>>>> }
>>>>
>>>> public void addCommitService(String serviceName, boolean persist, Object... context) throws GenericServiceException {
>>>>
>>>> Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java
>>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java?rev=1616925&r1=1616924&r2=1616925&view=diff
>>>> ==============================================================================
>>>> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java (original)
>>>> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java Sat Aug 9 09:00:39 2014
>>>> @@ -281,7 +281,7 @@ public interface LocalDispatcher {
>>>>
>>>>
>>>> /**
>>>> - * Adds a rollback service to the current TX using the ServiceXaWrapper
>>>> + * Adds a rollback service to the current TX using ServiceSynchronization
>>>> * @param serviceName
>>>> * @param context
>>>> * @param persist
>>>> @@ -291,7 +291,7 @@ public interface LocalDispatcher {
>>>> public void addRollbackService(String serviceName, boolean persist, Object... context) throws GenericServiceException;
>>>>
>>>> /**
>>>> - * Adds a commit service to the current TX using the ServiceXaWrapper
>>>> + * Adds a commit service to the current TX using ServiceSynchronization
>>>> * @param serviceName
>>>> * @param context
>>>> * @param persist
>>>>
>>>> Added: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java
>>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java?rev=1616925&view=auto
>>>> ==============================================================================
>>>> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java (added)
>>>> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java Sat Aug 9 09:00:39 2014
>>>> @@ -0,0 +1,167 @@
>>>> +package org.ofbiz.service;
>>>> +
>>>> +import java.util.List;
>>>> +import java.util.Map;
>>>> +import java.util.WeakHashMap;
>>>> +
>>>> +import javax.transaction.RollbackException;
>>>> +import javax.transaction.Status;
>>>> +import javax.transaction.Synchronization;
>>>> +import javax.transaction.SystemException;
>>>> +import javax.transaction.Transaction;
>>>> +
>>>> +import javolution.util.FastList;
>>>> +import javolution.util.FastMap;
>>>> +
>>>> +import org.ofbiz.base.util.Debug;
>>>> +import org.ofbiz.entity.transaction.GenericTransactionException;
>>>> +import org.ofbiz.entity.transaction.TransactionFactory;
>>>> +import org.ofbiz.entity.transaction.TransactionUtil;
>>>> +
>>>> +/**
>>>> + * This class is used to execute services when a transaction is either
>>>> + * committed or rolled back. It should generally be accessed via
>>>> + * LocalDispatcher's addCommitService and addRollbackService methods
>>>> + * or by using the service ECA event attribute values global-commit,
>>>> + * global-rollback or global-commit-post-run
>>>> + *
>>>> + */
>>>> +public class ServiceSynchronization implements Synchronization {
>>>> +
>>>> + public static final String MODULE = ServiceSynchronization.class.getName();
>>>> +
>>>> + private static Map<Transaction, ServiceSynchronization> syncingleton = new WeakHashMap<Transaction, ServiceSynchronization>();
>>>> + private List<ServiceExecution> services = FastList.newInstance();
>>>> +
>>>> + public static void registerCommitService(DispatchContext dctx, String serviceName, String runAsUser, Map<String, ? extends Object> context, boolean async, boolean persist) throws GenericServiceException {
>>>> + ServiceSynchronization sync = ServiceSynchronization.getInstance();
>>>> + if (sync != null) {
>>>> + sync.services.add(new ServiceExecution(dctx, serviceName, runAsUser, context, async, persist, false));
>>>> + }
>>>> + }
>>>> +
>>>> + public static void registerRollbackService(DispatchContext dctx, String serviceName, String runAsUser, Map<String, ? extends Object> context, boolean async, boolean persist) throws GenericServiceException {
>>>> + ServiceSynchronization sync = ServiceSynchronization.getInstance();
>>>> + if (sync != null) {
>>>> + sync.services.add(new ServiceExecution(dctx, serviceName, runAsUser, context, async, persist, true));
>>>> + }
>>>> + }
>>>> +
>>>> + protected static ServiceSynchronization getInstance() throws GenericServiceException {
>>>> + ServiceSynchronization sync = null;
>>>> + try {
>>>> + Transaction transaction = TransactionFactory.getTransactionManager().getTransaction();
>>>> + synchronized (transaction) {
>>>> + sync = syncingleton.get(transaction);
>>>> + if (sync == null) {
>>>> + sync = new ServiceSynchronization();
>>>> + transaction.registerSynchronization(sync);
>>>> + syncingleton.put(transaction, sync);
>>>> + }
>>>> + }
>>>> + } catch (SystemException e) {
>>>> + throw new GenericServiceException(e.getMessage(), e);
>>>> + } catch (IllegalStateException e) {
>>>> + throw new GenericServiceException(e.getMessage(), e);
>>>> + } catch (RollbackException e) {
>>>> + throw new GenericServiceException(e.getMessage(), e);
>>>> + }
>>>> + return sync;
>>>> + }
>>>> +
>>>> + @Override
>>>> + public void afterCompletion(int status) {
>>>> + for (ServiceExecution serviceExec : this.services) {
>>>> + serviceExec.runService(status);
>>>> + }
>>>> + }
>>>> +
>>>> + @Override
>>>> + public void beforeCompletion() {
>>>> +
>>>> + }
>>>> +
>>>> + static class ServiceExecution {
>>>> + protected DispatchContext dctx = null;
>>>> + protected String serviceName;
>>>> + protected String runAsUser = null;
>>>> + protected Map<String, ? extends Object> context = null;
>>>> + protected boolean rollback = false;
>>>> + protected boolean persist = true;
>>>> + protected boolean async = false;
>>>> +
>>>> + ServiceExecution(DispatchContext dctx, String serviceName, String runAsUser, Map<String, ? extends Object> context, boolean async, boolean persist, boolean rollback) {
>>>> + this.dctx = dctx;
>>>> + this.serviceName = serviceName;
>>>> + this.runAsUser = runAsUser;
>>>> + this.context = context;
>>>> + this.async = async;
>>>> + this.persist = persist;
>>>> + this.rollback = rollback;
>>>> + }
>>>> +
>>>> + protected void runService(int status) {
>>>> + if ((status == Status.STATUS_COMMITTED && !rollback) || (status == Status.STATUS_ROLLEDBACK && rollback)) {
>>>> + Thread thread = new Thread() {
>>>> + @Override
>>>> + public void run() {
>>>> + String msgPrefix = null;
>>>> + if (rollback) {
>>>> + msgPrefix = "[Rollback] ";
>>>> + } else {
>>>> + msgPrefix = "[Commit] ";
>>>> + }
>>>> +
>>>> + boolean beganTx;
>>>> + try {
>>>> + // begin the new tx
>>>> + beganTx = TransactionUtil.begin();
>>>> + // configure and run the service
>>>> + try {
>>>> + // obtain the model and get the valid context
>>>> + ModelService model = dctx.getModelService(serviceName);
>>>> + Map<String, Object> thisContext;
>>>> + if (model.validate) {
>>>> + thisContext = model.makeValid(context, ModelService.IN_PARAM);
>>>> + } else {
>>>> + thisContext = FastMap.newInstance();
>>>> + thisContext.putAll(context);
>>>> + }
>>>> +
>>>> + // set the userLogin object
>>>> + thisContext.put("userLogin", ServiceUtil.getUserLogin(dctx, thisContext, runAsUser));
>>>> + if (async) {
>>>> + if (Debug.infoOn()) Debug.logInfo(msgPrefix + "Invoking [" + serviceName + "] via runAsync", MODULE);
>>>> + dctx.getDispatcher().runAsync(serviceName, thisContext, persist);
>>>> + } else {
>>>> + if (Debug.infoOn()) Debug.logInfo(msgPrefix + "Invoking [" + serviceName + "] via runSyncIgnore", MODULE);
>>>> + dctx.getDispatcher().runSyncIgnore(serviceName, thisContext);
>>>> + }
>>>> + } catch (Throwable t) {
>>>> + Debug.logError(t, "Problem calling " + msgPrefix + "service : " + serviceName + " / " + context, MODULE);
>>>> + try {
>>>> + TransactionUtil.rollback(beganTx, t.getMessage(), t);
>>>> + } catch (GenericTransactionException e) {
>>>> + Debug.logError(e, MODULE);
>>>> + }
>>>> +
>>>> + } finally {
>>>> + // commit the transaction
>>>> + try {
>>>> + TransactionUtil.commit(beganTx);
>>>> + } catch (GenericTransactionException e) {
>>>> + Debug.logError(e, MODULE);
>>>> + }
>>>> + }
>>>> + } catch (GenericTransactionException e) {
>>>> + Debug.logError(e, MODULE);
>>>> + }
>>>> +
>>>> + }
>>>> + };
>>>> + thread.start();
>>>> + }
>>>> + }
>>>> + }
>>>> +
>>>> +}
>>>>
>>>> Propchange: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java
>>>> ------------------------------------------------------------------------------
>>>> svn:eol-style = native
>>>>
>>>> Propchange: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java
>>>> ------------------------------------------------------------------------------
>>>> svn:keywords = "Date Rev Author URL Id"
>>>>
>>>> Propchange: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java
>>>> ------------------------------------------------------------------------------
>>>> svn:mime-type = text/plain
>>>>
>>>> Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java
>>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java?rev=1616925&r1=1616924&r2=1616925&view=diff
>>>> ==============================================================================
>>>> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java (original)
>>>> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java Sat Aug 9 09:00:39 2014
>>>> @@ -34,7 +34,9 @@ import org.ofbiz.entity.transaction.Tran
>>>>
>>>> /**
>>>> * ServiceXaWrapper - XA Resource wrapper for running services on commit() or rollback()
>>>> + * @deprecated - Use ServiceSynchronization instead (via LocalDispatcher)
>>>> */
>>>> +@Deprecated
>>>> public class ServiceXaWrapper extends GenericXaResource {
>>>>
>>>> public static final String module = ServiceXaWrapper.class.getName();
>>>>
>>>> Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java
>>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java?rev=1616925&r1=1616924&r2=1616925&view=diff
>>>> ==============================================================================
>>>> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java (original)
>>>> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java Sat Aug 9 09:00:39 2014
>>>> @@ -22,8 +22,6 @@ import java.util.LinkedList;
>>>> import java.util.List;
>>>> import java.util.Map;
>>>>
>>>> -import javax.transaction.xa.XAException;
>>>> -
>>>> import javolution.util.FastMap;
>>>>
>>>> import org.ofbiz.base.util.Debug;
>>>> @@ -33,8 +31,8 @@ import org.ofbiz.service.DispatchContext
>>>> import org.ofbiz.service.GenericServiceException;
>>>> import org.ofbiz.service.LocalDispatcher;
>>>> import org.ofbiz.service.ModelService;
>>>> +import org.ofbiz.service.ServiceSynchronization;
>>>> import org.ofbiz.service.ServiceUtil;
>>>> -import org.ofbiz.service.ServiceXaWrapper;
>>>> import org.w3c.dom.Element;
>>>>
>>>> /**
>>>> @@ -115,19 +113,12 @@ public class ServiceEcaAction implements
>>>> }
>>>>
>>>> if (eventName.startsWith("global-")) {
>>>> - // XA resource ECA
>>>> - ServiceXaWrapper xaw = new ServiceXaWrapper(dctx);
>>>> if (eventName.equals("global-rollback")) {
>>>> - xaw.setRollbackService(serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates
>>>> + ServiceSynchronization.registerRollbackService(dctx, serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates
>>>> } else if (eventName.equals("global-commit")) {
>>>> - xaw.setCommitService(serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates
>>>> + ServiceSynchronization.registerCommitService(dctx, serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates
>>>> } else if (eventName.equals("global-commit-post-run")) {
>>>> - xaw.setCommitService(serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates
>>>> - }
>>>> - try {
>>>> - xaw.enlist();
>>>> - } catch (XAException e) {
>>>> - throw new GenericServiceException("Unable to enlist ServiceXaWrapper with transaction", e);
>>>> + ServiceSynchronization.registerCommitService(dctx, serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates
>>>> }
>>>> } else {
>>>> // standard ECA
>>>>
>>>>
>>
>
Re: svn commit: r1616925 - in /ofbiz/trunk: applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ framework/common/src/org/ofbiz/common/ framework/service/src/org/ofbiz/service/ framework/service/src/org/ofbiz/service/eca/
Posted by Scott Gray <sc...@hotwaxmedia.com>.
and again in r1616931
Regards
Scott
On 9/08/2014, at 12:44 pm, Scott Gray <sc...@hotwaxmedia.com> wrote:
> Fixed in r1616928
>
> Regards
> Scott
>
> On 9/08/2014, at 12:41 pm, Scott Gray <sc...@hotwaxmedia.com> wrote:
>
>> Oh sorry, force of habit I guess. If we've stopped using it, why haven't we removed the libs? That's a sure fire way of preventing its use!
>>
>> Regards
>> Scott
>>
>> On 9/08/2014, at 12:24 pm, Adrian Crum <ad...@sandglass-software.com> wrote:
>>
>>> :(
>>>
>>> I thought we stopped using Javolution.
>>>
>>> Adrian Crum
>>> Sandglass Software
>>> www.sandglass-software.com
>>>
>>> On 8/9/2014 10:00 AM, lektran@apache.org wrote:
>>>> Author: lektran
>>>> Date: Sat Aug 9 09:00:39 2014
>>>> New Revision: 1616925
>>>>
>>>> URL: http://svn.apache.org/r1616925
>>>> Log:
>>>> Replace the ServiceXaWrapper with a simpler Synchronization implementation. Helps pave the way for use of alternative transaction management libraries that don't work well with our XA wrapper implementations. Still DebugXaResource to go.
>>>>
>>>> Added:
>>>> ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java (with props)
>>>> Modified:
>>>> ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java
>>>> ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java
>>>> ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java
>>>> ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java
>>>> ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java
>>>> ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java
>>>>
>>>> Modified: ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java
>>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java?rev=1616925&r1=1616924&r2=1616925&view=diff
>>>> ==============================================================================
>>>> --- ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java (original)
>>>> +++ ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java Sat Aug 9 09:00:39 2014
>>>> @@ -24,8 +24,6 @@ import java.util.Locale;
>>>> import java.util.Map;
>>>> import java.util.Properties;
>>>>
>>>> -import javax.transaction.xa.XAException;
>>>> -
>>>> import javolution.util.FastMap;
>>>>
>>>> import org.ofbiz.base.util.Debug;
>>>> @@ -48,7 +46,6 @@ import org.ofbiz.service.GenericServiceE
>>>> import org.ofbiz.service.LocalDispatcher;
>>>> import org.ofbiz.service.ModelService;
>>>> import org.ofbiz.service.ServiceUtil;
>>>> -import org.ofbiz.service.ServiceXaWrapper;
>>>>
>>>> /**
>>>> * ValueLinkServices - Integration with ValueLink Gift Cards
>>>> @@ -792,13 +789,11 @@ public class ValueLinkServices {
>>>> // Activate/Rollback is not supported by valuelink
>>>> if (!vlInterface.equals("Activate")) {
>>>> // create the listener
>>>> - ServiceXaWrapper xaw = new ServiceXaWrapper(dctx);
>>>> - xaw.setRollbackService("vlTimeOutReversal", context);
>>>> - //xaw.setCommitService("vlTimeOutReversal", context);
>>>> Debug.logInfo("Set 704 context : " + context, module);
>>>> try {
>>>> - xaw.enlist();
>>>> - } catch (XAException e) {
>>>> + dctx.getDispatcher().addRollbackService("vlTimeOutReversal", context, false);
>>>> + //dctx.getDispatcher().addCommitService("vlTimeOutReversal", context, false);
>>>> + } catch (GenericServiceException e) {
>>>> Debug.logError(e, "Unable to setup 0704 Timeout Reversal", module);
>>>> }
>>>> }
>>>> @@ -1214,14 +1209,10 @@ public class ValueLinkServices {
>>>> }
>>>>
>>>> if (!failure) {
>>>> - // set the void on rollback wrapper
>>>> - ServiceXaWrapper xaw = new ServiceXaWrapper(dctx);
>>>> - activateCtx.put("cardNumber", activateResult.get("cardNumber"));
>>>> - activateCtx.put("pin", activateResult.get("pin"));
>>>> - xaw.setRollbackService("voidActivateGiftCard", activateCtx);
>>>> + // set the void on rollback
>>>> try {
>>>> - xaw.enlist();
>>>> - } catch (XAException e) {
>>>> + dispatcher.addRollbackService("voidActivateGiftCard", activateCtx, false);
>>>> + } catch (GenericServiceException e) {
>>>> Debug.logError(e, "Unable to setup Activate/Void on error", module);
>>>> }
>>>> }
>>>>
>>>> Modified: ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java
>>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java?rev=1616925&r1=1616924&r2=1616925&view=diff
>>>> ==============================================================================
>>>> --- ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java (original)
>>>> +++ ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java Sat Aug 9 09:00:39 2014
>>>> @@ -40,7 +40,6 @@ import java.util.Set;
>>>> import java.util.TreeSet;
>>>>
>>>> import javax.mail.internet.MimeMessage;
>>>> -import javax.transaction.xa.XAException;
>>>>
>>>> import javolution.util.FastList;
>>>> import javolution.util.FastMap;
>>>> @@ -65,8 +64,8 @@ import org.ofbiz.service.DispatchContext
>>>> import org.ofbiz.service.GenericServiceException;
>>>> import org.ofbiz.service.LocalDispatcher;
>>>> import org.ofbiz.service.ModelService;
>>>> +import org.ofbiz.service.ServiceSynchronization;
>>>> import org.ofbiz.service.ServiceUtil;
>>>> -import org.ofbiz.service.ServiceXaWrapper;
>>>> import org.ofbiz.service.mail.MimeMessageWrapper;
>>>> import org.owasp.esapi.errors.EncodingException;
>>>>
>>>> @@ -142,23 +141,19 @@ public class CommonServices {
>>>> }
>>>>
>>>> public static Map<String, Object> testRollbackListener(DispatchContext dctx, Map<String, ?> context) {
>>>> - Locale locale = (Locale) context.get("locale");
>>>> - ServiceXaWrapper xar = new ServiceXaWrapper(dctx);
>>>> - xar.setRollbackService("testScv", context);
>>>> try {
>>>> - xar.enlist();
>>>> - } catch (XAException e) {
>>>> + ServiceSynchronization.registerRollbackService(dctx, "testScv", null, context, false, false);
>>>> + } catch (GenericServiceException e) {
>>>> Debug.logError(e, module);
>>>> }
>>>> + Locale locale = (Locale) context.get("locale");
>>>> return ServiceUtil.returnError(UtilProperties.getMessage(resource, "CommonTestRollingBack", locale));
>>>> }
>>>>
>>>> public static Map<String, Object> testCommitListener(DispatchContext dctx, Map<String, ?> context) {
>>>> - ServiceXaWrapper xar = new ServiceXaWrapper(dctx);
>>>> - xar.setCommitService("testScv", context);
>>>> try {
>>>> - xar.enlist();
>>>> - } catch (XAException e) {
>>>> + ServiceSynchronization.registerCommitService(dctx, "testScv", null, context, false, false);
>>>> + } catch (GenericServiceException e) {
>>>> Debug.logError(e, module);
>>>> }
>>>> return ServiceUtil.returnSuccess();
>>>>
>>>> Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java
>>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java?rev=1616925&r1=1616924&r2=1616925&view=diff
>>>> ==============================================================================
>>>> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java (original)
>>>> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java Sat Aug 9 09:00:39 2014
>>>> @@ -22,7 +22,6 @@ import java.util.Date;
>>>> import java.util.Map;
>>>>
>>>> import javax.transaction.Transaction;
>>>> -import javax.transaction.xa.XAException;
>>>>
>>>> import org.ofbiz.service.calendar.RecurrenceRule;
>>>> import org.ofbiz.entity.Delegator;
>>>> @@ -117,14 +116,7 @@ public abstract class GenericAbstractDis
>>>> }
>>>>
>>>> public void addRollbackService(String serviceName, Map<String, ? extends Object> context, boolean persist) throws GenericServiceException {
>>>> - ServiceXaWrapper xa = new ServiceXaWrapper(this.getDispatchContext());
>>>> - xa.setRollbackService(serviceName, context, true, persist);
>>>> - try {
>>>> - xa.enlist();
>>>> - } catch (XAException e) {
>>>> - Debug.logError(e, module);
>>>> - throw new GenericServiceException(e.getMessage(), e);
>>>> - }
>>>> + ServiceSynchronization.registerRollbackService(this.getDispatchContext(), serviceName, null, context, true, persist);
>>>> }
>>>>
>>>> public void addRollbackService(String serviceName, boolean persist, Object... context) throws GenericServiceException {
>>>> @@ -132,14 +124,7 @@ public abstract class GenericAbstractDis
>>>> }
>>>>
>>>> public void addCommitService(String serviceName, Map<String, ? extends Object> context, boolean persist) throws GenericServiceException {
>>>> - ServiceXaWrapper xa = new ServiceXaWrapper(this.getDispatchContext());
>>>> - xa.setCommitService(serviceName, context, true, persist);
>>>> - try {
>>>> - xa.enlist();
>>>> - } catch (XAException e) {
>>>> - Debug.logError(e, module);
>>>> - throw new GenericServiceException(e.getMessage(), e);
>>>> - }
>>>> + ServiceSynchronization.registerCommitService(this.getDispatchContext(), serviceName, null, context, true, persist);
>>>> }
>>>>
>>>> public void addCommitService(String serviceName, boolean persist, Object... context) throws GenericServiceException {
>>>>
>>>> Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java
>>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java?rev=1616925&r1=1616924&r2=1616925&view=diff
>>>> ==============================================================================
>>>> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java (original)
>>>> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java Sat Aug 9 09:00:39 2014
>>>> @@ -281,7 +281,7 @@ public interface LocalDispatcher {
>>>>
>>>>
>>>> /**
>>>> - * Adds a rollback service to the current TX using the ServiceXaWrapper
>>>> + * Adds a rollback service to the current TX using ServiceSynchronization
>>>> * @param serviceName
>>>> * @param context
>>>> * @param persist
>>>> @@ -291,7 +291,7 @@ public interface LocalDispatcher {
>>>> public void addRollbackService(String serviceName, boolean persist, Object... context) throws GenericServiceException;
>>>>
>>>> /**
>>>> - * Adds a commit service to the current TX using the ServiceXaWrapper
>>>> + * Adds a commit service to the current TX using ServiceSynchronization
>>>> * @param serviceName
>>>> * @param context
>>>> * @param persist
>>>>
>>>> Added: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java
>>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java?rev=1616925&view=auto
>>>> ==============================================================================
>>>> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java (added)
>>>> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java Sat Aug 9 09:00:39 2014
>>>> @@ -0,0 +1,167 @@
>>>> +package org.ofbiz.service;
>>>> +
>>>> +import java.util.List;
>>>> +import java.util.Map;
>>>> +import java.util.WeakHashMap;
>>>> +
>>>> +import javax.transaction.RollbackException;
>>>> +import javax.transaction.Status;
>>>> +import javax.transaction.Synchronization;
>>>> +import javax.transaction.SystemException;
>>>> +import javax.transaction.Transaction;
>>>> +
>>>> +import javolution.util.FastList;
>>>> +import javolution.util.FastMap;
>>>> +
>>>> +import org.ofbiz.base.util.Debug;
>>>> +import org.ofbiz.entity.transaction.GenericTransactionException;
>>>> +import org.ofbiz.entity.transaction.TransactionFactory;
>>>> +import org.ofbiz.entity.transaction.TransactionUtil;
>>>> +
>>>> +/**
>>>> + * This class is used to execute services when a transaction is either
>>>> + * committed or rolled back. It should generally be accessed via
>>>> + * LocalDispatcher's addCommitService and addRollbackService methods
>>>> + * or by using the service ECA event attribute values global-commit,
>>>> + * global-rollback or global-commit-post-run
>>>> + *
>>>> + */
>>>> +public class ServiceSynchronization implements Synchronization {
>>>> +
>>>> + public static final String MODULE = ServiceSynchronization.class.getName();
>>>> +
>>>> + private static Map<Transaction, ServiceSynchronization> syncingleton = new WeakHashMap<Transaction, ServiceSynchronization>();
>>>> + private List<ServiceExecution> services = FastList.newInstance();
>>>> +
>>>> + public static void registerCommitService(DispatchContext dctx, String serviceName, String runAsUser, Map<String, ? extends Object> context, boolean async, boolean persist) throws GenericServiceException {
>>>> + ServiceSynchronization sync = ServiceSynchronization.getInstance();
>>>> + if (sync != null) {
>>>> + sync.services.add(new ServiceExecution(dctx, serviceName, runAsUser, context, async, persist, false));
>>>> + }
>>>> + }
>>>> +
>>>> + public static void registerRollbackService(DispatchContext dctx, String serviceName, String runAsUser, Map<String, ? extends Object> context, boolean async, boolean persist) throws GenericServiceException {
>>>> + ServiceSynchronization sync = ServiceSynchronization.getInstance();
>>>> + if (sync != null) {
>>>> + sync.services.add(new ServiceExecution(dctx, serviceName, runAsUser, context, async, persist, true));
>>>> + }
>>>> + }
>>>> +
>>>> + protected static ServiceSynchronization getInstance() throws GenericServiceException {
>>>> + ServiceSynchronization sync = null;
>>>> + try {
>>>> + Transaction transaction = TransactionFactory.getTransactionManager().getTransaction();
>>>> + synchronized (transaction) {
>>>> + sync = syncingleton.get(transaction);
>>>> + if (sync == null) {
>>>> + sync = new ServiceSynchronization();
>>>> + transaction.registerSynchronization(sync);
>>>> + syncingleton.put(transaction, sync);
>>>> + }
>>>> + }
>>>> + } catch (SystemException e) {
>>>> + throw new GenericServiceException(e.getMessage(), e);
>>>> + } catch (IllegalStateException e) {
>>>> + throw new GenericServiceException(e.getMessage(), e);
>>>> + } catch (RollbackException e) {
>>>> + throw new GenericServiceException(e.getMessage(), e);
>>>> + }
>>>> + return sync;
>>>> + }
>>>> +
>>>> + @Override
>>>> + public void afterCompletion(int status) {
>>>> + for (ServiceExecution serviceExec : this.services) {
>>>> + serviceExec.runService(status);
>>>> + }
>>>> + }
>>>> +
>>>> + @Override
>>>> + public void beforeCompletion() {
>>>> +
>>>> + }
>>>> +
>>>> + static class ServiceExecution {
>>>> + protected DispatchContext dctx = null;
>>>> + protected String serviceName;
>>>> + protected String runAsUser = null;
>>>> + protected Map<String, ? extends Object> context = null;
>>>> + protected boolean rollback = false;
>>>> + protected boolean persist = true;
>>>> + protected boolean async = false;
>>>> +
>>>> + ServiceExecution(DispatchContext dctx, String serviceName, String runAsUser, Map<String, ? extends Object> context, boolean async, boolean persist, boolean rollback) {
>>>> + this.dctx = dctx;
>>>> + this.serviceName = serviceName;
>>>> + this.runAsUser = runAsUser;
>>>> + this.context = context;
>>>> + this.async = async;
>>>> + this.persist = persist;
>>>> + this.rollback = rollback;
>>>> + }
>>>> +
>>>> + protected void runService(int status) {
>>>> + if ((status == Status.STATUS_COMMITTED && !rollback) || (status == Status.STATUS_ROLLEDBACK && rollback)) {
>>>> + Thread thread = new Thread() {
>>>> + @Override
>>>> + public void run() {
>>>> + String msgPrefix = null;
>>>> + if (rollback) {
>>>> + msgPrefix = "[Rollback] ";
>>>> + } else {
>>>> + msgPrefix = "[Commit] ";
>>>> + }
>>>> +
>>>> + boolean beganTx;
>>>> + try {
>>>> + // begin the new tx
>>>> + beganTx = TransactionUtil.begin();
>>>> + // configure and run the service
>>>> + try {
>>>> + // obtain the model and get the valid context
>>>> + ModelService model = dctx.getModelService(serviceName);
>>>> + Map<String, Object> thisContext;
>>>> + if (model.validate) {
>>>> + thisContext = model.makeValid(context, ModelService.IN_PARAM);
>>>> + } else {
>>>> + thisContext = FastMap.newInstance();
>>>> + thisContext.putAll(context);
>>>> + }
>>>> +
>>>> + // set the userLogin object
>>>> + thisContext.put("userLogin", ServiceUtil.getUserLogin(dctx, thisContext, runAsUser));
>>>> + if (async) {
>>>> + if (Debug.infoOn()) Debug.logInfo(msgPrefix + "Invoking [" + serviceName + "] via runAsync", MODULE);
>>>> + dctx.getDispatcher().runAsync(serviceName, thisContext, persist);
>>>> + } else {
>>>> + if (Debug.infoOn()) Debug.logInfo(msgPrefix + "Invoking [" + serviceName + "] via runSyncIgnore", MODULE);
>>>> + dctx.getDispatcher().runSyncIgnore(serviceName, thisContext);
>>>> + }
>>>> + } catch (Throwable t) {
>>>> + Debug.logError(t, "Problem calling " + msgPrefix + "service : " + serviceName + " / " + context, MODULE);
>>>> + try {
>>>> + TransactionUtil.rollback(beganTx, t.getMessage(), t);
>>>> + } catch (GenericTransactionException e) {
>>>> + Debug.logError(e, MODULE);
>>>> + }
>>>> +
>>>> + } finally {
>>>> + // commit the transaction
>>>> + try {
>>>> + TransactionUtil.commit(beganTx);
>>>> + } catch (GenericTransactionException e) {
>>>> + Debug.logError(e, MODULE);
>>>> + }
>>>> + }
>>>> + } catch (GenericTransactionException e) {
>>>> + Debug.logError(e, MODULE);
>>>> + }
>>>> +
>>>> + }
>>>> + };
>>>> + thread.start();
>>>> + }
>>>> + }
>>>> + }
>>>> +
>>>> +}
>>>>
>>>> Propchange: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java
>>>> ------------------------------------------------------------------------------
>>>> svn:eol-style = native
>>>>
>>>> Propchange: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java
>>>> ------------------------------------------------------------------------------
>>>> svn:keywords = "Date Rev Author URL Id"
>>>>
>>>> Propchange: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java
>>>> ------------------------------------------------------------------------------
>>>> svn:mime-type = text/plain
>>>>
>>>> Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java
>>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java?rev=1616925&r1=1616924&r2=1616925&view=diff
>>>> ==============================================================================
>>>> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java (original)
>>>> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java Sat Aug 9 09:00:39 2014
>>>> @@ -34,7 +34,9 @@ import org.ofbiz.entity.transaction.Tran
>>>>
>>>> /**
>>>> * ServiceXaWrapper - XA Resource wrapper for running services on commit() or rollback()
>>>> + * @deprecated - Use ServiceSynchronization instead (via LocalDispatcher)
>>>> */
>>>> +@Deprecated
>>>> public class ServiceXaWrapper extends GenericXaResource {
>>>>
>>>> public static final String module = ServiceXaWrapper.class.getName();
>>>>
>>>> Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java
>>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java?rev=1616925&r1=1616924&r2=1616925&view=diff
>>>> ==============================================================================
>>>> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java (original)
>>>> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java Sat Aug 9 09:00:39 2014
>>>> @@ -22,8 +22,6 @@ import java.util.LinkedList;
>>>> import java.util.List;
>>>> import java.util.Map;
>>>>
>>>> -import javax.transaction.xa.XAException;
>>>> -
>>>> import javolution.util.FastMap;
>>>>
>>>> import org.ofbiz.base.util.Debug;
>>>> @@ -33,8 +31,8 @@ import org.ofbiz.service.DispatchContext
>>>> import org.ofbiz.service.GenericServiceException;
>>>> import org.ofbiz.service.LocalDispatcher;
>>>> import org.ofbiz.service.ModelService;
>>>> +import org.ofbiz.service.ServiceSynchronization;
>>>> import org.ofbiz.service.ServiceUtil;
>>>> -import org.ofbiz.service.ServiceXaWrapper;
>>>> import org.w3c.dom.Element;
>>>>
>>>> /**
>>>> @@ -115,19 +113,12 @@ public class ServiceEcaAction implements
>>>> }
>>>>
>>>> if (eventName.startsWith("global-")) {
>>>> - // XA resource ECA
>>>> - ServiceXaWrapper xaw = new ServiceXaWrapper(dctx);
>>>> if (eventName.equals("global-rollback")) {
>>>> - xaw.setRollbackService(serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates
>>>> + ServiceSynchronization.registerRollbackService(dctx, serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates
>>>> } else if (eventName.equals("global-commit")) {
>>>> - xaw.setCommitService(serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates
>>>> + ServiceSynchronization.registerCommitService(dctx, serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates
>>>> } else if (eventName.equals("global-commit-post-run")) {
>>>> - xaw.setCommitService(serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates
>>>> - }
>>>> - try {
>>>> - xaw.enlist();
>>>> - } catch (XAException e) {
>>>> - throw new GenericServiceException("Unable to enlist ServiceXaWrapper with transaction", e);
>>>> + ServiceSynchronization.registerCommitService(dctx, serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates
>>>> }
>>>> } else {
>>>> // standard ECA
>>>>
>>>>
>>
>
Re: svn commit: r1616925 - in /ofbiz/trunk: applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ framework/common/src/org/ofbiz/common/ framework/service/src/org/ofbiz/service/ framework/service/src/org/ofbiz/service/eca/
Posted by Scott Gray <sc...@hotwaxmedia.com>.
Fixed in r1616928
Regards
Scott
On 9/08/2014, at 12:41 pm, Scott Gray <sc...@hotwaxmedia.com> wrote:
> Oh sorry, force of habit I guess. If we've stopped using it, why haven't we removed the libs? That's a sure fire way of preventing its use!
>
> Regards
> Scott
>
> On 9/08/2014, at 12:24 pm, Adrian Crum <ad...@sandglass-software.com> wrote:
>
>> :(
>>
>> I thought we stopped using Javolution.
>>
>> Adrian Crum
>> Sandglass Software
>> www.sandglass-software.com
>>
>> On 8/9/2014 10:00 AM, lektran@apache.org wrote:
>>> Author: lektran
>>> Date: Sat Aug 9 09:00:39 2014
>>> New Revision: 1616925
>>>
>>> URL: http://svn.apache.org/r1616925
>>> Log:
>>> Replace the ServiceXaWrapper with a simpler Synchronization implementation. Helps pave the way for use of alternative transaction management libraries that don't work well with our XA wrapper implementations. Still DebugXaResource to go.
>>>
>>> Added:
>>> ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java (with props)
>>> Modified:
>>> ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java
>>> ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java
>>> ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java
>>> ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java
>>> ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java
>>> ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java
>>>
>>> Modified: ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java
>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java?rev=1616925&r1=1616924&r2=1616925&view=diff
>>> ==============================================================================
>>> --- ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java (original)
>>> +++ ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java Sat Aug 9 09:00:39 2014
>>> @@ -24,8 +24,6 @@ import java.util.Locale;
>>> import java.util.Map;
>>> import java.util.Properties;
>>>
>>> -import javax.transaction.xa.XAException;
>>> -
>>> import javolution.util.FastMap;
>>>
>>> import org.ofbiz.base.util.Debug;
>>> @@ -48,7 +46,6 @@ import org.ofbiz.service.GenericServiceE
>>> import org.ofbiz.service.LocalDispatcher;
>>> import org.ofbiz.service.ModelService;
>>> import org.ofbiz.service.ServiceUtil;
>>> -import org.ofbiz.service.ServiceXaWrapper;
>>>
>>> /**
>>> * ValueLinkServices - Integration with ValueLink Gift Cards
>>> @@ -792,13 +789,11 @@ public class ValueLinkServices {
>>> // Activate/Rollback is not supported by valuelink
>>> if (!vlInterface.equals("Activate")) {
>>> // create the listener
>>> - ServiceXaWrapper xaw = new ServiceXaWrapper(dctx);
>>> - xaw.setRollbackService("vlTimeOutReversal", context);
>>> - //xaw.setCommitService("vlTimeOutReversal", context);
>>> Debug.logInfo("Set 704 context : " + context, module);
>>> try {
>>> - xaw.enlist();
>>> - } catch (XAException e) {
>>> + dctx.getDispatcher().addRollbackService("vlTimeOutReversal", context, false);
>>> + //dctx.getDispatcher().addCommitService("vlTimeOutReversal", context, false);
>>> + } catch (GenericServiceException e) {
>>> Debug.logError(e, "Unable to setup 0704 Timeout Reversal", module);
>>> }
>>> }
>>> @@ -1214,14 +1209,10 @@ public class ValueLinkServices {
>>> }
>>>
>>> if (!failure) {
>>> - // set the void on rollback wrapper
>>> - ServiceXaWrapper xaw = new ServiceXaWrapper(dctx);
>>> - activateCtx.put("cardNumber", activateResult.get("cardNumber"));
>>> - activateCtx.put("pin", activateResult.get("pin"));
>>> - xaw.setRollbackService("voidActivateGiftCard", activateCtx);
>>> + // set the void on rollback
>>> try {
>>> - xaw.enlist();
>>> - } catch (XAException e) {
>>> + dispatcher.addRollbackService("voidActivateGiftCard", activateCtx, false);
>>> + } catch (GenericServiceException e) {
>>> Debug.logError(e, "Unable to setup Activate/Void on error", module);
>>> }
>>> }
>>>
>>> Modified: ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java
>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java?rev=1616925&r1=1616924&r2=1616925&view=diff
>>> ==============================================================================
>>> --- ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java (original)
>>> +++ ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java Sat Aug 9 09:00:39 2014
>>> @@ -40,7 +40,6 @@ import java.util.Set;
>>> import java.util.TreeSet;
>>>
>>> import javax.mail.internet.MimeMessage;
>>> -import javax.transaction.xa.XAException;
>>>
>>> import javolution.util.FastList;
>>> import javolution.util.FastMap;
>>> @@ -65,8 +64,8 @@ import org.ofbiz.service.DispatchContext
>>> import org.ofbiz.service.GenericServiceException;
>>> import org.ofbiz.service.LocalDispatcher;
>>> import org.ofbiz.service.ModelService;
>>> +import org.ofbiz.service.ServiceSynchronization;
>>> import org.ofbiz.service.ServiceUtil;
>>> -import org.ofbiz.service.ServiceXaWrapper;
>>> import org.ofbiz.service.mail.MimeMessageWrapper;
>>> import org.owasp.esapi.errors.EncodingException;
>>>
>>> @@ -142,23 +141,19 @@ public class CommonServices {
>>> }
>>>
>>> public static Map<String, Object> testRollbackListener(DispatchContext dctx, Map<String, ?> context) {
>>> - Locale locale = (Locale) context.get("locale");
>>> - ServiceXaWrapper xar = new ServiceXaWrapper(dctx);
>>> - xar.setRollbackService("testScv", context);
>>> try {
>>> - xar.enlist();
>>> - } catch (XAException e) {
>>> + ServiceSynchronization.registerRollbackService(dctx, "testScv", null, context, false, false);
>>> + } catch (GenericServiceException e) {
>>> Debug.logError(e, module);
>>> }
>>> + Locale locale = (Locale) context.get("locale");
>>> return ServiceUtil.returnError(UtilProperties.getMessage(resource, "CommonTestRollingBack", locale));
>>> }
>>>
>>> public static Map<String, Object> testCommitListener(DispatchContext dctx, Map<String, ?> context) {
>>> - ServiceXaWrapper xar = new ServiceXaWrapper(dctx);
>>> - xar.setCommitService("testScv", context);
>>> try {
>>> - xar.enlist();
>>> - } catch (XAException e) {
>>> + ServiceSynchronization.registerCommitService(dctx, "testScv", null, context, false, false);
>>> + } catch (GenericServiceException e) {
>>> Debug.logError(e, module);
>>> }
>>> return ServiceUtil.returnSuccess();
>>>
>>> Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java
>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java?rev=1616925&r1=1616924&r2=1616925&view=diff
>>> ==============================================================================
>>> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java (original)
>>> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java Sat Aug 9 09:00:39 2014
>>> @@ -22,7 +22,6 @@ import java.util.Date;
>>> import java.util.Map;
>>>
>>> import javax.transaction.Transaction;
>>> -import javax.transaction.xa.XAException;
>>>
>>> import org.ofbiz.service.calendar.RecurrenceRule;
>>> import org.ofbiz.entity.Delegator;
>>> @@ -117,14 +116,7 @@ public abstract class GenericAbstractDis
>>> }
>>>
>>> public void addRollbackService(String serviceName, Map<String, ? extends Object> context, boolean persist) throws GenericServiceException {
>>> - ServiceXaWrapper xa = new ServiceXaWrapper(this.getDispatchContext());
>>> - xa.setRollbackService(serviceName, context, true, persist);
>>> - try {
>>> - xa.enlist();
>>> - } catch (XAException e) {
>>> - Debug.logError(e, module);
>>> - throw new GenericServiceException(e.getMessage(), e);
>>> - }
>>> + ServiceSynchronization.registerRollbackService(this.getDispatchContext(), serviceName, null, context, true, persist);
>>> }
>>>
>>> public void addRollbackService(String serviceName, boolean persist, Object... context) throws GenericServiceException {
>>> @@ -132,14 +124,7 @@ public abstract class GenericAbstractDis
>>> }
>>>
>>> public void addCommitService(String serviceName, Map<String, ? extends Object> context, boolean persist) throws GenericServiceException {
>>> - ServiceXaWrapper xa = new ServiceXaWrapper(this.getDispatchContext());
>>> - xa.setCommitService(serviceName, context, true, persist);
>>> - try {
>>> - xa.enlist();
>>> - } catch (XAException e) {
>>> - Debug.logError(e, module);
>>> - throw new GenericServiceException(e.getMessage(), e);
>>> - }
>>> + ServiceSynchronization.registerCommitService(this.getDispatchContext(), serviceName, null, context, true, persist);
>>> }
>>>
>>> public void addCommitService(String serviceName, boolean persist, Object... context) throws GenericServiceException {
>>>
>>> Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java
>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java?rev=1616925&r1=1616924&r2=1616925&view=diff
>>> ==============================================================================
>>> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java (original)
>>> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java Sat Aug 9 09:00:39 2014
>>> @@ -281,7 +281,7 @@ public interface LocalDispatcher {
>>>
>>>
>>> /**
>>> - * Adds a rollback service to the current TX using the ServiceXaWrapper
>>> + * Adds a rollback service to the current TX using ServiceSynchronization
>>> * @param serviceName
>>> * @param context
>>> * @param persist
>>> @@ -291,7 +291,7 @@ public interface LocalDispatcher {
>>> public void addRollbackService(String serviceName, boolean persist, Object... context) throws GenericServiceException;
>>>
>>> /**
>>> - * Adds a commit service to the current TX using the ServiceXaWrapper
>>> + * Adds a commit service to the current TX using ServiceSynchronization
>>> * @param serviceName
>>> * @param context
>>> * @param persist
>>>
>>> Added: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java
>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java?rev=1616925&view=auto
>>> ==============================================================================
>>> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java (added)
>>> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java Sat Aug 9 09:00:39 2014
>>> @@ -0,0 +1,167 @@
>>> +package org.ofbiz.service;
>>> +
>>> +import java.util.List;
>>> +import java.util.Map;
>>> +import java.util.WeakHashMap;
>>> +
>>> +import javax.transaction.RollbackException;
>>> +import javax.transaction.Status;
>>> +import javax.transaction.Synchronization;
>>> +import javax.transaction.SystemException;
>>> +import javax.transaction.Transaction;
>>> +
>>> +import javolution.util.FastList;
>>> +import javolution.util.FastMap;
>>> +
>>> +import org.ofbiz.base.util.Debug;
>>> +import org.ofbiz.entity.transaction.GenericTransactionException;
>>> +import org.ofbiz.entity.transaction.TransactionFactory;
>>> +import org.ofbiz.entity.transaction.TransactionUtil;
>>> +
>>> +/**
>>> + * This class is used to execute services when a transaction is either
>>> + * committed or rolled back. It should generally be accessed via
>>> + * LocalDispatcher's addCommitService and addRollbackService methods
>>> + * or by using the service ECA event attribute values global-commit,
>>> + * global-rollback or global-commit-post-run
>>> + *
>>> + */
>>> +public class ServiceSynchronization implements Synchronization {
>>> +
>>> + public static final String MODULE = ServiceSynchronization.class.getName();
>>> +
>>> + private static Map<Transaction, ServiceSynchronization> syncingleton = new WeakHashMap<Transaction, ServiceSynchronization>();
>>> + private List<ServiceExecution> services = FastList.newInstance();
>>> +
>>> + public static void registerCommitService(DispatchContext dctx, String serviceName, String runAsUser, Map<String, ? extends Object> context, boolean async, boolean persist) throws GenericServiceException {
>>> + ServiceSynchronization sync = ServiceSynchronization.getInstance();
>>> + if (sync != null) {
>>> + sync.services.add(new ServiceExecution(dctx, serviceName, runAsUser, context, async, persist, false));
>>> + }
>>> + }
>>> +
>>> + public static void registerRollbackService(DispatchContext dctx, String serviceName, String runAsUser, Map<String, ? extends Object> context, boolean async, boolean persist) throws GenericServiceException {
>>> + ServiceSynchronization sync = ServiceSynchronization.getInstance();
>>> + if (sync != null) {
>>> + sync.services.add(new ServiceExecution(dctx, serviceName, runAsUser, context, async, persist, true));
>>> + }
>>> + }
>>> +
>>> + protected static ServiceSynchronization getInstance() throws GenericServiceException {
>>> + ServiceSynchronization sync = null;
>>> + try {
>>> + Transaction transaction = TransactionFactory.getTransactionManager().getTransaction();
>>> + synchronized (transaction) {
>>> + sync = syncingleton.get(transaction);
>>> + if (sync == null) {
>>> + sync = new ServiceSynchronization();
>>> + transaction.registerSynchronization(sync);
>>> + syncingleton.put(transaction, sync);
>>> + }
>>> + }
>>> + } catch (SystemException e) {
>>> + throw new GenericServiceException(e.getMessage(), e);
>>> + } catch (IllegalStateException e) {
>>> + throw new GenericServiceException(e.getMessage(), e);
>>> + } catch (RollbackException e) {
>>> + throw new GenericServiceException(e.getMessage(), e);
>>> + }
>>> + return sync;
>>> + }
>>> +
>>> + @Override
>>> + public void afterCompletion(int status) {
>>> + for (ServiceExecution serviceExec : this.services) {
>>> + serviceExec.runService(status);
>>> + }
>>> + }
>>> +
>>> + @Override
>>> + public void beforeCompletion() {
>>> +
>>> + }
>>> +
>>> + static class ServiceExecution {
>>> + protected DispatchContext dctx = null;
>>> + protected String serviceName;
>>> + protected String runAsUser = null;
>>> + protected Map<String, ? extends Object> context = null;
>>> + protected boolean rollback = false;
>>> + protected boolean persist = true;
>>> + protected boolean async = false;
>>> +
>>> + ServiceExecution(DispatchContext dctx, String serviceName, String runAsUser, Map<String, ? extends Object> context, boolean async, boolean persist, boolean rollback) {
>>> + this.dctx = dctx;
>>> + this.serviceName = serviceName;
>>> + this.runAsUser = runAsUser;
>>> + this.context = context;
>>> + this.async = async;
>>> + this.persist = persist;
>>> + this.rollback = rollback;
>>> + }
>>> +
>>> + protected void runService(int status) {
>>> + if ((status == Status.STATUS_COMMITTED && !rollback) || (status == Status.STATUS_ROLLEDBACK && rollback)) {
>>> + Thread thread = new Thread() {
>>> + @Override
>>> + public void run() {
>>> + String msgPrefix = null;
>>> + if (rollback) {
>>> + msgPrefix = "[Rollback] ";
>>> + } else {
>>> + msgPrefix = "[Commit] ";
>>> + }
>>> +
>>> + boolean beganTx;
>>> + try {
>>> + // begin the new tx
>>> + beganTx = TransactionUtil.begin();
>>> + // configure and run the service
>>> + try {
>>> + // obtain the model and get the valid context
>>> + ModelService model = dctx.getModelService(serviceName);
>>> + Map<String, Object> thisContext;
>>> + if (model.validate) {
>>> + thisContext = model.makeValid(context, ModelService.IN_PARAM);
>>> + } else {
>>> + thisContext = FastMap.newInstance();
>>> + thisContext.putAll(context);
>>> + }
>>> +
>>> + // set the userLogin object
>>> + thisContext.put("userLogin", ServiceUtil.getUserLogin(dctx, thisContext, runAsUser));
>>> + if (async) {
>>> + if (Debug.infoOn()) Debug.logInfo(msgPrefix + "Invoking [" + serviceName + "] via runAsync", MODULE);
>>> + dctx.getDispatcher().runAsync(serviceName, thisContext, persist);
>>> + } else {
>>> + if (Debug.infoOn()) Debug.logInfo(msgPrefix + "Invoking [" + serviceName + "] via runSyncIgnore", MODULE);
>>> + dctx.getDispatcher().runSyncIgnore(serviceName, thisContext);
>>> + }
>>> + } catch (Throwable t) {
>>> + Debug.logError(t, "Problem calling " + msgPrefix + "service : " + serviceName + " / " + context, MODULE);
>>> + try {
>>> + TransactionUtil.rollback(beganTx, t.getMessage(), t);
>>> + } catch (GenericTransactionException e) {
>>> + Debug.logError(e, MODULE);
>>> + }
>>> +
>>> + } finally {
>>> + // commit the transaction
>>> + try {
>>> + TransactionUtil.commit(beganTx);
>>> + } catch (GenericTransactionException e) {
>>> + Debug.logError(e, MODULE);
>>> + }
>>> + }
>>> + } catch (GenericTransactionException e) {
>>> + Debug.logError(e, MODULE);
>>> + }
>>> +
>>> + }
>>> + };
>>> + thread.start();
>>> + }
>>> + }
>>> + }
>>> +
>>> +}
>>>
>>> Propchange: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java
>>> ------------------------------------------------------------------------------
>>> svn:eol-style = native
>>>
>>> Propchange: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java
>>> ------------------------------------------------------------------------------
>>> svn:keywords = "Date Rev Author URL Id"
>>>
>>> Propchange: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java
>>> ------------------------------------------------------------------------------
>>> svn:mime-type = text/plain
>>>
>>> Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java
>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java?rev=1616925&r1=1616924&r2=1616925&view=diff
>>> ==============================================================================
>>> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java (original)
>>> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java Sat Aug 9 09:00:39 2014
>>> @@ -34,7 +34,9 @@ import org.ofbiz.entity.transaction.Tran
>>>
>>> /**
>>> * ServiceXaWrapper - XA Resource wrapper for running services on commit() or rollback()
>>> + * @deprecated - Use ServiceSynchronization instead (via LocalDispatcher)
>>> */
>>> +@Deprecated
>>> public class ServiceXaWrapper extends GenericXaResource {
>>>
>>> public static final String module = ServiceXaWrapper.class.getName();
>>>
>>> Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java
>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java?rev=1616925&r1=1616924&r2=1616925&view=diff
>>> ==============================================================================
>>> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java (original)
>>> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java Sat Aug 9 09:00:39 2014
>>> @@ -22,8 +22,6 @@ import java.util.LinkedList;
>>> import java.util.List;
>>> import java.util.Map;
>>>
>>> -import javax.transaction.xa.XAException;
>>> -
>>> import javolution.util.FastMap;
>>>
>>> import org.ofbiz.base.util.Debug;
>>> @@ -33,8 +31,8 @@ import org.ofbiz.service.DispatchContext
>>> import org.ofbiz.service.GenericServiceException;
>>> import org.ofbiz.service.LocalDispatcher;
>>> import org.ofbiz.service.ModelService;
>>> +import org.ofbiz.service.ServiceSynchronization;
>>> import org.ofbiz.service.ServiceUtil;
>>> -import org.ofbiz.service.ServiceXaWrapper;
>>> import org.w3c.dom.Element;
>>>
>>> /**
>>> @@ -115,19 +113,12 @@ public class ServiceEcaAction implements
>>> }
>>>
>>> if (eventName.startsWith("global-")) {
>>> - // XA resource ECA
>>> - ServiceXaWrapper xaw = new ServiceXaWrapper(dctx);
>>> if (eventName.equals("global-rollback")) {
>>> - xaw.setRollbackService(serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates
>>> + ServiceSynchronization.registerRollbackService(dctx, serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates
>>> } else if (eventName.equals("global-commit")) {
>>> - xaw.setCommitService(serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates
>>> + ServiceSynchronization.registerCommitService(dctx, serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates
>>> } else if (eventName.equals("global-commit-post-run")) {
>>> - xaw.setCommitService(serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates
>>> - }
>>> - try {
>>> - xaw.enlist();
>>> - } catch (XAException e) {
>>> - throw new GenericServiceException("Unable to enlist ServiceXaWrapper with transaction", e);
>>> + ServiceSynchronization.registerCommitService(dctx, serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates
>>> }
>>> } else {
>>> // standard ECA
>>>
>>>
>
Re: svn commit: r1616925 - in /ofbiz/trunk: applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ framework/common/src/org/ofbiz/common/ framework/service/src/org/ofbiz/service/ framework/service/src/org/ofbiz/service/eca/
Posted by Scott Gray <sc...@hotwaxmedia.com>.
Oh sorry, force of habit I guess. If we've stopped using it, why haven't we removed the libs? That's a sure fire way of preventing its use!
Regards
Scott
On 9/08/2014, at 12:24 pm, Adrian Crum <ad...@sandglass-software.com> wrote:
> :(
>
> I thought we stopped using Javolution.
>
> Adrian Crum
> Sandglass Software
> www.sandglass-software.com
>
> On 8/9/2014 10:00 AM, lektran@apache.org wrote:
>> Author: lektran
>> Date: Sat Aug 9 09:00:39 2014
>> New Revision: 1616925
>>
>> URL: http://svn.apache.org/r1616925
>> Log:
>> Replace the ServiceXaWrapper with a simpler Synchronization implementation. Helps pave the way for use of alternative transaction management libraries that don't work well with our XA wrapper implementations. Still DebugXaResource to go.
>>
>> Added:
>> ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java (with props)
>> Modified:
>> ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java
>> ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java
>> ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java
>> ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java
>> ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java
>> ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java
>>
>> Modified: ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java
>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java?rev=1616925&r1=1616924&r2=1616925&view=diff
>> ==============================================================================
>> --- ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java (original)
>> +++ ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java Sat Aug 9 09:00:39 2014
>> @@ -24,8 +24,6 @@ import java.util.Locale;
>> import java.util.Map;
>> import java.util.Properties;
>>
>> -import javax.transaction.xa.XAException;
>> -
>> import javolution.util.FastMap;
>>
>> import org.ofbiz.base.util.Debug;
>> @@ -48,7 +46,6 @@ import org.ofbiz.service.GenericServiceE
>> import org.ofbiz.service.LocalDispatcher;
>> import org.ofbiz.service.ModelService;
>> import org.ofbiz.service.ServiceUtil;
>> -import org.ofbiz.service.ServiceXaWrapper;
>>
>> /**
>> * ValueLinkServices - Integration with ValueLink Gift Cards
>> @@ -792,13 +789,11 @@ public class ValueLinkServices {
>> // Activate/Rollback is not supported by valuelink
>> if (!vlInterface.equals("Activate")) {
>> // create the listener
>> - ServiceXaWrapper xaw = new ServiceXaWrapper(dctx);
>> - xaw.setRollbackService("vlTimeOutReversal", context);
>> - //xaw.setCommitService("vlTimeOutReversal", context);
>> Debug.logInfo("Set 704 context : " + context, module);
>> try {
>> - xaw.enlist();
>> - } catch (XAException e) {
>> + dctx.getDispatcher().addRollbackService("vlTimeOutReversal", context, false);
>> + //dctx.getDispatcher().addCommitService("vlTimeOutReversal", context, false);
>> + } catch (GenericServiceException e) {
>> Debug.logError(e, "Unable to setup 0704 Timeout Reversal", module);
>> }
>> }
>> @@ -1214,14 +1209,10 @@ public class ValueLinkServices {
>> }
>>
>> if (!failure) {
>> - // set the void on rollback wrapper
>> - ServiceXaWrapper xaw = new ServiceXaWrapper(dctx);
>> - activateCtx.put("cardNumber", activateResult.get("cardNumber"));
>> - activateCtx.put("pin", activateResult.get("pin"));
>> - xaw.setRollbackService("voidActivateGiftCard", activateCtx);
>> + // set the void on rollback
>> try {
>> - xaw.enlist();
>> - } catch (XAException e) {
>> + dispatcher.addRollbackService("voidActivateGiftCard", activateCtx, false);
>> + } catch (GenericServiceException e) {
>> Debug.logError(e, "Unable to setup Activate/Void on error", module);
>> }
>> }
>>
>> Modified: ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java
>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java?rev=1616925&r1=1616924&r2=1616925&view=diff
>> ==============================================================================
>> --- ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java (original)
>> +++ ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java Sat Aug 9 09:00:39 2014
>> @@ -40,7 +40,6 @@ import java.util.Set;
>> import java.util.TreeSet;
>>
>> import javax.mail.internet.MimeMessage;
>> -import javax.transaction.xa.XAException;
>>
>> import javolution.util.FastList;
>> import javolution.util.FastMap;
>> @@ -65,8 +64,8 @@ import org.ofbiz.service.DispatchContext
>> import org.ofbiz.service.GenericServiceException;
>> import org.ofbiz.service.LocalDispatcher;
>> import org.ofbiz.service.ModelService;
>> +import org.ofbiz.service.ServiceSynchronization;
>> import org.ofbiz.service.ServiceUtil;
>> -import org.ofbiz.service.ServiceXaWrapper;
>> import org.ofbiz.service.mail.MimeMessageWrapper;
>> import org.owasp.esapi.errors.EncodingException;
>>
>> @@ -142,23 +141,19 @@ public class CommonServices {
>> }
>>
>> public static Map<String, Object> testRollbackListener(DispatchContext dctx, Map<String, ?> context) {
>> - Locale locale = (Locale) context.get("locale");
>> - ServiceXaWrapper xar = new ServiceXaWrapper(dctx);
>> - xar.setRollbackService("testScv", context);
>> try {
>> - xar.enlist();
>> - } catch (XAException e) {
>> + ServiceSynchronization.registerRollbackService(dctx, "testScv", null, context, false, false);
>> + } catch (GenericServiceException e) {
>> Debug.logError(e, module);
>> }
>> + Locale locale = (Locale) context.get("locale");
>> return ServiceUtil.returnError(UtilProperties.getMessage(resource, "CommonTestRollingBack", locale));
>> }
>>
>> public static Map<String, Object> testCommitListener(DispatchContext dctx, Map<String, ?> context) {
>> - ServiceXaWrapper xar = new ServiceXaWrapper(dctx);
>> - xar.setCommitService("testScv", context);
>> try {
>> - xar.enlist();
>> - } catch (XAException e) {
>> + ServiceSynchronization.registerCommitService(dctx, "testScv", null, context, false, false);
>> + } catch (GenericServiceException e) {
>> Debug.logError(e, module);
>> }
>> return ServiceUtil.returnSuccess();
>>
>> Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java
>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java?rev=1616925&r1=1616924&r2=1616925&view=diff
>> ==============================================================================
>> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java (original)
>> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java Sat Aug 9 09:00:39 2014
>> @@ -22,7 +22,6 @@ import java.util.Date;
>> import java.util.Map;
>>
>> import javax.transaction.Transaction;
>> -import javax.transaction.xa.XAException;
>>
>> import org.ofbiz.service.calendar.RecurrenceRule;
>> import org.ofbiz.entity.Delegator;
>> @@ -117,14 +116,7 @@ public abstract class GenericAbstractDis
>> }
>>
>> public void addRollbackService(String serviceName, Map<String, ? extends Object> context, boolean persist) throws GenericServiceException {
>> - ServiceXaWrapper xa = new ServiceXaWrapper(this.getDispatchContext());
>> - xa.setRollbackService(serviceName, context, true, persist);
>> - try {
>> - xa.enlist();
>> - } catch (XAException e) {
>> - Debug.logError(e, module);
>> - throw new GenericServiceException(e.getMessage(), e);
>> - }
>> + ServiceSynchronization.registerRollbackService(this.getDispatchContext(), serviceName, null, context, true, persist);
>> }
>>
>> public void addRollbackService(String serviceName, boolean persist, Object... context) throws GenericServiceException {
>> @@ -132,14 +124,7 @@ public abstract class GenericAbstractDis
>> }
>>
>> public void addCommitService(String serviceName, Map<String, ? extends Object> context, boolean persist) throws GenericServiceException {
>> - ServiceXaWrapper xa = new ServiceXaWrapper(this.getDispatchContext());
>> - xa.setCommitService(serviceName, context, true, persist);
>> - try {
>> - xa.enlist();
>> - } catch (XAException e) {
>> - Debug.logError(e, module);
>> - throw new GenericServiceException(e.getMessage(), e);
>> - }
>> + ServiceSynchronization.registerCommitService(this.getDispatchContext(), serviceName, null, context, true, persist);
>> }
>>
>> public void addCommitService(String serviceName, boolean persist, Object... context) throws GenericServiceException {
>>
>> Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java
>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java?rev=1616925&r1=1616924&r2=1616925&view=diff
>> ==============================================================================
>> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java (original)
>> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java Sat Aug 9 09:00:39 2014
>> @@ -281,7 +281,7 @@ public interface LocalDispatcher {
>>
>>
>> /**
>> - * Adds a rollback service to the current TX using the ServiceXaWrapper
>> + * Adds a rollback service to the current TX using ServiceSynchronization
>> * @param serviceName
>> * @param context
>> * @param persist
>> @@ -291,7 +291,7 @@ public interface LocalDispatcher {
>> public void addRollbackService(String serviceName, boolean persist, Object... context) throws GenericServiceException;
>>
>> /**
>> - * Adds a commit service to the current TX using the ServiceXaWrapper
>> + * Adds a commit service to the current TX using ServiceSynchronization
>> * @param serviceName
>> * @param context
>> * @param persist
>>
>> Added: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java
>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java?rev=1616925&view=auto
>> ==============================================================================
>> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java (added)
>> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java Sat Aug 9 09:00:39 2014
>> @@ -0,0 +1,167 @@
>> +package org.ofbiz.service;
>> +
>> +import java.util.List;
>> +import java.util.Map;
>> +import java.util.WeakHashMap;
>> +
>> +import javax.transaction.RollbackException;
>> +import javax.transaction.Status;
>> +import javax.transaction.Synchronization;
>> +import javax.transaction.SystemException;
>> +import javax.transaction.Transaction;
>> +
>> +import javolution.util.FastList;
>> +import javolution.util.FastMap;
>> +
>> +import org.ofbiz.base.util.Debug;
>> +import org.ofbiz.entity.transaction.GenericTransactionException;
>> +import org.ofbiz.entity.transaction.TransactionFactory;
>> +import org.ofbiz.entity.transaction.TransactionUtil;
>> +
>> +/**
>> + * This class is used to execute services when a transaction is either
>> + * committed or rolled back. It should generally be accessed via
>> + * LocalDispatcher's addCommitService and addRollbackService methods
>> + * or by using the service ECA event attribute values global-commit,
>> + * global-rollback or global-commit-post-run
>> + *
>> + */
>> +public class ServiceSynchronization implements Synchronization {
>> +
>> + public static final String MODULE = ServiceSynchronization.class.getName();
>> +
>> + private static Map<Transaction, ServiceSynchronization> syncingleton = new WeakHashMap<Transaction, ServiceSynchronization>();
>> + private List<ServiceExecution> services = FastList.newInstance();
>> +
>> + public static void registerCommitService(DispatchContext dctx, String serviceName, String runAsUser, Map<String, ? extends Object> context, boolean async, boolean persist) throws GenericServiceException {
>> + ServiceSynchronization sync = ServiceSynchronization.getInstance();
>> + if (sync != null) {
>> + sync.services.add(new ServiceExecution(dctx, serviceName, runAsUser, context, async, persist, false));
>> + }
>> + }
>> +
>> + public static void registerRollbackService(DispatchContext dctx, String serviceName, String runAsUser, Map<String, ? extends Object> context, boolean async, boolean persist) throws GenericServiceException {
>> + ServiceSynchronization sync = ServiceSynchronization.getInstance();
>> + if (sync != null) {
>> + sync.services.add(new ServiceExecution(dctx, serviceName, runAsUser, context, async, persist, true));
>> + }
>> + }
>> +
>> + protected static ServiceSynchronization getInstance() throws GenericServiceException {
>> + ServiceSynchronization sync = null;
>> + try {
>> + Transaction transaction = TransactionFactory.getTransactionManager().getTransaction();
>> + synchronized (transaction) {
>> + sync = syncingleton.get(transaction);
>> + if (sync == null) {
>> + sync = new ServiceSynchronization();
>> + transaction.registerSynchronization(sync);
>> + syncingleton.put(transaction, sync);
>> + }
>> + }
>> + } catch (SystemException e) {
>> + throw new GenericServiceException(e.getMessage(), e);
>> + } catch (IllegalStateException e) {
>> + throw new GenericServiceException(e.getMessage(), e);
>> + } catch (RollbackException e) {
>> + throw new GenericServiceException(e.getMessage(), e);
>> + }
>> + return sync;
>> + }
>> +
>> + @Override
>> + public void afterCompletion(int status) {
>> + for (ServiceExecution serviceExec : this.services) {
>> + serviceExec.runService(status);
>> + }
>> + }
>> +
>> + @Override
>> + public void beforeCompletion() {
>> +
>> + }
>> +
>> + static class ServiceExecution {
>> + protected DispatchContext dctx = null;
>> + protected String serviceName;
>> + protected String runAsUser = null;
>> + protected Map<String, ? extends Object> context = null;
>> + protected boolean rollback = false;
>> + protected boolean persist = true;
>> + protected boolean async = false;
>> +
>> + ServiceExecution(DispatchContext dctx, String serviceName, String runAsUser, Map<String, ? extends Object> context, boolean async, boolean persist, boolean rollback) {
>> + this.dctx = dctx;
>> + this.serviceName = serviceName;
>> + this.runAsUser = runAsUser;
>> + this.context = context;
>> + this.async = async;
>> + this.persist = persist;
>> + this.rollback = rollback;
>> + }
>> +
>> + protected void runService(int status) {
>> + if ((status == Status.STATUS_COMMITTED && !rollback) || (status == Status.STATUS_ROLLEDBACK && rollback)) {
>> + Thread thread = new Thread() {
>> + @Override
>> + public void run() {
>> + String msgPrefix = null;
>> + if (rollback) {
>> + msgPrefix = "[Rollback] ";
>> + } else {
>> + msgPrefix = "[Commit] ";
>> + }
>> +
>> + boolean beganTx;
>> + try {
>> + // begin the new tx
>> + beganTx = TransactionUtil.begin();
>> + // configure and run the service
>> + try {
>> + // obtain the model and get the valid context
>> + ModelService model = dctx.getModelService(serviceName);
>> + Map<String, Object> thisContext;
>> + if (model.validate) {
>> + thisContext = model.makeValid(context, ModelService.IN_PARAM);
>> + } else {
>> + thisContext = FastMap.newInstance();
>> + thisContext.putAll(context);
>> + }
>> +
>> + // set the userLogin object
>> + thisContext.put("userLogin", ServiceUtil.getUserLogin(dctx, thisContext, runAsUser));
>> + if (async) {
>> + if (Debug.infoOn()) Debug.logInfo(msgPrefix + "Invoking [" + serviceName + "] via runAsync", MODULE);
>> + dctx.getDispatcher().runAsync(serviceName, thisContext, persist);
>> + } else {
>> + if (Debug.infoOn()) Debug.logInfo(msgPrefix + "Invoking [" + serviceName + "] via runSyncIgnore", MODULE);
>> + dctx.getDispatcher().runSyncIgnore(serviceName, thisContext);
>> + }
>> + } catch (Throwable t) {
>> + Debug.logError(t, "Problem calling " + msgPrefix + "service : " + serviceName + " / " + context, MODULE);
>> + try {
>> + TransactionUtil.rollback(beganTx, t.getMessage(), t);
>> + } catch (GenericTransactionException e) {
>> + Debug.logError(e, MODULE);
>> + }
>> +
>> + } finally {
>> + // commit the transaction
>> + try {
>> + TransactionUtil.commit(beganTx);
>> + } catch (GenericTransactionException e) {
>> + Debug.logError(e, MODULE);
>> + }
>> + }
>> + } catch (GenericTransactionException e) {
>> + Debug.logError(e, MODULE);
>> + }
>> +
>> + }
>> + };
>> + thread.start();
>> + }
>> + }
>> + }
>> +
>> +}
>>
>> Propchange: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java
>> ------------------------------------------------------------------------------
>> svn:eol-style = native
>>
>> Propchange: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java
>> ------------------------------------------------------------------------------
>> svn:keywords = "Date Rev Author URL Id"
>>
>> Propchange: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java
>> ------------------------------------------------------------------------------
>> svn:mime-type = text/plain
>>
>> Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java
>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java?rev=1616925&r1=1616924&r2=1616925&view=diff
>> ==============================================================================
>> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java (original)
>> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java Sat Aug 9 09:00:39 2014
>> @@ -34,7 +34,9 @@ import org.ofbiz.entity.transaction.Tran
>>
>> /**
>> * ServiceXaWrapper - XA Resource wrapper for running services on commit() or rollback()
>> + * @deprecated - Use ServiceSynchronization instead (via LocalDispatcher)
>> */
>> +@Deprecated
>> public class ServiceXaWrapper extends GenericXaResource {
>>
>> public static final String module = ServiceXaWrapper.class.getName();
>>
>> Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java
>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java?rev=1616925&r1=1616924&r2=1616925&view=diff
>> ==============================================================================
>> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java (original)
>> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java Sat Aug 9 09:00:39 2014
>> @@ -22,8 +22,6 @@ import java.util.LinkedList;
>> import java.util.List;
>> import java.util.Map;
>>
>> -import javax.transaction.xa.XAException;
>> -
>> import javolution.util.FastMap;
>>
>> import org.ofbiz.base.util.Debug;
>> @@ -33,8 +31,8 @@ import org.ofbiz.service.DispatchContext
>> import org.ofbiz.service.GenericServiceException;
>> import org.ofbiz.service.LocalDispatcher;
>> import org.ofbiz.service.ModelService;
>> +import org.ofbiz.service.ServiceSynchronization;
>> import org.ofbiz.service.ServiceUtil;
>> -import org.ofbiz.service.ServiceXaWrapper;
>> import org.w3c.dom.Element;
>>
>> /**
>> @@ -115,19 +113,12 @@ public class ServiceEcaAction implements
>> }
>>
>> if (eventName.startsWith("global-")) {
>> - // XA resource ECA
>> - ServiceXaWrapper xaw = new ServiceXaWrapper(dctx);
>> if (eventName.equals("global-rollback")) {
>> - xaw.setRollbackService(serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates
>> + ServiceSynchronization.registerRollbackService(dctx, serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates
>> } else if (eventName.equals("global-commit")) {
>> - xaw.setCommitService(serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates
>> + ServiceSynchronization.registerCommitService(dctx, serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates
>> } else if (eventName.equals("global-commit-post-run")) {
>> - xaw.setCommitService(serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates
>> - }
>> - try {
>> - xaw.enlist();
>> - } catch (XAException e) {
>> - throw new GenericServiceException("Unable to enlist ServiceXaWrapper with transaction", e);
>> + ServiceSynchronization.registerCommitService(dctx, serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates
>> }
>> } else {
>> // standard ECA
>>
>>