]> git.argeo.org Git - gpl/argeo-slc.git/commitdiff
Integrate detached with standard SLC
authorMathieu Baudier <mbaudier@argeo.org>
Thu, 2 Oct 2008 07:46:23 +0000 (07:46 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Thu, 2 Oct 2008 07:46:23 +0000 (07:46 +0000)
git-svn-id: https://svn.argeo.org/slc/trunk@1674 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

13 files changed:
org.argeo.slc.detached/pom.xml
org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedAnswer.java [new file with mode: 0644]
org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedClient.java
org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedCommunication.java [new file with mode: 0644]
org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedDriver.java
org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedExecutionServer.java
org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedExecutionServerImpl.java
org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedRequest.java [new file with mode: 0644]
org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedStep.java
org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedStepAnswer.java [deleted file]
org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedStepRequest.java [deleted file]
org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/drivers/FileDriver.java
org.argeo.slc.detached/src/main/resources/META-INF/MANIFEST.MF

index f276f7bc6a3e9f10adec58cb5b6278b4fd076697..79cb5b4c92a16cb188ea55deee231ce10c193b54 100644 (file)
@@ -69,5 +69,9 @@
                        <artifactId>junit</artifactId>
                        <scope>test</scope>
                </dependency>
                        <artifactId>junit</artifactId>
                        <scope>test</scope>
                </dependency>
+               <dependency>
+                       <groupId>log4j</groupId>
+                       <artifactId>log4j</artifactId>
+               </dependency>
        </dependencies>
 </project>
\ No newline at end of file
        </dependencies>
 </project>
\ No newline at end of file
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
new file mode 100644 (file)
index 0000000..b4279e0
--- /dev/null
@@ -0,0 +1,55 @@
+package org.argeo.slc.detached;
+
+import java.util.Properties;
+
+public class DetachedAnswer implements DetachedCommunication {
+       static final long serialVersionUID = 1l;
+
+       public static int PROCESSED = 0;
+       public static int ERROR = 1;
+       public static int SKIPPED = 2;
+
+       private Properties properties = new Properties();
+       private int status;
+       private String log;
+       private String uuid;
+
+       public DetachedAnswer() {
+
+       }
+
+       public DetachedAnswer(DetachedRequest request, String message) {
+               uuid = request.getUuid();
+               log = message;
+               status = PROCESSED;
+       }
+
+       public Properties getProperties() {
+               return properties;
+       }
+
+       public void setProperties(Properties outputParameters) {
+               this.properties = outputParameters;
+       }
+
+       public int getStatus() {
+               return status;
+       }
+
+       public void setStatus(int outputStatus) {
+               this.status = outputStatus;
+       }
+
+       public String getLog() {
+               return log;
+       }
+
+       public void setLog(String log) {
+               this.log = log;
+       }
+
+       public String getUuid() {
+               return uuid;
+       }
+
+}
index 101d1efa737c0efd3167aa8bf866ad56caf2d8de..3c750325347ea33850545bb115533ab4dd61fd18 100644 (file)
@@ -1,8 +1,8 @@
 package org.argeo.slc.detached;
 
 public interface DetachedClient {
 package org.argeo.slc.detached;
 
 public interface DetachedClient {
-       public void sendRequest(DetachedStepRequest request) throws Exception;
+       public void sendRequest(DetachedRequest request) throws Exception;
 
        /** Blocks until next answer. */
 
        /** Blocks until next answer. */
-       public DetachedStepAnswer receiveAnswer() throws Exception;
+       public DetachedAnswer receiveAnswer() throws Exception;
 }
 }
diff --git a/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedCommunication.java b/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedCommunication.java
new file mode 100644 (file)
index 0000000..8bdba36
--- /dev/null
@@ -0,0 +1,7 @@
+package org.argeo.slc.detached;
+
+import java.io.Serializable;
+
+public interface DetachedCommunication extends Serializable {
+       public String getUuid();
+}
index 1e7f7bc7c2990f7024bf5b94eca36655459397c2..08791a8a2031222bb03b011bdf692992677c321d 100644 (file)
@@ -2,6 +2,6 @@ package org.argeo.slc.detached;
 
 public interface DetachedDriver {
        /** Blocks until it receives a request. */
 
 public interface DetachedDriver {
        /** Blocks until it receives a request. */
-       public DetachedStepRequest receiveRequest() throws Exception;
-       public void sendAnswer(DetachedStepAnswer answer) throws Exception;
+       public DetachedRequest receiveRequest() throws Exception;
+       public void sendAnswer(DetachedAnswer answer) throws Exception;
 }
 }
index 37bb2c8779b7eb55ce9f5874c48a9ffce9d59869..76828b5bcf0a9653fe32bebac368a1e7f19fdae2 100644 (file)
@@ -1,5 +1,5 @@
 package org.argeo.slc.detached;
 
 public interface DetachedExecutionServer {
 package org.argeo.slc.detached;
 
 public interface DetachedExecutionServer {
-       public DetachedStepAnswer executeStep(DetachedStepRequest request);
+       public DetachedAnswer executeStep(DetachedRequest request);
 }
 }
index d21ec2dfc5e47a4016739d17baf665dd44269301..13d67947fbc9ba126ccf1cecbc285dda39427244 100644 (file)
@@ -19,7 +19,7 @@ public class DetachedExecutionServerImpl implements DetachedExecutionServer {
                detachedContext = new DetachedContextImpl();
        }
 
                detachedContext = new DetachedContextImpl();
        }
 
