You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by ge...@apache.org on 2007/08/09 05:30:58 UTC

svn commit: r564081 - in /incubator/servicemix/trunk: common/servicemix-components/src/main/java/org/apache/servicemix/components/file/ deployables/bindingcomponents/servicemix-file/src/main/java/org/apache/servicemix/file/ deployables/bindingcomponent...

Author: gertv
Date: Wed Aug  8 20:30:56 2007
New Revision: 564081

URL: http://svn.apache.org/viewvc?view=rev&rev=564081
Log:
Fix for SM-990: FilePoller with Archiving

Added:
    incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-file/src/test/java/org/apache/servicemix/file/FilePollerEndpointTest.java
Modified:
    incubator/servicemix/trunk/common/servicemix-components/src/main/java/org/apache/servicemix/components/file/FilePoller.java
    incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-file/src/main/java/org/apache/servicemix/file/FilePollerEndpoint.java

Modified: incubator/servicemix/trunk/common/servicemix-components/src/main/java/org/apache/servicemix/components/file/FilePoller.java
URL: http://svn.apache.org/viewvc/incubator/servicemix/trunk/common/servicemix-components/src/main/java/org/apache/servicemix/components/file/FilePoller.java?view=diff&rev=564081&r1=564080&r2=564081
==============================================================================
--- incubator/servicemix/trunk/common/servicemix-components/src/main/java/org/apache/servicemix/components/file/FilePoller.java (original)
+++ incubator/servicemix/trunk/common/servicemix-components/src/main/java/org/apache/servicemix/components/file/FilePoller.java Wed Aug  8 20:30:56 2007
@@ -21,10 +21,12 @@
 import org.apache.servicemix.components.util.DefaultFileMarshaler;
 import org.apache.servicemix.components.util.FileMarshaler;
 import org.apache.servicemix.components.util.PollingComponentSupport;
+import org.apache.servicemix.jbi.util.FileUtil;
 
 import edu.emory.mathcs.backport.java.util.concurrent.CopyOnWriteArraySet;
 
 import javax.jbi.JBIException;
+import javax.jbi.management.DeploymentException;
 import javax.jbi.messaging.InOnly;
 import javax.jbi.messaging.NormalizedMessage;
 import java.io.BufferedInputStream;
