This is an automated email from the ASF dual-hosted git repository. khmarbaise pushed a commit to branch MichelSchudel-MRESOURCES-250-flatten-dirs in repository https://gitbox.apache.org/repos/asf/maven-filtering.git
commit dfb58c4ce9a4cceaf7f2f2a4820d44c8b3a208c8 Author: Michel Schudel <michel.schu...@gmail.com> AuthorDate: Wed Jan 1 16:32:37 2020 +0100 [MRESOURCES-250] - Add ability to flatten folder structure into target directory when copying resources This change is the preparation to enabling the maven-resources-plugin to make use of a new version of the filtering library the allows the resource plugin to copy to copy resources to a flattened directory structure. --- .../filtering/DefaultMavenResourcesFiltering.java | 27 ++++++- .../shared/filtering/MavenResourcesExecution.java | 26 +++++++ .../DefaultMavenResourcesFilteringTest.java | 82 ++++++++++++++++++++++ .../includedir/includefile.txt | 16 +++++ 4 files changed, 150 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFiltering.java b/src/main/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFiltering.java index da690c3..5ce53e9 100644 --- a/src/main/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFiltering.java +++ b/src/main/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFiltering.java @@ -24,6 +24,8 @@ import java.io.IOException; import java.io.Reader; import java.io.StringReader; import java.io.StringWriter; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -227,6 +229,19 @@ public class DefaultMavenResourcesFiltering File destinationFile = getDestinationFile( outputDirectory, targetPath, name, mavenResourcesExecution ); + if ( mavenResourcesExecution.isFlatten() && destinationFile.exists() ) + { + if ( mavenResourcesExecution.isOverwrite() ) + { + getLogger().warn( "existing file " + destinationFile.getName() + + " will be overwritten by " + name ); + } + else + { + throw new MavenFilteringException( "existing file " + destinationFile.getName() + + " will be overwritten by " + name + " and overwrite was not set to true" ); + } + } boolean filteredExt = filteredFileExtension( source.getName(), mavenResourcesExecution.getNonFilteredFileExtensions() ); @@ -275,7 +290,17 @@ public class DefaultMavenResourcesFiltering MavenResourcesExecution mavenResourcesExecution ) throws MavenFilteringException { - String destination = name; + String destination; + if ( !mavenResourcesExecution.isFlatten() ) + { + destination = name; + } + else + { + Path path = Paths.get( name ); + Path filePath = path.getFileName(); + destination = filePath.toString(); + } if ( mavenResourcesExecution.isFilterFilenames() && mavenResourcesExecution.getFilterWrappers().size() > 0 ) { diff --git a/src/main/java/org/apache/maven/shared/filtering/MavenResourcesExecution.java b/src/main/java/org/apache/maven/shared/filtering/MavenResourcesExecution.java index 71a2fcf..e1b581f 100644 --- a/src/main/java/org/apache/maven/shared/filtering/MavenResourcesExecution.java +++ b/src/main/java/org/apache/maven/shared/filtering/MavenResourcesExecution.java @@ -108,6 +108,12 @@ public class MavenResourcesExecution private boolean supportMultiLineFiltering; /** + * Write resources to a flattened directory structure. + * + */ + private boolean flatten = false; + + /** * Do nothing. */ public MavenResourcesExecution() @@ -358,6 +364,26 @@ public class MavenResourcesExecution } /** + * Write to flattened directory structure. + * + * @return {@link #flatten} + */ + public boolean isFlatten() + { + return flatten; + } + + /** + * Write to flattened directory structure. + * + * @param flatten flatten true or false. + */ + public void setFlatten( boolean flatten ) + { + this.flatten = flatten; + } + + /** * Copy any empty directories included in the Resources. * * @return {@link #includeEmptyDirs} diff --git a/src/test/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFilteringTest.java b/src/test/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFilteringTest.java index 698634f..00e511c 100644 --- a/src/test/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFilteringTest.java +++ b/src/test/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFilteringTest.java @@ -489,6 +489,88 @@ public class DefaultMavenResourcesFilteringTest } + public void testFlattenDirectoryStructure() + throws Exception + { + File baseDir = new File( "c:\\foo\\bar" ); + StubMavenProject mavenProject = new StubMavenProject( baseDir ); + mavenProject.setVersion( "1.0" ); + mavenProject.setGroupId( "org.apache" ); + mavenProject.setName( "test project" ); + + MavenResourcesFiltering mavenResourcesFiltering = lookup( MavenResourcesFiltering.class ); + + String unitFilesDir = getBasedir() + "/src/test/units-files/maven-resources-filtering"; + + Resource resource = new Resource(); + List<Resource> resources = new ArrayList<>(); + resources.add( resource ); + resource.setDirectory( unitFilesDir ); + resource.setFiltering( true ); + resource.addInclude( "includ*" ); + resource.addInclude( "**/includ*" ); + + List<String> filtersFile = new ArrayList<>(); + filtersFile.add( getBasedir() + + "/src/test/units-files/maven-resources-filtering/empty-maven-resources-filtering.txt" ); + + MavenResourcesExecution mavenResourcesExecution = + new MavenResourcesExecution( resources, outputDirectory, mavenProject, "UTF-8", filtersFile, + Collections.<String> emptyList(), new StubMavenSession() ); + mavenResourcesExecution.setFlatten(true); + mavenResourcesExecution.setOverwrite(true); + mavenResourcesFiltering.filterResources( mavenResourcesExecution ); + + File[] files = outputDirectory.listFiles(); + assertNotNull( files ); + assertEquals( 2, files.length ); + File includeFile = new File( outputDirectory, "includefile.txt" ); + assertTrue( includeFile.exists() ); + + includeFile = new File( outputDirectory, "include.txt" ); + assertTrue( includeFile.exists() ); + + } + + public void testFlattenDirectoryStructureWithoutOverride() + throws Exception + { + File baseDir = new File( "c:\\foo\\bar" ); + StubMavenProject mavenProject = new StubMavenProject( baseDir ); + mavenProject.setVersion( "1.0" ); + mavenProject.setGroupId( "org.apache" ); + mavenProject.setName( "test project" ); + + MavenResourcesFiltering mavenResourcesFiltering = lookup( MavenResourcesFiltering.class ); + + String unitFilesDir = getBasedir() + "/src/test/units-files/maven-resources-filtering"; + + Resource resource = new Resource(); + List<Resource> resources = new ArrayList<>(); + resources.add( resource ); + resource.setDirectory( unitFilesDir ); + resource.setFiltering( true ); + resource.addInclude( "includ*" ); + resource.addInclude( "**/includ*" ); + + List<String> filtersFile = new ArrayList<>(); + filtersFile.add( getBasedir() + + "/src/test/units-files/maven-resources-filtering/empty-maven-resources-filtering.txt" ); + + MavenResourcesExecution mavenResourcesExecution = + new MavenResourcesExecution( resources, outputDirectory, mavenProject, "UTF-8", filtersFile, + Collections.<String> emptyList(), new StubMavenSession() ); + mavenResourcesExecution.setFlatten(true); + mavenResourcesExecution.setOverwrite(false); + try { + mavenResourcesFiltering.filterResources(mavenResourcesExecution); + } catch (MavenFilteringException e) { + return; + } + fail("Copying directory structure with duplicate filename includefile.txt should have failed with overwrite"); + + } + public void testExcludeOneFile() throws Exception { diff --git a/src/test/units-files/maven-resources-filtering/includedir/includefile.txt b/src/test/units-files/maven-resources-filtering/includedir/includefile.txt new file mode 100644 index 0000000..13a8339 --- /dev/null +++ b/src/test/units-files/maven-resources-filtering/includedir/includefile.txt @@ -0,0 +1,16 @@ +# 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.