-       public DetachedStepAnswer executeStep(DetachedStepRequest request) {
+       public DetachedAnswer executeStep(DetachedRequest request) {
                try {
                        DetachedStep step = null;
 
                try {
                        DetachedStep step = null;
 
@@ -29,7 +29,7 @@ public class DetachedExecutionServerImpl implements DetachedExecutionServer {
                        for (int i = 0; i < refs.length; i++) {
                                StaticRefProvider provider = (StaticRefProvider) bundleContext
                                                .getService(refs[i]);
                        for (int i = 0; i < refs.length; i++) {
                                StaticRefProvider provider = (StaticRefProvider) bundleContext
                                                .getService(refs[i]);
-                               Object obj = provider.getStaticRef(request.getStepRef());
+                               Object obj = provider.getStaticRef(request.getRef());
                                if (obj != null) {
                                        step = (DetachedStep) obj;
                                        break;
                                if (obj != null) {
                                        step = (DetachedStep) obj;
                                        break;
@@ -38,7 +38,7 @@ public class DetachedExecutionServerImpl implements DetachedExecutionServer {
 
                        if (step == null)
                                throw new DetachedException("Could not find step with ref "
 
                        if (step == null)
                                throw new DetachedException("Could not find step with ref "
-                                               + request.getStepRef());
+                                               + request.getRef());
 
                        return step.execute(detachedContext, request);
                } catch (DetachedException e) {
 
                        return step.execute(detachedContext, request);
                } catch (DetachedException e) {
@@ -58,8 +58,9 @@ public class DetachedExecutionServerImpl implements DetachedExecutionServer {
                        public void run() {
                                while (active) {
                                        try {
                        public void run() {
                                while (active) {
                                        try {
-                                               DetachedStepRequest request = driver.receiveRequest();
-                                               executeStep(request);
+                                               DetachedRequest request = driver.receiveRequest();
+                                               DetachedAnswer answer = executeStep(request);
+                                               driver.sendAnswer(answer);
                                        } catch (Exception e) {
                                                if (e instanceof RuntimeException)
                                                        throw (RuntimeException) e;
                                        } catch (Exception e) {
                                                if (e instanceof RuntimeException)
                                                        throw (RuntimeException) e;
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
new file mode 100644 (file)
index 0000000..0a34842
--- /dev/null
@@ -0,0 +1,44 @@
+package org.argeo.slc.detached;
+
+import java.util.Properties;
+
+public class DetachedRequest implements DetachedCommunication {
+       static final long serialVersionUID = 1l;
+
+       private String uuid;
+       private Properties properties = new Properties();
+       private String ref;
+       private String path;
+
+       public Properties getProperties() {
+               return properties;
+       }
+
+       public void setProperties(Properties inputParameters) {
+               this.properties = inputParameters;
+       }
+
+       public String getRef() {
+               return ref;
+       }
+
+       public void setRef(String stepRef) {
+               this.ref = stepRef;
+       }
+
+       public String getPath() {
+               return path;
+       }
+
+       public void setPath(String path) {
+               this.path = path;
+       }
+
+       public String getUuid() {
+               return uuid;
+       }
+
+       public void setUuid(String uuid) {
+               this.uuid = uuid;
+       }
+}
index fd25d5260313f1194f9a4f27f2171d8ab46a91d6..67dba674c5972c5663accefe4260c41d88614832 100644 (file)
@@ -2,6 +2,6 @@ package org.argeo.slc.detached;
 
 
 public interface DetachedStep {
 
 
 public interface DetachedStep {
-       public DetachedStepAnswer execute(DetachedContext detachedContext,
-                       DetachedStepRequest detachedStepRequest);
+       public DetachedAnswer execute(DetachedContext detachedContext,
+                       DetachedRequest detachedStepRequest);
 }
 }
diff --git a/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedStepAnswer.java b/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedStepAnswer.java
deleted file mode 100644 (file)
index ebc6fe6..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.argeo.slc.detached;
-
-import java.util.Properties;
-
-public class DetachedStepAnswer {
-       public static int PROCESSED = 0;
-       public static int ERROR = 1;
-       public static int SKIPPED = 2;
-
-       private Properties outputParameters;
-       private int outputStatus;
-       private String log;
-
-       public Properties getOutputParameters() {
-               return outputParameters;
-       }
-
-       public void setOutputParameters(Properties outputParameters) {
-               this.outputParameters = outputParameters;
-       }
-
-       public int getOutputStatus() {
-               return outputStatus;
-       }
-
-       public void setOutputStatus(int outputStatus) {
-               this.outputStatus = outputStatus;
-       }
-
-       public String getLog() {
-               return log;
-       }
-
-       public void setLog(String log) {
-               this.log = log;
-       }
-
-}
diff --git a/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedStepRequest.java b/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedStepRequest.java
deleted file mode 100644 (file)
index 1c772ad..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-package org.argeo.slc.detached;
-
-import java.io.Serializable;
-import java.util.Properties;
-
-public class DetachedStepRequest implements Serializable {
-       private String uuid;
-       private Properties inputParameters;
-       private String stepRef;
-       private String path;
-
-       public Properties getInputParameters() {
-               return inputParameters;
-       }
-
-       public void setInputParameters(Properties inputParameters) {
-               this.inputParameters = inputParameters;
-       }
-
-       public String getStepRef() {
-               return stepRef;
-       }
-
-       public void setStepRef(String stepRef) {
-               this.stepRef = stepRef;
-       }
-
-       public String getPath() {
-               return path;
-       }
-
-       public void setPath(String path) {
-               this.path = path;
-       }
-
-       public String getUuid() {
-               return uuid;
-       }
-
-       public void setUuid(String uuid) {
-               this.uuid = uuid;
-       }
-}
index 89522ed0aaacf7ba07ff43a23b3b70334787c9f0..cc9d1392246c22565f91658e69effc92dd6f0dbd 100644 (file)
@@ -3,66 +3,129 @@ package org.argeo.slc.detached.drivers;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
+import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.argeo.slc.detached.DetachedClient;
 import org.argeo.slc.detached.DetachedClient;
+import org.argeo.slc.detached.DetachedCommunication;
 import org.argeo.slc.detached.DetachedDriver;
 import org.argeo.slc.detached.DetachedException;
 import org.argeo.slc.detached.DetachedDriver;
 import org.argeo.slc.detached.DetachedException;
-import org.argeo.slc.detached.DetachedStepAnswer;
-import org.argeo.slc.detached.DetachedStepRequest;
+import org.argeo.slc.detached.DetachedAnswer;
+import org.argeo.slc.detached.DetachedRequest;
+import org.springframework.beans.factory.InitializingBean;
 
 
-public class FileDriver implements DetachedDriver, DetachedClient {
-       private File requestDir;
-       private File answerDir;
+public class FileDriver implements DetachedDriver, DetachedClient,
+               InitializingBean {
+       private final static Log log = LogFactory.getLog(FileDriver.class);
 
 
-       public synchronized DetachedStepRequest receiveRequest() throws Exception {
-               if (!requestDir.exists())
-                       throw new DetachedException("Request dir "
-                                       + requestDir.getCanonicalPath() + " does not exist.");
+       private File baseDir;
+       private File requestsDir;
+       private File answersDir;
+       private File processedRequestsDir;
+       private File processedAnswersDir;
 
 
+       public synchronized DetachedRequest receiveRequest() throws Exception {
+               return (DetachedRequest) receiveFile(requestsDir,
+                               processedRequestsDir);
+       }
+
+       public void sendAnswer(DetachedAnswer answer) throws Exception {
+               sendFile(answersDir, answer);
+       }
+
+       public DetachedAnswer receiveAnswer() throws Exception {
+               return (DetachedAnswer) receiveFile(answersDir, processedAnswersDir);
+       }
+
+       public void sendRequest(DetachedRequest request) throws Exception {
+               sendFile(requestsDir, request);
+       }
+
+       protected void sendFile(File dir, DetachedCommunication detCom)
+                       throws Exception {
+               File file = new File(dir.getPath() + File.separator + detCom.getUuid());
+               File lockFile = createLockFile(file);
+               ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(
+                               file));
+               out.writeObject(detCom);
+               out.close();
+               lockFile.delete();
+       }
+
+       protected DetachedCommunication receiveFile(File dir, File processedDir)
+                       throws Exception {
                File file = null;
                while (file == null) {
                File file = null;
                while (file == null) {
-                       File[] files = requestDir.listFiles();
+                       File[] files = dir.listFiles();
                        if (files.length > 0)
                                file = files[0];
                        else
                                Thread.sleep(1000);
                }
 
                        if (files.length > 0)
                                file = files[0];
                        else
                                Thread.sleep(1000);
                }
 
+               File lockFile = nameLockFile(file);
+               while (lockFile.exists())
+                       // TODO: implements time out
+                       Thread.sleep(100);
+
                ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
                ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
-               DetachedStepRequest request = (DetachedStepRequest) in.readObject();
+               DetachedCommunication detCom = (DetachedCommunication) in.readObject();
                in.close();
 
                in.close();
 
-               file.delete();// move it to a processed dir instead?
-               return request;
+               // Move to processed dir
+               file.renameTo(new File(processedDir.getAbsolutePath() + File.separator
+                               + file.getName()));
+               return detCom;
+
        }
 
        }
 
-       public void sendAnswer(DetachedStepAnswer answer) throws Exception {
-               // TODO Auto-generated method stub
+       protected File createLockFile(File file) {
+               File lockFile = nameLockFile(file);
+               try {
+                       lockFile.createNewFile();
+               } catch (IOException e) {
+                       throw new DetachedException("Cannot create lock file " + lockFile);
+               }
+               return lockFile;
+       }
 
 
+       protected File nameLockFile(File file) {
+               return new File(file.getAbsolutePath() + ".lck");
        }
 
        }
 
-       public DetachedStepAnswer receiveAnswer() throws Exception {
-               // TODO Auto-generated method stub
-               return null;
+       public void setBaseDir(File baseDir) {
+               this.baseDir = baseDir;
        }
 
        }
 
-       public void sendRequest(DetachedStepRequest request) throws Exception {
-               File file = new File(requestDir.getPath() + File.separator
-                               + request.getUuid());
-               ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(
-                               file));
-               out.writeObject(request);
-               out.close();
+       public void init() {
+               this.requestsDir = new File(baseDir.getAbsolutePath() + File.separator
+                               + "requests");
+               this.answersDir = new File(baseDir.getAbsolutePath() + File.separator
+                               + "answers");
+               this.processedRequestsDir = new File(baseDir.getAbsolutePath()
+                               + File.separator + "processed" + File.separator + "requests");
+               this.processedAnswersDir = new File(baseDir.getAbsolutePath()
+                               + File.separator + "processed" + File.separator + "answers");
+
+               createIfNotExist(requestsDir);
+               createIfNotExist(answersDir);
+               createIfNotExist(processedRequestsDir);
+               createIfNotExist(processedAnswersDir);
        }
 
        }
 
-       public void setRequestDir(File requestDir) {
-               this.requestDir = requestDir;
+       private void createIfNotExist(File dir) {
+               if (!dir.exists()) {
+                       log.warn("Dir " + requestsDir.getAbsolutePath()
+                                       + " does not exist. Creating it...");
+                       dir.mkdirs();
+               }
        }
 
        }
 
-       public void setAnswerDir(File answerDir) {
-               this.answerDir = answerDir;
+       public void afterPropertiesSet() throws Exception {
+               init();
        }
 
 }
        }
 
 }
index 2c158afef58ebec128ddccf47d134287ff3ca772..92b00a88f0f396f657622aa7a4ca341e2f7a4867 100644 (file)
@@ -12,7 +12,7 @@ Created-By: Apache Maven Bundle Plugin
 Bundle-Vendor: Argeo\r
 Build-Jdk: 1.6.0\r
 Bundle-Version: 0.11.1.SNAPSHOT\r
 Bundle-Vendor: Argeo\r
 Build-Jdk: 1.6.0\r
 Bundle-Version: 0.11.1.SNAPSHOT\r
-Bnd-LastModified: 1222616555343\r
+Bnd-LastModified: 1222787012918\r
 Bundle-ManifestVersion: 2\r
 Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt\r
 Bundle-Description: SLC Distribution\r
 Bundle-ManifestVersion: 2\r
 Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt\r
 Bundle-Description: SLC Distribution\r