You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ode.apache.org by mi...@apache.org on 2009/12/09 03:01:42 UTC

svn commit: r888674 - /ode/trunk/bpel-store/src/main/java/org/apache/ode/store/ProcessStoreImpl.java

Author: midon
Date: Wed Dec  9 02:01:40 2009
New Revision: 888674

URL: http://svn.apache.org/viewvc?rev=888674&view=rev
Log:
ODE-700: retire any previous versions of package. Thanks to Oleg Zenzin

Modified:
    ode/trunk/bpel-store/src/main/java/org/apache/ode/store/ProcessStoreImpl.java

Modified: ode/trunk/bpel-store/src/main/java/org/apache/ode/store/ProcessStoreImpl.java
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-store/src/main/java/org/apache/ode/store/ProcessStoreImpl.java?rev=888674&r1=888673&r2=888674&view=diff
==============================================================================
--- ode/trunk/bpel-store/src/main/java/org/apache/ode/store/ProcessStoreImpl.java (original)
+++ ode/trunk/bpel-store/src/main/java/org/apache/ode/store/ProcessStoreImpl.java Wed Dec  9 02:01:40 2009
@@ -29,6 +29,8 @@
 import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import javax.sql.DataSource;
 import javax.xml.namespace.QName;
@@ -39,18 +41,12 @@
 import org.apache.ode.bpel.extension.ExtensionValidator;
 import org.apache.ode.bpel.dd.DeployDocument;
 import org.apache.ode.bpel.dd.TDeployment;
-import org.apache.ode.bpel.iapi.ContextException;
-import org.apache.ode.bpel.iapi.ProcessConf;
-import org.apache.ode.bpel.iapi.ProcessState;
-import org.apache.ode.bpel.iapi.ProcessStore;
-import org.apache.ode.bpel.iapi.ProcessStoreEvent;
-import org.apache.ode.bpel.iapi.ProcessStoreListener;
-import org.apache.ode.bpel.iapi.EndpointReferenceContext;
+import org.apache.ode.bpel.iapi.*;
+import org.apache.ode.il.config.OdeConfigProperties;
 import org.apache.ode.store.DeploymentUnitDir.CBPInfo;
 import org.apache.ode.utils.DOMUtils;
 import org.apache.ode.utils.GUID;
 import org.apache.ode.utils.msg.MessageBundle;
-import org.apache.ode.il.config.OdeConfigProperties;
 import org.hsqldb.jdbc.jdbcDataSource;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
@@ -81,6 +77,8 @@
 
     private final CopyOnWriteArrayList<ProcessStoreListener> _listeners = new CopyOnWriteArrayList<ProcessStoreListener>();
 
+    private static final String VERSION_REGEXP = "([-\\Q.\\E](\\d)+)?";
+
     private Map<QName, ProcessConfImpl> _processes = new HashMap<QName, ProcessConfImpl>();
 
     private Map<String, DeploymentUnitDir> _deploymentUnits = new HashMap<String, DeploymentUnitDir>();
@@ -209,14 +207,11 @@
 
             du.setVersion(version);
 
+            retirePreviousPackageVersions(du);
+
             for (TDeployment.Process processDD : dd.getDeploy().getProcessList()) {
                 QName pid = toPid(processDD.getName(), version);
 
-                // Retires older version if we can find one
-                DeploymentUnitDir oldDU = findOldDU(du.getName());
-                if (oldDU != null)
-                    setRetiredPackage(oldDU.getName(), true);
-
                 if (_processes.containsKey(pid)) {
                     String errmsg = __msgs.msgDeployFailDuplicatePID(processDD.getName(), du.getName());
                     __log.error(errmsg);
@@ -311,6 +306,34 @@
         return deployed;
     }
 
+    /**
+     * Retire all the other versions of the same DU:
+     * first take the DU name and insert version regexp,
+     * than try to match the this string against names of already deployed DUs.
+     * For instance if we are deploying DU "AbsenceRequest-2/AbsenceRequest.ode" and
+     * there's already version 2 than regexp
+     * "AbsenceRequest([-\\.](\d)+)?/AbsenceRequest.ode" will be matched against
+     * "AbsenceRequest-2/AbsenceRequest.ode" and setRetirePackage() will be called accordingly.
+     */
+    private void retirePreviousPackageVersions(DeploymentUnitDir du) {
+        //retire all the other versions of the same DU
+        String[] nameParts = du.getName().split("/");
+        nameParts[0] += VERSION_REGEXP;
+        StringBuilder duNameRegExp = new StringBuilder(du.getName().length() * 2);
+        for (int i = 0, n = nameParts.length; i < n; i++) {
+            if (i > 0) duNameRegExp.append("/");
+            duNameRegExp.append(nameParts[i]);
+        }
+
+        Pattern duNamePattern = Pattern.compile(duNameRegExp.toString());
+        for (String deployedDUname : _deploymentUnits.keySet()) {
+            Matcher matcher = duNamePattern.matcher(deployedDUname);
+            if (matcher.matches()) {
+                setRetiredPackage(deployedDUname, true);
+            }
+        }
+    }
+
     public Collection<QName> undeploy(final File dir) {
         try {
             exec(new Callable<Collection<QName>>() {