From dedca2a980a31bfefaa2ecdd95cb7425bf3d7e46 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Wed, 8 Jun 2022 22:50:46 +0200 Subject: [PATCH 1/6] [MSHARED-1080] Parent POM 36, Java8, drop legacy. --- https://issues.apache.org/jira/browse/MSHARED-1080 --- pom.xml | 59 ++++++------- .../maven/shared/filtering/BaseFilter.java | 3 +- .../filtering/DefaultMavenFileFilter.java | 25 +++--- .../filtering/DefaultMavenReaderFilter.java | 7 +- .../DefaultMavenResourcesFiltering.java | 86 +++++++++---------- .../shared/filtering/FilteringUtils.java | 8 +- .../maven/shared/filtering/PropertyUtils.java | 5 +- .../IncrementalResourceFilteringTest.xml | 27 ------ 8 files changed, 96 insertions(+), 124 deletions(-) delete mode 100644 src/test/resources/org/apache/maven/shared/filtering/IncrementalResourceFilteringTest.xml diff --git a/pom.xml b/pom.xml index 1243429..e247b95 100644 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,8 @@ org.apache.maven.shared maven-shared-components - 34 + 36 + maven-filtering @@ -55,7 +56,8 @@ 3.2.5 - 7 + 1.7.36 + 8 2020-08-05T15:18:01Z @@ -66,20 +68,33 @@ + + javax.inject + javax.inject + 1 + + + org.slf4j + slf4j-api + ${slf4jVersion} + org.apache.maven maven-core ${mavenVersion} + provided org.apache.maven maven-model ${mavenVersion} + provided org.apache.maven maven-settings ${mavenVersion} + provided org.eclipse.sisu @@ -90,15 +105,10 @@ org.codehaus.plexus plexus-component-annotations - - org.apache.maven.shared - maven-shared-utils - 3.3.4 - org.codehaus.plexus plexus-utils - 3.3.0 + 3.4.2 org.codehaus.plexus @@ -108,25 +118,13 @@ commons-io commons-io - 2.6 - - - org.sonatype.plexus - plexus-build-api - 0.0.7 - - - org.sonatype.plexus - plexus-build-api - 0.0.7 - test - tests + 2.11.0 org.mockito mockito-core - 2.28.2 + 4.5.1 test @@ -141,21 +139,20 @@ 2.2 test + + org.slf4j + slf4j-simple + ${slf4jVersion} + test + - org.codehaus.plexus - plexus-component-metadata - - - - generate-metadata - - - + org.eclipse.sisu + sisu-maven-plugin diff --git a/src/main/java/org/apache/maven/shared/filtering/BaseFilter.java b/src/main/java/org/apache/maven/shared/filtering/BaseFilter.java index be8908f..6059c65 100644 --- a/src/main/java/org/apache/maven/shared/filtering/BaseFilter.java +++ b/src/main/java/org/apache/maven/shared/filtering/BaseFilter.java @@ -32,7 +32,6 @@ import org.apache.maven.execution.MavenSession; import org.apache.maven.project.MavenProject; import org.apache.maven.settings.Settings; -import org.apache.maven.shared.utils.StringUtils; import org.apache.maven.shared.utils.io.FileUtils; import org.codehaus.plexus.interpolation.InterpolationPostProcessor; import org.codehaus.plexus.interpolation.Interpolator; @@ -195,7 +194,7 @@ void loadProperties( Properties filterProperties, File basedir, List pro for ( String filterFile : propertiesFilePaths ) { - if ( StringUtils.isEmpty( filterFile ) ) + if ( filterFile == null || filterFile.trim().isEmpty() ) { // skip empty file name continue; diff --git a/src/main/java/org/apache/maven/shared/filtering/DefaultMavenFileFilter.java b/src/main/java/org/apache/maven/shared/filtering/DefaultMavenFileFilter.java index 3995650..ca7a6f8 100644 --- a/src/main/java/org/apache/maven/shared/filtering/DefaultMavenFileFilter.java +++ b/src/main/java/org/apache/maven/shared/filtering/DefaultMavenFileFilter.java @@ -19,6 +19,10 @@ * under the License. */ +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Singleton; + import java.io.File; import java.io.IOException; import java.util.List; @@ -27,24 +31,25 @@ import org.apache.maven.project.MavenProject; import org.apache.maven.shared.utils.io.FileUtils; import org.apache.maven.shared.utils.io.FileUtils.FilterWrapper; -import org.codehaus.plexus.component.annotations.Component; -import org.codehaus.plexus.component.annotations.Requirement; -import org.sonatype.plexus.build.incremental.BuildContext; + +import static java.util.Objects.requireNonNull; /** * @author Olivier Lamy */ -@Component( role = org.apache.maven.shared.filtering.MavenFileFilter.class, hint = "default" ) +@Singleton +@Named public class DefaultMavenFileFilter extends BaseFilter implements MavenFileFilter { + private final MavenReaderFilter readerFilter; - @Requirement - private MavenReaderFilter readerFilter; - - @Requirement - private BuildContext buildContext; + @Inject + public DefaultMavenFileFilter( MavenReaderFilter readerFilter ) + { + this.readerFilter = requireNonNull( readerFilter ); + } @Override public void copyFile( File from, File to, boolean filtering, MavenProject mavenProject, List filters, @@ -105,8 +110,6 @@ public void copyFile( File from, File to, boolean filtering, List defaultNonFilteredFileExtensions; - - @Requirement - private BuildContext buildContext; + private final List defaultNonFilteredFileExtensions; - @Requirement - private MavenFileFilter mavenFileFilter; + private final MavenFileFilter mavenFileFilter; - // ------------------------------------------------ - // Plexus lifecycle - // ------------------------------------------------ - @Override - public void initialize() - throws InitializationException + @Inject + public DefaultMavenResourcesFiltering( MavenFileFilter mavenFileFilter ) { + this.mavenFileFilter = mavenFileFilter; this.defaultNonFilteredFileExtensions = new ArrayList<>( 5 ); this.defaultNonFilteredFileExtensions.add( "jpg" ); this.defaultNonFilteredFileExtensions.add( "jpeg" ); @@ -90,23 +83,25 @@ public boolean filteredFileExtension( String fileName, List userNonFilte { nonFilteredFileExtensions.addAll( userNonFilteredFileExtensions ); } - String extension = StringUtils.lowerCase( FilenameUtils.getExtension( fileName ) ); + String extension = getExtension( fileName ); boolean filteredFileExtension = !nonFilteredFileExtensions.contains( extension ); - if ( getLogger().isDebugEnabled() ) + if ( LOGGER.isDebugEnabled() ) { - getLogger().debug( "file " + fileName + " has a" + ( filteredFileExtension ? " " : " non " ) + LOGGER.debug( "file " + fileName + " has a" + ( filteredFileExtension ? " " : " non " ) + "filtered file extension" ); } return filteredFileExtension; } + private static String getExtension( String fileName ) + { + String rawExt = FilenameUtils.getExtension( fileName ); + return rawExt == null ? null : rawExt.toLowerCase( Locale.ROOT ); + } + @Override public List getDefaultNonFilteredFileExtensions() { - if ( this.defaultNonFilteredFileExtensions == null ) - { - this.defaultNonFilteredFileExtensions = new ArrayList<>(); - } return this.defaultNonFilteredFileExtensions; } @@ -121,7 +116,7 @@ public void filterResources( MavenResourcesExecution mavenResourcesExecution ) if ( mavenResourcesExecution.getResources() == null ) { - getLogger().info( "No resources configured skip copying/filtering" ); + LOGGER.info( "No resources configured skip copying/filtering" ); return; } @@ -137,24 +132,24 @@ public void filterResources( MavenResourcesExecution mavenResourcesExecution ) if ( mavenResourcesExecution.getEncoding() == null || mavenResourcesExecution.getEncoding().length() < 1 ) { - getLogger().warn( "Using platform encoding (" + ReaderFactory.FILE_ENCODING + LOGGER.warn( "Using platform encoding (" + System.getProperty( "file.encoding" ) + " actually) to copy filtered resources, i.e. build is platform dependent!" ); } else { - getLogger().debug( "Using '" + mavenResourcesExecution.getEncoding() + LOGGER.debug( "Using '" + mavenResourcesExecution.getEncoding() + "' encoding to copy filtered resources." ); } if ( mavenResourcesExecution.getPropertiesEncoding() == null || mavenResourcesExecution.getPropertiesEncoding().length() < 1 ) { - getLogger().debug( "Using '" + mavenResourcesExecution.getEncoding() + LOGGER.debug( "Using '" + mavenResourcesExecution.getEncoding() + "' encoding to copy filtered properties files." ); } else { - getLogger().debug( "Using '" + mavenResourcesExecution.getPropertiesEncoding() + LOGGER.debug( "Using '" + mavenResourcesExecution.getPropertiesEncoding() + "' encoding to copy filtered properties files." ); } @@ -165,7 +160,7 @@ public void filterResources( MavenResourcesExecution mavenResourcesExecution ) for ( Resource resource : mavenResourcesExecution.getResources() ) { - if ( getLogger().isDebugEnabled() ) + if ( LOGGER.isDebugEnabled() ) { String ls = System.lineSeparator(); StringBuilder debugMessage = @@ -179,7 +174,7 @@ public void filterResources( MavenResourcesExecution mavenResourcesExecution ) : resource.getIncludes().toString() ); // @formatter:on - getLogger().debug( debugMessage.toString() ); + LOGGER.debug( debugMessage.toString() ); } String targetPath = resource.getTargetPath(); @@ -194,7 +189,7 @@ public void filterResources( MavenResourcesExecution mavenResourcesExecution ) if ( resourceDirectory == null || !resourceDirectory.exists() ) { - getLogger().info( "skip non existing resourceDirectory " + resourceDirectory ); + LOGGER.info( "skip non existing resourceDirectory " + resourceDirectory ); continue; } @@ -238,13 +233,13 @@ public void filterResources( MavenResourcesExecution mavenResourcesExecution ) List includedFiles = Arrays.asList( scanner.getIncludedFiles() ); - getLogger().info( "Copying " + includedFiles.size() + " resource" + ( includedFiles.size() > 1 ? "s" : "" ) + LOGGER.info( "Copying " + includedFiles.size() + " resource" + ( includedFiles.size() > 1 ? "s" : "" ) + ( targetPath == null ? "" : " to " + targetPath ) ); for ( String name : includedFiles ) { - getLogger().debug( "Copying file " + name ); + LOGGER.debug( "Copying file " + name ); File source = new File( resourceDirectory, name ); File destinationFile = getDestinationFile( outputDirectory, targetPath, name, mavenResourcesExecution ); @@ -253,7 +248,7 @@ public void filterResources( MavenResourcesExecution mavenResourcesExecution ) { if ( mavenResourcesExecution.isOverwrite() ) { - getLogger().warn( "existing file " + destinationFile.getName() + LOGGER.warn( "existing file " + destinationFile.getName() + " will be overwritten by " + name ); } else @@ -272,7 +267,7 @@ public void filterResources( MavenResourcesExecution mavenResourcesExecution ) // Determine which encoding to use when filtering this file String encoding = getEncoding( source, mavenResourcesExecution.getEncoding(), mavenResourcesExecution.getPropertiesEncoding() ); - getLogger().debug( "Using '" + encoding + "' encoding to copy filtered resource '" + LOGGER.debug( "Using '" + encoding + "' encoding to copy filtered resource '" + source.getName() + "'." ); mavenFileFilter.copyFile( source, destinationFile, resource.isFiltering() && filteredExt, mavenResourcesExecution.getFilterWrappers(), @@ -313,7 +308,7 @@ public void filterResources( MavenResourcesExecution mavenResourcesExecution ) && propertiesFiles.size() > 0 ) { // @todo Sometime in the future we should change this to be a warning - getLogger().info( "The encoding used to copy filtered properties files have not been set." + LOGGER.info( "The encoding used to copy filtered properties files have not been set." + " This means that the same encoding will be used to copy filtered properties files" + " as when copying other filtered resources. This might not be what you want!" + " Run your build with --debug to see which files might be affected." @@ -328,7 +323,7 @@ public void filterResources( MavenResourcesExecution mavenResourcesExecution ) { affectedFiles.append( System.lineSeparator() ).append( " - " ).append( propertiesFile.getPath() ); } - getLogger().debug( affectedFiles.toString() ); + LOGGER.debug( affectedFiles.toString() ); } @@ -374,8 +369,7 @@ static String getEncoding( File file, String encoding, String propertiesEncoding */ static boolean isPropertiesFile( File file ) { - String extension = StringUtils.lowerCase( FilenameUtils.getExtension( ( file.getName() ) ) ); - return "properties".equals( extension ); + return "properties".equals( getExtension( file.getName() ) ); } private void handleDefaultFilterWrappers( MavenResourcesExecution mavenResourcesExecution ) diff --git a/src/main/java/org/apache/maven/shared/filtering/FilteringUtils.java b/src/main/java/org/apache/maven/shared/filtering/FilteringUtils.java index ffaf21f..71bd13e 100644 --- a/src/main/java/org/apache/maven/shared/filtering/FilteringUtils.java +++ b/src/main/java/org/apache/maven/shared/filtering/FilteringUtils.java @@ -21,8 +21,6 @@ import java.util.regex.Pattern; -import org.apache.maven.shared.utils.StringUtils; - /** * @author Olivier Lamy * @author Dennis Lundberg @@ -49,7 +47,7 @@ private FilteringUtils() */ public static String escapeWindowsPath( String val ) { - if ( !StringUtils.isEmpty( val ) && PATTERN.matcher( val ).matches() ) + if ( !isEmpty( val ) && PATTERN.matcher( val ).matches() ) { // Adapted from StringUtils.replace in plexus-utils to accommodate pre-escaped backslashes. StringBuilder buf = new StringBuilder( val.length() ); @@ -72,4 +70,8 @@ public static String escapeWindowsPath( String val ) return val; } + static boolean isEmpty( final String string ) + { + return string == null || string.trim().isEmpty(); + } } diff --git a/src/main/java/org/apache/maven/shared/filtering/PropertyUtils.java b/src/main/java/org/apache/maven/shared/filtering/PropertyUtils.java index b37f7de..d84f07a 100644 --- a/src/main/java/org/apache/maven/shared/filtering/PropertyUtils.java +++ b/src/main/java/org/apache/maven/shared/filtering/PropertyUtils.java @@ -28,9 +28,10 @@ import java.util.List; import java.util.Properties; -import org.apache.maven.shared.utils.StringUtils; import org.codehaus.plexus.logging.Logger; +import static org.apache.maven.shared.filtering.FilteringUtils.isEmpty; + /** * @author Kenney Westerhof * @author William Ferguson @@ -234,7 +235,7 @@ private static String getPropertyValue( String k, Properties p, Logger logger ) valueChain.add( nk ); // try global environment.. - if ( nv == null && !StringUtils.isEmpty( nk ) ) + if ( nv == null && !isEmpty( nk ) ) { nv = System.getProperty( nk ); } diff --git a/src/test/resources/org/apache/maven/shared/filtering/IncrementalResourceFilteringTest.xml b/src/test/resources/org/apache/maven/shared/filtering/IncrementalResourceFilteringTest.xml deleted file mode 100644 index 551b1b4..0000000 --- a/src/test/resources/org/apache/maven/shared/filtering/IncrementalResourceFilteringTest.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - org.sonatype.plexus.build.incremental.BuildContext - default - org.sonatype.plexus.build.incremental.ThreadBuildContext - - - From d026df469c5f59966cdf7ebe4c5613c9724ef443 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Thu, 9 Jun 2022 12:31:59 +0200 Subject: [PATCH 2/6] WIP --- .../maven/shared/filtering/BaseFilter.java | 13 ++- .../shared/filtering/DefaultFilterInfo.java | 5 +- .../filtering/DefaultMavenFileFilter.java | 21 +---- .../filtering/DefaultMavenReaderFilter.java | 1 - .../DefaultMavenResourcesFiltering.java | 7 +- .../maven/shared/filtering/FilterWrapper.java | 36 ++++++++ .../shared/filtering/FilteringUtils.java | 85 +++++++++++++++++++ .../shared/filtering/MavenFileFilter.java | 5 +- .../shared/filtering/MavenReaderFilter.java | 3 +- .../filtering/MavenResourcesExecution.java | 16 ++-- .../filtering/DefaultMavenFileFilterTest.java | 1 - 11 files changed, 147 insertions(+), 46 deletions(-) create mode 100644 src/main/java/org/apache/maven/shared/filtering/FilterWrapper.java diff --git a/src/main/java/org/apache/maven/shared/filtering/BaseFilter.java b/src/main/java/org/apache/maven/shared/filtering/BaseFilter.java index 6059c65..580a223 100644 --- a/src/main/java/org/apache/maven/shared/filtering/BaseFilter.java +++ b/src/main/java/org/apache/maven/shared/filtering/BaseFilter.java @@ -32,7 +32,6 @@ import org.apache.maven.execution.MavenSession; import org.apache.maven.project.MavenProject; import org.apache.maven.settings.Settings; -import org.apache.maven.shared.utils.io.FileUtils; import org.codehaus.plexus.interpolation.InterpolationPostProcessor; import org.codehaus.plexus.interpolation.Interpolator; import org.codehaus.plexus.interpolation.PrefixAwareRecursionInterceptor; @@ -51,7 +50,7 @@ class BaseFilter { @Override - public List getDefaultFilterWrappers( final MavenProject mavenProject, + public List getDefaultFilterWrappers( final MavenProject mavenProject, List filters, final boolean escapedBackslashesInFilePath, MavenSession mavenSession, @@ -72,7 +71,7 @@ public List getDefaultFilterWrappers( final MavenProjec } @Override - public List getDefaultFilterWrappers( final AbstractMavenFilteringRequest request ) + public List getDefaultFilterWrappers( final AbstractMavenFilteringRequest request ) throws MavenFilteringException { // backup values @@ -157,7 +156,7 @@ public List getDefaultFilterWrappers( final AbstractMav filterProperties.putAll( request.getAdditionalProperties() ); } - List defaultFilterWrappers = new ArrayList<>( request.getDelimiters().size() + 1 ); + List defaultFilterWrappers = new ArrayList<>( request.getDelimiters().size() + 1 ); if ( getLogger().isDebugEnabled() ) { @@ -170,7 +169,7 @@ public List getDefaultFilterWrappers( final AbstractMav final ValueSource propertiesValueSource = new PropertiesBasedValueSource( filterProperties ); - FileUtils.FilterWrapper wrapper = + FilterWrapper wrapper = new Wrapper( request.getDelimiters(), request.getMavenProject(), request.getMavenSession(), propertiesValueSource, request.getProjectStartExpressions(), request.getEscapeString(), request.isEscapeWindowsPaths(), request.isSupportMultiLineFiltering() ); @@ -201,7 +200,7 @@ void loadProperties( Properties filterProperties, File basedir, List pro } try { - File propFile = FileUtils.resolveFile( basedir, filterFile ); + File propFile = FilteringUtils.resolveFile( basedir, filterFile ); Properties properties = PropertyUtils.loadPropertyFile( propFile, workProperties, getLogger() ); filterProperties.putAll( properties ); workProperties.putAll( properties ); @@ -215,7 +214,7 @@ void loadProperties( Properties filterProperties, File basedir, List pro } private static final class Wrapper - extends FileUtils.FilterWrapper + extends FilterWrapper { private LinkedHashSet delimiters; diff --git a/src/main/java/org/apache/maven/shared/filtering/DefaultFilterInfo.java b/src/main/java/org/apache/maven/shared/filtering/DefaultFilterInfo.java index a123123..3254556 100644 --- a/src/main/java/org/apache/maven/shared/filtering/DefaultFilterInfo.java +++ b/src/main/java/org/apache/maven/shared/filtering/DefaultFilterInfo.java @@ -23,7 +23,6 @@ import org.apache.maven.execution.MavenSession; import org.apache.maven.project.MavenProject; -import org.apache.maven.shared.utils.io.FileUtils; /** * @author Kristian Rosenvold @@ -41,7 +40,7 @@ public interface DefaultFilterInfo * @return {@link java.util.List} of FileUtils.FilterWrapper * @since 1.0-beta-2 */ - List getDefaultFilterWrappers( MavenProject mavenProject, List filters, + List getDefaultFilterWrappers( MavenProject mavenProject, List filters, boolean escapedBackslashesInFilePath, MavenSession mavenSession, MavenResourcesExecution mavenResourcesExecution ) @@ -53,6 +52,6 @@ List getDefaultFilterWrappers( MavenProject mavenProjec * @return {@link java.util.List} of FileUtils.FilterWrapper * @since 1.0-beta-3 */ - List getDefaultFilterWrappers( AbstractMavenFilteringRequest request ) + List getDefaultFilterWrappers( AbstractMavenFilteringRequest request ) throws MavenFilteringException; } diff --git a/src/main/java/org/apache/maven/shared/filtering/DefaultMavenFileFilter.java b/src/main/java/org/apache/maven/shared/filtering/DefaultMavenFileFilter.java index ca7a6f8..59c93f2 100644 --- a/src/main/java/org/apache/maven/shared/filtering/DefaultMavenFileFilter.java +++ b/src/main/java/org/apache/maven/shared/filtering/DefaultMavenFileFilter.java @@ -19,7 +19,6 @@ * under the License. */ -import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; @@ -29,10 +28,6 @@ import org.apache.maven.execution.MavenSession; import org.apache.maven.project.MavenProject; -import org.apache.maven.shared.utils.io.FileUtils; -import org.apache.maven.shared.utils.io.FileUtils.FilterWrapper; - -import static java.util.Objects.requireNonNull; /** * @author Olivier Lamy @@ -43,14 +38,6 @@ public class DefaultMavenFileFilter extends BaseFilter implements MavenFileFilter { - private final MavenReaderFilter readerFilter; - - @Inject - public DefaultMavenFileFilter( MavenReaderFilter readerFilter ) - { - this.readerFilter = requireNonNull( readerFilter ); - } - @Override public void copyFile( File from, File to, boolean filtering, MavenProject mavenProject, List filters, boolean escapedBackslashesInFilePath, String encoding, MavenSession mavenSession ) @@ -63,7 +50,7 @@ public void copyFile( File from, File to, boolean filtering, MavenProject mavenP mre.setMavenSession( mavenSession ); mre.setInjectProjectBuildFilters( true ); - List filterWrappers = getDefaultFilterWrappers( mre ); + List filterWrappers = getDefaultFilterWrappers( mre ); copyFile( from, to, filtering, filterWrappers, encoding ); } @@ -78,7 +65,7 @@ public void copyFile( MavenFileFilterRequest mavenFileFilterRequest ) } @Override - public void copyFile( File from, File to, boolean filtering, List filterWrappers, + public void copyFile( File from, File to, boolean filtering, List filterWrappers, String encoding ) throws MavenFilteringException { @@ -87,7 +74,7 @@ public void copyFile( File from, File to, boolean filtering, List filterWrappers, + public void copyFile( File from, File to, boolean filtering, List filterWrappers, String encoding, boolean overwrite ) throws MavenFilteringException { @@ -108,7 +95,7 @@ public void copyFile( File from, File to, boolean filtering, Listfilename to its canonical form. If filename is + * relative (doesn't start with /), it is resolved relative to + * baseFile. Otherwise it is treated as a normal root-relative path. + * + * @param baseFile where to resolve filename from, if filename is relative + * @param filename absolute or relative file path to resolve + * @return the canonical File of filename + */ + public static File resolveFile( final File baseFile, String filename ) + { + String filenm = filename; + if ( '/' != File.separatorChar ) + { + filenm = filename.replace( '/', File.separatorChar ); + } + + if ( '\\' != File.separatorChar ) + { + filenm = filename.replace( '\\', File.separatorChar ); + } + + // deal with absolute files + if ( filenm.startsWith( File.separator ) || ( Os.isFamily( Os.FAMILY_WINDOWS ) && filenm.indexOf( ":" ) > 0 ) ) + { + File file = new File( filenm ); + + try + { + file = file.getCanonicalFile(); + } + catch ( final IOException ioe ) + { + // nop + } + + return file; + } + // FIXME: I'm almost certain this // removal is unnecessary, as getAbsoluteFile() strips + // them. However, I'm not sure about this UNC stuff. (JT) + final char[] chars = filename.toCharArray(); + final StringBuilder sb = new StringBuilder(); + + //remove duplicate file separators in succession - except + //on win32 at start of filename as UNC filenames can + //be \\AComputer\AShare\myfile.txt + int start = 0; + if ( '\\' == File.separatorChar ) + { + sb.append( filenm.charAt( 0 ) ); + start++; + } + + for ( int i = start; i < chars.length; i++ ) + { + final boolean doubleSeparator = File.separatorChar == chars[i] && File.separatorChar == chars[i - 1]; + + if ( !doubleSeparator ) + { + sb.append( chars[i] ); + } + } + + filenm = sb.toString(); + + //must be relative + File file = ( new File( baseFile, filenm ) ).getAbsoluteFile(); + + try + { + file = file.getCanonicalFile(); + } + catch ( final IOException ioe ) + { + // nop + } + + return file; + } + static boolean isEmpty( final String string ) { return string == null || string.trim().isEmpty(); diff --git a/src/main/java/org/apache/maven/shared/filtering/MavenFileFilter.java b/src/main/java/org/apache/maven/shared/filtering/MavenFileFilter.java index 9c6f7a1..c6607e3 100644 --- a/src/main/java/org/apache/maven/shared/filtering/MavenFileFilter.java +++ b/src/main/java/org/apache/maven/shared/filtering/MavenFileFilter.java @@ -24,7 +24,6 @@ import org.apache.maven.execution.MavenSession; import org.apache.maven.project.MavenProject; -import org.apache.maven.shared.utils.io.FileUtils; /** * @author Olivier Lamy @@ -67,7 +66,7 @@ void copyFile( MavenFileFilterRequest mavenFileFilterRequest ) * @param encoding The encoding used during the filtering. * @throws MavenFilteringException In case of an error. */ - void copyFile( File from, final File to, boolean filtering, List filterWrappers, + void copyFile( File from, final File to, boolean filtering, List filterWrappers, String encoding ) throws MavenFilteringException; @@ -81,7 +80,7 @@ void copyFile( File from, final File to, boolean filtering, List filterWrappers, + void copyFile( File from, final File to, boolean filtering, List filterWrappers, String encoding, boolean overwrite ) throws MavenFilteringException; } diff --git a/src/main/java/org/apache/maven/shared/filtering/MavenReaderFilter.java b/src/main/java/org/apache/maven/shared/filtering/MavenReaderFilter.java index 2ec1075..28c74ff 100644 --- a/src/main/java/org/apache/maven/shared/filtering/MavenReaderFilter.java +++ b/src/main/java/org/apache/maven/shared/filtering/MavenReaderFilter.java @@ -24,7 +24,6 @@ import org.apache.maven.execution.MavenSession; import org.apache.maven.project.MavenProject; -import org.apache.maven.shared.utils.io.FileUtils; /** * @author Olivier Lamy @@ -71,5 +70,5 @@ Reader filter( MavenReaderFilterRequest mavenFileFilterRequest ) * @param filterWrappers {@link java.util.List} of FileUtils.FilterWrapper * @return an input stream that applies the filter */ - Reader filter( Reader from, boolean filtering, List filterWrappers ); + Reader filter( Reader from, boolean filtering, List filterWrappers ); } 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 449e405..ed97165 100644 --- a/src/main/java/org/apache/maven/shared/filtering/MavenResourcesExecution.java +++ b/src/main/java/org/apache/maven/shared/filtering/MavenResourcesExecution.java @@ -27,8 +27,6 @@ import org.apache.maven.execution.MavenSession; import org.apache.maven.model.Resource; import org.apache.maven.project.MavenProject; -import org.apache.maven.shared.utils.io.FileUtils; -import org.apache.maven.shared.utils.io.FileUtils.FilterWrapper; import org.codehaus.plexus.interpolation.StringSearchInterpolator; import org.codehaus.plexus.interpolation.ValueSource; @@ -47,7 +45,7 @@ public class MavenResourcesExecution private List nonFilteredFileExtensions; - private List filterWrappers; + private List filterWrappers; private File resourcesBaseDirectory; @@ -161,7 +159,7 @@ public MavenResourcesExecution( List resources, File outputDirectory, * @param nonFilteredFileExtensions The list of extensions which should not being filtered. */ public MavenResourcesExecution( List resources, File outputDirectory, String encoding, - List filterWrappers, File resourcesBaseDirectory, + List filterWrappers, File resourcesBaseDirectory, List nonFilteredFileExtensions ) { this(); @@ -265,17 +263,17 @@ public void setNonFilteredFileExtensions( List nonFilteredFileExtensions } /** - * @return List of {@link FileUtils.FilterWrapper} + * @return List of {@link FilterWrapper} */ - public List getFilterWrappers() + public List getFilterWrappers() { return filterWrappers; } /** - * @param filterWrappers List of {@link FileUtils.FilterWrapper} + * @param filterWrappers List of {@link FilterWrapper} */ - public void setFilterWrappers( List filterWrappers ) + public void setFilterWrappers( List filterWrappers ) { this.filterWrappers = filterWrappers; } @@ -303,7 +301,7 @@ public void addFilterWrapper( FilterWrapper filterWrapper ) public void addFilerWrapperWithEscaping( final ValueSource valueSource, final String startExp, final String endExp, final String escapeString, final boolean multiLineFiltering ) { - addFilterWrapper( new FileUtils.FilterWrapper() + addFilterWrapper( new FilterWrapper() { @Override public Reader getReader( Reader reader ) diff --git a/src/test/java/org/apache/maven/shared/filtering/DefaultMavenFileFilterTest.java b/src/test/java/org/apache/maven/shared/filtering/DefaultMavenFileFilterTest.java index 249aa79..9144990 100644 --- a/src/test/java/org/apache/maven/shared/filtering/DefaultMavenFileFilterTest.java +++ b/src/test/java/org/apache/maven/shared/filtering/DefaultMavenFileFilterTest.java @@ -32,7 +32,6 @@ import org.apache.commons.io.IOUtils; import org.apache.maven.project.MavenProject; -import org.apache.maven.shared.utils.io.FileUtils.FilterWrapper; import org.codehaus.plexus.PlexusTestCase; /** From e0f0ed6814366c4185f8a8ac0cc663b5f8ef744e Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Thu, 9 Jun 2022 13:21:52 +0200 Subject: [PATCH 3/6] WIP --- pom.xml | 21 +- .../maven/shared/filtering/BaseFilter.java | 10 +- .../filtering/DefaultMavenFileFilter.java | 4 +- .../DefaultMavenResourcesFiltering.java | 29 +- .../shared/filtering/FilteringUtils.java | 341 ++++++++++++++++++ .../maven/shared/filtering/PropertyUtils.java | 2 +- .../filtering/DefaultMavenFileFilterTest.java | 3 +- .../DefaultMavenReaderFilterTest.java | 3 +- .../DefaultMavenResourcesFilteringTest.java | 3 +- .../shared/filtering/EscapeStringTest.java | 3 +- .../shared/filtering/FilteringUtilsTest.java | 9 +- .../IncrementalResourceFilteringTest.java | 212 ----------- .../shared/filtering/InvalidMarkTest.java | 3 +- .../MuliLinesMavenResourcesFilteringTest.java | 3 +- .../shared/filtering/PropertyUtilsTest.java | 144 +------- .../filtering/TestReflectionProperties.java | 3 +- .../maven/shared/filtering/TestSupport.java | 37 ++ 17 files changed, 431 insertions(+), 399 deletions(-) delete mode 100644 src/test/java/org/apache/maven/shared/filtering/IncrementalResourceFilteringTest.java create mode 100644 src/test/java/org/apache/maven/shared/filtering/TestSupport.java diff --git a/pom.xml b/pom.xml index e247b95..08f1a2a 100644 --- a/pom.xml +++ b/pom.xml @@ -96,15 +96,6 @@ ${mavenVersion} provided - - org.eclipse.sisu - org.eclipse.sisu.plexus - 0.3.0.M1 - - - org.codehaus.plexus - plexus-component-annotations - org.codehaus.plexus plexus-utils @@ -145,6 +136,18 @@ ${slf4jVersion} test + + org.eclipse.sisu + org.eclipse.sisu.plexus + 0.3.0.M1 + test + + + org.eclipse.sisu + org.eclipse.sisu.inject + 0.3.0.M1 + test + diff --git a/src/main/java/org/apache/maven/shared/filtering/BaseFilter.java b/src/main/java/org/apache/maven/shared/filtering/BaseFilter.java index 580a223..fc3afd8 100644 --- a/src/main/java/org/apache/maven/shared/filtering/BaseFilter.java +++ b/src/main/java/org/apache/maven/shared/filtering/BaseFilter.java @@ -42,12 +42,18 @@ import org.codehaus.plexus.interpolation.SingleResponseValueSource; import org.codehaus.plexus.interpolation.ValueSource; import org.codehaus.plexus.interpolation.multi.MultiDelimiterStringSearchInterpolator; -import org.codehaus.plexus.logging.AbstractLogEnabled; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; class BaseFilter - extends AbstractLogEnabled implements DefaultFilterInfo { + private final Logger logger = LoggerFactory.getLogger( getClass() ); + + protected Logger getLogger() + { + return logger; + } @Override public List getDefaultFilterWrappers( final MavenProject mavenProject, diff --git a/src/main/java/org/apache/maven/shared/filtering/DefaultMavenFileFilter.java b/src/main/java/org/apache/maven/shared/filtering/DefaultMavenFileFilter.java index 59c93f2..58dea10 100644 --- a/src/main/java/org/apache/maven/shared/filtering/DefaultMavenFileFilter.java +++ b/src/main/java/org/apache/maven/shared/filtering/DefaultMavenFileFilter.java @@ -87,7 +87,7 @@ public void copyFile( File from, File to, boolean filtering, List getLogger().debug( "filtering " + from.getPath() + " to " + to.getPath() ); } FilterWrapper[] array = filterWrappers.toArray( new FilterWrapper[0] ); - FileUtils.copyFile( from, to, encoding, array, false ); + FilteringUtils.copyFile( from, to, encoding, array, false ); } else { @@ -95,7 +95,7 @@ public void copyFile( File from, File to, boolean filtering, List { getLogger().debug( "copy " + from.getPath() + " to " + to.getPath() ); } - FileUtils.copyFile( from, to, encoding, new FilterWrapper[0], overwrite ); + FilteringUtils.copyFile( from, to, encoding, new FilterWrapper[0], overwrite ); } } catch ( IOException e ) 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 291295f..2a97d6b 100644 --- a/src/main/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFiltering.java +++ b/src/main/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFiltering.java @@ -206,9 +206,6 @@ public void filterResources( MavenResourcesExecution mavenResourcesExecution ) { isFilteringUsed = true; } - boolean ignoreDelta = !outputExists || buildContext.hasDelta( mavenResourcesExecution.getFileFilters() ) - || buildContext.hasDelta( getRelativeOutputDirectory( mavenResourcesExecution ) ); - getLogger().debug( "ignoreDelta " + ignoreDelta ); DirectoryScanner scanner = new DirectoryScanner(); scanner.setBasedir( resourceDirectory ); @@ -275,26 +272,6 @@ public void filterResources( MavenResourcesExecution mavenResourcesExecution ) encoding, mavenResourcesExecution.isOverwrite() ); } - - // deal with deleted source files - - scanner = buildContext.newDeleteScanner( resourceDirectory ); - - setupScanner( resource, scanner, mavenResourcesExecution.isAddDefaultExcludes() ); - - scanner.scan(); - - List deletedFiles = Arrays.asList( scanner.getIncludedFiles() ); - - for ( String name : deletedFiles ) - { - File destinationFile = getDestinationFile( outputDirectory, targetPath, name, mavenResourcesExecution ); - - destinationFile.delete(); - - buildContext.refresh( destinationFile ); - } - } // Warn the user if all of the following requirements are met, to avoid those that are not affected @@ -497,7 +474,7 @@ private String getRelativeOutputDirectory( MavenResourcesExecution execution ) if ( execution.getMavenProject() != null && execution.getMavenProject().getBasedir() != null ) { String basedir = execution.getMavenProject().getBasedir().getAbsolutePath(); - relOutDir = PathTool.getRelativeFilePath( basedir, relOutDir ); + relOutDir = FilteringUtils.getRelativeFilePath( basedir, relOutDir ); if ( relOutDir == null ) { relOutDir = execution.getOutputDirectory().getPath(); @@ -529,9 +506,9 @@ private String filterFileName( String name, List wrappers ) IOUtils.copy( reader, writer ); String filteredFilename = writer.toString(); - if ( getLogger().isDebugEnabled() ) + if ( LOGGER.isDebugEnabled() ) { - getLogger().debug( "renaming filename " + name + " to " + filteredFilename ); + LOGGER.debug( "renaming filename " + name + " to " + filteredFilename ); } return filteredFilename; } diff --git a/src/main/java/org/apache/maven/shared/filtering/FilteringUtils.java b/src/main/java/org/apache/maven/shared/filtering/FilteringUtils.java index 6bb9a48..b7690e0 100644 --- a/src/main/java/org/apache/maven/shared/filtering/FilteringUtils.java +++ b/src/main/java/org/apache/maven/shared/filtering/FilteringUtils.java @@ -21,8 +21,22 @@ import java.io.File; import java.io.IOException; +import java.io.RandomAccessFile; +import java.io.Reader; +import java.io.Writer; +import java.nio.Buffer; +import java.nio.ByteBuffer; +import java.nio.CharBuffer; +import java.nio.charset.Charset; +import java.nio.charset.CharsetEncoder; +import java.nio.charset.CoderResult; +import java.nio.file.Files; +import java.nio.file.LinkOption; +import java.nio.file.StandardCopyOption; +import java.util.StringTokenizer; import java.util.regex.Pattern; +import org.apache.commons.io.IOUtils; import org.codehaus.plexus.util.Os; /** @@ -31,6 +45,21 @@ */ public final class FilteringUtils { + /** + * The number of bytes in a kilobyte. + */ + private static final int ONE_KB = 1024; + + /** + * The number of bytes in a megabyte. + */ + private static final int ONE_MB = ONE_KB * ONE_KB; + + /** + * The file copy buffer size (30 MB) + */ + private static final int FILE_COPY_BUFFER_SIZE = ONE_MB * 30; + private static final String WINDOWS_PATH_PATTERN = "^(.*)[a-zA-Z]:\\\\(.*)"; private static final Pattern PATTERN = Pattern.compile( WINDOWS_PATH_PATTERN ); @@ -155,8 +184,320 @@ public static File resolveFile( final File baseFile, String filename ) return file; } + + /** + *

