From 3a1eee241244b73bdf0e25b81442d4e6b366c06f Mon Sep 17 00:00:00 2001 From: Boris Brodski Date: Fri, 29 Jan 2016 13:29:21 +0100 Subject: [PATCH] Add "override" option to preserve existing properties from being overridden This fixes https://github.com/mojohaus/properties-maven-plugin/issues/21 --- .../mojo/properties/ReadPropertiesMojo.java | 35 +++++++++--- .../properties/ReadPropertiesMojoTest.java | 55 +++++++++++++++++++ 2 files changed, 81 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/codehaus/mojo/properties/ReadPropertiesMojo.java b/src/main/java/org/codehaus/mojo/properties/ReadPropertiesMojo.java index 979d753..714e912 100644 --- a/src/main/java/org/codehaus/mojo/properties/ReadPropertiesMojo.java +++ b/src/main/java/org/codehaus/mojo/properties/ReadPropertiesMojo.java @@ -130,6 +130,19 @@ public void setKeyPrefix( String keyPrefix ) @Parameter( defaultValue = "false" ) private boolean useDefaultValues; + /** + * Determine, whether existing properties should be overridden or not. Default: true. + * + * @since 1.2.0 + */ + @Parameter( defaultValue = "true" ) + private boolean override = true; + + public void setOverride( boolean override ) + { + this.override = override; + } + /** * Used for resolving property placeholders. */ @@ -202,19 +215,23 @@ private void loadProperties( Resource resource ) try ( InputStream stream = resource.getInputStream() ) { + String effectivePrefix = ""; if ( keyPrefix != null ) { - Properties properties = new Properties(); - properties.load( stream ); - Properties projectProperties = project.getProperties(); - for ( String key : properties.stringPropertyNames() ) - { - projectProperties.put( keyPrefix + key, properties.get( key ) ); - } + effectivePrefix = keyPrefix; } - else + + Properties properties = new Properties(); + properties.load( stream ); + Properties projectProperties = project.getProperties(); + + for( String key: properties.stringPropertyNames() ) { - project.getProperties().load( stream ); + String propertyName = effectivePrefix + key; + if ( override || !projectProperties.containsKey( propertyName ) ) + { + projectProperties.put( propertyName, properties.get( key ) ); + } } } } diff --git a/src/test/java/org/codehaus/mojo/properties/ReadPropertiesMojoTest.java b/src/test/java/org/codehaus/mojo/properties/ReadPropertiesMojoTest.java index 29d2cd2..159f9e3 100644 --- a/src/test/java/org/codehaus/mojo/properties/ReadPropertiesMojoTest.java +++ b/src/test/java/org/codehaus/mojo/properties/ReadPropertiesMojoTest.java @@ -152,6 +152,61 @@ public void testDefaultValueForUnresolvedPropertyWithEnabledFlag() throws MojoFa assertEquals(" ", value13); } + @Test + public void readPropertiesOverridingExisting() throws Exception { + + File testPropertyFile = getPropertyFileForTesting(); + // load properties directly for comparison later + Properties testProperties = new Properties(); + testProperties.load(new FileReader(testPropertyFile)); + + // Existing property value should be overridden + projectStub.getProperties().put("test.property2", "old-value"); + + // do the work + readPropertiesMojo.setFiles(new File[]{testPropertyFile}); + readPropertiesMojo.execute(); + + // check results + Properties projectProperties = projectStub.getProperties(); + assertNotNull(projectProperties); + // it should not be empty + assertNotEquals(0, projectProperties.size()); + + // we are not adding prefix, so properties should be same as in file + assertEquals(testProperties.size(), projectProperties.size()); + assertEquals(testProperties, projectProperties); + + } + + @Test + public void readPropertiesPreserveExisting() throws Exception { + + File testPropertyFile = getPropertyFileForTesting(); + // load properties directly for comparison later + Properties testProperties = new Properties(); + testProperties.load(new FileReader(testPropertyFile)); + + // Existing property should keep the value + testProperties.put("test.property2", "old-value"); + projectStub.getProperties().put("test.property2", "old-value"); + + // do the work + readPropertiesMojo.setFiles(new File[]{testPropertyFile}); + readPropertiesMojo.setOverride(false); + readPropertiesMojo.execute(); + + // check results + Properties projectProperties = projectStub.getProperties(); + assertNotNull(projectProperties); + // it should not be empty + assertNotEquals(0, projectProperties.size()); + + // we are not adding prefix, so properties should be same as in file + assertEquals(testProperties.size(), projectProperties.size()); + assertEquals(testProperties, projectProperties); + } + /** * with the flag disabled (default behavior) nothing gets replaced * ':' is treated as a regular character and part of the property name