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 2012/03/04 11:43:46 UTC
svn commit: r1296778 - in /camel/trunk:
camel-core/src/main/java/org/apache/camel/component/file/
camel-core/src/test/java/org/apache/camel/component/file/
components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/
components/camel-ftp/...
Author: davsclaus
Date: Sun Mar 4 10:43:45 2012
New Revision: 1296778
URL: http://svn.apache.org/viewvc?rev=1296778&view=rev
Log:
CAMEL-4602: GenericFileFilter now supports directories. Thanks to Michael for partly patch.
Added:
camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerDirectoryFilterTest.java
camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpRemoteFileFilterDirectoryTest.java
- copied, changed from r1296761, camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpRemoteFileFilterTest.java
Modified:
camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/AntPathMatcherGenericFileFilter.java
camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileConsumer.java
camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFile.java
camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileConsumer.java
camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerFileFilterTest.java
camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpConsumer.java
camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpConsumer.java
Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/AntPathMatcherGenericFileFilter.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/AntPathMatcherGenericFileFilter.java?rev=1296778&r1=1296777&r2=1296778&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/AntPathMatcherGenericFileFilter.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/AntPathMatcherGenericFileFilter.java Sun Mar 4 10:43:45 2012
@@ -36,6 +36,11 @@ public class AntPathMatcherGenericFileFi
}
public boolean accept(GenericFile<T> file) {
+ // directories should always be accepted by ANT path matcher
+ if (file.isDirectory()) {
+ return true;
+ }
+
String path = file.getRelativeFilePath();
return filter.acceptPathName(path);
}
Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileConsumer.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileConsumer.java?rev=1296778&r1=1296777&r2=1296778&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileConsumer.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileConsumer.java Sun Mar 4 10:43:45 2012
@@ -125,6 +125,7 @@ public class FileConsumer extends Generi
answer.setFile(file);
answer.setFileNameOnly(file.getName());
answer.setFileLength(file.length());
+ answer.setDirectory(file.isDirectory());
// must use FileUtil.isAbsolute to have consistent check for whether the file is
// absolute or not. As windows do not consider \ paths as absolute where as all
// other OS platforms will consider \ as absolute. The logic in Camel mandates
Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFile.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFile.java?rev=1296778&r1=1296777&r2=1296778&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFile.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFile.java Sun Mar 4 10:43:45 2012
@@ -44,6 +44,7 @@ public class GenericFile<T> implements W
private T file;
private GenericFileBinding<T> binding;
private boolean absolute;
+ private boolean directory;
public char getFileSeparator() {
return File.separatorChar;
@@ -65,6 +66,7 @@ public class GenericFile<T> implements W
}
result.setEndpointPath(source.getEndpointPath());
result.setAbsolute(source.isAbsolute());
+ result.setDirectory(source.isDirectory());
result.setAbsoluteFilePath(source.getAbsoluteFilePath());
result.setRelativeFilePath(source.getRelativeFilePath());
result.setFileName(source.getFileName());
@@ -333,6 +335,14 @@ public class GenericFile<T> implements W
this.fileNameOnly = fileNameOnly;
}
+ public boolean isDirectory() {
+ return directory;
+ }
+
+ public void setDirectory(boolean directory) {
+ this.directory = directory;
+ }
+
/**
* Fixes the path separator to be according to the protocol
*/
Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileConsumer.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileConsumer.java?rev=1296778&r1=1296777&r2=1296778&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileConsumer.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileConsumer.java Sun Mar 4 10:43:45 2012
@@ -391,11 +391,6 @@ public abstract class GenericFileConsume
return false;
}
- // directories so far is always regarded as matched (matching on the name is only for files)
- if (isDirectory) {
- return true;
- }
-
if (endpoint.getFilter() != null) {
if (!endpoint.getFilter().accept(file)) {
return false;
@@ -408,6 +403,11 @@ public abstract class GenericFileConsume
}
}
+ // directories are regarded as matched if filter accepted them
+ if (isDirectory) {
+ return true;
+ }
+
if (ObjectHelper.isNotEmpty(endpoint.getExclude())) {
if (name.matches(endpoint.getExclude())) {
return false;
Added: camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerDirectoryFilterTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerDirectoryFilterTest.java?rev=1296778&view=auto
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerDirectoryFilterTest.java (added)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerDirectoryFilterTest.java Sun Mar 4 10:43:45 2012
@@ -0,0 +1,102 @@
+/**
+ * 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.camel.component.file;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.impl.JndiRegistry;
+
+/**
+ * Unit test for the file filter option using directories
+ */
+public class FileConsumerDirectoryFilterTest extends ContextTestSupport {
+
+ private String fileUrl = "file://target/directoryfilter/?recursive=true&filter=#myFilter";
+ private static final List<String> names = new ArrayList<String>();
+
+ @Override
+ protected JndiRegistry createRegistry() throws Exception {
+ JndiRegistry jndi = super.createRegistry();
+ jndi.bind("myFilter", new MyDirectoryFilter<Object>());
+ return jndi;
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ deleteDirectory("target/directoryfilter");
+ super.setUp();
+ }
+
+ public void testFilterFilesWithARegularFile() throws Exception {
+ MockEndpoint mock = getMockEndpoint("mock:result");
+ mock.expectedMessageCount(1);
+ mock.expectedBodiesReceived("Hello World");
+
+ template.sendBodyAndHeader("file:target/directoryfilter/skipDir/", "This is a file to be filtered",
+ Exchange.FILE_NAME, "skipme.txt");
+
+ template.sendBodyAndHeader("file:target/directoryfilter/skipDir2/", "This is a file to be filtered",
+ Exchange.FILE_NAME, "skipme.txt");
+
+ template.sendBodyAndHeader("file:target/directoryfilter/okDir/", "Hello World",
+ Exchange.FILE_NAME, "hello.txt");
+
+ mock.assertIsSatisfied();
+
+ // check names
+ assertEquals(4, names.size());
+ Collections.sort(names);
+ assertEquals("okDir", names.get(0));
+ // windows or unix paths
+ assertTrue(names.get(0), names.get(1).equals("okDir/hello.txt") || names.get(1).equals("okDir\\hello.txt"));
+ assertEquals("skipDir", names.get(2));
+ assertEquals("skipDir2", names.get(3));
+ }
+
+ protected RouteBuilder createRouteBuilder() throws Exception {
+ return new RouteBuilder() {
+ public void configure() throws Exception {
+ from(fileUrl).convertBodyTo(String.class).to("mock:result");
+ }
+ };
+ }
+
+ // START SNIPPET: e1
+ public class MyDirectoryFilter<T> implements GenericFileFilter<T> {
+
+ public boolean accept(GenericFile<T> file) {
+ // remember the name due unit testing (should not be needed in regular use-cases)
+ names.add(file.getFileName());
+
+ // we dont accept any files within directory starting with skip in the name
+ if (file.isDirectory() && file.getFileName().startsWith("skip")) {
+ return false;
+ }
+
+ return true;
+ }
+
+ }
+ // END SNIPPET: e1
+
+}
\ No newline at end of file
Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerFileFilterTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerFileFilterTest.java?rev=1296778&r1=1296777&r2=1296778&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerFileFilterTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerFileFilterTest.java Sun Mar 4 10:43:45 2012
@@ -77,9 +77,13 @@ public class FileConsumerFileFilterTest
// START SNIPPET: e1
public class MyFileFilter<T> implements GenericFileFilter<T> {
- public boolean accept(GenericFile<T> pathname) {
+ public boolean accept(GenericFile<T> file) {
+ // we want all directories
+ if (file.isDirectory()) {
+ return true;
+ }
// we dont accept any files starting with skip in the name
- return !pathname.getFileName().startsWith("skip");
+ return !file.getFileName().startsWith("skip");
}
}
// END SNIPPET: e1
Modified: camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpConsumer.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpConsumer.java?rev=1296778&r1=1296777&r2=1296778&view=diff
==============================================================================
--- camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpConsumer.java (original)
+++ camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpConsumer.java Sun Mar 4 10:43:45 2012
@@ -142,6 +142,7 @@ public class FtpConsumer extends RemoteF
answer.setFile(file);
answer.setFileNameOnly(file.getName());
answer.setFileLength(file.getSize());
+ answer.setDirectory(file.isDirectory());
if (file.getTimestamp() != null) {
answer.setLastModified(file.getTimestamp().getTimeInMillis());
}
Modified: camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpConsumer.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpConsumer.java?rev=1296778&r1=1296777&r2=1296778&view=diff
==============================================================================
--- camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpConsumer.java (original)
+++ camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpConsumer.java Sun Mar 4 10:43:45 2012
@@ -143,6 +143,7 @@ public class SftpConsumer extends Remote
answer.setFileLength(file.getAttrs().getSize());
answer.setLastModified(file.getAttrs().getMTime() * 1000L);
answer.setHostname(((RemoteFileConfiguration) endpoint.getConfiguration()).getHost());
+ answer.setDirectory(file.getAttrs().isDir());
// absolute or relative path
boolean absolute = FileUtil.hasLeadingSeparator(absolutePath);
Copied: camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpRemoteFileFilterDirectoryTest.java (from r1296761, camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpRemoteFileFilterTest.java)
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpRemoteFileFilterDirectoryTest.java?p2=camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpRemoteFileFilterDirectoryTest.java&p1=camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpRemoteFileFilterTest.java&r1=1296761&r2=1296778&rev=1296778&view=diff
==============================================================================
--- camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpRemoteFileFilterTest.java (original)
+++ camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpRemoteFileFilterDirectoryTest.java Sun Mar 4 10:43:45 2012
@@ -27,10 +27,10 @@ import org.junit.Test;
/**
* Unit test to verify FTP filter option.
*/
-public class FromFtpRemoteFileFilterTest extends FtpServerTestSupport {
+public class FromFtpRemoteFileFilterDirectoryTest extends FtpServerTestSupport {
private String getFtpUrl() {
- return "ftp://admin@localhost:" + getPort() + "/filefilter?password=admin&filter=#myFilter";
+ return "ftp://admin@localhost:" + getPort() + "/filefilter?password=admin&recursive=true&filter=#myFilter";
}
@Override
@@ -55,8 +55,8 @@ public class FromFtpRemoteFileFilterTest
}
MockEndpoint mock = getMockEndpoint("mock:result");
- mock.expectedMessageCount(2);
- mock.expectedBodiesReceivedInAnyOrder("Report 1", "Report 2");
+ mock.expectedMessageCount(1);
+ mock.expectedBodiesReceived("Hello World");
mock.assertIsSatisfied();
}
@@ -64,10 +64,9 @@ public class FromFtpRemoteFileFilterTest
private void prepareFtpServer() throws Exception {
// prepares the FTP Server by creating files on the server that we want to unit
// test that we can pool
- sendFile(getFtpUrl(), "Hello World", "hello.txt");
- sendFile(getFtpUrl(), "Report 1", "report1.txt");
- sendFile(getFtpUrl(), "Bye World", "bye.txt");
- sendFile(getFtpUrl(), "Report 2", "report2.txt");
+ sendFile(getFtpUrl(), "This is a file to be filtered", "skipDir/skipme.txt");
+ sendFile(getFtpUrl(), "This is a file to be filtered", "skipDir2/skipme.txt");
+ sendFile(getFtpUrl(), "Hello World", "okDir/hello.txt");
}
protected RouteBuilder createRouteBuilder() throws Exception {
@@ -82,8 +81,12 @@ public class FromFtpRemoteFileFilterTest
public class MyFileFilter<T> implements GenericFileFilter<T> {
public boolean accept(GenericFile<T> file) {
- // we only want report files
- return file.getFileName().startsWith("report");
+ // we dont accept any files within directory starting with skip in the name
+ if (file.isDirectory() && file.getFileName().startsWith("skip")) {
+ return false;
+ }
+
+ return true;
}
}
// END SNIPPET: e1