]> git.argeo.org Git - gpl/argeo-slc.git/commitdiff
Integrate XML-based file exchanges.
authorMathieu Baudier <mbaudier@argeo.org>
Sun, 5 Oct 2008 13:43:10 +0000 (13:43 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Sun, 5 Oct 2008 13:43:10 +0000 (13:43 +0000)
git-svn-id: https://svn.argeo.org/slc/trunk@1703 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

org.argeo.slc.detached/.classpath
org.argeo.slc.detached/pom.xml
org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedXmlConverter.java
org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedXmlConverterCompat.java
org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/drivers/AbstractDriver.java
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
org.argeo.slc.detached/src/main/resources/org/argeo/slc/detached/spring.xml

index 7dc80e91b8c60e97306a2b3b1a48762a364cecfb..4972669eda6e786357f31fc5611c9c984689d836 100644 (file)
@@ -2,8 +2,6 @@
 <classpath>
        <classpathentry kind="src" path="src/main/java"/>
        <classpathentry kind="src" path="src/main/resources"/>
-       <classpathentry kind="src" path="src/test/java"/>
-       <classpathentry kind="src" path="src/test/resources"/>
        <classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>
        <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
        <classpathentry kind="output" path="target/classes"/>
index 1588b11631765ca2f5a48fe669ba62c716855e2e..7083a9f8ad6309358bc2ffc1d4d05745701f4a7b 100644 (file)
                         <Export-Package>
                             org.argeo.slc.detached.*
                         </Export-Package>
+                        <Import-Package>
+                            *,
+                            org.springframework.beans.factory;version="2.0",
+                            org.springframework.beans.factory.support;version="2.0",
+                            org.springframework.beans.factory.xml;version="2.0",
+                            org.springframework.context;version="2.0",
+                            org.springframework.context.support;version="2.0",
+                            org.springframework.core.io;version="2.0"
+                        </Import-Package>
                     </instructions>
                 </configuration>
             </plugin>
         <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-context</artifactId>
-            <version>2.0.8</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.codehaus.castor</groupId>
-            <artifactId>castor</artifactId>
-            <version>1.1.2</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>adaptx</groupId>
-                    <artifactId>adaptx</artifactId>
-                </exclusion>
-            </exclusions>
         </dependency>
 
         <dependency>
index 455597d544341ee38951e8d0324539bf95fe1673..0843a888578c327fc2a1e328109cc0cc2859cd51 100644 (file)
@@ -4,11 +4,8 @@ import javax.xml.transform.Result;
 import javax.xml.transform.Source;
 
 public interface DetachedXmlConverter {
-       public void marshallRequest(DetachedRequest request, Result result);
+       public void marshallCommunication(DetachedCommunication detCom,
+                       Result result);
 
-       public DetachedRequest unmarshallRequest(Source source);
-
-       public void marshallAnswer(DetachedAnswer answer, Result result);
-
-       public DetachedAnswer unmarshallAnswer(Source source);
+       public DetachedCommunication unmarshallCommunication(Source source);
 }
index 1a361dfa128b437484ade6f1f286df4f99d4467c..7ad49fadaad5ba1ad161345a2292f17a746d4dec 100644 (file)
@@ -33,6 +33,61 @@ public class DetachedXmlConverterCompat implements DetachedXmlConverter {
                }
        }
 