This method can calculate the relative path between two paths on a file system.

+ *
+     * PathTool.getRelativeFilePath( null, null )                                   = ""
+     * PathTool.getRelativeFilePath( null, "/usr/local/java/bin" )                  = ""
+     * PathTool.getRelativeFilePath( "/usr/local", null )                           = ""
+     * PathTool.getRelativeFilePath( "/usr/local", "/usr/local/java/bin" )          = "java/bin"
+     * PathTool.getRelativeFilePath( "/usr/local", "/usr/local/java/bin/" )         = "java/bin"
+     * PathTool.getRelativeFilePath( "/usr/local/java/bin", "/usr/local/" )         = "../.."
+     * PathTool.getRelativeFilePath( "/usr/local/", "/usr/local/java/bin/java.sh" ) = "java/bin/java.sh"
+     * PathTool.getRelativeFilePath( "/usr/local/java/bin/java.sh", "/usr/local/" ) = "../../.."
+     * PathTool.getRelativeFilePath( "/usr/local/", "/bin" )                        = "../../bin"
+     * PathTool.getRelativeFilePath( "/bin", "/usr/local/" )                        = "../usr/local"
+     * 
+ * Note: On Windows based system, the / character should be replaced by \ character. + * + * @param oldPath old path + * @param newPath new path + * @return a relative file path from oldPath. + */ + public static String getRelativeFilePath( final String oldPath, final String newPath ) + { + if ( isEmpty( oldPath ) || isEmpty( newPath ) ) + { + return ""; + } + + // normalise the path delimiters + String fromPath = new File( oldPath ).getPath(); + String toPath = new File( newPath ).getPath(); + + // strip any leading slashes if its a windows path + if ( toPath.matches( "^\\[a-zA-Z]:" ) ) + { + toPath = toPath.substring( 1 ); + } + if ( fromPath.matches( "^\\[a-zA-Z]:" ) ) + { + fromPath = fromPath.substring( 1 ); + } + + // lowercase windows drive letters. + if ( fromPath.startsWith( ":", 1 ) ) + { + fromPath = Character.toLowerCase( fromPath.charAt( 0 ) ) + fromPath.substring( 1 ); + } + if ( toPath.startsWith( ":", 1 ) ) + { + toPath = Character.toLowerCase( toPath.charAt( 0 ) ) + toPath.substring( 1 ); + } + + // check for the presence of windows drives. No relative way of + // traversing from one to the other. + if ( ( toPath.startsWith( ":", 1 ) && fromPath.startsWith( ":", 1 ) ) + && ( !toPath.substring( 0, 1 ).equals( fromPath.substring( 0, 1 ) ) ) ) + { + // they both have drive path element but they dont match, no + // relative path + return null; + } + + if ( ( toPath.startsWith( ":", 1 ) && !fromPath.startsWith( ":", 1 ) ) + || ( !toPath.startsWith( ":", 1 ) && fromPath.startsWith( ":", 1 ) ) ) + { + // one has a drive path element and the other doesnt, no relative + // path. + return null; + } + + String resultPath = buildRelativePath( toPath, fromPath, File.separatorChar ); + + if ( newPath.endsWith( File.separator ) && !resultPath.endsWith( File.separator ) ) + { + return resultPath + File.separator; + } + + return resultPath; + } + + private static String buildRelativePath( String toPath, String fromPath, final char separatorChar ) + { + // use tokeniser to traverse paths and for lazy checking + StringTokenizer toTokeniser = new StringTokenizer( toPath, String.valueOf( separatorChar ) ); + StringTokenizer fromTokeniser = new StringTokenizer( fromPath, String.valueOf( separatorChar ) ); + + int count = 0; + + // walk along the to path looking for divergence from the from path + while ( toTokeniser.hasMoreTokens() && fromTokeniser.hasMoreTokens() ) + { + if ( separatorChar == '\\' ) + { + if ( !fromTokeniser.nextToken().equalsIgnoreCase( toTokeniser.nextToken() ) ) + { + break; + } + } + else + { + if ( !fromTokeniser.nextToken().equals( toTokeniser.nextToken() ) ) + { + break; + } + } + + count++; + } + + // reinitialise the tokenisers to count positions to retrieve the + // gobbled token + + toTokeniser = new StringTokenizer( toPath, String.valueOf( separatorChar ) ); + fromTokeniser = new StringTokenizer( fromPath, String.valueOf( separatorChar ) ); + + while ( count-- > 0 ) + { + fromTokeniser.nextToken(); + toTokeniser.nextToken(); + } + + StringBuilder relativePath = new StringBuilder(); + + // add back refs for the rest of from location. + while ( fromTokeniser.hasMoreTokens() ) + { + fromTokeniser.nextToken(); + + relativePath.append( ".." ); + + if ( fromTokeniser.hasMoreTokens() ) + { + relativePath.append( separatorChar ); + } + } + + if ( relativePath.length() != 0 && toTokeniser.hasMoreTokens() ) + { + relativePath.append( separatorChar ); + } + + // add fwd fills for whatevers left of newPath. + while ( toTokeniser.hasMoreTokens() ) + { + relativePath.append( toTokeniser.nextToken() ); + + if ( toTokeniser.hasMoreTokens() ) + { + relativePath.append( separatorChar ); + } + } + return relativePath.toString(); + } + static boolean isEmpty( final String string ) { return string == null || string.trim().isEmpty(); } + + /** + * If wrappers is null or empty, the file will be copy only if to.lastModified() < from.lastModified() or if + * overwrite is true + * + * @param from the file to copy + * @param to the destination file + * @param encoding the file output encoding (only if wrappers is not empty) + * @param wrappers array of {@link FilterWrapper} + * @param overwrite if true and wrappers is null or empty, the file will be copied even if + * to.lastModified() < from.lastModified() + * @throws IOException if an IO error occurs during copying or filtering + */ + public static void copyFile( File from, File to, String encoding, + FilterWrapper[] wrappers, boolean overwrite ) + throws IOException + { + if ( wrappers == null || wrappers.length == 0 ) + { + if ( overwrite || to.lastModified() < from.lastModified() ) + { + Files.copy( from.toPath(), to.toPath(), LinkOption.NOFOLLOW_LINKS, + StandardCopyOption.REPLACE_EXISTING ); + } + } + else + { + Charset charset = charset( encoding ); + + // buffer so it isn't reading a byte at a time! + try ( Reader fileReader = Files.newBufferedReader( from.toPath(), charset ) ) + { + Reader wrapped = fileReader; + for ( FilterWrapper wrapper : wrappers ) + { + wrapped = wrapper.getReader( wrapped ); + } + + if ( overwrite || !to.exists() ) + { + try ( Writer fileWriter = Files.newBufferedWriter( to.toPath(), charset ) ) + { + IOUtils.copy( wrapped, fileWriter ); + } + } + else + { + CharsetEncoder encoder = charset.newEncoder(); + + int totalBufferSize = FILE_COPY_BUFFER_SIZE; + + int charBufferSize = ( int ) Math.floor( totalBufferSize / ( 2 + 2 * encoder.maxBytesPerChar() ) ); + int byteBufferSize = ( int ) Math.ceil( charBufferSize * encoder.maxBytesPerChar() ); + + CharBuffer newChars = CharBuffer.allocate( charBufferSize ); + ByteBuffer newBytes = ByteBuffer.allocate( byteBufferSize ); + ByteBuffer existingBytes = ByteBuffer.allocate( byteBufferSize ); + + CoderResult coderResult; + int existingRead; + boolean writing = false; + + try ( final RandomAccessFile existing = new RandomAccessFile( to, "rw" ) ) + { + int n; + while ( -1 != ( n = wrapped.read( newChars ) ) ) + { + ( (Buffer) newChars ).flip(); + + coderResult = encoder.encode( newChars, newBytes, n != 0 ); + if ( coderResult.isError() ) + { + coderResult.throwException(); + } + + ( ( Buffer ) newBytes ).flip(); + + if ( !writing ) + { + existingRead = existing.read( existingBytes.array(), 0, newBytes.remaining() ); + ( ( Buffer ) existingBytes ).position( existingRead ); + ( ( Buffer ) existingBytes ).flip(); + + if ( newBytes.compareTo( existingBytes ) != 0 ) + { + writing = true; + if ( existingRead > 0 ) + { + existing.seek( existing.getFilePointer() - existingRead ); + } + } + } + + if ( writing ) + { + existing.write( newBytes.array(), 0, newBytes.remaining() ); + } + + ( ( Buffer ) newChars ).clear(); + ( ( Buffer ) newBytes ).clear(); + ( ( Buffer ) existingBytes ).clear(); + } + + if ( existing.length() > existing.getFilePointer() ) + { + existing.setLength( existing.getFilePointer() ); + } + } + } + } + } + + copyFilePermissions( from, to ); + } + + + /** + * Attempts to copy file permissions from the source to the destination file. + * Initially attempts to copy posix file permissions, assuming that the files are both on posix filesystems. + * If the initial attempts fail then a second attempt using less precise permissions model. + * Note that permissions are copied on a best-efforts basis, + * failure to copy permissions will not result in an exception. + * + * @param source the file to copy permissions from. + * @param destination the file to copy permissions to. + */ + private static void copyFilePermissions( File source, File destination ) + throws IOException + { + try + { + // attempt to copy posix file permissions + Files.setPosixFilePermissions( + destination.toPath(), + Files.getPosixFilePermissions( source.toPath() ) + ); + } + catch ( UnsupportedOperationException e ) + { + // fallback to setting partial permissions + destination.setExecutable( source.canExecute() ); + destination.setReadable( source.canRead() ); + destination.setWritable( source.canWrite() ); + } + } + + private static Charset charset( String encoding ) + { + if ( encoding == null || encoding.isEmpty() ) + { + return Charset.defaultCharset(); + } + else + { + return Charset.forName( encoding ); + } + } + } diff --git a/src/main/java/org/apache/maven/shared/filtering/PropertyUtils.java b/src/main/java/org/apache/maven/shared/filtering/PropertyUtils.java index d84f07a..1282046 100644 --- a/src/main/java/org/apache/maven/shared/filtering/PropertyUtils.java +++ b/src/main/java/org/apache/maven/shared/filtering/PropertyUtils.java @@ -28,7 +28,7 @@ import java.util.List; import java.util.Properties; -import org.codehaus.plexus.logging.Logger; +import org.slf4j.Logger; import static org.apache.maven.shared.filtering.FilteringUtils.isEmpty; diff --git a/src/test/java/org/apache/maven/shared/filtering/DefaultMavenFileFilterTest.java b/src/test/java/org/apache/maven/shared/filtering/DefaultMavenFileFilterTest.java index 9144990..32435ee 100644 --- a/src/test/java/org/apache/maven/shared/filtering/DefaultMavenFileFilterTest.java +++ b/src/test/java/org/apache/maven/shared/filtering/DefaultMavenFileFilterTest.java @@ -32,14 +32,13 @@ import org.apache.commons.io.IOUtils; import org.apache.maven.project.MavenProject; -import org.codehaus.plexus.PlexusTestCase; /** * @author Olivier Lamy * */ public class DefaultMavenFileFilterTest - extends PlexusTestCase + extends TestSupport { File to = new File( getBasedir(), "target/reflection-test.properties" ); diff --git a/src/test/java/org/apache/maven/shared/filtering/DefaultMavenReaderFilterTest.java b/src/test/java/org/apache/maven/shared/filtering/DefaultMavenReaderFilterTest.java index 49d6ec6..303927b 100644 --- a/src/test/java/org/apache/maven/shared/filtering/DefaultMavenReaderFilterTest.java +++ b/src/test/java/org/apache/maven/shared/filtering/DefaultMavenReaderFilterTest.java @@ -24,13 +24,12 @@ import java.util.Properties; import org.apache.commons.io.IOUtils; -import org.codehaus.plexus.PlexusTestCase; /** * @author Kristian Rosenvold */ public class DefaultMavenReaderFilterTest - extends PlexusTestCase + extends TestSupport { public void testJustDoSomeFiltering() throws Exception 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 db6a6f6..7cf19cf 100644 --- a/src/test/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFilteringTest.java +++ b/src/test/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFilteringTest.java @@ -33,7 +33,6 @@ import org.apache.maven.execution.MavenSession; import org.apache.maven.model.Resource; import org.apache.maven.settings.Settings; -import org.codehaus.plexus.PlexusTestCase; import org.codehaus.plexus.interpolation.PrefixedObjectValueSource; import org.codehaus.plexus.interpolation.ValueSource; @@ -43,7 +42,7 @@ * @since 1.0-beta-1 */ public class DefaultMavenResourcesFilteringTest - extends PlexusTestCase + extends TestSupport { private File outputDirectory = new File( getBasedir(), "target/DefaultMavenResourcesFilteringTest" ); diff --git a/src/test/java/org/apache/maven/shared/filtering/EscapeStringTest.java b/src/test/java/org/apache/maven/shared/filtering/EscapeStringTest.java index 7d0b426..1977e1a 100644 --- a/src/test/java/org/apache/maven/shared/filtering/EscapeStringTest.java +++ b/src/test/java/org/apache/maven/shared/filtering/EscapeStringTest.java @@ -28,13 +28,12 @@ import org.apache.commons.io.FileUtils; import org.apache.maven.model.Resource; -import org.codehaus.plexus.PlexusTestCase; /** * @author Olivier Lamy */ public class EscapeStringTest - extends PlexusTestCase + extends TestSupport { File outputDirectory = new File( getBasedir(), "target/EscapeStringTest" ); diff --git a/src/test/java/org/apache/maven/shared/filtering/FilteringUtilsTest.java b/src/test/java/org/apache/maven/shared/filtering/FilteringUtilsTest.java index 1516aa8..4cab67e 100644 --- a/src/test/java/org/apache/maven/shared/filtering/FilteringUtilsTest.java +++ b/src/test/java/org/apache/maven/shared/filtering/FilteringUtilsTest.java @@ -19,7 +19,9 @@ * under the License. */ -import org.codehaus.plexus.PlexusTestCase; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; /** * @author John Casey @@ -28,18 +30,20 @@ * */ public class FilteringUtilsTest - extends PlexusTestCase { + @Test public void testEscapeWindowsPathStartingWithDrive() { assertEquals( "C:\\\\Users\\\\Administrator", FilteringUtils.escapeWindowsPath( "C:\\Users\\Administrator" ) ); } + @Test public void testEscapeWindowsPathMissingDriveLetter() { assertEquals( ":\\Users\\Administrator", FilteringUtils.escapeWindowsPath( ":\\Users\\Administrator" ) ); } + @Test public void testEscapeWindowsPathInvalidDriveLetter() { assertEquals( "4:\\Users\\Administrator", FilteringUtils.escapeWindowsPath( "4:\\Users\\Administrator" ) ); @@ -62,6 +66,7 @@ public void testEscapeWindowsPathInvalidDriveLetter() */ // MSHARED-179 + @Test public void testEscapeWindowsPathNotAtBeginning() throws Exception { diff --git a/src/test/java/org/apache/maven/shared/filtering/IncrementalResourceFilteringTest.java b/src/test/java/org/apache/maven/shared/filtering/IncrementalResourceFilteringTest.java deleted file mode 100644 index d63b02d..0000000 --- a/src/test/java/org/apache/maven/shared/filtering/IncrementalResourceFilteringTest.java +++ /dev/null @@ -1,212 +0,0 @@ -package org.apache.maven.shared.filtering; - -/* - * 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. - */ - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Properties; -import java.util.Set; - -import org.apache.commons.io.FileUtils; -import org.apache.maven.model.Resource; -import org.codehaus.plexus.PlexusTestCase; -import org.sonatype.plexus.build.incremental.ThreadBuildContext; -import org.sonatype.plexus.build.incremental.test.TestIncrementalBuildContext; - -public class IncrementalResourceFilteringTest - extends PlexusTestCase -{ - - File outputDirectory = new File( getBasedir(), "target/IncrementalResourceFilteringTest" ); - - File unitDirectory = new File( getBasedir(), "src/test/units-files/incremental" ); - - @Override - protected void setUp() - throws Exception - { - super.setUp(); - if ( outputDirectory.exists() ) - { - FileUtils.deleteDirectory( outputDirectory ); - } - outputDirectory.mkdirs(); - } - - public void testSimpleIncrementalFiltering() - throws Exception - { - // run full build first - filter( "time" ); - - assertTime( "time", "file01.txt" ); - assertTime( "time", "file02.txt" ); - - // only one file is expected to change - Set changedFiles = new HashSet<>(); - changedFiles.add( "file01.txt" ); - - TestIncrementalBuildContext ctx = - new TestIncrementalBuildContext( unitDirectory, changedFiles, Collections.emptyMap() ); - ThreadBuildContext.setThreadBuildContext( ctx ); - - filter( "notime" ); - assertTime( "notime", "file01.txt" ); - assertTime( "time", "file02.txt" ); // this one is unchanged - - assertTrue( ctx.getRefreshFiles().contains( new File( outputDirectory, "file01.txt" ) ) ); - - ctx = new TestIncrementalBuildContext( unitDirectory, Collections.emptySet(), changedFiles, - Collections.emptyMap(), new ArrayList(), new ArrayList() ); - ThreadBuildContext.setThreadBuildContext( ctx ); - - filter( "moretime" ); - assertFalse( new File( outputDirectory, "file01.txt" ).exists() ); - assertTime( "time", "file02.txt" ); // this one is unchanged - - assertTrue( ctx.getRefreshFiles().contains( new File( outputDirectory, "file01.txt" ) ) ); - - } - - public void testOutputChange() - throws Exception - { - // run full build first - filter( "time" ); - - // all files are reprocessed after contents of output directory changed (e.g. was deleted) - Set changedFiles = new HashSet<>(); - changedFiles.add( "target/IncrementalResourceFilteringTest" ); - TestIncrementalBuildContext ctx = - new TestIncrementalBuildContext( unitDirectory, changedFiles, Collections.emptyMap() ); - ThreadBuildContext.setThreadBuildContext( ctx ); - - filter( "notime" ); - assertTime( "notime", "file01.txt" ); - assertTime( "notime", "file02.txt" ); - - assertTrue( ctx.getRefreshFiles().contains( new File( outputDirectory, "file01.txt" ) ) ); - assertTrue( ctx.getRefreshFiles().contains( new File( outputDirectory, "file02.txt" ) ) ); - - } - - public void testFilterChange() - throws Exception - { - // run full build first - filter( "time" ); - - // all files are reprocessed after content of filters changes - Set changedFiles = new HashSet<>(); - changedFiles.add( "filters.txt" ); - TestIncrementalBuildContext ctx = - new TestIncrementalBuildContext( unitDirectory, changedFiles, Collections.emptyMap() ); - ThreadBuildContext.setThreadBuildContext( ctx ); - - filter( "notime" ); - assertTime( "notime", "file01.txt" ); - assertTime( "notime", "file02.txt" ); - - assertTrue( ctx.getRefreshFiles().contains( new File( outputDirectory, "file01.txt" ) ) ); - assertTrue( ctx.getRefreshFiles().contains( new File( outputDirectory, "file02.txt" ) ) ); - - } - - public void testFilterDeleted() - throws Exception - { - // run full build first - filter( "time" ); - - // all files are reprocessed after content of filters changes - Set deletedFiles = new HashSet<>(); - deletedFiles.add( "filters.txt" ); - TestIncrementalBuildContext ctx = new TestIncrementalBuildContext( unitDirectory, Collections.emptySet(), - deletedFiles, Collections.emptyMap(), new ArrayList(), new ArrayList() ); - ThreadBuildContext.setThreadBuildContext( ctx ); - - filter( "notime" ); - assertTime( "notime", "file01.txt" ); - assertTime( "notime", "file02.txt" ); - - assertTrue( ctx.getRefreshFiles().contains( new File( outputDirectory, "file01.txt" ) ) ); - assertTrue( ctx.getRefreshFiles().contains( new File( outputDirectory, "file02.txt" ) ) ); - } - - private void assertTime( String time, String relpath ) - throws IOException - { - Properties properties = new Properties(); - - - try ( InputStream is = new FileInputStream( new File( outputDirectory, relpath ) ) ) - { - properties.load( is ); - } - - assertEquals( time, properties.getProperty( "time" ) ); - } - - private void filter( String time ) - throws Exception - { - File baseDir = new File( getBasedir() ); - StubMavenProject mavenProject = new StubMavenProject( baseDir ); - mavenProject.setVersion( "1.0" ); - mavenProject.setGroupId( "org.apache" ); - mavenProject.setName( "test project" ); - - Properties projectProperties = new Properties(); - projectProperties.put( "time", time ); - projectProperties.put( "java.version", "zloug" ); - mavenProject.setProperties( projectProperties ); - MavenResourcesFiltering mavenResourcesFiltering = lookup( MavenResourcesFiltering.class ); - - String unitFilesDir = new File( unitDirectory, "files" ).getPath(); - - Resource resource = new Resource(); - List resources = new ArrayList<>(); - resources.add( resource ); - resource.setDirectory( unitFilesDir ); - resource.setFiltering( true ); - - List filtersFile = new ArrayList<>(); - filtersFile.add( new File( unitDirectory, "filters.txt" ).getPath() ); - - MavenResourcesExecution mre = new MavenResourcesExecution(); - mre.setResources( resources ); - mre.setOutputDirectory( outputDirectory ); - mre.setEncoding( "UTF-8" ); - mre.setMavenProject( mavenProject ); - mre.setFilters( filtersFile ); - mre.setNonFilteredFileExtensions( Collections.emptyList() ); - mre.setMavenSession( new StubMavenSession() ); - mre.setUseDefaultFilterWrappers( true ); - - mavenResourcesFiltering.filterResources( mre ); - } - -} diff --git a/src/test/java/org/apache/maven/shared/filtering/InvalidMarkTest.java b/src/test/java/org/apache/maven/shared/filtering/InvalidMarkTest.java index 324e94c..d154ccd 100644 --- a/src/test/java/org/apache/maven/shared/filtering/InvalidMarkTest.java +++ b/src/test/java/org/apache/maven/shared/filtering/InvalidMarkTest.java @@ -24,13 +24,12 @@ import org.apache.commons.io.FileUtils; import org.apache.maven.model.Resource; -import org.codehaus.plexus.PlexusTestCase; /** * @author Mikolaj Izdebski */ public class InvalidMarkTest - extends PlexusTestCase + extends TestSupport { File outputDirectory = new File( getBasedir(), "target/LongLineTest" ); diff --git a/src/test/java/org/apache/maven/shared/filtering/MuliLinesMavenResourcesFilteringTest.java b/src/test/java/org/apache/maven/shared/filtering/MuliLinesMavenResourcesFilteringTest.java index c3eef47..3a903f4 100644 --- a/src/test/java/org/apache/maven/shared/filtering/MuliLinesMavenResourcesFilteringTest.java +++ b/src/test/java/org/apache/maven/shared/filtering/MuliLinesMavenResourcesFilteringTest.java @@ -28,14 +28,13 @@ import org.apache.commons.io.FileUtils; import org.apache.maven.model.Resource; -import org.codehaus.plexus.PlexusTestCase; /** * @author Olivier Lamy * */ public class MuliLinesMavenResourcesFilteringTest - extends PlexusTestCase + extends TestSupport { File outputDirectory = new File( getBasedir(), "target/MuliLinesMavenResourcesFilteringTest" ); diff --git a/src/test/java/org/apache/maven/shared/filtering/PropertyUtilsTest.java b/src/test/java/org/apache/maven/shared/filtering/PropertyUtilsTest.java index 107d406..18f67a1 100644 --- a/src/test/java/org/apache/maven/shared/filtering/PropertyUtilsTest.java +++ b/src/test/java/org/apache/maven/shared/filtering/PropertyUtilsTest.java @@ -22,11 +22,14 @@ import java.io.File; import java.io.FileWriter; import java.io.IOException; -import java.util.ArrayList; import java.util.Properties; -import org.codehaus.plexus.PlexusTestCase; -import org.codehaus.plexus.logging.Logger; +import org.slf4j.Logger; + +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; /** * @author Olivier Lamy @@ -34,7 +37,7 @@ * */ public class PropertyUtilsTest - extends PlexusTestCase + extends TestSupport { private static File testDirectory = new File( getBasedir(), "target/test-classes/" ); @@ -138,12 +141,12 @@ public void testCircularReferences() writer.flush(); } - MockLogger logger = new MockLogger(); + Logger logger = mock(Logger.class); Properties prop = PropertyUtils.loadPropertyFile( basicProp, null, logger ); assertEquals( "${test2}", prop.getProperty( "test" ) ); assertEquals( "${test2}", prop.getProperty( "test2" ) ); - assertEquals( 2, logger.warnMsgs.size() ); + verify( logger, times( 2 ) ).warn( anyString() ); assertWarn( "Circular reference between properties detected: test2 => test2", logger ); assertWarn( "Circular reference between properties detected: test => test2 => test2", logger ); } @@ -172,141 +175,20 @@ public void testCircularReferences3Vars() writer.flush(); } - MockLogger logger = new MockLogger(); + Logger logger = mock(Logger.class); Properties prop = PropertyUtils.loadPropertyFile( basicProp, null, logger ); assertEquals( "${test2}", prop.getProperty( "test" ) ); assertEquals( "${test3}", prop.getProperty( "test2" ) ); assertEquals( "${test}", prop.getProperty( "test3" ) ); - assertEquals( 3, logger.warnMsgs.size() ); + verify( logger, times( 3 ) ).warn( anyString() ); assertWarn( "Circular reference between properties detected: test3 => test => test2 => test3", logger ); assertWarn( "Circular reference between properties detected: test2 => test3 => test => test2", logger ); assertWarn( "Circular reference between properties detected: test => test2 => test3 => test", logger ); } - private void assertWarn( String expected, MockLogger logger ) - { - assertTrue( logger.warnMsgs.contains( expected ) ); - } - - private static class MockLogger - implements Logger + private void assertWarn( String expected, Logger mock ) { - - ArrayList warnMsgs = new ArrayList<>(); - - @Override - public void debug( String message ) - { - // nothing - } - - @Override - public void debug( String message, Throwable throwable ) - { - // nothing - } - - @Override - public boolean isDebugEnabled() - { - return false; - } - - @Override - public void info( String message ) - { - // nothing - } - - @Override - public void info( String message, Throwable throwable ) - { - // nothing - } - - @Override - public boolean isInfoEnabled() - { - return false; - } - - @Override - public void warn( String message ) - { - warnMsgs.add( message ); - } - - @Override - public void warn( String message, Throwable throwable ) - { - // nothing - } - - @Override - public boolean isWarnEnabled() - { - return false; - } - - @Override - public void error( String message ) - { - // nothing - } - - @Override - public void error( String message, Throwable throwable ) - { - // nothing - } - - @Override - public boolean isErrorEnabled() - { - return false; - } - - @Override - public void fatalError( String message ) - { - // nothing - } - - @Override - public void fatalError( String message, Throwable throwable ) - { - // nothing - } - - @Override - public boolean isFatalErrorEnabled() - { - return false; - } - - @Override - public int getThreshold() - { - return 0; - } - - @Override - public void setThreshold( int threshold ) - { - // nothing - } - - @Override - public Logger getChildLogger( String name ) - { - return null; - } - - @Override - public String getName() - { - return null; - } +// assertTrue( logger.warnMsgs.contains( expected ) ); } } diff --git a/src/test/java/org/apache/maven/shared/filtering/TestReflectionProperties.java b/src/test/java/org/apache/maven/shared/filtering/TestReflectionProperties.java index 40b8054..81ad6e7 100644 --- a/src/test/java/org/apache/maven/shared/filtering/TestReflectionProperties.java +++ b/src/test/java/org/apache/maven/shared/filtering/TestReflectionProperties.java @@ -24,7 +24,6 @@ import java.util.Properties; import org.apache.maven.project.MavenProject; -import org.codehaus.plexus.PlexusTestCase; /** * @author Olivier Lamy @@ -32,7 +31,7 @@ * */ public class TestReflectionProperties - extends PlexusTestCase + extends TestSupport { public void testSimpleFiltering() diff --git a/src/test/java/org/apache/maven/shared/filtering/TestSupport.java b/src/test/java/org/apache/maven/shared/filtering/TestSupport.java new file mode 100644 index 0000000..35aca98 --- /dev/null +++ b/src/test/java/org/apache/maven/shared/filtering/TestSupport.java @@ -0,0 +1,37 @@ +package org.apache.maven.shared.filtering; + +/* + * 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. + */ + +import org.codehaus.plexus.ContainerConfiguration; +import org.codehaus.plexus.PlexusConstants; +import org.codehaus.plexus.PlexusTestCase; + +/** + * Support class for injected tests. This should be moved off ancient Junit3 PlexusTestCase to more modern JUnit. + */ +public abstract class TestSupport + extends PlexusTestCase +{ + @Override + protected void customizeContainerConfiguration( ContainerConfiguration configuration ) + { + configuration.setAutoWiring( true ).setClassPathScanning( PlexusConstants.SCANNING_INDEX ); + } +} From b21a56651224d92edf26a10827e49e4af68ec3ad Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Thu, 9 Jun 2022 13:32:31 +0200 Subject: [PATCH 4/6] Fix UT --- .../shared/filtering/PropertyUtilsTest.java | 48 +++++++++++-------- 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/src/test/java/org/apache/maven/shared/filtering/PropertyUtilsTest.java b/src/test/java/org/apache/maven/shared/filtering/PropertyUtilsTest.java index 18f67a1..b5ab443 100644 --- a/src/test/java/org/apache/maven/shared/filtering/PropertyUtilsTest.java +++ b/src/test/java/org/apache/maven/shared/filtering/PropertyUtilsTest.java @@ -22,11 +22,12 @@ import java.io.File; import java.io.FileWriter; import java.io.IOException; +import java.util.List; import java.util.Properties; +import org.mockito.ArgumentCaptor; import org.slf4j.Logger; -import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -34,15 +35,14 @@ /** * @author Olivier Lamy * @since 1.0-beta-1 - * */ public class PropertyUtilsTest - extends TestSupport + extends TestSupport { private static File testDirectory = new File( getBasedir(), "target/test-classes/" ); public void testBasic() - throws Exception + throws Exception { File basicProp = new File( testDirectory, "basic.properties" ); @@ -66,7 +66,7 @@ public void testBasic() } public void testSystemProperties() - throws Exception + throws Exception { File systemProp = new File( testDirectory, "system.properties" ); @@ -87,7 +87,7 @@ public void testSystemProperties() } public void testException() - throws Exception + throws Exception { File nonExistent = new File( testDirectory, "not_existent_file" ); @@ -105,7 +105,7 @@ public void testException() } public void testloadpropertiesFile() - throws Exception + throws Exception { File propertyFile = new File( getBasedir() + "/src/test/units-files/propertyutils-test.properties" ); Properties baseProps = new Properties(); @@ -124,7 +124,7 @@ public void testloadpropertiesFile() * @throws IOException if problem writing file */ public void testCircularReferences() - throws IOException + throws IOException { File basicProp = new File( testDirectory, "circular.properties" ); @@ -134,21 +134,21 @@ public void testCircularReferences() } basicProp.createNewFile(); - try( FileWriter writer = new FileWriter( basicProp ) ) + try ( FileWriter writer = new FileWriter( basicProp ) ) { writer.write( "test=${test2}\n" ); writer.write( "test2=${test2}\n" ); writer.flush(); } - Logger logger = mock(Logger.class); + Logger logger = mock( Logger.class ); Properties prop = PropertyUtils.loadPropertyFile( basicProp, null, logger ); assertEquals( "${test2}", prop.getProperty( "test" ) ); assertEquals( "${test2}", prop.getProperty( "test2" ) ); - verify( logger, times( 2 ) ).warn( anyString() ); - assertWarn( "Circular reference between properties detected: test2 => test2", logger ); - assertWarn( "Circular reference between properties detected: test => test2 => test2", logger ); + assertWarn( logger, + "Circular reference between properties detected: test2 => test2", + "Circular reference between properties detected: test => test2 => test2" ); } /** @@ -157,7 +157,7 @@ public void testCircularReferences() * @throws IOException if problem writing file */ public void testCircularReferences3Vars() - throws IOException + throws IOException { File basicProp = new File( testDirectory, "circular.properties" ); @@ -175,20 +175,26 @@ public void testCircularReferences3Vars() writer.flush(); } - Logger logger = mock(Logger.class); + Logger logger = mock( Logger.class ); Properties prop = PropertyUtils.loadPropertyFile( basicProp, null, logger ); assertEquals( "${test2}", prop.getProperty( "test" ) ); assertEquals( "${test3}", prop.getProperty( "test2" ) ); assertEquals( "${test}", prop.getProperty( "test3" ) ); - verify( logger, times( 3 ) ).warn( anyString() ); - assertWarn( "Circular reference between properties detected: test3 => test => test2 => test3", logger ); - assertWarn( "Circular reference between properties detected: test2 => test3 => test => test2", logger ); - assertWarn( "Circular reference between properties detected: test => test2 => test3 => test", logger ); + assertWarn( logger, + "Circular reference between properties detected: test3 => test => test2 => test3", + "Circular reference between properties detected: test2 => test3 => test => test2", + "Circular reference between properties detected: test => test2 => test3 => test" ); } - private void assertWarn( String expected, Logger mock ) + private void assertWarn( Logger mock, String... expected ) { -// assertTrue( logger.warnMsgs.contains( expected ) ); + ArgumentCaptor argument = ArgumentCaptor.forClass( String.class ); + verify( mock, times( expected.length ) ).warn( argument.capture() ); + List messages = argument.getAllValues(); + for ( String str : expected ) + { + assertTrue( messages.contains( str ) ); + } } } From 4e16d700d9ff823db377c8220f0e46a67fd18541 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Fri, 10 Jun 2022 09:33:20 +0200 Subject: [PATCH 5/6] Raise from the dead, neglect the smell. --- pom.xml | 13 ++ .../filtering/DefaultMavenFileFilter.java | 14 ++ .../DefaultMavenResourcesFiltering.java | 36 ++- .../filtering/DefaultMavenFileFilterTest.java | 5 +- .../IncrementalResourceFilteringTest.java | 212 ++++++++++++++++++ .../IncrementalResourceFilteringTest.xml | 27 +++ 6 files changed, 301 insertions(+), 6 deletions(-) create mode 100644 src/test/java/org/apache/maven/shared/filtering/IncrementalResourceFilteringTest.java create mode 100644 src/test/resources/org/apache/maven/shared/filtering/IncrementalResourceFilteringTest.xml diff --git a/pom.xml b/pom.xml index 08f1a2a..0c4aea0 100644 --- a/pom.xml +++ b/pom.xml @@ -57,6 +57,7 @@ 3.2.5 1.7.36 + 0.0.7 8 2020-08-05T15:18:01Z @@ -78,6 +79,11 @@ slf4j-api ${slf4jVersion} + + org.sonatype.plexus + plexus-build-api + ${plexusBuildApiVersion} + org.apache.maven maven-core @@ -136,6 +142,13 @@ ${slf4jVersion} test + + org.sonatype.plexus + plexus-build-api + ${plexusBuildApiVersion} + test + tests + org.eclipse.sisu org.eclipse.sisu.plexus diff --git a/src/main/java/org/apache/maven/shared/filtering/DefaultMavenFileFilter.java b/src/main/java/org/apache/maven/shared/filtering/DefaultMavenFileFilter.java index 58dea10..37102d5 100644 --- a/src/main/java/org/apache/maven/shared/filtering/DefaultMavenFileFilter.java +++ b/src/main/java/org/apache/maven/shared/filtering/DefaultMavenFileFilter.java @@ -19,6 +19,7 @@ * under the License. */ +import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; @@ -28,6 +29,9 @@ import org.apache.maven.execution.MavenSession; import org.apache.maven.project.MavenProject; +import org.sonatype.plexus.build.incremental.BuildContext; + +import static java.util.Objects.requireNonNull; /** * @author Olivier Lamy @@ -38,6 +42,14 @@ public class DefaultMavenFileFilter extends BaseFilter implements MavenFileFilter { + private final BuildContext buildContext; + + @Inject + public DefaultMavenFileFilter( BuildContext buildContext ) + { + this.buildContext = requireNonNull( buildContext ); + } + @Override public void copyFile( File from, File to, boolean filtering, MavenProject mavenProject, List filters, boolean escapedBackslashesInFilePath, String encoding, MavenSession mavenSession ) @@ -97,6 +109,8 @@ public void copyFile( File from, File to, boolean filtering, List } FilteringUtils.copyFile( from, to, encoding, new FilterWrapper[0], overwrite ); } + + buildContext.refresh( to ); } catch ( IOException e ) { 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 2a97d6b..e61d6ec 100644 --- a/src/main/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFiltering.java +++ b/src/main/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFiltering.java @@ -38,10 +38,12 @@ import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.IOUtils; import org.apache.maven.model.Resource; -import org.codehaus.plexus.util.DirectoryScanner; import org.codehaus.plexus.util.Scanner; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.sonatype.plexus.build.incremental.BuildContext; + +import static java.util.Objects.requireNonNull; /** * @author Olivier Lamy @@ -61,10 +63,13 @@ public class DefaultMavenResourcesFiltering private final MavenFileFilter mavenFileFilter; + private final BuildContext buildContext; + @Inject - public DefaultMavenResourcesFiltering( MavenFileFilter mavenFileFilter ) + public DefaultMavenResourcesFiltering( MavenFileFilter mavenFileFilter, BuildContext buildContext ) { - this.mavenFileFilter = mavenFileFilter; + this.mavenFileFilter = requireNonNull( mavenFileFilter ); + this.buildContext = requireNonNull( buildContext ); this.defaultNonFilteredFileExtensions = new ArrayList<>( 5 ); this.defaultNonFilteredFileExtensions.add( "jpg" ); this.defaultNonFilteredFileExtensions.add( "jpeg" ); @@ -207,8 +212,10 @@ public void filterResources( MavenResourcesExecution mavenResourcesExecution ) isFilteringUsed = true; } - DirectoryScanner scanner = new DirectoryScanner(); - scanner.setBasedir( resourceDirectory ); + boolean ignoreDelta = !outputExists || buildContext.hasDelta( mavenResourcesExecution.getFileFilters() ) + || buildContext.hasDelta( getRelativeOutputDirectory( mavenResourcesExecution ) ); + LOGGER.debug( "ignoreDelta " + ignoreDelta ); + Scanner scanner = buildContext.newScanner( resourceDirectory, ignoreDelta ); setupScanner( resource, scanner, mavenResourcesExecution.isAddDefaultExcludes() ); @@ -272,6 +279,25 @@ public void filterResources( MavenResourcesExecution mavenResourcesExecution ) encoding, mavenResourcesExecution.isOverwrite() ); } + + // deal with deleted source files + + scanner = buildContext.newDeleteScanner( resourceDirectory ); + + setupScanner( resource, scanner, mavenResourcesExecution.isAddDefaultExcludes() ); + + scanner.scan(); + + List deletedFiles = Arrays.asList( scanner.getIncludedFiles() ); + + for ( String name : deletedFiles ) + { + File destinationFile = getDestinationFile( outputDirectory, targetPath, name, mavenResourcesExecution ); + + destinationFile.delete(); + + buildContext.refresh( destinationFile ); + } } // Warn the user if all of the following requirements are met, to avoid those that are not affected diff --git a/src/test/java/org/apache/maven/shared/filtering/DefaultMavenFileFilterTest.java b/src/test/java/org/apache/maven/shared/filtering/DefaultMavenFileFilterTest.java index 32435ee..d53456f 100644 --- a/src/test/java/org/apache/maven/shared/filtering/DefaultMavenFileFilterTest.java +++ b/src/test/java/org/apache/maven/shared/filtering/DefaultMavenFileFilterTest.java @@ -32,6 +32,9 @@ import org.apache.commons.io.IOUtils; import org.apache.maven.project.MavenProject; +import org.sonatype.plexus.build.incremental.BuildContext; + +import static org.mockito.Mockito.mock; /** * @author Olivier Lamy @@ -110,7 +113,7 @@ public void testNullSafeDefaultFilterWrappers() public void testMultiFilterFileInheritance() throws Exception { - DefaultMavenFileFilter mavenFileFilter = new DefaultMavenFileFilter(); + DefaultMavenFileFilter mavenFileFilter = new DefaultMavenFileFilter( mock( BuildContext.class ) ); File testDir = new File( getBasedir(), "src/test/units-files/MSHARED-177" ); diff --git a/src/test/java/org/apache/maven/shared/filtering/IncrementalResourceFilteringTest.java b/src/test/java/org/apache/maven/shared/filtering/IncrementalResourceFilteringTest.java new file mode 100644 index 0000000..bccc980 --- /dev/null +++ b/src/test/java/org/apache/maven/shared/filtering/IncrementalResourceFilteringTest.java @@ -0,0 +1,212 @@ +package org.apache.maven.shared.filtering; + +/* + * 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. + */ + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Properties; +import java.util.Set; + +import org.apache.commons.io.FileUtils; +import org.apache.maven.model.Resource; +import org.codehaus.plexus.PlexusTestCase; +import org.sonatype.plexus.build.incremental.ThreadBuildContext; +import org.sonatype.plexus.build.incremental.test.TestIncrementalBuildContext; + +public class IncrementalResourceFilteringTest + extends TestSupport +{ + + File outputDirectory = new File( getBasedir(), "target/IncrementalResourceFilteringTest" ); + + File unitDirectory = new File( getBasedir(), "src/test/units-files/incremental" ); + + @Override + protected void setUp() + throws Exception + { + super.setUp(); + if ( outputDirectory.exists() ) + { + FileUtils.deleteDirectory( outputDirectory ); + } + outputDirectory.mkdirs(); + } + + public void testSimpleIncrementalFiltering() + throws Exception + { + // run full build first + filter( "time" ); + + assertTime( "time", "file01.txt" ); + assertTime( "time", "file02.txt" ); + + // only one file is expected to change + Set changedFiles = new HashSet<>(); + changedFiles.add( "file01.txt" ); + + TestIncrementalBuildContext ctx = + new TestIncrementalBuildContext( unitDirectory, changedFiles, Collections.emptyMap() ); + ThreadBuildContext.setThreadBuildContext( ctx ); + + filter( "notime" ); + assertTime( "notime", "file01.txt" ); + assertTime( "time", "file02.txt" ); // this one is unchanged + + assertTrue( ctx.getRefreshFiles().contains( new File( outputDirectory, "file01.txt" ) ) ); + + ctx = new TestIncrementalBuildContext( unitDirectory, Collections.emptySet(), changedFiles, + Collections.emptyMap(), new ArrayList(), new ArrayList() ); + ThreadBuildContext.setThreadBuildContext( ctx ); + + filter( "moretime" ); + assertFalse( new File( outputDirectory, "file01.txt" ).exists() ); + assertTime( "time", "file02.txt" ); // this one is unchanged + + assertTrue( ctx.getRefreshFiles().contains( new File( outputDirectory, "file01.txt" ) ) ); + + } + + public void testOutputChange() + throws Exception + { + // run full build first + filter( "time" ); + + // all files are reprocessed after contents of output directory changed (e.g. was deleted) + Set changedFiles = new HashSet<>(); + changedFiles.add( "target/IncrementalResourceFilteringTest" ); + TestIncrementalBuildContext ctx = + new TestIncrementalBuildContext( unitDirectory, changedFiles, Collections.emptyMap() ); + ThreadBuildContext.setThreadBuildContext( ctx ); + + filter( "notime" ); + assertTime( "notime", "file01.txt" ); + assertTime( "notime", "file02.txt" ); + + assertTrue( ctx.getRefreshFiles().contains( new File( outputDirectory, "file01.txt" ) ) ); + assertTrue( ctx.getRefreshFiles().contains( new File( outputDirectory, "file02.txt" ) ) ); + + } + + public void testFilterChange() + throws Exception + { + // run full build first + filter( "time" ); + + // all files are reprocessed after content of filters changes + Set changedFiles = new HashSet<>(); + changedFiles.add( "filters.txt" ); + TestIncrementalBuildContext ctx = + new TestIncrementalBuildContext( unitDirectory, changedFiles, Collections.emptyMap() ); + ThreadBuildContext.setThreadBuildContext( ctx ); + + filter( "notime" ); + assertTime( "notime", "file01.txt" ); + assertTime( "notime", "file02.txt" ); + + assertTrue( ctx.getRefreshFiles().contains( new File( outputDirectory, "file01.txt" ) ) ); + assertTrue( ctx.getRefreshFiles().contains( new File( outputDirectory, "file02.txt" ) ) ); + + } + + public void testFilterDeleted() + throws Exception + { + // run full build first + filter( "time" ); + + // all files are reprocessed after content of filters changes + Set deletedFiles = new HashSet<>(); + deletedFiles.add( "filters.txt" ); + TestIncrementalBuildContext ctx = new TestIncrementalBuildContext( unitDirectory, Collections.emptySet(), + deletedFiles, Collections.emptyMap(), new ArrayList(), new ArrayList() ); + ThreadBuildContext.setThreadBuildContext( ctx ); + + filter( "notime" ); + assertTime( "notime", "file01.txt" ); + assertTime( "notime", "file02.txt" ); + + assertTrue( ctx.getRefreshFiles().contains( new File( outputDirectory, "file01.txt" ) ) ); + assertTrue( ctx.getRefreshFiles().contains( new File( outputDirectory, "file02.txt" ) ) ); + } + + private void assertTime( String time, String relpath ) + throws IOException + { + Properties properties = new Properties(); + + + try ( InputStream is = new FileInputStream( new File( outputDirectory, relpath ) ) ) + { + properties.load( is ); + } + + assertEquals( time, properties.getProperty( "time" ) ); + } + + private void filter( String time ) + throws Exception + { + File baseDir = new File( getBasedir() ); + StubMavenProject mavenProject = new StubMavenProject( baseDir ); + mavenProject.setVersion( "1.0" ); + mavenProject.setGroupId( "org.apache" ); + mavenProject.setName( "test project" ); + + Properties projectProperties = new Properties(); + projectProperties.put( "time", time ); + projectProperties.put( "java.version", "zloug" ); + mavenProject.setProperties( projectProperties ); + MavenResourcesFiltering mavenResourcesFiltering = lookup( MavenResourcesFiltering.class ); + + String unitFilesDir = new File( unitDirectory, "files" ).getPath(); + + Resource resource = new Resource(); + List resources = new ArrayList<>(); + resources.add( resource ); + resource.setDirectory( unitFilesDir ); + resource.setFiltering( true ); + + List filtersFile = new ArrayList<>(); + filtersFile.add( new File( unitDirectory, "filters.txt" ).getPath() ); + + MavenResourcesExecution mre = new MavenResourcesExecution(); + mre.setResources( resources ); + mre.setOutputDirectory( outputDirectory ); + mre.setEncoding( "UTF-8" ); + mre.setMavenProject( mavenProject ); + mre.setFilters( filtersFile ); + mre.setNonFilteredFileExtensions( Collections.emptyList() ); + mre.setMavenSession( new StubMavenSession() ); + mre.setUseDefaultFilterWrappers( true ); + + mavenResourcesFiltering.filterResources( mre ); + } + +} diff --git a/src/test/resources/org/apache/maven/shared/filtering/IncrementalResourceFilteringTest.xml b/src/test/resources/org/apache/maven/shared/filtering/IncrementalResourceFilteringTest.xml new file mode 100644 index 0000000..551b1b4 --- /dev/null +++ b/src/test/resources/org/apache/maven/shared/filtering/IncrementalResourceFilteringTest.xml @@ -0,0 +1,27 @@ + + + + + org.sonatype.plexus.build.incremental.BuildContext + default + org.sonatype.plexus.build.incremental.ThreadBuildContext + + + From 0158eb95d9e097b771086e7886b34d4fdf2fd17a Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Fri, 10 Jun 2022 21:59:37 +0200 Subject: [PATCH 6/6] Applied PR comments --- pom.xml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 0c4aea0..5460a65 100644 --- a/pom.xml +++ b/pom.xml @@ -55,10 +55,10 @@ + 8 3.2.5 1.7.36 0.0.7 - 8 2020-08-05T15:18:01Z @@ -152,13 +152,11 @@ org.eclipse.sisu org.eclipse.sisu.plexus - 0.3.0.M1 test org.eclipse.sisu org.eclipse.sisu.inject - 0.3.0.M1 test