From 455a146a1ff1e903210a50a4ded1a36264aec5a1 Mon Sep 17 00:00:00 2001 From: Gary Russell Date: Tue, 11 Aug 2015 17:51:59 -0400 Subject: [PATCH] INT-3798: Customizable File in Props MetadataStore JIRA: https://jira.spring.io/browse/INT-3798 Add `fileName` property. --- .../PropertiesPersistingMetadataStore.java | 27 +++++++++++++++---- ...ropertiesPersistingMetadataStoreTests.java | 26 +++++++++++++++--- 2 files changed, 45 insertions(+), 8 deletions(-) diff --git a/spring-integration-core/src/main/java/org/springframework/integration/metadata/PropertiesPersistingMetadataStore.java b/spring-integration-core/src/main/java/org/springframework/integration/metadata/PropertiesPersistingMetadataStore.java index 8a6d81f4c3..f2c98e46d0 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/metadata/PropertiesPersistingMetadataStore.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/metadata/PropertiesPersistingMetadataStore.java @@ -42,8 +42,10 @@ import org.springframework.util.DefaultPropertiesPersister; /** * Properties file-based implementation of {@link MetadataStore}. To avoid conflicts * each instance should be constructed with the unique key from which unique file name - * will be generated. The file name will be 'persistentKey' + ".last.entry". - * Files will be written to the 'java.io.tmpdir' + "/spring-integration/". + * will be generated. + * By default, the properties file will be + * {@code 'java.io.tmpdir' + "/spring-integration/metadata-store.properties"}, + * but the directory and filename are settable. * * @author Oleg Zhurakousky * @author Mark Fisher @@ -63,21 +65,36 @@ public class PropertiesPersistingMetadataStore implements ConcurrentMetadataStor private String baseDirectory = System.getProperty("java.io.tmpdir") + "/spring-integration/"; + private String fileName = "metadata-store.properties"; + private File file; private volatile boolean dirty; - + /** + * Set the location for the properties file. Defaults to + * {@code 'java.io.tmpdir' + "/spring-integration/"}. + * @param baseDirectory the directory. + */ public void setBaseDirectory(String baseDirectory) { Assert.hasText(baseDirectory, "'baseDirectory' must be non-empty"); this.baseDirectory = baseDirectory; } + /** + * Set the name of the properties file in {@link #setBaseDirectory(String)}. + * Defaults to {@code metadata-store.properties}, + * @param fileName the properties file name. + */ + public void setFileName(String fileName) { + this.fileName = fileName; + } + @Override public void afterPropertiesSet() throws Exception { - File baseDir = new File(baseDirectory); + File baseDir = new File(this.baseDirectory); baseDir.mkdirs(); - this.file = new File(baseDir, "metadata-store.properties"); + this.file = new File(baseDir, this.fileName); try { if (!this.file.exists()) { this.file.createNewFile(); diff --git a/spring-integration-core/src/test/java/org/springframework/integration/metadata/PropertiesPersistingMetadataStoreTests.java b/spring-integration-core/src/test/java/org/springframework/integration/metadata/PropertiesPersistingMetadataStoreTests.java index c9ed5556f5..ad530a2433 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/metadata/PropertiesPersistingMetadataStoreTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/metadata/PropertiesPersistingMetadataStoreTests.java @@ -25,7 +25,9 @@ import static org.junit.Assert.assertTrue; import java.io.File; import java.util.Properties; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TemporaryFolder; import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.support.PropertiesLoaderUtils; @@ -39,6 +41,9 @@ import org.springframework.core.io.support.PropertiesLoaderUtils; */ public class PropertiesPersistingMetadataStoreTests { + @Rule + public TemporaryFolder folder = new TemporaryFolder(); + @Test public void validateWithDefaultBaseDir() throws Exception { File file = new File(System.getProperty("java.io.tmpdir") + "/spring-integration/metadata-store.properties"); @@ -60,10 +65,25 @@ public class PropertiesPersistingMetadataStoreTests { @Test public void validateWithCustomBaseDir() throws Exception { - File file = new File("target/foo" + "/metadata-store.properties"); - file.deleteOnExit(); + File file = new File(this.folder.getRoot(), "metadata-store.properties"); PropertiesPersistingMetadataStore metadataStore = new PropertiesPersistingMetadataStore(); - metadataStore.setBaseDirectory("target/foo"); + metadataStore.setBaseDirectory(folder.getRoot().getAbsolutePath()); + metadataStore.afterPropertiesSet(); + metadataStore.put("foo", "bar"); + metadataStore.close(); + assertTrue(file.exists()); + Properties persistentProperties = PropertiesLoaderUtils.loadProperties(new FileSystemResource(file)); + assertNotNull(persistentProperties); + assertEquals(1, persistentProperties.size()); + assertEquals("bar", persistentProperties.get("foo")); + } + + @Test + public void validateWithCustomFileName() throws Exception { + File file = new File(this.folder.getRoot(), "foo.properties"); + PropertiesPersistingMetadataStore metadataStore = new PropertiesPersistingMetadataStore(); + metadataStore.setBaseDirectory(folder.getRoot().getAbsolutePath()); + metadataStore.setFileName("foo.properties"); metadataStore.afterPropertiesSet(); metadataStore.put("foo", "bar"); metadataStore.close();