Repository: camel Updated Branches: refs/heads/master 913c48d92 -> bb2539c2b
CAMEL-7404 Zip Aggregation Strategy preserves folder structure with thanks to Matt Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/bb2539c2 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/bb2539c2 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/bb2539c2 Branch: refs/heads/master Commit: bb2539c2b574f0f64f42680d680c5a9cb909e375 Parents: 913c48d Author: Willem Jiang <willem.ji...@gmail.com> Authored: Wed Apr 30 22:44:16 2014 +0800 Committer: Willem Jiang <willem.ji...@gmail.com> Committed: Wed Apr 30 22:44:16 2014 +0800 ---------------------------------------------------------------------- .../zipfile/ZipAggregationStrategy.java | 31 ++++--- ...AggregationStrategyWithPreservationTest.java | 93 ++++++++++++++++++++ .../aggregate/zipfile/data/another/hello.txt | 1 + .../aggregate/zipfile/data/other/greetings.txt | 1 + 4 files changed, 116 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/bb2539c2/components/camel-zipfile/src/main/java/org/apache/camel/processor/aggregate/zipfile/ZipAggregationStrategy.java ---------------------------------------------------------------------- diff --git a/components/camel-zipfile/src/main/java/org/apache/camel/processor/aggregate/zipfile/ZipAggregationStrategy.java b/components/camel-zipfile/src/main/java/org/apache/camel/processor/aggregate/zipfile/ZipAggregationStrategy.java index a028614..208f727 100644 --- a/components/camel-zipfile/src/main/java/org/apache/camel/processor/aggregate/zipfile/ZipAggregationStrategy.java +++ b/components/camel-zipfile/src/main/java/org/apache/camel/processor/aggregate/zipfile/ZipAggregationStrategy.java @@ -49,7 +49,20 @@ public class ZipAggregationStrategy implements AggregationStrategy { private String filePrefix; private String fileSuffix = ".zip"; + private boolean preserveFolderStructure; + public ZipAggregationStrategy() { + this(false); + } + + /** + * @param preserveFolderStructure if true, the folder structure is preserved when the source is + * a type of {@link GenericFileMessage}. If used with a file, use recursive=true. + */ + public ZipAggregationStrategy(boolean preserveFolderStructure) { + this.preserveFolderStructure = preserveFolderStructure; + } + /** * Gets the prefix used when creating the ZIP file name. * @return the prefix @@ -110,7 +123,7 @@ public class ZipAggregationStrategy implements AggregationStrategy { try { File appendFile = newExchange.getIn().getBody(File.class); if (appendFile != null) { - addFilesToZip(zipFile, new File[]{appendFile}); + addFileToZip(zipFile, appendFile, this.preserveFolderStructure ? newExchange.getIn().toString() : null); GenericFile<File> genericFile = FileConsumer.asGenericFile( zipFile.getParent(), @@ -139,7 +152,7 @@ public class ZipAggregationStrategy implements AggregationStrategy { return answer; } - private static void addFilesToZip(File source, File[] files) throws IOException { + private static void addFileToZip(File source, File file, String fileName) throws IOException { File tmpZip = File.createTempFile(source.getName(), null); tmpZip.delete(); if (!source.renameTo(tmpZip)) { @@ -149,15 +162,13 @@ public class ZipAggregationStrategy implements AggregationStrategy { ZipInputStream zin = new ZipInputStream(new FileInputStream(tmpZip)); ZipOutputStream out = new ZipOutputStream(new FileOutputStream(source)); - for (int i = 0; i < files.length; i++) { - InputStream in = new FileInputStream(files[i]); - out.putNextEntry(new ZipEntry(files[i].getName())); - for (int read = in.read(buffer); read > -1; read = in.read(buffer)) { - out.write(buffer, 0, read); - } - out.closeEntry(); - in.close(); + InputStream in = new FileInputStream(file); + out.putNextEntry(new ZipEntry(fileName == null ? file.getName() : fileName)); + for (int read = in.read(buffer); read > -1; read = in.read(buffer)) { + out.write(buffer, 0, read); } + out.closeEntry(); + in.close(); for (ZipEntry ze = zin.getNextEntry(); ze != null; ze = zin.getNextEntry()) { out.putNextEntry(ze); http://git-wip-us.apache.org/repos/asf/camel/blob/bb2539c2/components/camel-zipfile/src/test/java/org/apache/camel/processor/aggregate/zipfile/AggregationStrategyWithPreservationTest.java ---------------------------------------------------------------------- diff --git a/components/camel-zipfile/src/test/java/org/apache/camel/processor/aggregate/zipfile/AggregationStrategyWithPreservationTest.java b/components/camel-zipfile/src/test/java/org/apache/camel/processor/aggregate/zipfile/AggregationStrategyWithPreservationTest.java new file mode 100644 index 0000000..647faa5 --- /dev/null +++ b/components/camel-zipfile/src/test/java/org/apache/camel/processor/aggregate/zipfile/AggregationStrategyWithPreservationTest.java @@ -0,0 +1,93 @@ +/** + * 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.processor.aggregate.zipfile; + +import java.io.File; +import java.io.FileInputStream; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.test.junit4.CamelTestSupport; +import org.apache.camel.util.IOHelper; +import org.junit.Test; + +public class AggregationStrategyWithPreservationTest extends CamelTestSupport { + + private static final int EXPECTED_NO_FILES = 5; + + @Override + public void setUp() throws Exception { + deleteDirectory("target/out"); + super.setUp(); + } + + @Test + public void testSplitter() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:aggregateToZipEntry"); + mock.expectedMessageCount(1); + + assertMockEndpointsSatisfied(); + + Thread.sleep(500); + + File[] files = new File("target/out").listFiles(); + assertTrue("Should be a file in target/out directory", files.length > 0); + + File resultFile = files[0]; + Set<String> expectedZipFiles = new HashSet<String>(Arrays.asList("another" + File.separator + "hello.txt", + "other" + File.separator + "greetings.txt", + "chiau.txt", "hi.txt", "hola.txt")); + ZipInputStream zin = new ZipInputStream(new FileInputStream(resultFile)); + try { + int fileCount = 0; + for (ZipEntry ze = zin.getNextEntry(); ze != null; ze = zin.getNextEntry()) { + System.out.println(ze.toString()); + expectedZipFiles.remove(ze.toString()); + fileCount++; + } + assertTrue("Zip file should contains " + AggregationStrategyWithPreservationTest.EXPECTED_NO_FILES + " files", + fileCount == AggregationStrategyWithPreservationTest.EXPECTED_NO_FILES); + assertEquals("Should have found all of the zip files in the file.", 0, expectedZipFiles.size()); + } finally { + IOHelper.close(zin); + } + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + // Unzip file and Split it according to FileEntry + from("file:src/test/resources/org/apache/camel/aggregate/zipfile/data?consumer.delay=1000&noop=true&recursive=true") + .aggregate(new ZipAggregationStrategy(true)) + .constant(true) + .completionFromBatchConsumer() + .eagerCheckCompletion() + .to("file:target/out") + .to("mock:aggregateToZipEntry") + .log("Done processing zip file: ${header.CamelFileName}"); + } + }; + + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/bb2539c2/components/camel-zipfile/src/test/resources/org/apache/camel/aggregate/zipfile/data/another/hello.txt ---------------------------------------------------------------------- diff --git a/components/camel-zipfile/src/test/resources/org/apache/camel/aggregate/zipfile/data/another/hello.txt b/components/camel-zipfile/src/test/resources/org/apache/camel/aggregate/zipfile/data/another/hello.txt new file mode 100644 index 0000000..b6fc4c6 --- /dev/null +++ b/components/camel-zipfile/src/test/resources/org/apache/camel/aggregate/zipfile/data/another/hello.txt @@ -0,0 +1 @@ +hello \ No newline at end of file http://git-wip-us.apache.org/repos/asf/camel/blob/bb2539c2/components/camel-zipfile/src/test/resources/org/apache/camel/aggregate/zipfile/data/other/greetings.txt ---------------------------------------------------------------------- diff --git a/components/camel-zipfile/src/test/resources/org/apache/camel/aggregate/zipfile/data/other/greetings.txt b/components/camel-zipfile/src/test/resources/org/apache/camel/aggregate/zipfile/data/other/greetings.txt new file mode 100644 index 0000000..9eaa11a --- /dev/null +++ b/components/camel-zipfile/src/test/resources/org/apache/camel/aggregate/zipfile/data/other/greetings.txt @@ -0,0 +1 @@ +greetings \ No newline at end of file