:(

I thought we stopped using Javolution.

Adrian Crum
Sandglass Software
www.sandglass-software.com

On 8/9/2014 10:00 AM, [email protected] 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


Reply via email to