@@ -45,6 +47,7 @@
 public class FilePoller extends PollingComponentSupport {
     private static final Log log = LogFactory.getLog(FilePoller.class);
 
+    private File archive;
     private File file;
     private FileFilter filter;
     private boolean deleteFile = true;
@@ -117,6 +120,19 @@
     public void setMarshaler(FileMarshaler marshaler) {
         this.marshaler = marshaler;
     }
+    
+    public File getArchive() {
+        return archive;
+    }
+    
+    /**
+     * Configure a directory to archive files before deleting them.
+     * 
+     * @param archive the archive directory
+     */
+    public void setArchive(File archive) {
+        this.archive = archive;
+    }
 
     /**
      * The set of FTPFiles that this component is currently working on
@@ -136,6 +152,17 @@
         if (isAutoCreateDirectory() && !file.exists()) {
             file.mkdirs();
         }
+        if (archive != null) {
+            if (!deleteFile) {
+                throw new DeploymentException("Archive shouldn't be specified unless deleteFile='true'");
+            }
+            if (isAutoCreateDirectory() && !archive.exists()) {
+                archive.mkdirs();
+            }
+            if (!archive.isDirectory()) {
+                throw new DeploymentException("Archive should refer to a directory");
+            }
+        }
         super.init();
     }
 
@@ -182,8 +209,12 @@
             if (aFile.exists()) {
                 processFile(aFile);
                 if (isDeleteFile()) {
-                    if (!aFile.delete()) {
-                        throw new IOException("Could not delete file " + aFile);
+                    if (archive != null) {
+                        FileUtil.moveFile(aFile, archive);
+                    } else {
+                        if (!aFile.delete()) {
+                            throw new IOException("Could not delete file " + aFile);
+                        }
                     }
                 }
             }

Modified: incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-file/src/main/java/org/apache/servicemix/file/FilePollerEndpoint.java
URL: http://svn.apache.org/viewvc/incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-file/src/main/java/org/apache/servicemix/file/FilePollerEndpoint.java?view=diff&rev=564081&r1=564080&r2=564081
==============================================================================
--- incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-file/src/main/java/org/apache/servicemix/file/FilePollerEndpoint.java (original)
+++ incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-file/src/main/java/org/apache/servicemix/file/FilePollerEndpoint.java Wed Aug  8 20:30:56 2007
@@ -39,6 +39,7 @@
 import org.apache.servicemix.common.endpoints.PollingEndpoint;
 import org.apache.servicemix.components.util.DefaultFileMarshaler;
 import org.apache.servicemix.components.util.FileMarshaler;
+import org.apache.servicemix.jbi.util.FileUtil;
 import org.apache.servicemix.locks.LockManager;
 import org.apache.servicemix.locks.impl.SimpleLockManager;
 
@@ -58,6 +59,7 @@
     private boolean deleteFile = true;
     private boolean recursive = true;
     private boolean autoCreateDirectory = true;
+    private File archive;
     private FileMarshaler marshaler = new DefaultFileMarshaler();
     private LockManager lockManager;
 
@@ -84,6 +86,17 @@
         if (isAutoCreateDirectory() && !file.exists()) {
             file.mkdirs();
         }
+        if (archive != null) {
+            if (!deleteFile) {
+                throw new DeploymentException("Archive shouldn't be specified unless deleteFile='true'");
+            }
+            if (isAutoCreateDirectory() && !archive.exists()) {
+                archive.mkdirs();
+            }
+            if (!archive.isDirectory()) {
+                throw new DeploymentException("Archive should refer to a directory");
+            }
+        }
         if (lockManager == null) {
             lockManager = createLockManager();
         }
@@ -168,6 +181,19 @@
     public void setMarshaler(FileMarshaler marshaler) {
         this.marshaler = marshaler;
     }
+    
+    public File getArchive() {
+        return archive;
+    }
+    
+    /**
+     * Configure a directory to archive files before deleting them.
+     * 
+     * @param archive the archive directory
+     */
+    public void setArchive(File archive) {
+        this.archive = archive;
+    }
 
     // Implementation methods
     //-------------------------------------------------------------------------
@@ -227,8 +253,12 @@
                 processFile(aFile);
                 unlock = false;
                 if (isDeleteFile()) {
-                    if (!aFile.delete()) {
-                        throw new IOException("Could not delete file " + aFile);
+                    if (archive != null) {
+                        FileUtil.moveFile(aFile, archive);
+                    } else {
+                        if (!aFile.delete()) {
+                            throw new IOException("Could not delete file " + aFile);
+                        }
                     }
                     unlock = true;
                 }

Added: incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-file/src/test/java/org/apache/servicemix/file/FilePollerEndpointTest.java
URL: http://svn.apache.org/viewvc/incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-file/src/test/java/org/apache/servicemix/file/FilePollerEndpointTest.java?view=auto&rev=564081
==============================================================================
--- incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-file/src/test/java/org/apache/servicemix/file/FilePollerEndpointTest.java (added)
+++ incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-file/src/test/java/org/apache/servicemix/file/FilePollerEndpointTest.java Wed Aug  8 20:30:56 2007
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.servicemix.file;
+
+import java.io.File;
+
+import javax.jbi.management.DeploymentException;
+import javax.xml.namespace.QName;
+
+import junit.framework.TestCase;
+
+public class FilePollerEndpointTest extends TestCase {
+    
+    private static final File DATA = new File("target/test/data");
+    private static final File ARCHIVE = new File("target/test/archive");
+    private FilePollerEndpoint endpoint;
+
+    @Override
+    protected void setUp() throws Exception {
+        endpoint = new FilePollerEndpoint();
+        endpoint.setTargetService(new QName("urn:test", "service"));
+    }
+    
+    public void testValidateNoFile() throws Exception {
+        try {
+            endpoint.validate();
+            fail("validate() should throw an exception when file has not been set");
+        } catch (DeploymentException e) {
+            //test succeeds
+        }
+    }
+
+    public void testValidateArchiveNoDirectory() throws Exception {
+        endpoint.setFile(DATA);
+        File archive = null;
+        try {
+            archive = File.createTempFile("servicemix", "test");
+            endpoint.setArchive(archive);
+            endpoint.validate();
+            fail("validate() should throw an exception when archive doesn't refer to a directory");
+        } catch (DeploymentException e) {
+            //test succeeds
+        } finally {
+            if (archive != null) {
+                archive.delete();
+            }
+        }
+    }
+    
+    public void testValidateArchiveWithoutDelete() throws Exception {
+        endpoint.setFile(DATA);
+        endpoint.setArchive(ARCHIVE);
+        endpoint.setDeleteFile(false);
+        try {
+            endpoint.validate();
+            fail("validate() should throw an exception when archive was set without delete");
+        } catch (DeploymentException e) {
+            //test succeeds
+        }
+    }
+}