Repository: camel Updated Branches: refs/heads/camel-2.16.x cbf6335d5 -> 771f06c59 refs/heads/master 2a5a7ccc4 -> b25ff047d
CAMEL-9777: camel-zipfile - Using zip iterator with dataformat may fail. Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/771f06c5 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/771f06c5 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/771f06c5 Branch: refs/heads/camel-2.16.x Commit: 771f06c595a11d6c99f9d54612472176624a7898 Parents: cbf6335 Author: Claus Ibsen <davscl...@apache.org> Authored: Wed Mar 30 15:34:04 2016 +0200 Committer: Claus Ibsen <davscl...@apache.org> Committed: Wed Mar 30 15:35:21 2016 +0200 ---------------------------------------------------------------------- .../camel/dataformat/zipfile/ZipIterator.java | 7 +- .../zipfile/ZipFileSplitOneFileTest.java | 97 ++++++++++++++++++++ 2 files changed, 98 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/771f06c5/components/camel-zipfile/src/main/java/org/apache/camel/dataformat/zipfile/ZipIterator.java ---------------------------------------------------------------------- diff --git a/components/camel-zipfile/src/main/java/org/apache/camel/dataformat/zipfile/ZipIterator.java b/components/camel-zipfile/src/main/java/org/apache/camel/dataformat/zipfile/ZipIterator.java index ed8e68e..b1a0c30 100644 --- a/components/camel-zipfile/src/main/java/org/apache/camel/dataformat/zipfile/ZipIterator.java +++ b/components/camel-zipfile/src/main/java/org/apache/camel/dataformat/zipfile/ZipIterator.java @@ -105,12 +105,7 @@ public class ZipIterator implements Iterator<Message>, Closeable { answer.getHeaders().putAll(inputMessage.getHeaders()); answer.setHeader("zipFileName", current.getName()); answer.setHeader(Exchange.FILE_NAME, current.getName()); - if (current.getSize() > 0) { - answer.setBody(new ZipInputStreamWrapper(zipInputStream)); - } else { - // Workaround for the case when the entry is zero bytes big - answer.setBody(new ByteArrayInputStream(new byte[0])); - } + answer.setBody(new ZipInputStreamWrapper(zipInputStream)); return answer; } else { LOGGER.trace("close zipInputStream"); http://git-wip-us.apache.org/repos/asf/camel/blob/771f06c5/components/camel-zipfile/src/test/java/org/apache/camel/dataformat/zipfile/ZipFileSplitOneFileTest.java ---------------------------------------------------------------------- diff --git a/components/camel-zipfile/src/test/java/org/apache/camel/dataformat/zipfile/ZipFileSplitOneFileTest.java b/components/camel-zipfile/src/test/java/org/apache/camel/dataformat/zipfile/ZipFileSplitOneFileTest.java new file mode 100644 index 0000000..f1f6cd3 --- /dev/null +++ b/components/camel-zipfile/src/test/java/org/apache/camel/dataformat/zipfile/ZipFileSplitOneFileTest.java @@ -0,0 +1,97 @@ +/** + * 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.dataformat.zipfile; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.util.Iterator; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +import org.apache.camel.Exchange; +import org.apache.camel.RoutesBuilder; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.test.junit4.CamelTestSupport; +import org.junit.Test; + +public class ZipFileSplitOneFileTest extends CamelTestSupport { + + @Override + public void setUp() throws Exception { + deleteDirectory("target/zip-unmarshal"); + super.setUp(); + } + + @Test + public void testZipFileUnmarshal() throws Exception { + getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.FILE_NAME_ONLY, "test.zip"); + getMockEndpoint("mock:end").expectedBodiesReceived("Hello World"); + + createZipFile("Hello World"); + + assertMockEndpointsSatisfied(); + } + + @Override + protected RoutesBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + ZipFileDataFormat zf = new ZipFileDataFormat(); + zf.setUsingIterator(true); + + from("file://target/zip-unmarshal?noop=true&include=.*zip") + .to("mock:input") + .unmarshal(zf) + .split(bodyAs(Iterator.class)).streaming() + .convertBodyTo(String.class) + .to("mock:end") + .end(); + } + }; + } + + private void createZipFile(String content) throws IOException { + String basePath = "target" + File.separator + "zip-unmarshal" + File.separator; + File file = new File(basePath + "test.txt"); + file.getParentFile().mkdirs(); + + try (FileWriter fw = new FileWriter(file); + FileOutputStream fos = new FileOutputStream(basePath + "test.zip"); + ZipOutputStream zos = new ZipOutputStream(fos); + FileInputStream fis = new FileInputStream(basePath + "test.txt")) { + + fw.write(content); + fw.close(); + + ZipEntry entry = new ZipEntry("test.txt"); + zos.putNextEntry(entry); + + int len; + byte[] buffer = new byte[1024]; + + while ((len = fis.read(buffer)) > 0) { + zos.write(buffer, 0, len); + } + + zos.closeEntry(); + } + } +}