+       public void marshallCommunication(DetachedCommunication detCom,
+                       Result result) {
+               if (detCom instanceof DetachedRequest) {
+                       marshallRequest((DetachedRequest) detCom, result);
+               } else if (detCom instanceof DetachedAnswer) {
+                       marshallAnswer((DetachedAnswer) detCom, result);
+               } else {
+                       throw new DetachedException("Unkown communication type "
+                                       + detCom.getClass());
+               }
+       }
+
+       public DetachedCommunication unmarshallCommunication(Source source) {
+               // Parse
+               DOMResult result = new DOMResult();
+               try {
+                       copy.transform(source, result);
+               } catch (TransformerException e) {
+                       throw new DetachedException("Could not copy xml source", e);
+               }
+               Element root = (Element) ((Document) result.getNode())
+                               .getDocumentElement();
+               
+               // Create objects
+               String requestType = root.getLocalName();
+               if (requestType.equals("detached-request")) {
+                       DetachedRequest request = new DetachedRequest();
+                       request.setUuid(root.getElementsByTagNameNS(
+                                       SLC_DETACHED_NAMESPACE_URI, "uuid").item(0)
+                                       .getTextContent());
+                       request
+                                       .setRef(root.getElementsByTagNameNS(
+                                                       SLC_DETACHED_NAMESPACE_URI, "ref").item(0)
+                                                       .getTextContent());
+                       request.setPath(root.getElementsByTagNameNS(
+                                       SLC_DETACHED_NAMESPACE_URI, "path").item(0)
+                                       .getTextContent());
+                       Element propertiesElement = (Element) root.getElementsByTagNameNS(
+                                       SLC_DETACHED_NAMESPACE_URI, "properties").item(0);
+                       NodeList propElements = propertiesElement.getElementsByTagNameNS(
+                                       SLC_DETACHED_NAMESPACE_URI, "prop");
+                       Properties properties = new Properties();
+                       for (int i = 0; i < propElements.getLength(); i++) {
+                               Element propElement = (Element) propElements.item(i);
+                               String key = propElement.getAttribute("key");
+                               String value = propElement.getTextContent();
+                               properties.setProperty(key, value);
+                       }
+                       request.setProperties(properties);
+                       return request;
+               } else {
+                       throw new DetachedException(requestType + " not implemented.");
+               }
+       }
+
        public void marshallAnswer(DetachedAnswer answer, Result result) {
                StringBuffer buf = new StringBuffer("");
                buf.append("<slc-det:detached-answer xmlns:slc-det=\""
@@ -69,11 +124,7 @@ public class DetachedXmlConverterCompat implements DetachedXmlConverter {
        }
 
        public void marshallRequest(DetachedRequest request, Result result) {
-               throw new DetachedException("Not implemented.");
-       }
-
-       public DetachedAnswer unmarshallAnswer(Source source) {
-               throw new DetachedException("Not implemented.");
+               throw new DetachedException(" Not implemented.");
        }
 
        public DetachedRequest unmarshallRequest(Source source) {
index ac4851517836dea4d2285298fe1d229b3081a635..8ba2de1fad18f60c25ef24d673c6eebcd483106d 100644 (file)
@@ -4,11 +4,14 @@ import org.argeo.slc.detached.DetachedAnswer;
 import org.argeo.slc.detached.DetachedDriver;
 import org.argeo.slc.detached.DetachedExecutionServer;
 import org.argeo.slc.detached.DetachedRequest;
+import org.argeo.slc.detached.DetachedXmlConverter;
 
 public abstract class AbstractDriver implements DetachedDriver {
        private boolean active = true;
        private DetachedExecutionServer executionServer = null;
 
+       private DetachedXmlConverter xmlConverter = null;
+
        public synchronized void start() {
 
                Thread driverThread = new Thread(new Runnable() {
@@ -53,4 +56,12 @@ public abstract class AbstractDriver implements DetachedDriver {
                this.active = active;
        }
 
+       public DetachedXmlConverter getXmlConverter() {
+               return xmlConverter;
+       }
+
+       public void setXmlConverter(DetachedXmlConverter xmlConverter) {
+               this.xmlConverter = xmlConverter;
+       }
+
 }
index fafa3ebf69506b58df812521734d44bc0a37e8e1..5b47e32d64ec5d7eceede9d23a0d7fed4f74d218 100644 (file)
@@ -1,12 +1,21 @@
 package org.argeo.slc.detached.drivers;
 
 import java.io.File;
+import java.io.FileFilter;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.io.filefilter.NotFileFilter;
+import org.apache.commons.io.filefilter.SuffixFileFilter;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.argeo.slc.detached.DetachedAnswer;
@@ -26,6 +35,10 @@ public class FileDriver extends AbstractDriver implements DetachedClient,
        private File processedRequestsDir;
        private File processedAnswersDir;
 
+       private String lockFileExt = "lck";
+       private FileFilter notLockFileFilter = new NotFileFilter(
+                       new SuffixFileFilter("." + lockFileExt));
+
        public synchronized DetachedRequest receiveRequest() throws Exception {
                DetachedRequest request = (DetachedRequest) receiveFile(requestsDir,
                                processedRequestsDir);
@@ -58,12 +71,31 @@ public class FileDriver extends AbstractDriver implements DetachedClient,
 
        protected void sendFile(File dir, DetachedCommunication detCom)
                        throws Exception {
-               File file = new File(dir.getPath() + File.separator + detCom.getUuid());
+               final File file;
+               if (getXmlConverter() != null)
+                       file = new File(dir.getPath() + File.separator + detCom.getUuid()
+                                       + ".xml");
+               else
+                       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();
+               if (getXmlConverter() != null) {
+                       FileOutputStream outFile = new FileOutputStream(file);
+                       try {
+                               StreamResult result = new StreamResult(outFile);
+                               getXmlConverter().marshallCommunication(detCom, result);
+                       } finally {
+                               IOUtils.closeQuietly(outFile);
+                       }
+               } else {
+                       ObjectOutputStream out = new ObjectOutputStream(
+                                       new FileOutputStream(file));
+                       try {
+                               out.writeObject(detCom);
+                       } finally {
+                               IOUtils.closeQuietly(out);
+                       }
+               }
                lockFile.delete();
        }
 
@@ -74,7 +106,7 @@ public class FileDriver extends AbstractDriver implements DetachedClient,
                        if (!dir.exists())
                                throw new DetachedException("Dir " + dir + " does not exist.");
 
-                       File[] files = dir.listFiles();
+                       File[] files = dir.listFiles(notLockFileFilter);
                        if (files.length > 0)
                                file = files[0];
                        else {
@@ -91,18 +123,36 @@ public class FileDriver extends AbstractDriver implements DetachedClient,
 
                File lockFile = nameLockFile(file);
                while (lockFile.exists())
-                       // TODO: implements time out
+                       // FIXME: implements time out
                        Thread.sleep(100);
 
-               ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
-               DetachedCommunication detCom = (DetachedCommunication) in.readObject();
-               in.close();
-
+               // Read the file
+               final DetachedCommunication detCom;
+               if (FilenameUtils.getExtension(file.getName()).equals("xml")) {
+                       if (getXmlConverter() == null)
+                               throw new DetachedException("No XML converter defined.");
+                       FileInputStream in = new FileInputStream(file);
+                       try {
+                               StreamSource source = new StreamSource(in);
+                               detCom = getXmlConverter().unmarshallCommunication(source);
+                       } finally {
+                               IOUtils.closeQuietly(in);
+                       }
+               } else {
+                       ObjectInputStream in = new ObjectInputStream(new FileInputStream(
+                                       file));
+                       try {
+                               detCom = (DetachedCommunication) in.readObject();
+                       } finally {
+                               IOUtils.closeQuietly(in);
+                       }
+               }
                // Move to processed dir
-               file.renameTo(new File(processedDir.getAbsolutePath() + File.separator
-                               + file.getName()));
+               FileUtils.moveFileToDirectory(file, processedDir, false);
+               // file.renameTo(new File(processedDir.getAbsolutePath() +
+               // File.separator
+               // + file.getName()));
                return detCom;
-
        }
 
        protected File createLockFile(File file) {
@@ -116,7 +166,7 @@ public class FileDriver extends AbstractDriver implements DetachedClient,
        }
 
        protected File nameLockFile(File file) {
-               return new File(file.getAbsolutePath() + ".lck");
+               return new File(file.getAbsolutePath() + "." + lockFileExt);
        }
 
        public void setBaseDir(File baseDir) {
index 13b37eb501b8e19144ef30f7143765283b94a01f..2c4bd2d7df448fdd310a6fa41424c836dd85ba09 100644 (file)
@@ -4,10 +4,13 @@ Export-Package: org.argeo.slc.detached.admin;uses:="org.apache.commons
  ached.ui;uses:="org.argeo.slc.detached",org.argeo.slc.detached;uses:=\r
  "org.apache.commons.logging,org.springframework.context.support,org.s\r
  pringframework.core.io,org.springframework.context,org.springframewor\r
- k.beans.factory.xml,org.argeo.slc.detached.drivers,org.springframewor\r
- k.beans.factory.support,org.argeo.slc.detached.admin,org.osgi.framewo\r
- rk,org.springframework.beans.factory",org.argeo.slc.detached.drivers;\r
- uses:="org.apache.commons.logging,org.argeo.slc.detached,org.springfr\r
+ k.beans.factory.xml,javax.xml.transform.dom,org.argeo.slc.detached.dr\r
+ ivers,org.w3c.dom,org.springframework.beans.factory.support,org.argeo\r
+ .slc.detached.admin,javax.xml.transform,javax.xml.transform.stream,or\r
+ g.osgi.framework,org.apache.commons.io,org.springframework.beans.fact\r
+ ory",org.argeo.slc.detached.drivers;uses:="org.apache.commons.logging\r
+ ,org.apache.commons.io.filefilter,javax.xml.transform,javax.xml.trans\r
+ form.stream,org.apache.commons.io,org.argeo.slc.detached,org.springfr\r
  amework.beans.factory"\r
 Built-By: mbaudier\r
 Tool: Bnd-0.0.255\r
@@ -16,17 +19,21 @@ Created-By: Apache Maven Bundle Plugin
 Bundle-Vendor: Argeo\r
 Build-Jdk: 1.6.0\r
 Bundle-Version: 0.11.1.SNAPSHOT\r
-Bnd-LastModified: 1223022716810\r
+Bnd-LastModified: 1223214001545\r
 Bundle-ManifestVersion: 2\r
 Bundle-Activator: org.argeo.slc.detached.Activator\r
 Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt\r
 Bundle-Description: SLC Distribution\r
-Import-Package: org.apache.commons.logging,org.argeo.slc.detached,org.\r
- argeo.slc.detached.admin,org.argeo.slc.detached.drivers,org.argeo.slc\r
- .detached.ui,org.osgi.framework,org.springframework.beans.factory,org\r
- .springframework.beans.factory.support,org.springframework.beans.fact\r
- ory.xml,org.springframework.context,org.springframework.context.suppo\r
- rt,org.springframework.core.io\r
+Import-Package: javax.xml.transform,javax.xml.transform.dom,javax.xml.\r
+ transform.stream,org.apache.commons.io;version="1.4",org.apache.commo\r
+ ns.io.filefilter;version="1.4",org.apache.commons.logging,org.argeo.s\r
+ lc.detached,org.argeo.slc.detached.admin,org.argeo.slc.detached.drive\r
+ rs,org.argeo.slc.detached.ui,org.osgi.framework,org.springframework.b\r
+ eans.factory;version="2.0",org.springframework.beans.factory.support;\r
+ version="2.0",org.springframework.beans.factory.xml;version="2.0",org\r
+ .springframework.context;version="2.0",org.springframework.context.su\r
+ pport;version="2.0",org.springframework.core.io;version="2.0",org.w3c\r
+ .dom\r
 Bundle-SymbolicName: org.argeo.slc.detached\r
 Bundle-DocURL: http://www.argeo.org\r
 Originally-Created-By: Apache Maven Bundle Plugin\r
index 3655d99a02b57be835227cf1260a3aa455cb281b..72024088174726655aea5e15a41e7a4294969822 100644 (file)
     <bean id="slcDefault.detached.admin.closeSession"
         class="org.argeo.slc.detached.admin.CloseSession">
     </bean>
-    <!-- 
-        <bean id="jemmyTest" class="org.argeo.slc.jemmytest.DummyStep">
-        </bean>
-        
-        <bean id="slcDefault.detached.admin.openSession"
-        class="org.argeo.slc.detached.DetachedExecutionServerImpl">
-        <property name="driver" ref="driver" />
-        </bean>
-        
-        <bean id="driver"
-        class="org.argeo.slc.detached.drivers.FileDriver">
-        <property name="baseDir" value="file:${slc.workDir}/detached" />
-        </bean>
-    -->
+
+    <bean id="slcDefault.detached.xmlConverterCompat"
+        class="org.argeo.slc.detached.DetachedXmlConverterCompat">
+    </bean>
 </beans>
\ No newline at end of file