You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2008/11/29 22:15:35 UTC

svn commit: r721719 - in /activemq/camel/trunk/camel-core/src: main/java/org/apache/camel/component/file/ test/java/org/apache/camel/component/file/

Author: davsclaus
Date: Sat Nov 29 13:15:35 2008
New Revision: 721719

URL: http://svn.apache.org/viewvc?rev=721719&view=rev
Log:
CAMEL-1112: Added filter option to file consumer to allow end user to use a filter to skip files. Started on the sorter as well.

Added:
    activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerFileFilterTest.java   (contents, props changed)
      - copied, changed from r721684, activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerSkipDotFilesTest.java
Modified:
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileComponent.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileConsumer.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileEndpoint.java
    activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerSkipDotFilesTest.java

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileComponent.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileComponent.java?rev=721719&r1=721718&r2=721719&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileComponent.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileComponent.java Sat Nov 29 13:15:35 2008
@@ -17,6 +17,7 @@
 package org.apache.camel.component.file;
 
 import java.io.File;
+import java.io.FileFilter;
 import java.util.Map;
 
 import org.apache.camel.CamelContext;
@@ -71,6 +72,16 @@
             result.setIdempotentRepository(repository);
         }
 
+        // lookup file filter in registry if provided
+        ref = getAndRemoveParameter(parameters, "fileFilterRef", String.class);
+        if (ref != null) {
+            FileFilter filter = mandatoryLookup(ref, FileFilter.class);
+            result.setFilter(filter);
+        }
+
+        // TODO: CAMEL-1112 sorter and having out-of-box sorters for by name, by filestamp, etc.
+        // TODO: maybe even a reverse order
+
         setProperties(result, parameters);
         return result;
     }

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileConsumer.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileConsumer.java?rev=721719&r1=721718&r2=721719&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileConsumer.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileConsumer.java Sat Nov 29 13:15:35 2008
@@ -23,6 +23,7 @@
 import java.nio.channels.FileLock;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Collections;
 
 import org.apache.camel.AsyncCallback;
 import org.apache.camel.Processor;
