From 9a13e41d9607517f978afdca4fa55f11a925ab4e Mon Sep 17 00:00:00 2001 From: Artem Bilan Date: Fri, 9 Sep 2016 14:02:51 -0400 Subject: [PATCH] GH-164: Fix `ZipTransformer` `deleteFile` Mode Fixes GH-164 (https://github.com/spring-projects/spring-integration-extensions/issues/164) * Move `deleteFile` logic to the end of of `ZipTransformer#doZipTransform()` * Add `deleteFile = true` for the `ZipTransformerTests` * Add `` to the transformers XSD definitions * Upgrade to Gradle 3.0 * Upgrade dependencies Move delete logic before reply message creation --- spring-integration-zip/build.gradle | 71 ++++--- .../gradle/wrapper/gradle-wrapper.jar | Bin 52271 -> 52818 bytes .../gradle/wrapper/gradle-wrapper.properties | 4 +- spring-integration-zip/gradlew | 57 +++--- spring-integration-zip/gradlew.bat | 14 +- .../zip/transformer/ZipTransformer.java | 185 +++++++++--------- .../zip/config/spring-integration-zip-1.0.xsd | 1 + .../integration/zip/Zip2FileTests-context.xml | 10 +- .../integration/zip/Zip2FileTests.java | 41 ++-- .../zip/transformer/ZipTransformerTests.java | 10 +- 10 files changed, 206 insertions(+), 187 deletions(-) diff --git a/spring-integration-zip/build.gradle b/spring-integration-zip/build.gradle index 255a0d5..58e7a47 100644 --- a/spring-integration-zip/build.gradle +++ b/spring-integration-zip/build.gradle @@ -1,25 +1,42 @@ -description = 'Spring Integration Zip Adapter' - buildscript { repositories { maven { url 'https://repo.spring.io/plugins-release' } } } -apply plugin: 'java' -apply from: "${rootProject.projectDir}/publish-maven.gradle" -apply plugin: 'eclipse' -apply plugin: 'idea' -apply plugin: 'jacoco' +plugins { + id 'java' + id 'eclipse' + id 'idea' + id 'jacoco' + id 'org.sonarqube' version '2.1-rc3' +} + +description = 'Spring Integration Zip Adapter' + + +apply from: "${rootProject.projectDir}/publish-maven.gradle" group = 'org.springframework.integration' repositories { - if (version.endsWith('BUILD-SNAPSHOT')) { - maven { url 'https://repo.spring.io/libs-snapshot' } + if (version.endsWith('BUILD-SNAPSHOT') || project.hasProperty('platformVersion')) { + maven { url 'http://repo.spring.io/libs-snapshot' } } maven { url 'https://repo.spring.io/libs-milestone' } - mavenCentral() +} + +if (project.hasProperty('platformVersion')) { + apply plugin: 'spring-io' + + dependencyManagement { + springIoTestRuntime { + imports { + mavenBom "io.spring.platform:platform-bom:${platformVersion}" + } + + } + } } sourceCompatibility=1.6 @@ -34,8 +51,8 @@ ext { linkScmConnection = 'https://github.com/spring-projects/spring-integration-extensions.git' linkScmDevConnection = 'git@github.com:spring-projects/spring-integration-extensions.git' - slf4jVersion = "1.7.13" - springIntegrationVersion = '4.2.4.RELEASE' + slf4jVersion = "1.7.21" + springIntegrationVersion = '4.3.1.RELEASE' ztZipVersion = '1.9' idPrefix = 'zip' @@ -56,7 +73,7 @@ sourceSets { } jacoco { - toolVersion = "0.7.2.201409121644" + toolVersion = "0.7.6.201602180812" } dependencies { @@ -73,14 +90,6 @@ dependencies { ext.xLintArg = '-Xlint:all,-options' [compileJava, compileTestJava]*.options*.compilerArgs = [xLintArg] -jacocoTestReport { - reports { - xml.enabled false - csv.enabled false - html.destination "${buildDir}/reports/jacoco/html" - } -} - test { // suppress all console output during testing unless running `gradle -i` logging.captureStandardOutput(LogLevel.INFO) @@ -91,6 +100,14 @@ test { } } +jacocoTestReport { + reports { + xml.enabled false + csv.enabled false + html.destination "${buildDir}/reports/jacoco/html" + } +} + task sourcesJar(type: Jar) { classifier = 'sources' from sourceSets.main.allJava @@ -108,10 +125,8 @@ artifacts { build.dependsOn jacocoTestReport -apply plugin: 'sonar-runner' - -sonarRunner { - sonarProperties { +sonarqube { + properties { property "sonar.jacoco.reportPath", "${buildDir.name}/jacoco.exec" property "sonar.links.homepage", linkHomepage property "sonar.links.ci", linkCi @@ -245,9 +260,3 @@ task dist(dependsOn: assemble) { group = 'Distribution' description = 'Builds -dist, -docs and -schema distribution archives.' } - -task wrapper(type: Wrapper) { - description = 'Generates gradlew[.bat] scripts' - gradleVersion = '2.5' - distributionUrl = "http://services.gradle.org/distributions/gradle-${gradleVersion}-all.zip" -} diff --git a/spring-integration-zip/gradle/wrapper/gradle-wrapper.jar b/spring-integration-zip/gradle/wrapper/gradle-wrapper.jar index 30d399d8d2bf522ff5de94bf434a7cc43a9a74b5..deedc7fa5e6310eac3148a7dd0b1f069b07364cb 100644 GIT binary patch delta 19066 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 delta 18830 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

=6C>7^OR^cI**d4XXUQ+ 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 T1y!Ke)zXK1VnO`Ov!wGM$BkMr diff --git a/spring-integration-zip/gradle/wrapper/gradle-wrapper.properties b/spring-integration-zip/gradle/wrapper/gradle-wrapper.properties index 785b596..d1ff43f 100644 --- a/spring-integration-zip/gradle/wrapper/gradle-wrapper.properties +++ b/spring-integration-zip/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Thu Jan 07 20:03:45 EST 2016 +#Fri Sep 09 09:39:49 EDT 2016 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=http\://services.gradle.org/distributions/gradle-2.5-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-3.0-bin.zip diff --git a/spring-integration-zip/gradlew b/spring-integration-zip/gradlew index 91a7e26..9aa616c 100755 --- a/spring-integration-zip/gradlew +++ b/spring-integration-zip/gradlew @@ -6,12 +6,30 @@ ## ############################################################################## -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" @@ -30,6 +48,7 @@ die ( ) { cygwin=false msys=false darwin=false +nonstop=false case "`uname`" in CYGWIN* ) cygwin=true @@ -40,31 +59,11 @@ case "`uname`" in MINGW* ) msys=true ;; + NONSTOP* ) + nonstop=true + ;; esac -# For Cygwin, ensure paths are in UNIX format before anything is touched. -if $cygwin ; then - [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` -fi - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >&- -APP_HOME="`pwd -P`" -cd "$SAVED" >&- - CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -90,7 +89,7 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then MAX_FD_LIMIT=`ulimit -H -n` if [ $? -eq 0 ] ; then if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then @@ -114,6 +113,7 @@ fi if $cygwin ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` @@ -161,4 +161,9 @@ function splitJvmOpts() { eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [[ "$(uname)" == "Darwin" ]] && [[ "$HOME" == "$PWD" ]]; then + cd "$(dirname "$0")" +fi + exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/spring-integration-zip/gradlew.bat b/spring-integration-zip/gradlew.bat index aec9973..e95643d 100644 --- a/spring-integration-zip/gradlew.bat +++ b/spring-integration-zip/gradlew.bat @@ -8,14 +8,14 @@ @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - set DIRNAME=%~dp0 if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome @@ -46,10 +46,9 @@ echo location of your Java installation. goto fail :init -@rem Get command-line arguments, handling Windowz variants +@rem Get command-line arguments, handling Windows variants if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args :win9xME_args @rem Slurp the command line arguments. @@ -60,11 +59,6 @@ set _SKIP=2 if "x%~1" == "x" goto execute set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ :execute @rem Setup the command line diff --git a/spring-integration-zip/src/main/java/org/springframework/integration/zip/transformer/ZipTransformer.java b/spring-integration-zip/src/main/java/org/springframework/integration/zip/transformer/ZipTransformer.java index 92e1553..b0f3545 100644 --- a/spring-integration-zip/src/main/java/org/springframework/integration/zip/transformer/ZipTransformer.java +++ b/spring-integration-zip/src/main/java/org/springframework/integration/zip/transformer/ZipTransformer.java @@ -32,7 +32,6 @@ import org.springframework.integration.file.FileHeaders; import org.springframework.integration.transformer.Transformer; import org.springframework.integration.zip.ZipHeaders; import org.springframework.messaging.Message; -import org.springframework.messaging.MessageHandlingException; import org.springframework.util.Assert; import org.springframework.util.FileCopyUtils; import org.springframework.util.StringUtils; @@ -49,6 +48,7 @@ import org.springframework.util.StringUtils; * See also: https://blogs.oracle.com/xuemingshen/entry/zip64_support_for_4g_zipfile * * @author Gunnar Hillert + * @author Artem Bilan * @since 1.0 * */ @@ -98,90 +98,99 @@ public class ZipTransformer extends AbstractZipTransformer { */ @Override protected Object doZipTransform(Message message) throws Exception { + final Object payload = message.getPayload(); + final Object zippedData; + final String baseFileName = this.fileNameGenerator.generateFileName(message); - try { + final String zipEntryName; + final String zipFileName; - final Object payload = message.getPayload(); - final Object zippedData; - final String baseFileName = this.fileNameGenerator.generateFileName(message); - - final String zipEntryName; - final String zipFileName; - - if (message.getHeaders().containsKey(ZipHeaders.ZIP_ENTRY_FILE_NAME)) { - zipEntryName = (String) message.getHeaders().get(ZipHeaders.ZIP_ENTRY_FILE_NAME); - } - else { - zipEntryName = baseFileName; - } - - if (message.getHeaders().containsKey(FileHeaders.FILENAME)) { - zipFileName = baseFileName; - } - else { - zipFileName = baseFileName + ZIP_EXTENSION; - } - - final Date lastModifiedDate; - - if (message.getHeaders().containsKey(ZipHeaders.ZIP_ENTRY_LAST_MODIFIED_DATE)) { - lastModifiedDate = (Date) message.getHeaders().get(ZipHeaders.ZIP_ENTRY_LAST_MODIFIED_DATE); - } - else { - lastModifiedDate = new Date(); - } - - java.util.List entries = new ArrayList(); - - if (payload instanceof Iterable) { - int counter = 1; - - String baseName = FilenameUtils.getBaseName(zipEntryName); - String fileExtension = FilenameUtils.getExtension(zipEntryName); - - if (StringUtils.hasText(fileExtension)) { - fileExtension = FilenameUtils.EXTENSION_SEPARATOR_STR + fileExtension; - } - - for (Object item : (Iterable) payload) { - - final ZipEntrySource zipEntrySource = createZipEntrySource(item, lastModifiedDate, baseName + "_" - + counter + fileExtension, this.useFileAttributes); - if (logger.isDebugEnabled()) { - logger.debug("ZipEntrySource path: '" + zipEntrySource.getPath() + "'"); - } - entries.add(zipEntrySource); - counter++; - } - } - else { - final ZipEntrySource zipEntrySource = - createZipEntrySource(payload, lastModifiedDate, zipEntryName, this.useFileAttributes); - entries.add(zipEntrySource); - } - - final byte[] zippedBytes = SpringZipUtils.pack(entries, this.compressionLevel); - - if (ZipResultType.FILE.equals(this.zipResultType)) { - final File zippedFile = new File(this.workDirectory, zipFileName); - FileCopyUtils.copy(zippedBytes, zippedFile); - zippedData = zippedFile; - } - else if (ZipResultType.BYTE_ARRAY.equals(this.zipResultType)) { - zippedData = zippedBytes; - } - else { - throw new IllegalStateException("Unsupported zipResultType " + this.zipResultType); - } - - return getMessageBuilderFactory() - .withPayload(zippedData) - .copyHeaders(message.getHeaders()) - .setHeader(FileHeaders.FILENAME, zipFileName) - .build(); + if (message.getHeaders().containsKey(ZipHeaders.ZIP_ENTRY_FILE_NAME)) { + zipEntryName = (String) message.getHeaders().get(ZipHeaders.ZIP_ENTRY_FILE_NAME); } - catch (Exception e) { - throw new MessageHandlingException(message, "Failed to apply Zip transformation.", e); + else { + zipEntryName = baseFileName; + } + + if (message.getHeaders().containsKey(FileHeaders.FILENAME)) { + zipFileName = baseFileName; + } + else { + zipFileName = baseFileName + ZIP_EXTENSION; + } + + final Date lastModifiedDate; + + if (message.getHeaders().containsKey(ZipHeaders.ZIP_ENTRY_LAST_MODIFIED_DATE)) { + lastModifiedDate = (Date) message.getHeaders().get(ZipHeaders.ZIP_ENTRY_LAST_MODIFIED_DATE); + } + else { + lastModifiedDate = new Date(); + } + + java.util.List entries = new ArrayList(); + + if (payload instanceof Iterable) { + int counter = 1; + + String baseName = FilenameUtils.getBaseName(zipEntryName); + String fileExtension = FilenameUtils.getExtension(zipEntryName); + + if (StringUtils.hasText(fileExtension)) { + fileExtension = FilenameUtils.EXTENSION_SEPARATOR_STR + fileExtension; + } + + for (Object item : (Iterable) payload) { + + final ZipEntrySource zipEntrySource = createZipEntrySource(item, lastModifiedDate, baseName + "_" + + counter + fileExtension, this.useFileAttributes); + if (logger.isDebugEnabled()) { + logger.debug("ZipEntrySource path: '" + zipEntrySource.getPath() + "'"); + } + entries.add(zipEntrySource); + counter++; + } + } + else { + final ZipEntrySource zipEntrySource = + createZipEntrySource(payload, lastModifiedDate, zipEntryName, this.useFileAttributes); + entries.add(zipEntrySource); + } + + final byte[] zippedBytes = SpringZipUtils.pack(entries, this.compressionLevel); + + if (ZipResultType.FILE.equals(this.zipResultType)) { + final File zippedFile = new File(this.workDirectory, zipFileName); + FileCopyUtils.copy(zippedBytes, zippedFile); + zippedData = zippedFile; + } + else if (ZipResultType.BYTE_ARRAY.equals(this.zipResultType)) { + zippedData = zippedBytes; + } + else { + throw new IllegalStateException("Unsupported zipResultType " + this.zipResultType); + } + + if (this.deleteFiles) { + if (payload instanceof Iterable) { + for (Object item : (Iterable) payload) { + deleteFile(item); + } + } + else { + deleteFile(payload); + } + } + return getMessageBuilderFactory() + .withPayload(zippedData) + .copyHeaders(message.getHeaders()) + .setHeader(FileHeaders.FILENAME, zipFileName) + .build(); + } + + private void deleteFile(Object fileToDelete) { + if (fileToDelete instanceof File && !((File) fileToDelete).delete() && logger.isWarnEnabled()) { + logger.warn("Failed to delete File '" + fileToDelete + "'"); } } @@ -197,15 +206,7 @@ public class ZipTransformer extends AbstractZipTransformer { throw new UnsupportedOperationException("Zipping of directories is not supported."); } - final FileSource fileSource = new FileSource(fileName, filePayload); - - if (this.deleteFiles) { - if (!filePayload.delete() && logger.isWarnEnabled()) { - logger.warn("failed to delete File '" + filePayload + "'"); - } - } - - return fileSource; + return new FileSource(fileName, filePayload); } else if (item instanceof byte[] || item instanceof String) { @@ -223,7 +224,7 @@ public class ZipTransformer extends AbstractZipTransformer { } else { throw new IllegalArgumentException("Unsupported payload type. The only supported payloads are " + - "java.io.File, java.lang.String, and byte[]"); + "java.io.File, java.lang.String, and byte[]"); } } diff --git a/spring-integration-zip/src/main/resources/org/springframework/integration/zip/config/spring-integration-zip-1.0.xsd b/spring-integration-zip/src/main/resources/org/springframework/integration/zip/config/spring-integration-zip-1.0.xsd index 3ea1627..5e71d32 100644 --- a/spring-integration-zip/src/main/resources/org/springframework/integration/zip/config/spring-integration-zip-1.0.xsd +++ b/spring-integration-zip/src/main/resources/org/springframework/integration/zip/config/spring-integration-zip-1.0.xsd @@ -71,6 +71,7 @@ + diff --git a/spring-integration-zip/src/test/java/org/springframework/integration/zip/Zip2FileTests-context.xml b/spring-integration-zip/src/test/java/org/springframework/integration/zip/Zip2FileTests-context.xml index c348a6c..9cacd74 100644 --- a/spring-integration-zip/src/test/java/org/springframework/integration/zip/Zip2FileTests-context.xml +++ b/spring-integration-zip/src/test/java/org/springframework/integration/zip/Zip2FileTests-context.xml @@ -11,10 +11,14 @@ http://www.springframework.org/schema/integration/zip http://www.springframework.org/schema/integration/zip/spring-integration-zip.xsd http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd"> - - + + + + + + + - diff --git a/spring-integration-zip/src/test/java/org/springframework/integration/zip/Zip2FileTests.java b/spring-integration-zip/src/test/java/org/springframework/integration/zip/Zip2FileTests.java index 74eeb13..8b0dd27 100644 --- a/spring-integration-zip/src/test/java/org/springframework/integration/zip/Zip2FileTests.java +++ b/spring-integration-zip/src/test/java/org/springframework/integration/zip/Zip2FileTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2015 the original author or authors. + * Copyright 2015-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,7 +17,6 @@ package org.springframework.integration.zip; import java.io.File; -import java.io.FileNotFoundException; import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -30,6 +29,7 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; + import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -42,12 +42,14 @@ import org.springframework.messaging.MessageChannel; /** * * @author Gunnar Hillert + * @author Artem Bilan * @since 1.0 * */ public class Zip2FileTests { private AnnotationConfigApplicationContext context; + private MessageChannel input; private static final Properties properties = new Properties(); @@ -61,7 +63,6 @@ public class Zip2FileTests { public void setup() throws IOException { this.workDir = testFolder.newFolder(); properties.put("workDir", workDir); - System.out.print(this.workDir.getAbsolutePath()); context = new AnnotationConfigApplicationContext(); context.register(ContextConfiguration.class); @@ -77,7 +78,7 @@ public class Zip2FileTests { } @Test - public void zipStringWithDefaultFileName() throws FileNotFoundException, IOException, InterruptedException { + public void zipStringWithDefaultFileName() throws IOException, InterruptedException { final Message message = MessageBuilder.withPayload("Zip me up.").build(); @@ -89,28 +90,33 @@ public class Zip2FileTests { Assert.assertTrue(fileInWorkDir.isFile()); Assert.assertTrue(fileInWorkDir.getName().contains(message.getHeaders().getId().toString())); - Assert.assertTrue("The created file should have a 'zip' file extension.", fileInWorkDir.getName().endsWith(".zip")); + Assert.assertTrue("The created file should have a 'zip' file extension.", + fileInWorkDir.getName().endsWith(".zip")); } @Test - public void zipStringWithExplicitFileName() throws FileNotFoundException, IOException, InterruptedException { - input.send(MessageBuilder.withPayload("Zip me up.").setHeader(FileHeaders.FILENAME, "zipString.zip").build()); + public void zipStringWithExplicitFileName() throws IOException, InterruptedException { + input.send(MessageBuilder.withPayload("Zip me up.") + .setHeader(FileHeaders.FILENAME, "zipString.zip") + .build()); Assert.assertTrue(this.workDir.list().length == 1); Assert.assertEquals("zipString.zip", this.workDir.listFiles()[0].getName()); } @Test - public void zipBytesWithExplicitFileName() throws FileNotFoundException, IOException, InterruptedException { + public void zipBytesWithExplicitFileName() throws IOException, InterruptedException { - input.send(MessageBuilder.withPayload("Zip me up.".getBytes()).setHeader(FileHeaders.FILENAME, "zipString.zip").build()); + input.send(MessageBuilder.withPayload("Zip me up.".getBytes()) + .setHeader(FileHeaders.FILENAME, "zipString.zip") + .build()); Assert.assertTrue(this.workDir.list().length == 1); Assert.assertEquals("zipString.zip", this.workDir.listFiles()[0].getName()); } @Test - public void zipFile() throws FileNotFoundException, IOException, InterruptedException { + public void zipFile() throws IOException, InterruptedException { final File fileToCompress = testFolder.newFile(); FileUtils.writeStringToFile(fileToCompress, "hello world"); @@ -122,7 +128,7 @@ public class Zip2FileTests { } @Test - public void zipIterableWithMultipleStrings() throws FileNotFoundException, IOException, InterruptedException { + public void zipIterableWithMultipleStrings() throws IOException, InterruptedException { String stringToCompress1 = "String1"; String stringToCompress2 = "String2"; @@ -136,17 +142,19 @@ public class Zip2FileTests { stringsToCompress.add(stringToCompress3); stringsToCompress.add(stringToCompress4); - input.send(MessageBuilder.withPayload(stringsToCompress).setHeader(FileHeaders.FILENAME, "zipWith4Strings.zip").build()); + input.send(MessageBuilder.withPayload(stringsToCompress) + .setHeader(FileHeaders.FILENAME, "zipWith4Strings.zip") + .build()); Assert.assertTrue(this.workDir.list().length == 1); Assert.assertEquals("zipWith4Strings.zip", this.workDir.listFiles()[0].getName()); } @Test - public void zipIterableWithDifferentTypes() throws FileNotFoundException, IOException, InterruptedException { + public void zipIterableWithDifferentTypes() throws IOException, InterruptedException { String stringToCompress = "String1"; - byte[] bytesToCompress = "String2".getBytes(); + byte[] bytesToCompress = "String2".getBytes(); final File fileToCompress = testFolder.newFile(); FileUtils.writeStringToFile(fileToCompress, "hello world"); @@ -156,7 +164,9 @@ public class Zip2FileTests { objectsToCompress.add(bytesToCompress); objectsToCompress.add(fileToCompress); - input.send(MessageBuilder.withPayload(objectsToCompress).setHeader(FileHeaders.FILENAME, "objects-to-compress.zip").build()); + input.send(MessageBuilder.withPayload(objectsToCompress) + .setHeader(FileHeaders.FILENAME, "objects-to-compress.zip") + .build()); Assert.assertTrue(this.workDir.list().length == 1); Assert.assertEquals("objects-to-compress.zip", this.workDir.listFiles()[0].getName()); @@ -172,4 +182,5 @@ public class Zip2FileTests { } } + } diff --git a/spring-integration-zip/src/test/java/org/springframework/integration/zip/transformer/ZipTransformerTests.java b/spring-integration-zip/src/test/java/org/springframework/integration/zip/transformer/ZipTransformerTests.java index 323980f..f0d83b6 100644 --- a/spring-integration-zip/src/test/java/org/springframework/integration/zip/transformer/ZipTransformerTests.java +++ b/spring-integration-zip/src/test/java/org/springframework/integration/zip/transformer/ZipTransformerTests.java @@ -20,7 +20,6 @@ import static org.mockito.Mockito.mock; import java.io.ByteArrayInputStream; import java.io.File; -import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; import java.util.ArrayList; @@ -54,12 +53,6 @@ public class ZipTransformerTests { @Rule public TemporaryFolder testFolder = new TemporaryFolder(); - /** - * Compress a simple String. The result will be a byte array. - * - * @throws FileNotFoundException - * @throws IOException - */ @Test public void zipString() throws IOException { final ZipTransformer zipTransformer = new ZipTransformer(); @@ -198,8 +191,9 @@ public class ZipTransformerTests { @Test public void zipFile() throws IOException { - final ZipTransformer zipTransformer = new ZipTransformer(); + ZipTransformer zipTransformer = new ZipTransformer(); zipTransformer.setBeanFactory(mock(BeanFactory.class)); + zipTransformer.setDeleteFiles(true); zipTransformer.afterPropertiesSet(); final File testFile = createTestFile(10);