Vladimir Sitnikov created MSHARED-394:
-----------------------------------------

             Summary: Avoid rewrite of destination in 
DefaultMavenFileFilter#filterFile when producing the same contents
                 Key: MSHARED-394
                 URL: https://jira.codehaus.org/browse/MSHARED-394
             Project: Maven Shared Components
          Issue Type: Improvement
          Components: maven-filtering
    Affects Versions: maven-filtering-1.2
            Reporter: Vladimir Sitnikov


See relevant MRESOURCES-168.

When processing "filtered" resources, maven-filtering always overwrites 
destination files, leading to rebuild of the upstream results (e.g. jar file 
being repackaged due to "DEBUG] isUp2date: false (Resource with newer 
modification date found.)").

I think maven-filtering can do better job here: it can double-check if the 
resource contents after filtering is equal to the contents of the existing 
file, then it should avoid overwrite of the destination file.

The change would be localized in 
{{org.apache.maven.shared.filtering.DefaultMavenFileFilter#filterFile}}:

{code:java}
    private void filterFile(@Nonnull File from, @Nonnull File to, @Nullable 
String encoding, @Nullable List<FilterWrapper> wrappers) throws IOException, 
MavenFilteringException {
        if(wrappers != null && wrappers.size() > 0) {
            Reader fileReader = null;
            Writer fileWriter = null;

            try {
                fileReader = this.getFileReader(encoding, from);
                fileWriter = this.getFileWriter(encoding, to); // Here 
temporary buffer should be used to avoid accidental file overwrite
                Reader src = this.readerFilter.filter(fileReader, true, 
wrappers);
                IOUtil.copy(src, fileWriter);
            } finally {
                IOUtil.close(fileReader);
                IOUtil.close(fileWriter);
            }
        } else if(to.lastModified() < from.lastModified()) {
            FileUtils.copyFile(from, to);
        }

    }{code}

The change would require to buffer the contents in memory, thus it might lead 
to OutOfMemory errors. I suggest disabling this buffering if the size of the 
source file exceeds some threshold.



--
This message was sent by Atlassian JIRA
(v6.1.6#6162)

Reply via email to