@@ -53,9 +54,12 @@
     protected synchronized void poll() throws Exception {
         // gather list of files to process
         List<File> files = new ArrayList<File>();
-        filesToPoll(endpoint.getFile(), true, files);
+        scanFilesToPoll(endpoint.getFile(), true, files);
 
-        // TODO allow reordering of files CAMEL-1112
+        // resort files if provided
+        if (endpoint.getSorter() != null) {
+            Collections.sort(files, endpoint.getSorter());
+        }
 
         // consume files one by one
         int total = files.size();
@@ -72,7 +76,7 @@
      * @param processDir  recursive
      * @param fileList  current list of files gathered
      */
-    protected void filesToPoll(File fileOrDirectory, boolean processDir, List<File> fileList) {
+    protected void scanFilesToPoll(File fileOrDirectory, boolean processDir, List<File> fileList) {
         if (fileOrDirectory == null || !fileOrDirectory.exists()) {
             // not a file so skip it
             return;
@@ -88,7 +92,7 @@
             File[] files = fileOrDirectory.listFiles();
             for (File file : files) {
                 // recursive add the files
-                filesToPoll(file, isRecursive(), fileList);
+                scanFilesToPoll(file, isRecursive(), fileList);
             }
         } else {
             if (LOG.isTraceEnabled()) {
@@ -230,14 +234,14 @@
      * @param file  the file
      * @return true to include the file, false to skip it
      */
-    protected boolean isValidFile(File file) {
+    protected boolean validateFile(File file) {
         // NOTE: contains will add if we had a miss
         if (endpoint.isIdempotent() && endpoint.getIdempotentRepository().contains(file.getName())) {
             // skip as we have already processed it
             return false;
         }
 
-        return isMatched(file);
+        return matchFile(file);
     }
 
     /**
@@ -252,7 +256,7 @@
      * @param file  the file
      * @return true if the file is matche, false if not
      */
-    protected boolean isMatched(File file) {
+    protected boolean matchFile(File file) {
         String name = file.getName();
 
         // folders/names starting with dot is always skipped (eg. ".", ".camel", ".camelLock")
@@ -269,6 +273,12 @@
             return true;
         }
 
+        if (endpoint.getFilter() != null) {
+            if (!endpoint.getFilter().accept(file)) {
+                return false;
+            }
+        }
+
         if (regexPattern != null && regexPattern.length() > 0) {
             if (!name.matches(regexPattern)) {
                 return false;
@@ -290,7 +300,7 @@
     }
 
     private void addFile(File file, List<File> fileList) {
-        if (isValidFile(file)) {
+        if (validateFile(file)) {
             fileList.add(file);
         }
     }

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileEndpoint.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileEndpoint.java?rev=721719&r1=721718&r2=721719&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileEndpoint.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileEndpoint.java Sat Nov 29 13:15:35 2008
@@ -18,9 +18,11 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.io.FileFilter;
 import java.lang.reflect.Method;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Comparator;
 
 import org.apache.camel.Consumer;
 import org.apache.camel.Exchange;
@@ -70,6 +72,8 @@
     private String tempPrefix;
     private boolean idempotent;
     private MessageIdRepository idempotentRepository;
+    private FileFilter filter;
+    private Comparator<File> sorter;
 
     protected FileEndpoint(File file, String endpointUri, FileComponent component) {
         super(endpointUri, component);
@@ -334,6 +338,22 @@
         this.idempotentRepository = idempotentRepository;
     }
 
+    public FileFilter getFilter() {
+        return filter;
+    }
+
+    public void setFilter(FileFilter filter) {
+        this.filter = filter;
+    }
+
+    public Comparator<File> getSorter() {
+        return sorter;
+    }
+
+    public void setSorter(Comparator<File> sorter) {
+        this.sorter = sorter;
+    }
+
     /**
      * A strategy method to lazily create the file strategy
      */

Copied: activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerFileFilterTest.java (from r721684, activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerSkipDotFilesTest.java)
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerFileFilterTest.java?p2=activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerFileFilterTest.java&p1=activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerSkipDotFilesTest.java&r1=721684&r2=721719&rev=721719&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerSkipDotFilesTest.java (original)
+++ activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerFileFilterTest.java Sat Nov 29 13:15:35 2008
@@ -16,43 +16,54 @@
  */
 package org.apache.camel.component.file;
 
+import java.io.File;
+import java.io.FileFilter;
+
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.impl.JndiRegistry;
 
 /**
- * Unit test that file consumer will skip any files starting with a dot
+ * Unit test for  the file filter option
  */
-public class FileConsumerSkipDotFilesTest extends ContextTestSupport {
+public class FileConsumerFileFilterTest extends ContextTestSupport {
 
-    private String fileUrl = "file://target/dotfiles/";
+    private String fileUrl = "file://target/filefilter/?fileFilterRef=myFilter";
+
+    @Override
+    protected JndiRegistry createRegistry() throws Exception {
+        JndiRegistry jndi = super.createRegistry();
+        jndi.bind("myFilter", new MyFileFilter());
+        return jndi;
+    }
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        deleteDirectory("target/dotfiles");
+        deleteDirectory("target/filefilter");
     }
 
-    public void testSkipDotFiles() throws Exception {
+    public void testFilterFiles() throws Exception {
         MockEndpoint mock = getMockEndpoint("mock:result");
         mock.expectedMessageCount(0);
 
-        template.sendBodyAndHeader("file:target/dotfiles/", "This is a dot file",
-            FileComponent.HEADER_FILE_NAME, ".skipme");
+        template.sendBodyAndHeader("file:target/filefilter/", "This is a file to be filtered",
+            FileComponent.HEADER_FILE_NAME, "skipme.txt");
 
-        mock.setResultWaitTime(5000);
+        mock.setResultWaitTime(2000);
         mock.assertIsSatisfied();
     }
 
-    public void testSkipDotFilesWithARegularFile() throws Exception {
+    public void testFilterFilesWithARegularFile() throws Exception {
         MockEndpoint mock = getMockEndpoint("mock:result");
         mock.expectedMessageCount(1);
         mock.expectedBodiesReceived("Hello World");
 
-        template.sendBodyAndHeader("file:target/dotfiles/", "This is a dot file",
-            FileComponent.HEADER_FILE_NAME, ".skipme");
+        template.sendBodyAndHeader("file:target/filefilter/", "This is a file to be filtered",
+            FileComponent.HEADER_FILE_NAME, "skipme.txt");
 
-        template.sendBodyAndHeader("file:target/dotfiles/", "Hello World",
+        template.sendBodyAndHeader("file:target/filefilter/", "Hello World",
             FileComponent.HEADER_FILE_NAME, "hello.txt");
 
         mock.assertIsSatisfied();
@@ -66,4 +77,9 @@
         };
     }
 
-}
+    public class MyFileFilter implements FileFilter {
+        public boolean accept(File pathname) {
+            return !pathname.getName().startsWith("skip");
+        }
+    }
+}
\ No newline at end of file

Propchange: activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerFileFilterTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerFileFilterTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Propchange: activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerFileFilterTest.java
------------------------------------------------------------------------------
    svn:mergeinfo = 

Modified: activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerSkipDotFilesTest.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerSkipDotFilesTest.java?rev=721719&r1=721718&r2=721719&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerSkipDotFilesTest.java (original)
+++ activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerSkipDotFilesTest.java Sat Nov 29 13:15:35 2008
@@ -40,7 +40,7 @@
         template.sendBodyAndHeader("file:target/dotfiles/", "This is a dot file",
             FileComponent.HEADER_FILE_NAME, ".skipme");
 
-        mock.setResultWaitTime(5000);
+        mock.setResultWaitTime(2000);
         mock.assertIsSatisfied();
     }