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
>> 
>>