From: Mathieu Baudier Date: Thu, 2 Oct 2008 12:43:23 +0000 (+0000) Subject: Introduce doItAgain skip until error X-Git-Tag: argeo-slc-2.1.7~2510 X-Git-Url: http://git.argeo.org/?a=commitdiff_plain;h=be7ad715ee2abd75be6b0b61682f5fc3b57e0eb6;p=gpl%2Fargeo-slc.git Introduce doItAgain skip until error git-svn-id: https://svn.argeo.org/slc/trunk@1681 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- diff --git a/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedAdminCommand.java b/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedAdminCommand.java new file mode 100644 index 000000000..6407ee5f6 --- /dev/null +++ b/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedAdminCommand.java @@ -0,0 +1,5 @@ +package org.argeo.slc.detached; + +public interface DetachedAdminCommand { + +} diff --git a/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedAnswer.java b/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedAnswer.java index b4279e082..582703786 100644 --- a/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedAnswer.java +++ b/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedAnswer.java @@ -5,12 +5,14 @@ import java.util.Properties; public class DetachedAnswer implements DetachedCommunication { static final long serialVersionUID = 1l; + public static int UNKOWN = -1; public static int PROCESSED = 0; public static int ERROR = 1; public static int SKIPPED = 2; + public static int CLOSED_SESSION = 10; private Properties properties = new Properties(); - private int status; + private int status = UNKOWN; private String log; private String uuid; @@ -18,8 +20,12 @@ public class DetachedAnswer implements DetachedCommunication { } - public DetachedAnswer(DetachedRequest request, String message) { + public DetachedAnswer(DetachedRequest request) { uuid = request.getUuid(); + } + + public DetachedAnswer(DetachedRequest request, String message) { + this(request); log = message; status = PROCESSED; } diff --git a/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedExecutionServerImpl.java b/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedExecutionServerImpl.java index 13d67947f..a11c37049 100644 --- a/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedExecutionServerImpl.java +++ b/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedExecutionServerImpl.java @@ -1,10 +1,23 @@ package org.argeo.slc.detached; +import java.util.List; +import java.util.Vector; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.argeo.slc.detached.admin.CloseSession; +import org.argeo.slc.detached.admin.OpenSession; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; public class DetachedExecutionServerImpl implements DetachedExecutionServer { + private final static Log log = LogFactory + .getLog(DetachedExecutionServerImpl.class); + private final DetachedContextImpl detachedContext; + private final List sessions; + + private int skipCount = 0; private BundleContext bundleContext; private DetachedDriver driver; @@ -17,38 +30,143 @@ public class DetachedExecutionServerImpl implements DetachedExecutionServer { public DetachedExecutionServerImpl() { detachedContext = new DetachedContextImpl(); + sessions = new Vector(); } public DetachedAnswer executeStep(DetachedRequest request) { + DetachedAnswer answer = null; try { DetachedStep step = null; - // Find step + // Find action ServiceReference[] refs = bundleContext.getAllServiceReferences( StaticRefProvider.class.getName(), null); + Object obj = null; for (int i = 0; i < refs.length; i++) { StaticRefProvider provider = (StaticRefProvider) bundleContext .getService(refs[i]); - Object obj = provider.getStaticRef(request.getRef()); + obj = provider.getStaticRef(request.getRef()); if (obj != null) { - step = (DetachedStep) obj; break; } } - if (step == null) - throw new DetachedException("Could not find step with ref " + if (obj == null) + throw new DetachedException("Could not find action with ref " + + request.getRef()); + + // Execute actions + if (obj instanceof DetachedStep) { + if (getCurrentSession() == null) + throw new DetachedException("No open session."); + + StringBuffer skippedLog = new StringBuffer(); + boolean execute = true; + if (getPreviousSession() != null + && !getPreviousSession().isClosed()) { + if (getCurrentSession().getDoItAgainPolicy().equals( + DetachedSession.SKIP_UNTIL_ERROR)) { + // Skip execution of already successful steps + if (getPreviousSession().getAnswers().size() > skipCount) { + DetachedAnswer previousAnswer = (DetachedAnswer) getPreviousSession() + .getAnswers().get(skipCount); + DetachedRequest previousRequest = (DetachedRequest) getPreviousSession() + .getRequests().get(skipCount); + // Check paths + if (!previousRequest.getPath().equals( + request.getPath())) { + String msg = "New request is not consistent with previous path. previousPath=" + + previousRequest.getPath() + + ", newPath=" + + request.getPath() + + "\n"; + skippedLog.append(msg); + log.warn(msg); + } + + if (previousAnswer.getStatus() != DetachedAnswer.ERROR) { + execute = false; + } + } else { + // went further as skip count, doing nothing. + } + } + } + + if (execute) { + step = (DetachedStep) obj; + answer = step.execute(detachedContext, request); + } else { + skippedLog.append("Skipped path " + request.getPath() + + " (skipCount=" + skipCount + ")"); + answer = new DetachedAnswer(request); + answer.setStatus(DetachedAnswer.SKIPPED); + answer.setLog(skippedLog.toString()); + } + + } else if (obj instanceof DetachedAdminCommand) { + if (obj instanceof OpenSession) { + if (getCurrentSession() != null) + throw new DetachedException( + "There is already an open session #" + + getCurrentSession().getUuid()); + sessions.add(((OpenSession) obj).execute(request, + bundleContext)); + answer = new DetachedAnswer(request, "Session #" + + getCurrentSession().getUuid() + " open."); + } else if (obj instanceof CloseSession) { + if (getCurrentSession() == null) + throw new DetachedException( + "There is no open session to close"); + answer = new DetachedAnswer(request, "Session #" + + getCurrentSession().getUuid() + " closed."); + answer.setStatus(DetachedAnswer.CLOSED_SESSION); + } + } + + if (answer == null) + throw new DetachedException("Unknown action type " + + obj.getClass() + " for action with ref " + request.getRef()); - return step.execute(detachedContext, request); } catch (DetachedException e) { - throw e; + answer = new DetachedAnswer(request); + answer.setStatus(DetachedAnswer.ERROR); + answer.setLog(e.getMessage()); } catch (Exception e) { e.printStackTrace(); throw new DetachedException( "Unexpected exception while executing request " + request, e); } + getCurrentSession().getRequests().add(request); + getCurrentSession().getAnswers().add(answer); + return answer; + } + + protected final DetachedSession getCurrentSession() { + if (sessions.size() == 0) { + return null; + } else { + DetachedSession session = (DetachedSession) sessions.get(sessions + .size() - 1); + List answers = session.getAnswers(); + if (answers.size() > 0) { + DetachedAnswer lastAnswer = (DetachedAnswer) answers + .get(answers.size() - 1); + if (lastAnswer.getStatus() == DetachedAnswer.ERROR + || lastAnswer.getStatus() == DetachedAnswer.CLOSED_SESSION) + return null; + } + return session; + } + } + + protected final DetachedSession getPreviousSession() { + if (sessions.size() < 2) + return null; + else + return (DetachedSession) sessions.get(sessions.size() - 2); } public void init(BundleContext bundleContext) { diff --git a/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedRequest.java b/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedRequest.java index 0a3484267..99427bf1d 100644 --- a/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedRequest.java +++ b/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedRequest.java @@ -8,7 +8,15 @@ public class DetachedRequest implements DetachedCommunication { private String uuid; private Properties properties = new Properties(); private String ref; - private String path; + private String path = ""; + + public DetachedRequest() { + + } + + public DetachedRequest(String uuid) { + this.uuid = uuid; + } public Properties getProperties() { return properties; diff --git a/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedSession.java b/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedSession.java new file mode 100644 index 000000000..76e894b16 --- /dev/null +++ b/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedSession.java @@ -0,0 +1,50 @@ +package org.argeo.slc.detached; + +import java.util.List; +import java.util.Vector; + +public class DetachedSession { + public final static String PROP_DO_IT_AGAIN_POLICY = "slc.detached.doItAgainPolicy"; + public final static String SKIP_UNTIL_ERROR = "skipUntilError"; + public final static String REPLAY = "replay"; + + private String uuid = null; + private List requests = new Vector(); + private List answers = new Vector(); + private String doItAgainPolicy = SKIP_UNTIL_ERROR; + + public boolean isClosed() { + if (answers.size() > 0) { + DetachedAnswer answer = (DetachedAnswer) answers + .get(answers.size() - 1); + return answer.getStatus() == DetachedAnswer.CLOSED_SESSION; + } else { + return false; + } + } + + public String getDoItAgainPolicy() { + return doItAgainPolicy; + } + + public void setDoItAgainPolicy(String doItAgainPolicy) { + this.doItAgainPolicy = doItAgainPolicy; + } + + public List getRequests() { + return requests; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public List getAnswers() { + return answers; + } + +} diff --git a/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/admin/CloseSession.java b/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/admin/CloseSession.java new file mode 100644 index 000000000..c27a03538 --- /dev/null +++ b/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/admin/CloseSession.java @@ -0,0 +1,7 @@ +package org.argeo.slc.detached.admin; + +import org.argeo.slc.detached.DetachedAdminCommand; + +public class CloseSession implements DetachedAdminCommand { + +} diff --git a/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/admin/OpenSession.java b/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/admin/OpenSession.java new file mode 100644 index 000000000..2bf37b2f9 --- /dev/null +++ b/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/admin/OpenSession.java @@ -0,0 +1,24 @@ +package org.argeo.slc.detached.admin; + +import java.util.Properties; + +import org.argeo.slc.detached.DetachedAdminCommand; +import org.argeo.slc.detached.DetachedRequest; +import org.argeo.slc.detached.DetachedSession; +import org.osgi.framework.BundleContext; + +public class OpenSession implements DetachedAdminCommand { + + public DetachedSession execute(DetachedRequest request, + BundleContext bundleContext) { + DetachedSession session = new DetachedSession(); + session.setUuid(Long.toString(System.currentTimeMillis())); + + Properties props = request.getProperties(); + if (props.containsKey(DetachedSession.PROP_DO_IT_AGAIN_POLICY)) + session.setDoItAgainPolicy(props + .getProperty(DetachedSession.PROP_DO_IT_AGAIN_POLICY)); + + return session; + } +} diff --git a/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/drivers/FileDriver.java b/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/drivers/FileDriver.java index ca4209d0a..a4dfc892e 100644 --- a/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/drivers/FileDriver.java +++ b/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/drivers/FileDriver.java @@ -28,19 +28,31 @@ public class FileDriver implements DetachedDriver, DetachedClient, private File processedAnswersDir; public synchronized DetachedRequest receiveRequest() throws Exception { - return (DetachedRequest) receiveFile(requestsDir, processedRequestsDir); + DetachedRequest request = (DetachedRequest) receiveFile(requestsDir, + processedRequestsDir); + log.debug("Received detached request #" + request.getUuid() + + " for ref '" + request.getRef() + "', path=" + + request.getPath()); + return request; } public void sendAnswer(DetachedAnswer answer) throws Exception { sendFile(answersDir, answer); + log.debug("Sent detached answer #" + answer.getUuid()); } public DetachedAnswer receiveAnswer() throws Exception { - return (DetachedAnswer) receiveFile(answersDir, processedAnswersDir); + DetachedAnswer answer = (DetachedAnswer) receiveFile(answersDir, + processedAnswersDir); + log.debug("Received detached answer #" + answer.getUuid()); + return answer; } public void sendRequest(DetachedRequest request) throws Exception { sendFile(requestsDir, request); + log.debug("Sent detached request #" + request.getUuid() + + " for ref '" + request.getRef() + "', path=" + + request.getPath()); } protected void sendFile(File dir, DetachedCommunication detCom) diff --git a/org.argeo.slc.detached/src/main/resources/META-INF/MANIFEST.MF b/org.argeo.slc.detached/src/main/resources/META-INF/MANIFEST.MF index 92b00a88f..b1b3f0505 100644 --- a/org.argeo.slc.detached/src/main/resources/META-INF/MANIFEST.MF +++ b/org.argeo.slc.detached/src/main/resources/META-INF/MANIFEST.MF @@ -1,10 +1,12 @@ Manifest-Version: 1.0 -Export-Package: org.argeo.slc.detached;uses:="org.springframework.bean - s.factory.support,org.apache.commons.logging,org.springframework.cont - ext.support,org.springframework.core.io,org.osgi.framework,org.spring - framework.beans.factory.xml,org.springframework.context,org.springfra - mework.beans.factory",org.argeo.slc.detached.drivers;uses:="org.argeo - .slc.detached" +Export-Package: org.argeo.slc.detached.admin;uses:="org.osgi.framework + ,org.argeo.slc.detached",org.argeo.slc.detached;uses:="org.apache.com + mons.logging,org.springframework.context.support,org.springframework. + core.io,org.springframework.context,org.springframework.beans.factory + .xml,org.springframework.beans.factory.support,org.argeo.slc.detached + .admin,org.osgi.framework,org.springframework.beans.factory",org.arge + o.slc.detached.drivers;uses:="org.apache.commons.logging,org.argeo.sl + c.detached,org.springframework.beans.factory" Built-By: mbaudier Tool: Bnd-0.0.255 Bundle-Name: Argeo SLC Detached @@ -12,15 +14,16 @@ Created-By: Apache Maven Bundle Plugin Bundle-Vendor: Argeo Build-Jdk: 1.6.0 Bundle-Version: 0.11.1.SNAPSHOT -Bnd-LastModified: 1222787012918 +Bnd-LastModified: 1222949081084 Bundle-ManifestVersion: 2 Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt Bundle-Description: SLC Distribution Import-Package: org.apache.commons.logging,org.argeo.slc.detached,org. - argeo.slc.detached.drivers,org.osgi.framework,org.springframework.bea - ns.factory,org.springframework.beans.factory.support,org.springframew - ork.beans.factory.xml,org.springframework.context,org.springframework - .context.support,org.springframework.core.io + argeo.slc.detached.admin,org.argeo.slc.detached.drivers,org.osgi.fram + ework,org.springframework.beans.factory,org.springframework.beans.fac + tory.support,org.springframework.beans.factory.xml,org.springframewor + k.context,org.springframework.context.support,org.springframework.cor + e.io Bundle-SymbolicName: org.argeo.slc.detached Bundle-DocURL: http://www.argeo.org Originally-Created-By: Apache Maven Bundle Plugin diff --git a/org.argeo.slc.detached/src/main/resources/org/argeo/slc/detached/spring.xml b/org.argeo.slc.detached/src/main/resources/org/argeo/slc/detached/spring.xml new file mode 100644 index 000000000..3655d99a0 --- /dev/null +++ b/org.argeo.slc.detached/src/main/resources/org/argeo/slc/detached/spring.xml @@ -0,0 +1,27 @@ + + + + + + + + + + \ No newline at end of file