Author: midon
Date: Wed Dec 9 00:56:28 2009
New Revision: 888666
URL: http://svn.apache.org/viewvc?rev=888666&view=rev
Log:
ODE-700: retire any previous versions of package. Thanks to Oleg Zenzin
Modified:
ode/branches/APACHE_ODE_1.X/bpel-store/src/main/java/org/apache/ode/store/ProcessStoreImpl.java
Modified:
ode/branches/APACHE_ODE_1.X/bpel-store/src/main/java/org/apache/ode/store/ProcessStoreImpl.java
URL:
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-store/src/main/java/org/apache/ode/store/ProcessStoreImpl.java?rev=888666&r1=888665&r2=888666&view=diff
==============================================================================
---
ode/branches/APACHE_ODE_1.X/bpel-store/src/main/java/org/apache/ode/store/ProcessStoreImpl.java
(original)
+++
ode/branches/APACHE_ODE_1.X/bpel-store/src/main/java/org/apache/ode/store/ProcessStoreImpl.java
Wed Dec 9 00:56:28 2009
@@ -23,18 +23,12 @@
import org.apache.ode.bpel.compiler.api.CompilationException;
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;
@@ -46,13 +40,11 @@
import java.io.IOException;
import java.sql.SQLException;
import java.util.*;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.*;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
/**
* <p>
@@ -79,6 +71,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>();
@@ -223,7 +217,7 @@
throw new ContextException(errmsg);
}
- du.setVersion(version);
+ retirePreviousPackageVersions(du);
for (TDeployment.Process processDD :
dd.getDeploy().getProcessList()) {
QName pid = toPid(processDD.getName(), version);
@@ -303,16 +297,6 @@
}
});
-
- try {
- _rw.writeLock().lock();
- for (TDeployment.Process processDD :
dd.getDeploy().getProcessList()) {
- // Retires older version if we can find one
- retireOldDUs(du.getName(), (int) version);
- }
- } finally {
- _rw.writeLock().unlock();
- }
// We want the events to be fired outside of the bounds of the
writelock.
try {
@@ -332,6 +316,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) {
return undeploy(dir.getName());
}
@@ -839,36 +851,6 @@
return new QName(processType.getNamespaceURI(),
processType.getLocalPart() + "-" + version);
}
- private void retireOldDUs(String newName, int version) {
- int dashIdx = newName.lastIndexOf("-");
- String radical;
- if (dashIdx > 0 && dashIdx + 1 < newName.length()) {
- radical = newName.substring(0, dashIdx);
- } else {
- radical = newName;
- }
-
- SortedSet<Integer> versions = new TreeSet<Integer>();
- for (String name : _deploymentUnits.keySet()) {
- if (name.startsWith(radical + "-")) {
- try {
- int v =
Integer.parseInt(name.substring(radical.length() + 1));
- versions.add(v);
- } catch (NumberFormatException e) {
- }
- }
- }
-
- if (versions.size() > 1) {
- SortedSet<Integer> retireVersions =
versions.headSet(versions.last());
- for (Integer version2 : retireVersions) {
- String name = radical + "-" + version2;
- __log.debug("Set retired package " + name);
- setRetiredPackage(name, true);
- }
- }
- }
-
private class SimpleThreadFactory implements ThreadFactory {
int threadNumber = 0;
public Thread newThread(Runnable r) {