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 <adrian.c...@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, lekt...@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 >> >>