From a6c3a30d5bab6cc81de3ba45887f419cd8aef1f7 Mon Sep 17 00:00:00 2001 From: Artem Bilan Date: Thu, 12 Sep 2024 16:19:17 -0400 Subject: [PATCH] GH-9452: Expose `ZipTransformer.setFileNameGenerator()` Fixes: #9452 Issue link: https://github.com/spring-projects/spring-integration/issues/9452 * Move the logic about `fileNameGenerator` configuration out of `AbstractZipTransformer` since this property is not used by `UnZipTransformer` implementation * Add more docs about `ZipTransformer` logic --- .../transformer/AbstractZipTransformer.java | 11 +-- .../zip/transformer/ZipTransformer.java | 73 ++++++++++--------- .../xml/UnZipTransformerParserTests.java | 10 +-- .../antora/modules/ROOT/pages/whats-new.adoc | 6 ++ .../antora/modules/ROOT/pages/zip.adoc | 8 ++ 5 files changed, 56 insertions(+), 52 deletions(-) diff --git a/spring-integration-zip/src/main/java/org/springframework/integration/zip/transformer/AbstractZipTransformer.java b/spring-integration-zip/src/main/java/org/springframework/integration/zip/transformer/AbstractZipTransformer.java index 58639af1e9..948aa58ba6 100644 --- a/spring-integration-zip/src/main/java/org/springframework/integration/zip/transformer/AbstractZipTransformer.java +++ b/spring-integration-zip/src/main/java/org/springframework/integration/zip/transformer/AbstractZipTransformer.java @@ -1,5 +1,5 @@ /* - * Copyright 2015-2023 the original author or authors. + * Copyright 2015-2024 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. @@ -19,8 +19,6 @@ package org.springframework.integration.zip.transformer; import java.io.File; import java.nio.charset.Charset; -import org.springframework.integration.file.DefaultFileNameGenerator; -import org.springframework.integration.file.FileNameGenerator; import org.springframework.integration.transformer.AbstractTransformer; import org.springframework.messaging.Message; import org.springframework.util.Assert; @@ -37,8 +35,6 @@ public abstract class AbstractZipTransformer extends AbstractTransformer { protected Charset charset = Charset.defaultCharset(); - protected FileNameGenerator fileNameGenerator; - protected ZipResultType zipResultType = ZipResultType.FILE; protected File workDirectory = @@ -91,11 +87,6 @@ public abstract class AbstractZipTransformer extends AbstractTransformer { logger.info(() -> "Creating work directory: " + this.workDirectory); Assert.isTrue(this.workDirectory.mkdirs(), () -> "Can't create the 'workDirectory': " + this.workDirectory); } - DefaultFileNameGenerator defaultFileNameGenerator = new DefaultFileNameGenerator(); - defaultFileNameGenerator.setBeanFactory(getBeanFactory()); - defaultFileNameGenerator.setConversionService(getConversionService()); - this.fileNameGenerator = defaultFileNameGenerator; - } /** 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 056e831b30..fe8d68c32b 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 @@ -1,5 +1,5 @@ /* - * Copyright 2015-2023 the original author or authors. + * Copyright 2015-2024 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. @@ -29,10 +29,13 @@ import org.zeroturnaround.zip.ByteSource; import org.zeroturnaround.zip.FileSource; import org.zeroturnaround.zip.ZipEntrySource; +import org.springframework.integration.file.DefaultFileNameGenerator; import org.springframework.integration.file.FileHeaders; +import org.springframework.integration.file.FileNameGenerator; import org.springframework.integration.transformer.Transformer; import org.springframework.integration.zip.ZipHeaders; import org.springframework.messaging.Message; +import org.springframework.messaging.MessageHeaders; import org.springframework.util.Assert; import org.springframework.util.FileCopyUtils; import org.springframework.util.StringUtils; @@ -43,9 +46,6 @@ import org.springframework.util.StringUtils; *

* See also: *

- * If you want to generate Zip files larger than {@code 4GB}, you must use Java 7: - *

- * See also: * * @author Gunnar Hillert * @author Artem Bilan @@ -56,9 +56,11 @@ public class ZipTransformer extends AbstractZipTransformer { private static final String ZIP_EXTENSION = ".zip"; - private volatile int compressionLevel = Deflater.DEFAULT_COMPRESSION; + private int compressionLevel = Deflater.DEFAULT_COMPRESSION; - private volatile boolean useFileAttributes = true; + private boolean useFileAttributes = true; + + private FileNameGenerator fileNameGenerator; /** * Set the compression level. Default is {@link Deflater#DEFAULT_COMPRESSION}. @@ -77,6 +79,31 @@ public class ZipTransformer extends AbstractZipTransformer { this.useFileAttributes = useFileAttributes; } + /** + * Set a {@link FileNameGenerator} for zip file base name: the {@code .zip} extension is added to this name. + * Unless it already comes with {@code .zip} extension. + * Defaults to the {@link org.springframework.integration.file.DefaultFileNameGenerator}. + * The result of this generator is also used for zip entry(ies) if {@link ZipHeaders#ZIP_ENTRY_FILE_NAME} + * header is not provided in the request message. + * @param fileNameGenerator the {@link FileNameGenerator} to use. + * @since 6.4 + */ + public void setFileNameGenerator(FileNameGenerator fileNameGenerator) { + Assert.notNull(fileNameGenerator, "'fileNameGenerator' must not be null"); + this.fileNameGenerator = fileNameGenerator; + } + + @Override + protected void onInit() { + super.onInit(); + if (this.fileNameGenerator == null) { + DefaultFileNameGenerator defaultFileNameGenerator = new DefaultFileNameGenerator(); + defaultFileNameGenerator.setBeanFactory(getBeanFactory()); + defaultFileNameGenerator.setConversionService(getConversionService()); + this.fileNameGenerator = defaultFileNameGenerator; + } + } + /** * The payload may encompass the following types: *