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

Reply via email to