You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@maven.apache.org by Mark Struberg <st...@yahoo.de> on 2012/09/14 15:03:37 UTC

Re: svn commit: r1384747 - in /maven/shared/trunk/maven-shared-utils/src: main/java/org/apache/maven/shared/utils/io/DirectorySnapshotScanner.java test/java/org/apache/maven/shared/utils/io/DirectorySnapshotScannerTest.java

Hi!

If anyone has a better name for the 'DirectorySnapshotScanner' I would be happy to rename it.


What it makes: it takes a snapshot capture of a directory structure and compares it with another snapshot capture of that directory to calculate a diff (files added/removed)

Not sure though if the name 'snapshot' isn't too heavily associated with dependency-snapshots, wdyt?


We will need this for the incremental build support.

LieGrue,
strub



----- Original Message -----
> From: "struberg@apache.org" <st...@apache.org>
> To: commits@maven.apache.org
> Cc: 
> Sent: Friday, September 14, 2012 2:57 PM
> Subject: svn commit: r1384747 - in /maven/shared/trunk/maven-shared-utils/src: main/java/org/apache/maven/shared/utils/io/DirectorySnapshotScanner.java test/java/org/apache/maven/shared/utils/io/DirectorySnapshotScannerTest.java
> 
> Author: struberg
> Date: Fri Sep 14 12:57:24 2012
> New Revision: 1384747
> 
> URL: http://svn.apache.org/viewvc?rev=1384747&view=rev
> Log:
> MSHARED-243 add DirectorySnapshotScanner
> 
> This allows to take snapshot captures of a directory and
> calculate the 'diff' between those (files added/removed).
> 
> Added:
>     
> maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/DirectorySnapshotScanner.java  
> (with props)
>     
> maven/shared/trunk/maven-shared-utils/src/test/java/org/apache/maven/shared/utils/io/DirectorySnapshotScannerTest.java  
> (with props)
> 
> Added: 
> maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/DirectorySnapshotScanner.java
> URL: 
> http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/DirectorySnapshotScanner.java?rev=1384747&view=auto
> ==============================================================================
> --- 
> maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/DirectorySnapshotScanner.java 
> (added)
> +++ 
> maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/DirectorySnapshotScanner.java 
> Fri Sep 14 12:57:24 2012
> @@ -0,0 +1,139 @@
> +package org.apache.maven.shared.utils.io;
> +
> +/*
> + * 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.apache.maven.shared.utils.CollectionUtils;
> +
> +import java.io.File;
> +import java.util.ArrayList;
> +import java.util.List;
> +import java.util.Set;
> +
> +/**
> + * Scan for files in a directory at a given time and reports removed and added 
> files
> + * between captures.
> + */
> +public class DirectorySnapshotScanner
> +{
> +    private final static String[] NO_FILES = new String[0];
> +
> +    private File rootDirectory;
> +    private String[] scannedOldFiles;
> +    private String[] scannedNewFiles = NO_FILES;
> +    private String[] filesAdded;
> +    private String[] filesRemoved;
> +
> +    public DirectorySnapshotScanner( File rootDirectory )
> +    {
> +        this.rootDirectory = rootDirectory;
> +    }
> +
> +    public void capture()
> +    {
> +        DirectoryScanner ds = new DirectoryScanner();
> +        capture( ds );
> +    }
> +
> +    public void capture( DirectoryScanner ds )
> +    {
> +        ds.setBasedir( rootDirectory );
> +        ds.scan();
> +
> +        scannedNewFiles = ds.getIncludedFiles();
> +
> +        if ( scannedOldFiles != null )
> +        {
> +            calculateDiff( scannedOldFiles, scannedNewFiles );
> +
> +        }
> +        else
> +        {
> +            filesAdded = NO_FILES;
> +            filesRemoved = NO_FILES;
> +        }
> +
> +        // this attempts new files is the baseline for the next scan
> +        scannedOldFiles = scannedNewFiles;
> +    }
> +
> +    /**
> +     * @return all files which got scanned during the last capture.
> +     */
> +    public String[] getScannedFiles()
> +    {
> +        return scannedNewFiles;
> +    }
> +
> +    /**
> +     * @return all files which got detected as being added between 2 capture 
> calls
> +     */
> +    public String[] getFilesAdded()
> +    {
> +        return filesAdded;
> +    }
> +
> +    /**
> +     * @return all files which got detected as being removed between 2 capture 
> calls
> +     */
> +    public String[] getFilesRemoved()
> +    {
> +        return filesRemoved;
> +    }
> +
> +    /**
> +     * Determine the file differences between the oldFiles and newFiles.
> +     * This method will not look for a changed in content but sole in the
> +     * list of files given.
> +     *
> +     * The result of the diff can be queried by the methods
> +     * {@link #getFilesAdded()} and {@link #getFilesRemoved()}
> +     *
> +     * @param oldFiles
> +     * @param newFiles
> +     */
> +    public void calculateDiff( String[] oldFiles, String[] newFiles )
> +    {
> +        Set<String> oldFileSet = CollectionUtils.arrayAsHashSet( oldFiles 
> );
> +        Set<String> newFileSet = CollectionUtils.arrayAsHashSet( newFiles 
> );
> +
> +        List<String> added = new ArrayList<String>();
> +        List<String> removed = new ArrayList<String>();
> +
> +        for ( String oldFile : oldFileSet )
> +        {
> +            if ( !newFileSet.contains( oldFile ) )
> +            {
> +                removed.add( oldFile );
> +            }
> +        }
> +
> +        for ( String newFile : newFileSet )
> +        {
> +            if ( !oldFileSet.contains( newFile ) )
> +            {
> +                added.add( newFile );
> +            }
> +        }
> +
> +        filesAdded = added.toArray( new String[ added.size() ] );
> +        filesRemoved = removed.toArray( new String[ removed.size() ] );
> +    }
> +
> +}
> 
> Propchange: 
> maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/DirectorySnapshotScanner.java
> ------------------------------------------------------------------------------
>     svn:eol-style = native
> 
> Added: 
> maven/shared/trunk/maven-shared-utils/src/test/java/org/apache/maven/shared/utils/io/DirectorySnapshotScannerTest.java
> URL: 
> http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-utils/src/test/java/org/apache/maven/shared/utils/io/DirectorySnapshotScannerTest.java?rev=1384747&view=auto
> ==============================================================================
> --- 
> maven/shared/trunk/maven-shared-utils/src/test/java/org/apache/maven/shared/utils/io/DirectorySnapshotScannerTest.java 
> (added)
> +++ 
> maven/shared/trunk/maven-shared-utils/src/test/java/org/apache/maven/shared/utils/io/DirectorySnapshotScannerTest.java 
> Fri Sep 14 12:57:24 2012
> @@ -0,0 +1,161 @@
> +package org.apache.maven.shared.utils.io;
> +
> +/*
> + * 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.apache.maven.shared.utils.testhelpers.FileTestHelper;
> +import org.junit.Test;
> +import org.junit.Rule;
> +import org.junit.Ignore;
> +import org.junit.Assert;
> +import org.junit.rules.TemporaryFolder;
> +
> +import java.io.File;
> +import java.io.IOException;
> +
> +public class DirectorySnapshotScannerTest
> +{
> +
> +    @Rule
> +    public TemporaryFolder tempFolder = new TemporaryFolder();
> +
> +    private void createTestData() throws IOException
> +    {
> +        File rootDir = tempFolder.getRoot();
> +        File folder1 = new File( rootDir, "folder1" );
> +        folder1.mkdirs();
> +
> +        FileTestHelper.generateTestFile( new File( rootDir, 
> "file1.txt" ), 11 );
> +        FileTestHelper.generateTestFile( new File( rootDir, 
> "file2.txt" ), 12 );
> +        FileTestHelper.generateTestFile( new File( rootDir, 
> "file3.dat" ), 13 );
> +
> +        FileTestHelper.generateTestFile( new File( folder1, 
> "file4.txt" ), 14 );
> +        FileTestHelper.generateTestFile( new File( folder1, 
> "file5.dat" ), 15 );
> +
> +        File folder2 = new File( folder1, "ignorefolder" );
> +        folder2.mkdirs();
> +        FileTestHelper.generateTestFile( new File( folder2, 
> "file7.txt" ), 17 );
> +
> +    }
> +
> +    private void removeAndAddSomeFiles() throws IOException
> +    {
> +        File rootDir = tempFolder.getRoot();
> +        File file2 = new File( rootDir, "file2.txt" );
> +        file2.delete();
> +
> +        FileTestHelper.generateTestFile( new File( rootDir, 
> "folder1/file9.txt" ), 15 );
> +
> +        File folder2 = new File( rootDir, "folder1/ignorefolder" );
> +        FileUtils.deleteDirectory( folder2 );
> +    }
> +
> +    @Test
> +    public void testInitialScan() throws Exception
> +    {
> +        createTestData();
> +
> +        DirectorySnapshotScanner dss = new DirectorySnapshotScanner( 
> tempFolder.getRoot() );
> +        Assert.assertNotNull( dss );
> +
> +        // we take the initial snapshot which should result in an empty diff
> +        dss.capture();
> +
> +        //X TODO define result of the initial scan. Full directory tree or just 
> an empty array?
> +        String[] addedFiles = dss.getFilesAdded();
> +        String[] removedFiles = dss.getFilesRemoved();
> +        Assert.assertNotNull( addedFiles );
> +        Assert.assertNotNull( removedFiles );
> +        Assert.assertEquals( 0, addedFiles.length );
> +        Assert.assertEquals(0, removedFiles.length );
> +
> +        // now we change 3 files. add one and remove
> +        removeAndAddSomeFiles();
> +
> +        dss.capture();
> +
> +        addedFiles = dss.getFilesAdded();
> +        removedFiles = dss.getFilesRemoved();
> +        Assert.assertNotNull( addedFiles );
> +        Assert.assertNotNull( removedFiles );
> +        Assert.assertEquals( 1, addedFiles.length );
> +        Assert.assertEquals(2, removedFiles.length );
> +
> +        String[] allFiles = dss.getScannedFiles();
> +        Assert.assertNotNull( allFiles );
> +        Assert.assertEquals(5, allFiles.length );
> +
> +    }
> +
> +
> +
> +    @Ignore("Enable this test to run performance checks")
> +    @Test
> +    public void performanceTest() throws Exception {
> +
> +        File rootFolder = tempFolder.getRoot();
> +
> +        // do some warmup
> +        for ( int i = 1; i < 200; i++ )
> +        {
> +            createTestData();
> +            removeAndAddSomeFiles();
> +            FileUtils.deleteDirectory( rootFolder );
> +        }
> +
> +        int cycles = 2000;
> +
> +        // and now we take the time _without_
> +        long startTime = System.nanoTime();
> +        for ( int i = 1; i < cycles; i++ )
> +        {
> +            createTestData();
> +            removeAndAddSomeFiles();
> +            FileUtils.deleteDirectory( rootFolder );
> +            rootFolder.mkdir();
> +        }
> +        long endTime = System.nanoTime();
> +
> +        long durationEmptyRun = endTime - startTime;
> +        System.out.println( "durationEmptyRun            [ns]: " + 
> durationEmptyRun);
> +
> +        startTime = System.nanoTime();
> +        for ( int i = 1; i < cycles; i++ )
> +        {
> +            createTestData();
> +            DirectorySnapshotScanner dss = new DirectorySnapshotScanner( 
> rootFolder );
> +            dss.capture();
> +            removeAndAddSomeFiles();
> +            dss.capture();
> +
> +            FileUtils.deleteDirectory( rootFolder );
> +            rootFolder.mkdir();
> +        }
> +        endTime = System.nanoTime();
> +
> +        long durationWithSnapshotScanner = endTime - startTime;
> +        System.out.println( "durationWithSnapshotScanner [ns]: " + 
> durationWithSnapshotScanner);
> +
> +        long dirScannerOverhead = durationWithSnapshotScanner - 
> durationEmptyRun;
> +
> +        System.out.println( "Overhead for n cycles [ns]: " + 
> dirScannerOverhead);
> +    }
> +
> +}
> 
> Propchange: 
> maven/shared/trunk/maven-shared-utils/src/test/java/org/apache/maven/shared/utils/io/DirectorySnapshotScannerTest.java
> ------------------------------------------------------------------------------
>     svn:eol-style = native
> 

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
For additional commands, e-mail: dev-help@maven.apache.org


Re: svn commit: r1384747 - in /maven/shared/trunk/maven-shared-utils/src: main/java/org/apache/maven/shared/utils/io/DirectorySnapshotScanner.java test/java/org/apache/maven/shared/utils/io/DirectorySnapshotScannerTest.java

Posted by Romain Manni-Bucau <rm...@gmail.com>.
SavePoint?
Le 14 sept. 2012 20:04, "Anders Hammar" <an...@hammar.net> a écrit :

> Yes, "Snapshot" is not good. "PointInTime"?
>
> /Anders
> On Fri, Sep 14, 2012 at 3:03 PM, Mark Struberg <st...@yahoo.de> wrote:
> > Hi!
> >
> > If anyone has a better name for the 'DirectorySnapshotScanner' I would
> be happy to rename it.
> >
> >
> > What it makes: it takes a snapshot capture of a directory structure and
> compares it with another snapshot capture of that directory to calculate a
> diff (files added/removed)
> >
> > Not sure though if the name 'snapshot' isn't too heavily associated with
> dependency-snapshots, wdyt?
> >
> >
> > We will need this for the incremental build support.
> >
> > LieGrue,
> > strub
> >
> >
> >
> > ----- Original Message -----
> >> From: "struberg@apache.org" <st...@apache.org>
> >> To: commits@maven.apache.org
> >> Cc:
> >> Sent: Friday, September 14, 2012 2:57 PM
> >> Subject: svn commit: r1384747 - in
> /maven/shared/trunk/maven-shared-utils/src:
> main/java/org/apache/maven/shared/utils/io/DirectorySnapshotScanner.java
> test/java/org/apache/maven/shared/utils/io/DirectorySnapshotScannerTest.java
> >>
> >> Author: struberg
> >> Date: Fri Sep 14 12:57:24 2012
> >> New Revision: 1384747
> >>
> >> URL: http://svn.apache.org/viewvc?rev=1384747&view=rev
> >> Log:
> >> MSHARED-243 add DirectorySnapshotScanner
> >>
> >> This allows to take snapshot captures of a directory and
> >> calculate the 'diff' between those (files added/removed).
> >>
> >> Added:
> >>
> >>
> maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/DirectorySnapshotScanner.java
> >> (with props)
> >>
> >>
> maven/shared/trunk/maven-shared-utils/src/test/java/org/apache/maven/shared/utils/io/DirectorySnapshotScannerTest.java
> >> (with props)
> >>
> >> Added:
> >>
> maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/DirectorySnapshotScanner.java
> >> URL:
> >>
> http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/DirectorySnapshotScanner.java?rev=1384747&view=auto
> >>
> ==============================================================================
> >> ---
> >>
> maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/DirectorySnapshotScanner.java
> >> (added)
> >> +++
> >>
> maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/DirectorySnapshotScanner.java
> >> Fri Sep 14 12:57:24 2012
> >> @@ -0,0 +1,139 @@
> >> +package org.apache.maven.shared.utils.io;
> >> +
> >> +/*
> >> + * 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.apache.maven.shared.utils.CollectionUtils;
> >> +
> >> +import java.io.File;
> >> +import java.util.ArrayList;
> >> +import java.util.List;
> >> +import java.util.Set;
> >> +
> >> +/**
> >> + * Scan for files in a directory at a given time and reports removed
> and added
> >> files
> >> + * between captures.
> >> + */
> >> +public class DirectorySnapshotScanner
> >> +{
> >> +    private final static String[] NO_FILES = new String[0];
> >> +
> >> +    private File rootDirectory;
> >> +    private String[] scannedOldFiles;
> >> +    private String[] scannedNewFiles = NO_FILES;
> >> +    private String[] filesAdded;
> >> +    private String[] filesRemoved;
> >> +
> >> +    public DirectorySnapshotScanner( File rootDirectory )
> >> +    {
> >> +        this.rootDirectory = rootDirectory;
> >> +    }
> >> +
> >> +    public void capture()
> >> +    {
> >> +        DirectoryScanner ds = new DirectoryScanner();
> >> +        capture( ds );
> >> +    }
> >> +
> >> +    public void capture( DirectoryScanner ds )
> >> +    {
> >> +        ds.setBasedir( rootDirectory );
> >> +        ds.scan();
> >> +
> >> +        scannedNewFiles = ds.getIncludedFiles();
> >> +
> >> +        if ( scannedOldFiles != null )
> >> +        {
> >> +            calculateDiff( scannedOldFiles, scannedNewFiles );
> >> +
> >> +        }
> >> +        else
> >> +        {
> >> +            filesAdded = NO_FILES;
> >> +            filesRemoved = NO_FILES;
> >> +        }
> >> +
> >> +        // this attempts new files is the baseline for the next scan
> >> +        scannedOldFiles = scannedNewFiles;
> >> +    }
> >> +
> >> +    /**
> >> +     * @return all files which got scanned during the last capture.
> >> +     */
> >> +    public String[] getScannedFiles()
> >> +    {
> >> +        return scannedNewFiles;
> >> +    }
> >> +
> >> +    /**
> >> +     * @return all files which got detected as being added between 2
> capture
> >> calls
> >> +     */
> >> +    public String[] getFilesAdded()
> >> +    {
> >> +        return filesAdded;
> >> +    }
> >> +
> >> +    /**
> >> +     * @return all files which got detected as being removed between 2
> capture
> >> calls
> >> +     */
> >> +    public String[] getFilesRemoved()
> >> +    {
> >> +        return filesRemoved;
> >> +    }
> >> +
> >> +    /**
> >> +     * Determine the file differences between the oldFiles and
> newFiles.
> >> +     * This method will not look for a changed in content but sole in
> the
> >> +     * list of files given.
> >> +     *
> >> +     * The result of the diff can be queried by the methods
> >> +     * {@link #getFilesAdded()} and {@link #getFilesRemoved()}
> >> +     *
> >> +     * @param oldFiles
> >> +     * @param newFiles
> >> +     */
> >> +    public void calculateDiff( String[] oldFiles, String[] newFiles )
> >> +    {
> >> +        Set<String> oldFileSet = CollectionUtils.arrayAsHashSet(
> oldFiles
> >> );
> >> +        Set<String> newFileSet = CollectionUtils.arrayAsHashSet(
> newFiles
> >> );
> >> +
> >> +        List<String> added = new ArrayList<String>();
> >> +        List<String> removed = new ArrayList<String>();
> >> +
> >> +        for ( String oldFile : oldFileSet )
> >> +        {
> >> +            if ( !newFileSet.contains( oldFile ) )
> >> +            {
> >> +                removed.add( oldFile );
> >> +            }
> >> +        }
> >> +
> >> +        for ( String newFile : newFileSet )
> >> +        {
> >> +            if ( !oldFileSet.contains( newFile ) )
> >> +            {
> >> +                added.add( newFile );
> >> +            }
> >> +        }
> >> +
> >> +        filesAdded = added.toArray( new String[ added.size() ] );
> >> +        filesRemoved = removed.toArray( new String[ removed.size() ] );
> >> +    }
> >> +
> >> +}
> >>
> >> Propchange:
> >>
> maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/DirectorySnapshotScanner.java
> >>
> ------------------------------------------------------------------------------
> >>     svn:eol-style = native
> >>
> >> Added:
> >>
> maven/shared/trunk/maven-shared-utils/src/test/java/org/apache/maven/shared/utils/io/DirectorySnapshotScannerTest.java
> >> URL:
> >>
> http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-utils/src/test/java/org/apache/maven/shared/utils/io/DirectorySnapshotScannerTest.java?rev=1384747&view=auto
> >>
> ==============================================================================
> >> ---
> >>
> maven/shared/trunk/maven-shared-utils/src/test/java/org/apache/maven/shared/utils/io/DirectorySnapshotScannerTest.java
> >> (added)
> >> +++
> >>
> maven/shared/trunk/maven-shared-utils/src/test/java/org/apache/maven/shared/utils/io/DirectorySnapshotScannerTest.java
> >> Fri Sep 14 12:57:24 2012
> >> @@ -0,0 +1,161 @@
> >> +package org.apache.maven.shared.utils.io;
> >> +
> >> +/*
> >> + * 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.apache.maven.shared.utils.testhelpers.FileTestHelper;
> >> +import org.junit.Test;
> >> +import org.junit.Rule;
> >> +import org.junit.Ignore;
> >> +import org.junit.Assert;
> >> +import org.junit.rules.TemporaryFolder;
> >> +
> >> +import java.io.File;
> >> +import java.io.IOException;
> >> +
> >> +public class DirectorySnapshotScannerTest
> >> +{
> >> +
> >> +    @Rule
> >> +    public TemporaryFolder tempFolder = new TemporaryFolder();
> >> +
> >> +    private void createTestData() throws IOException
> >> +    {
> >> +        File rootDir = tempFolder.getRoot();
> >> +        File folder1 = new File( rootDir, "folder1" );
> >> +        folder1.mkdirs();
> >> +
> >> +        FileTestHelper.generateTestFile( new File( rootDir,
> >> "file1.txt" ), 11 );
> >> +        FileTestHelper.generateTestFile( new File( rootDir,
> >> "file2.txt" ), 12 );
> >> +        FileTestHelper.generateTestFile( new File( rootDir,
> >> "file3.dat" ), 13 );
> >> +
> >> +        FileTestHelper.generateTestFile( new File( folder1,
> >> "file4.txt" ), 14 );
> >> +        FileTestHelper.generateTestFile( new File( folder1,
> >> "file5.dat" ), 15 );
> >> +
> >> +        File folder2 = new File( folder1, "ignorefolder" );
> >> +        folder2.mkdirs();
> >> +        FileTestHelper.generateTestFile( new File( folder2,
> >> "file7.txt" ), 17 );
> >> +
> >> +    }
> >> +
> >> +    private void removeAndAddSomeFiles() throws IOException
> >> +    {
> >> +        File rootDir = tempFolder.getRoot();
> >> +        File file2 = new File( rootDir, "file2.txt" );
> >> +        file2.delete();
> >> +
> >> +        FileTestHelper.generateTestFile( new File( rootDir,
> >> "folder1/file9.txt" ), 15 );
> >> +
> >> +        File folder2 = new File( rootDir, "folder1/ignorefolder" );
> >> +        FileUtils.deleteDirectory( folder2 );
> >> +    }
> >> +
> >> +    @Test
> >> +    public void testInitialScan() throws Exception
> >> +    {
> >> +        createTestData();
> >> +
> >> +        DirectorySnapshotScanner dss = new DirectorySnapshotScanner(
> >> tempFolder.getRoot() );
> >> +        Assert.assertNotNull( dss );
> >> +
> >> +        // we take the initial snapshot which should result in an
> empty diff
> >> +        dss.capture();
> >> +
> >> +        //X TODO define result of the initial scan. Full directory
> tree or just
> >> an empty array?
> >> +        String[] addedFiles = dss.getFilesAdded();
> >> +        String[] removedFiles = dss.getFilesRemoved();
> >> +        Assert.assertNotNull( addedFiles );
> >> +        Assert.assertNotNull( removedFiles );
> >> +        Assert.assertEquals( 0, addedFiles.length );
> >> +        Assert.assertEquals(0, removedFiles.length );
> >> +
> >> +        // now we change 3 files. add one and remove
> >> +        removeAndAddSomeFiles();
> >> +
> >> +        dss.capture();
> >> +
> >> +        addedFiles = dss.getFilesAdded();
> >> +        removedFiles = dss.getFilesRemoved();
> >> +        Assert.assertNotNull( addedFiles );
> >> +        Assert.assertNotNull( removedFiles );
> >> +        Assert.assertEquals( 1, addedFiles.length );
> >> +        Assert.assertEquals(2, removedFiles.length );
> >> +
> >> +        String[] allFiles = dss.getScannedFiles();
> >> +        Assert.assertNotNull( allFiles );
> >> +        Assert.assertEquals(5, allFiles.length );
> >> +
> >> +    }
> >> +
> >> +
> >> +
> >> +    @Ignore("Enable this test to run performance checks")
> >> +    @Test
> >> +    public void performanceTest() throws Exception {
> >> +
> >> +        File rootFolder = tempFolder.getRoot();
> >> +
> >> +        // do some warmup
> >> +        for ( int i = 1; i < 200; i++ )
> >> +        {
> >> +            createTestData();
> >> +            removeAndAddSomeFiles();
> >> +            FileUtils.deleteDirectory( rootFolder );
> >> +        }
> >> +
> >> +        int cycles = 2000;
> >> +
> >> +        // and now we take the time _without_
> >> +        long startTime = System.nanoTime();
> >> +        for ( int i = 1; i < cycles; i++ )
> >> +        {
> >> +            createTestData();
> >> +            removeAndAddSomeFiles();
> >> +            FileUtils.deleteDirectory( rootFolder );
> >> +            rootFolder.mkdir();
> >> +        }
> >> +        long endTime = System.nanoTime();
> >> +
> >> +        long durationEmptyRun = endTime - startTime;
> >> +        System.out.println( "durationEmptyRun            [ns]: " +
> >> durationEmptyRun);
> >> +
> >> +        startTime = System.nanoTime();
> >> +        for ( int i = 1; i < cycles; i++ )
> >> +        {
> >> +            createTestData();
> >> +            DirectorySnapshotScanner dss = new
> DirectorySnapshotScanner(
> >> rootFolder );
> >> +            dss.capture();
> >> +            removeAndAddSomeFiles();
> >> +            dss.capture();
> >> +
> >> +            FileUtils.deleteDirectory( rootFolder );
> >> +            rootFolder.mkdir();
> >> +        }
> >> +        endTime = System.nanoTime();
> >> +
> >> +        long durationWithSnapshotScanner = endTime - startTime;
> >> +        System.out.println( "durationWithSnapshotScanner [ns]: " +
> >> durationWithSnapshotScanner);
> >> +
> >> +        long dirScannerOverhead = durationWithSnapshotScanner -
> >> durationEmptyRun;
> >> +
> >> +        System.out.println( "Overhead for n cycles [ns]: " +
> >> dirScannerOverhead);
> >> +    }
> >> +
> >> +}
> >>
> >> Propchange:
> >>
> maven/shared/trunk/maven-shared-utils/src/test/java/org/apache/maven/shared/utils/io/DirectorySnapshotScannerTest.java
> >>
> ------------------------------------------------------------------------------
> >>     svn:eol-style = native
> >>
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
> > For additional commands, e-mail: dev-help@maven.apache.org
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
> For additional commands, e-mail: dev-help@maven.apache.org
>
>

Re: svn commit: r1384747 - in /maven/shared/trunk/maven-shared-utils/src: main/java/org/apache/maven/shared/utils/io/DirectorySnapshotScanner.java test/java/org/apache/maven/shared/utils/io/DirectorySnapshotScannerTest.java

Posted by Mark Struberg <st...@yahoo.de>.
Thanks for all the proposals. Kristian had a good idea which I try to work on now. 

Instead of having an own Scanner for this, our good ole DirectoryScanner might return a ScanResult.
This ScanResult can offer a diff method or something similar. Will do some experiments.

LieGrue,
strub



----- Original Message -----
> From: Hervé BOUTEMY <he...@free.fr>
> To: Maven Developers List <de...@maven.apache.org>
> Cc: 
> Sent: Saturday, September 15, 2012 11:17 AM
> Subject: Re: svn commit: r1384747 - in /maven/shared/trunk/maven-shared-utils/src: main/java/org/apache/maven/shared/utils/io/DirectorySnapshotScanner.java test/java/org/apache/maven/shared/utils/io/DirectorySnapshotScannerTest.java
> 
>& quot;Listing"?
> 
> Le vendredi 14 septembre 2012 20:04:23 Anders Hammar a écrit :
>>  Yes, "Snapshot" is not good. "PointInTime"?
>> 
>>  /Anders
>> 
>>  On Fri, Sep 14, 2012 at 3:03 PM, Mark Struberg <st...@yahoo.de> 
> wrote:
>>  > Hi!
>>  > 
>>  > If anyone has a better name for the 'DirectorySnapshotScanner' 
> I would be
>>  > happy to rename it.
>>  > 
>>  > 
>>  > What it makes: it takes a snapshot capture of a directory structure 
> and
>>  > compares it with another snapshot capture of that directory to 
> calculate
>>  > a diff (files added/removed)
>>  > 
>>  > Not sure though if the name 'snapshot' isn't too heavily 
> associated with
>>  > dependency-snapshots, wdyt?
>>  > 
>>  > 
>>  > We will need this for the incremental build support.
>>  > 
>>  > LieGrue,
>>  > strub
>>  > 
>>  > 
>>  > 
>>  > ----- Original Message -----
>>  > 
>>  >> From: "struberg@apache.org" <st...@apache.org>
>>  >> To: commits@maven.apache.org
>>  >> Cc:
>>  >> Sent: Friday, September 14, 2012 2:57 PM
>>  >> Subject: svn commit: r1384747 - in
>>  >> /maven/shared/trunk/maven-shared-utils/src:
>>  >> 
> main/java/org/apache/maven/shared/utils/io/DirectorySnapshotScanner.java
>>  >> 
> test/java/org/apache/maven/shared/utils/io/DirectorySnapshotScannerTest.
>>  >> java
>>  >> 
>>  >> Author: struberg
>>  >> Date: Fri Sep 14 12:57:24 2012
>>  >> New Revision: 1384747
>>  >> 
>>  >> URL: http://svn.apache.org/viewvc?rev=1384747&view=rev
>>  >> Log:
>>  >> MSHARED-243 add DirectorySnapshotScanner
>>  >> 
>>  >> This allows to take snapshot captures of a directory and
>>  >> calculate the 'diff' between those (files added/removed).
>>  >> 
>>  >> Added:
>>  >> 
>>  >> 
> maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shar
>>  >> ed/utils/io/DirectorySnapshotScanner.java (with props)
>>  >> 
>>  >> 
> maven/shared/trunk/maven-shared-utils/src/test/java/org/apache/maven/shar
>>  >> ed/utils/io/DirectorySnapshotScannerTest.java (with props)
>>  >> 
>>  >> Added:
>>  >> 
> maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shar
>>  >> ed/utils/io/DirectorySnapshotScanner.java URL:
>>  >> 
> http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-utils/src/ma
>>  >> 
> in/java/org/apache/maven/shared/utils/io/DirectorySnapshotScanner.java?re
>>  >> v=1384747&view=auto
>>  >> 
> ========================================================================
>>  >> ====== ---
>>  >> 
> maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shar
>>  >> ed/utils/io/DirectorySnapshotScanner.java (added)
>>  >> +++
>>  >> 
> maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shar
>>  >> ed/utils/io/DirectorySnapshotScanner.java Fri Sep 14 12:57:24 2012
>>  >> @@ -0,0 +1,139 @@
>>  >> +package org.apache.maven.shared.utils.io;
>>  >> +
>>  >> +/*
>>  >> + * 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.apache.maven.shared.utils.CollectionUtils;
>>  >> +
>>  >> +import java.io.File;
>>  >> +import java.util.ArrayList;
>>  >> +import java.util.List;
>>  >> +import java.util.Set;
>>  >> +
>>  >> +/**
>>  >> + * Scan for files in a directory at a given time and reports 
> removed and
>>  >> added files
>>  >> + * between captures.
>>  >> + */
>>  >> +public class DirectorySnapshotScanner
>>  >> +{
>>  >> +    private final static String[] NO_FILES = new String[0];
>>  >> +
>>  >> +    private File rootDirectory;
>>  >> +    private String[] scannedOldFiles;
>>  >> +    private String[] scannedNewFiles = NO_FILES;
>>  >> +    private String[] filesAdded;
>>  >> +    private String[] filesRemoved;
>>  >> +
>>  >> +    public DirectorySnapshotScanner( File rootDirectory )
>>  >> +    {
>>  >> +        this.rootDirectory = rootDirectory;
>>  >> +    }
>>  >> +
>>  >> +    public void capture()
>>  >> +    {
>>  >> +        DirectoryScanner ds = new DirectoryScanner();
>>  >> +        capture( ds );
>>  >> +    }
>>  >> +
>>  >> +    public void capture( DirectoryScanner ds )
>>  >> +    {
>>  >> +        ds.setBasedir( rootDirectory );
>>  >> +        ds.scan();
>>  >> +
>>  >> +        scannedNewFiles = ds.getIncludedFiles();
>>  >> +
>>  >> +        if ( scannedOldFiles != null )
>>  >> +        {
>>  >> +            calculateDiff( scannedOldFiles, scannedNewFiles );
>>  >> +
>>  >> +        }
>>  >> +        else
>>  >> +        {
>>  >> +            filesAdded = NO_FILES;
>>  >> +            filesRemoved = NO_FILES;
>>  >> +        }
>>  >> +
>>  >> +        // this attempts new files is the baseline for the next 
> scan
>>  >> +        scannedOldFiles = scannedNewFiles;
>>  >> +    }
>>  >> +
>>  >> +    /**
>>  >> +     * @return all files which got scanned during the last 
> capture.
>>  >> +     */
>>  >> +    public String[] getScannedFiles()
>>  >> +    {
>>  >> +        return scannedNewFiles;
>>  >> +    }
>>  >> +
>>  >> +    /**
>>  >> +     * @return all files which got detected as being added 
> between 2
>>  >> capture calls
>>  >> +     */
>>  >> +    public String[] getFilesAdded()
>>  >> +    {
>>  >> +        return filesAdded;
>>  >> +    }
>>  >> +
>>  >> +    /**
>>  >> +     * @return all files which got detected as being removed 
> between 2
>>  >> capture calls
>>  >> +     */
>>  >> +    public String[] getFilesRemoved()
>>  >> +    {
>>  >> +        return filesRemoved;
>>  >> +    }
>>  >> +
>>  >> +    /**
>>  >> +     * Determine the file differences between the oldFiles and 
> newFiles.
>>  >> +     * This method will not look for a changed in content but 
> sole in
>>  >> the
>>  >> +     * list of files given.
>>  >> +     *
>>  >> +     * The result of the diff can be queried by the methods
>>  >> +     * {@link #getFilesAdded()} and {@link #getFilesRemoved()}
>>  >> +     *
>>  >> +     * @param oldFiles
>>  >> +     * @param newFiles
>>  >> +     */
>>  >> +    public void calculateDiff( String[] oldFiles, String[] 
> newFiles )
>>  >> +    {
>>  >> +        Set<String> oldFileSet = 
> CollectionUtils.arrayAsHashSet(
>>  >> oldFiles
>>  >> );
>>  >> +        Set<String> newFileSet = 
> CollectionUtils.arrayAsHashSet(
>>  >> newFiles
>>  >> );
>>  >> +
>>  >> +        List<String> added = new ArrayList<String>();
>>  >> +        List<String> removed = new 
> ArrayList<String>();
>>  >> +
>>  >> +        for ( String oldFile : oldFileSet )
>>  >> +        {
>>  >> +            if ( !newFileSet.contains( oldFile ) )
>>  >> +            {
>>  >> +                removed.add( oldFile );
>>  >> +            }
>>  >> +        }
>>  >> +
>>  >> +        for ( String newFile : newFileSet )
>>  >> +        {
>>  >> +            if ( !oldFileSet.contains( newFile ) )
>>  >> +            {
>>  >> +                added.add( newFile );
>>  >> +            }
>>  >> +        }
>>  >> +
>>  >> +        filesAdded = added.toArray( new String[ added.size() ] );
>>  >> +        filesRemoved = removed.toArray( new String[ 
> removed.size() ] );
>>  >> +    }
>>  >> +
>>  >> +}
>>  >> 
>>  >> Propchange:
>>  >> 
> maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shar
>>  >> ed/utils/io/DirectorySnapshotScanner.java
>>  >> 
> ------------------------------------------------------------------------
>>  >> ------>> 
>>  >>     svn:eol-style = native
>>  >> 
>>  >> Added:
>>  >> 
> maven/shared/trunk/maven-shared-utils/src/test/java/org/apache/maven/shar
>>  >> ed/utils/io/DirectorySnapshotScannerTest.java URL:
>>  >> 
> http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-utils/src/te
>>  >> 
> st/java/org/apache/maven/shared/utils/io/DirectorySnapshotScannerTest.jav
>>  >> a?rev=1384747&view=auto
>>  >> 
> ========================================================================
>>  >> ====== ---
>>  >> 
> maven/shared/trunk/maven-shared-utils/src/test/java/org/apache/maven/shar
>>  >> ed/utils/io/DirectorySnapshotScannerTest.java (added)
>>  >> +++
>>  >> 
> maven/shared/trunk/maven-shared-utils/src/test/java/org/apache/maven/shar
>>  >> ed/utils/io/DirectorySnapshotScannerTest.java Fri Sep 14 12:57:24 
> 2012
>>  >> @@ -0,0 +1,161 @@
>>  >> +package org.apache.maven.shared.utils.io;
>>  >> +
>>  >> +/*
>>  >> + * 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.apache.maven.shared.utils.testhelpers.FileTestHelper;
>>  >> +import org.junit.Test;
>>  >> +import org.junit.Rule;
>>  >> +import org.junit.Ignore;
>>  >> +import org.junit.Assert;
>>  >> +import org.junit.rules.TemporaryFolder;
>>  >> +
>>  >> +import java.io.File;
>>  >> +import java.io.IOException;
>>  >> +
>>  >> +public class DirectorySnapshotScannerTest
>>  >> +{
>>  >> +
>>  >> +    @Rule
>>  >> +    public TemporaryFolder tempFolder = new TemporaryFolder();
>>  >> +
>>  >> +    private void createTestData() throws IOException
>>  >> +    {
>>  >> +        File rootDir = tempFolder.getRoot();
>>  >> +        File folder1 = new File( rootDir, "folder1" );
>>  >> +        folder1.mkdirs();
>>  >> +
>>  >> +        FileTestHelper.generateTestFile( new File( rootDir,
>>  >> "file1.txt" ), 11 );
>>  >> +        FileTestHelper.generateTestFile( new File( rootDir,
>>  >> "file2.txt" ), 12 );
>>  >> +        FileTestHelper.generateTestFile( new File( rootDir,
>>  >> "file3.dat" ), 13 );
>>  >> +
>>  >> +        FileTestHelper.generateTestFile( new File( folder1,
>>  >> "file4.txt" ), 14 );
>>  >> +        FileTestHelper.generateTestFile( new File( folder1,
>>  >> "file5.dat" ), 15 );
>>  >> +
>>  >> +        File folder2 = new File( folder1, 
> "ignorefolder" );
>>  >> +        folder2.mkdirs();
>>  >> +        FileTestHelper.generateTestFile( new File( folder2,
>>  >> "file7.txt" ), 17 );
>>  >> +
>>  >> +    }
>>  >> +
>>  >> +    private void removeAndAddSomeFiles() throws IOException
>>  >> +    {
>>  >> +        File rootDir = tempFolder.getRoot();
>>  >> +        File file2 = new File( rootDir, "file2.txt" );
>>  >> +        file2.delete();
>>  >> +
>>  >> +        FileTestHelper.generateTestFile( new File( rootDir,
>>  >> "folder1/file9.txt" ), 15 );
>>  >> +
>>  >> +        File folder2 = new File( rootDir, 
> "folder1/ignorefolder" );
>>  >> +        FileUtils.deleteDirectory( folder2 );
>>  >> +    }
>>  >> +
>>  >> +    @Test
>>  >> +    public void testInitialScan() throws Exception
>>  >> +    {
>>  >> +        createTestData();
>>  >> +
>>  >> +        DirectorySnapshotScanner dss = new 
> DirectorySnapshotScanner(
>>  >> tempFolder.getRoot() );
>>  >> +        Assert.assertNotNull( dss );
>>  >> +
>>  >> +        // we take the initial snapshot which should result in an 
> empty
>>  >> diff +        dss.capture();
>>  >> +
>>  >> +        //X TODO define result of the initial scan. Full 
> directory tree
>>  >> or just an empty array?
>>  >> +        String[] addedFiles = dss.getFilesAdded();
>>  >> +        String[] removedFiles = dss.getFilesRemoved();
>>  >> +        Assert.assertNotNull( addedFiles );
>>  >> +        Assert.assertNotNull( removedFiles );
>>  >> +        Assert.assertEquals( 0, addedFiles.length );
>>  >> +        Assert.assertEquals(0, removedFiles.length );
>>  >> +
>>  >> +        // now we change 3 files. add one and remove
>>  >> +        removeAndAddSomeFiles();
>>  >> +
>>  >> +        dss.capture();
>>  >> +
>>  >> +        addedFiles = dss.getFilesAdded();
>>  >> +        removedFiles = dss.getFilesRemoved();
>>  >> +        Assert.assertNotNull( addedFiles );
>>  >> +        Assert.assertNotNull( removedFiles );
>>  >> +        Assert.assertEquals( 1, addedFiles.length );
>>  >> +        Assert.assertEquals(2, removedFiles.length );
>>  >> +
>>  >> +        String[] allFiles = dss.getScannedFiles();
>>  >> +        Assert.assertNotNull( allFiles );
>>  >> +        Assert.assertEquals(5, allFiles.length );
>>  >> +
>>  >> +    }
>>  >> +
>>  >> +
>>  >> +
>>  >> +    @Ignore("Enable this test to run performance 
> checks")
>>  >> +    @Test
>>  >> +    public void performanceTest() throws Exception {
>>  >> +
>>  >> +        File rootFolder = tempFolder.getRoot();
>>  >> +
>>  >> +        // do some warmup
>>  >> +        for ( int i = 1; i < 200; i++ )
>>  >> +        {
>>  >> +            createTestData();
>>  >> +            removeAndAddSomeFiles();
>>  >> +            FileUtils.deleteDirectory( rootFolder );
>>  >> +        }
>>  >> +
>>  >> +        int cycles = 2000;
>>  >> +
>>  >> +        // and now we take the time _without_
>>  >> +        long startTime = System.nanoTime();
>>  >> +        for ( int i = 1; i < cycles; i++ )
>>  >> +        {
>>  >> +            createTestData();
>>  >> +            removeAndAddSomeFiles();
>>  >> +            FileUtils.deleteDirectory( rootFolder );
>>  >> +            rootFolder.mkdir();
>>  >> +        }
>>  >> +        long endTime = System.nanoTime();
>>  >> +
>>  >> +        long durationEmptyRun = endTime - startTime;
>>  >> +        System.out.println( "durationEmptyRun            
> [ns]: " +
>>  >> durationEmptyRun);
>>  >> +
>>  >> +        startTime = System.nanoTime();
>>  >> +        for ( int i = 1; i < cycles; i++ )
>>  >> +        {
>>  >> +            createTestData();
>>  >> +            DirectorySnapshotScanner dss = new 
> DirectorySnapshotScanner(
>>  >> rootFolder );
>>  >> +            dss.capture();
>>  >> +            removeAndAddSomeFiles();
>>  >> +            dss.capture();
>>  >> +
>>  >> +            FileUtils.deleteDirectory( rootFolder );
>>  >> +            rootFolder.mkdir();
>>  >> +        }
>>  >> +        endTime = System.nanoTime();
>>  >> +
>>  >> +        long durationWithSnapshotScanner = endTime - startTime;
>>  >> +        System.out.println( "durationWithSnapshotScanner 
> [ns]: " +
>>  >> durationWithSnapshotScanner);
>>  >> +
>>  >> +        long dirScannerOverhead = durationWithSnapshotScanner -
>>  >> durationEmptyRun;
>>  >> +
>>  >> +        System.out.println( "Overhead for n cycles [ns]: 
> " +
>>  >> dirScannerOverhead);
>>  >> +    }
>>  >> +
>>  >> +}
>>  >> 
>>  >> Propchange:
>>  >> 
> maven/shared/trunk/maven-shared-utils/src/test/java/org/apache/maven/shar
>>  >> ed/utils/io/DirectorySnapshotScannerTest.java
>>  >> 
> ------------------------------------------------------------------------
>>  >> ------>> 
>>  >>     svn:eol-style = native
>>  > 
>>  > ---------------------------------------------------------------------
>>  > To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
>>  > For additional commands, e-mail: dev-help@maven.apache.org
>> 
>>  ---------------------------------------------------------------------
>>  To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
>>  For additional commands, e-mail: dev-help@maven.apache.org
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
> For additional commands, e-mail: dev-help@maven.apache.org
> 

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
For additional commands, e-mail: dev-help@maven.apache.org


Re: svn commit: r1384747 - in /maven/shared/trunk/maven-shared-utils/src: main/java/org/apache/maven/shared/utils/io/DirectorySnapshotScanner.java test/java/org/apache/maven/shared/utils/io/DirectorySnapshotScannerTest.java

Posted by Hervé BOUTEMY <he...@free.fr>.
"Listing"?

Le vendredi 14 septembre 2012 20:04:23 Anders Hammar a écrit :
> Yes, "Snapshot" is not good. "PointInTime"?
> 
> /Anders
> 
> On Fri, Sep 14, 2012 at 3:03 PM, Mark Struberg <st...@yahoo.de> wrote:
> > Hi!
> > 
> > If anyone has a better name for the 'DirectorySnapshotScanner' I would be
> > happy to rename it.
> > 
> > 
> > What it makes: it takes a snapshot capture of a directory structure and
> > compares it with another snapshot capture of that directory to calculate
> > a diff (files added/removed)
> > 
> > Not sure though if the name 'snapshot' isn't too heavily associated with
> > dependency-snapshots, wdyt?
> > 
> > 
> > We will need this for the incremental build support.
> > 
> > LieGrue,
> > strub
> > 
> > 
> > 
> > ----- Original Message -----
> > 
> >> From: "struberg@apache.org" <st...@apache.org>
> >> To: commits@maven.apache.org
> >> Cc:
> >> Sent: Friday, September 14, 2012 2:57 PM
> >> Subject: svn commit: r1384747 - in
> >> /maven/shared/trunk/maven-shared-utils/src:
> >> main/java/org/apache/maven/shared/utils/io/DirectorySnapshotScanner.java
> >> test/java/org/apache/maven/shared/utils/io/DirectorySnapshotScannerTest.
> >> java
> >> 
> >> Author: struberg
> >> Date: Fri Sep 14 12:57:24 2012
> >> New Revision: 1384747
> >> 
> >> URL: http://svn.apache.org/viewvc?rev=1384747&view=rev
> >> Log:
> >> MSHARED-243 add DirectorySnapshotScanner
> >> 
> >> This allows to take snapshot captures of a directory and
> >> calculate the 'diff' between those (files added/removed).
> >> 
> >> Added:
> >> 
> >> maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shar
> >> ed/utils/io/DirectorySnapshotScanner.java (with props)
> >> 
> >> maven/shared/trunk/maven-shared-utils/src/test/java/org/apache/maven/shar
> >> ed/utils/io/DirectorySnapshotScannerTest.java (with props)
> >> 
> >> Added:
> >> maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shar
> >> ed/utils/io/DirectorySnapshotScanner.java URL:
> >> http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-utils/src/ma
> >> in/java/org/apache/maven/shared/utils/io/DirectorySnapshotScanner.java?re
> >> v=1384747&view=auto
> >> ========================================================================
> >> ====== ---
> >> maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shar
> >> ed/utils/io/DirectorySnapshotScanner.java (added)
> >> +++
> >> maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shar
> >> ed/utils/io/DirectorySnapshotScanner.java Fri Sep 14 12:57:24 2012
> >> @@ -0,0 +1,139 @@
> >> +package org.apache.maven.shared.utils.io;
> >> +
> >> +/*
> >> + * 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.apache.maven.shared.utils.CollectionUtils;
> >> +
> >> +import java.io.File;
> >> +import java.util.ArrayList;
> >> +import java.util.List;
> >> +import java.util.Set;
> >> +
> >> +/**
> >> + * Scan for files in a directory at a given time and reports removed and
> >> added files
> >> + * between captures.
> >> + */
> >> +public class DirectorySnapshotScanner
> >> +{
> >> +    private final static String[] NO_FILES = new String[0];
> >> +
> >> +    private File rootDirectory;
> >> +    private String[] scannedOldFiles;
> >> +    private String[] scannedNewFiles = NO_FILES;
> >> +    private String[] filesAdded;
> >> +    private String[] filesRemoved;
> >> +
> >> +    public DirectorySnapshotScanner( File rootDirectory )
> >> +    {
> >> +        this.rootDirectory = rootDirectory;
> >> +    }
> >> +
> >> +    public void capture()
> >> +    {
> >> +        DirectoryScanner ds = new DirectoryScanner();
> >> +        capture( ds );
> >> +    }
> >> +
> >> +    public void capture( DirectoryScanner ds )
> >> +    {
> >> +        ds.setBasedir( rootDirectory );
> >> +        ds.scan();
> >> +
> >> +        scannedNewFiles = ds.getIncludedFiles();
> >> +
> >> +        if ( scannedOldFiles != null )
> >> +        {
> >> +            calculateDiff( scannedOldFiles, scannedNewFiles );
> >> +
> >> +        }
> >> +        else
> >> +        {
> >> +            filesAdded = NO_FILES;
> >> +            filesRemoved = NO_FILES;
> >> +        }
> >> +
> >> +        // this attempts new files is the baseline for the next scan
> >> +        scannedOldFiles = scannedNewFiles;
> >> +    }
> >> +
> >> +    /**
> >> +     * @return all files which got scanned during the last capture.
> >> +     */
> >> +    public String[] getScannedFiles()
> >> +    {
> >> +        return scannedNewFiles;
> >> +    }
> >> +
> >> +    /**
> >> +     * @return all files which got detected as being added between 2
> >> capture calls
> >> +     */
> >> +    public String[] getFilesAdded()
> >> +    {
> >> +        return filesAdded;
> >> +    }
> >> +
> >> +    /**
> >> +     * @return all files which got detected as being removed between 2
> >> capture calls
> >> +     */
> >> +    public String[] getFilesRemoved()
> >> +    {
> >> +        return filesRemoved;
> >> +    }
> >> +
> >> +    /**
> >> +     * Determine the file differences between the oldFiles and newFiles.
> >> +     * This method will not look for a changed in content but sole in
> >> the
> >> +     * list of files given.
> >> +     *
> >> +     * The result of the diff can be queried by the methods
> >> +     * {@link #getFilesAdded()} and {@link #getFilesRemoved()}
> >> +     *
> >> +     * @param oldFiles
> >> +     * @param newFiles
> >> +     */
> >> +    public void calculateDiff( String[] oldFiles, String[] newFiles )
> >> +    {
> >> +        Set<String> oldFileSet = CollectionUtils.arrayAsHashSet(
> >> oldFiles
> >> );
> >> +        Set<String> newFileSet = CollectionUtils.arrayAsHashSet(
> >> newFiles
> >> );
> >> +
> >> +        List<String> added = new ArrayList<String>();
> >> +        List<String> removed = new ArrayList<String>();
> >> +
> >> +        for ( String oldFile : oldFileSet )
> >> +        {
> >> +            if ( !newFileSet.contains( oldFile ) )
> >> +            {
> >> +                removed.add( oldFile );
> >> +            }
> >> +        }
> >> +
> >> +        for ( String newFile : newFileSet )
> >> +        {
> >> +            if ( !oldFileSet.contains( newFile ) )
> >> +            {
> >> +                added.add( newFile );
> >> +            }
> >> +        }
> >> +
> >> +        filesAdded = added.toArray( new String[ added.size() ] );
> >> +        filesRemoved = removed.toArray( new String[ removed.size() ] );
> >> +    }
> >> +
> >> +}
> >> 
> >> Propchange:
> >> maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shar
> >> ed/utils/io/DirectorySnapshotScanner.java
> >> ------------------------------------------------------------------------
> >> ------>> 
> >>     svn:eol-style = native
> >> 
> >> Added:
> >> maven/shared/trunk/maven-shared-utils/src/test/java/org/apache/maven/shar
> >> ed/utils/io/DirectorySnapshotScannerTest.java URL:
> >> http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-utils/src/te
> >> st/java/org/apache/maven/shared/utils/io/DirectorySnapshotScannerTest.jav
> >> a?rev=1384747&view=auto
> >> ========================================================================
> >> ====== ---
> >> maven/shared/trunk/maven-shared-utils/src/test/java/org/apache/maven/shar
> >> ed/utils/io/DirectorySnapshotScannerTest.java (added)
> >> +++
> >> maven/shared/trunk/maven-shared-utils/src/test/java/org/apache/maven/shar
> >> ed/utils/io/DirectorySnapshotScannerTest.java Fri Sep 14 12:57:24 2012
> >> @@ -0,0 +1,161 @@
> >> +package org.apache.maven.shared.utils.io;
> >> +
> >> +/*
> >> + * 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.apache.maven.shared.utils.testhelpers.FileTestHelper;
> >> +import org.junit.Test;
> >> +import org.junit.Rule;
> >> +import org.junit.Ignore;
> >> +import org.junit.Assert;
> >> +import org.junit.rules.TemporaryFolder;
> >> +
> >> +import java.io.File;
> >> +import java.io.IOException;
> >> +
> >> +public class DirectorySnapshotScannerTest
> >> +{
> >> +
> >> +    @Rule
> >> +    public TemporaryFolder tempFolder = new TemporaryFolder();
> >> +
> >> +    private void createTestData() throws IOException
> >> +    {
> >> +        File rootDir = tempFolder.getRoot();
> >> +        File folder1 = new File( rootDir, "folder1" );
> >> +        folder1.mkdirs();
> >> +
> >> +        FileTestHelper.generateTestFile( new File( rootDir,
> >> "file1.txt" ), 11 );
> >> +        FileTestHelper.generateTestFile( new File( rootDir,
> >> "file2.txt" ), 12 );
> >> +        FileTestHelper.generateTestFile( new File( rootDir,
> >> "file3.dat" ), 13 );
> >> +
> >> +        FileTestHelper.generateTestFile( new File( folder1,
> >> "file4.txt" ), 14 );
> >> +        FileTestHelper.generateTestFile( new File( folder1,
> >> "file5.dat" ), 15 );
> >> +
> >> +        File folder2 = new File( folder1, "ignorefolder" );
> >> +        folder2.mkdirs();
> >> +        FileTestHelper.generateTestFile( new File( folder2,
> >> "file7.txt" ), 17 );
> >> +
> >> +    }
> >> +
> >> +    private void removeAndAddSomeFiles() throws IOException
> >> +    {
> >> +        File rootDir = tempFolder.getRoot();
> >> +        File file2 = new File( rootDir, "file2.txt" );
> >> +        file2.delete();
> >> +
> >> +        FileTestHelper.generateTestFile( new File( rootDir,
> >> "folder1/file9.txt" ), 15 );
> >> +
> >> +        File folder2 = new File( rootDir, "folder1/ignorefolder" );
> >> +        FileUtils.deleteDirectory( folder2 );
> >> +    }
> >> +
> >> +    @Test
> >> +    public void testInitialScan() throws Exception
> >> +    {
> >> +        createTestData();
> >> +
> >> +        DirectorySnapshotScanner dss = new DirectorySnapshotScanner(
> >> tempFolder.getRoot() );
> >> +        Assert.assertNotNull( dss );
> >> +
> >> +        // we take the initial snapshot which should result in an empty
> >> diff +        dss.capture();
> >> +
> >> +        //X TODO define result of the initial scan. Full directory tree
> >> or just an empty array?
> >> +        String[] addedFiles = dss.getFilesAdded();
> >> +        String[] removedFiles = dss.getFilesRemoved();
> >> +        Assert.assertNotNull( addedFiles );
> >> +        Assert.assertNotNull( removedFiles );
> >> +        Assert.assertEquals( 0, addedFiles.length );
> >> +        Assert.assertEquals(0, removedFiles.length );
> >> +
> >> +        // now we change 3 files. add one and remove
> >> +        removeAndAddSomeFiles();
> >> +
> >> +        dss.capture();
> >> +
> >> +        addedFiles = dss.getFilesAdded();
> >> +        removedFiles = dss.getFilesRemoved();
> >> +        Assert.assertNotNull( addedFiles );
> >> +        Assert.assertNotNull( removedFiles );
> >> +        Assert.assertEquals( 1, addedFiles.length );
> >> +        Assert.assertEquals(2, removedFiles.length );
> >> +
> >> +        String[] allFiles = dss.getScannedFiles();
> >> +        Assert.assertNotNull( allFiles );
> >> +        Assert.assertEquals(5, allFiles.length );
> >> +
> >> +    }
> >> +
> >> +
> >> +
> >> +    @Ignore("Enable this test to run performance checks")
> >> +    @Test
> >> +    public void performanceTest() throws Exception {
> >> +
> >> +        File rootFolder = tempFolder.getRoot();
> >> +
> >> +        // do some warmup
> >> +        for ( int i = 1; i < 200; i++ )
> >> +        {
> >> +            createTestData();
> >> +            removeAndAddSomeFiles();
> >> +            FileUtils.deleteDirectory( rootFolder );
> >> +        }
> >> +
> >> +        int cycles = 2000;
> >> +
> >> +        // and now we take the time _without_
> >> +        long startTime = System.nanoTime();
> >> +        for ( int i = 1; i < cycles; i++ )
> >> +        {
> >> +            createTestData();
> >> +            removeAndAddSomeFiles();
> >> +            FileUtils.deleteDirectory( rootFolder );
> >> +            rootFolder.mkdir();
> >> +        }
> >> +        long endTime = System.nanoTime();
> >> +
> >> +        long durationEmptyRun = endTime - startTime;
> >> +        System.out.println( "durationEmptyRun            [ns]: " +
> >> durationEmptyRun);
> >> +
> >> +        startTime = System.nanoTime();
> >> +        for ( int i = 1; i < cycles; i++ )
> >> +        {
> >> +            createTestData();
> >> +            DirectorySnapshotScanner dss = new DirectorySnapshotScanner(
> >> rootFolder );
> >> +            dss.capture();
> >> +            removeAndAddSomeFiles();
> >> +            dss.capture();
> >> +
> >> +            FileUtils.deleteDirectory( rootFolder );
> >> +            rootFolder.mkdir();
> >> +        }
> >> +        endTime = System.nanoTime();
> >> +
> >> +        long durationWithSnapshotScanner = endTime - startTime;
> >> +        System.out.println( "durationWithSnapshotScanner [ns]: " +
> >> durationWithSnapshotScanner);
> >> +
> >> +        long dirScannerOverhead = durationWithSnapshotScanner -
> >> durationEmptyRun;
> >> +
> >> +        System.out.println( "Overhead for n cycles [ns]: " +
> >> dirScannerOverhead);
> >> +    }
> >> +
> >> +}
> >> 
> >> Propchange:
> >> maven/shared/trunk/maven-shared-utils/src/test/java/org/apache/maven/shar
> >> ed/utils/io/DirectorySnapshotScannerTest.java
> >> ------------------------------------------------------------------------
> >> ------>> 
> >>     svn:eol-style = native
> > 
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
> > For additional commands, e-mail: dev-help@maven.apache.org
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
> For additional commands, e-mail: dev-help@maven.apache.org

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
For additional commands, e-mail: dev-help@maven.apache.org


Re: svn commit: r1384747 - in /maven/shared/trunk/maven-shared-utils/src: main/java/org/apache/maven/shared/utils/io/DirectorySnapshotScanner.java test/java/org/apache/maven/shared/utils/io/DirectorySnapshotScannerTest.java

Posted by Anders Hammar <an...@hammar.net>.
Yes, "Snapshot" is not good. "PointInTime"?

/Anders
On Fri, Sep 14, 2012 at 3:03 PM, Mark Struberg <st...@yahoo.de> wrote:
> Hi!
>
> If anyone has a better name for the 'DirectorySnapshotScanner' I would be happy to rename it.
>
>
> What it makes: it takes a snapshot capture of a directory structure and compares it with another snapshot capture of that directory to calculate a diff (files added/removed)
>
> Not sure though if the name 'snapshot' isn't too heavily associated with dependency-snapshots, wdyt?
>
>
> We will need this for the incremental build support.
>
> LieGrue,
> strub
>
>
>
> ----- Original Message -----
>> From: "struberg@apache.org" <st...@apache.org>
>> To: commits@maven.apache.org
>> Cc:
>> Sent: Friday, September 14, 2012 2:57 PM
>> Subject: svn commit: r1384747 - in /maven/shared/trunk/maven-shared-utils/src: main/java/org/apache/maven/shared/utils/io/DirectorySnapshotScanner.java test/java/org/apache/maven/shared/utils/io/DirectorySnapshotScannerTest.java
>>
>> Author: struberg
>> Date: Fri Sep 14 12:57:24 2012
>> New Revision: 1384747
>>
>> URL: http://svn.apache.org/viewvc?rev=1384747&view=rev
>> Log:
>> MSHARED-243 add DirectorySnapshotScanner
>>
>> This allows to take snapshot captures of a directory and
>> calculate the 'diff' between those (files added/removed).
>>
>> Added:
>>
>> maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/DirectorySnapshotScanner.java
>> (with props)
>>
>> maven/shared/trunk/maven-shared-utils/src/test/java/org/apache/maven/shared/utils/io/DirectorySnapshotScannerTest.java
>> (with props)
>>
>> Added:
>> maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/DirectorySnapshotScanner.java
>> URL:
>> http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/DirectorySnapshotScanner.java?rev=1384747&view=auto
>> ==============================================================================
>> ---
>> maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/DirectorySnapshotScanner.java
>> (added)
>> +++
>> maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/DirectorySnapshotScanner.java
>> Fri Sep 14 12:57:24 2012
>> @@ -0,0 +1,139 @@
>> +package org.apache.maven.shared.utils.io;
>> +
>> +/*
>> + * 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.apache.maven.shared.utils.CollectionUtils;
>> +
>> +import java.io.File;
>> +import java.util.ArrayList;
>> +import java.util.List;
>> +import java.util.Set;
>> +
>> +/**
>> + * Scan for files in a directory at a given time and reports removed and added
>> files
>> + * between captures.
>> + */
>> +public class DirectorySnapshotScanner
>> +{
>> +    private final static String[] NO_FILES = new String[0];
>> +
>> +    private File rootDirectory;
>> +    private String[] scannedOldFiles;
>> +    private String[] scannedNewFiles = NO_FILES;
>> +    private String[] filesAdded;
>> +    private String[] filesRemoved;
>> +
>> +    public DirectorySnapshotScanner( File rootDirectory )
>> +    {
>> +        this.rootDirectory = rootDirectory;
>> +    }
>> +
>> +    public void capture()
>> +    {
>> +        DirectoryScanner ds = new DirectoryScanner();
>> +        capture( ds );
>> +    }
>> +
>> +    public void capture( DirectoryScanner ds )
>> +    {
>> +        ds.setBasedir( rootDirectory );
>> +        ds.scan();
>> +
>> +        scannedNewFiles = ds.getIncludedFiles();
>> +
>> +        if ( scannedOldFiles != null )
>> +        {
>> +            calculateDiff( scannedOldFiles, scannedNewFiles );
>> +
>> +        }
>> +        else
>> +        {
>> +            filesAdded = NO_FILES;
>> +            filesRemoved = NO_FILES;
>> +        }
>> +
>> +        // this attempts new files is the baseline for the next scan
>> +        scannedOldFiles = scannedNewFiles;
>> +    }
>> +
>> +    /**
>> +     * @return all files which got scanned during the last capture.
>> +     */
>> +    public String[] getScannedFiles()
>> +    {
>> +        return scannedNewFiles;
>> +    }
>> +
>> +    /**
>> +     * @return all files which got detected as being added between 2 capture
>> calls
>> +     */
>> +    public String[] getFilesAdded()
>> +    {
>> +        return filesAdded;
>> +    }
>> +
>> +    /**
>> +     * @return all files which got detected as being removed between 2 capture
>> calls
>> +     */
>> +    public String[] getFilesRemoved()
>> +    {
>> +        return filesRemoved;
>> +    }
>> +
>> +    /**
>> +     * Determine the file differences between the oldFiles and newFiles.
>> +     * This method will not look for a changed in content but sole in the
>> +     * list of files given.
>> +     *
>> +     * The result of the diff can be queried by the methods
>> +     * {@link #getFilesAdded()} and {@link #getFilesRemoved()}
>> +     *
>> +     * @param oldFiles
>> +     * @param newFiles
>> +     */
>> +    public void calculateDiff( String[] oldFiles, String[] newFiles )
>> +    {
>> +        Set<String> oldFileSet = CollectionUtils.arrayAsHashSet( oldFiles
>> );
>> +        Set<String> newFileSet = CollectionUtils.arrayAsHashSet( newFiles
>> );
>> +
>> +        List<String> added = new ArrayList<String>();
>> +        List<String> removed = new ArrayList<String>();
>> +
>> +        for ( String oldFile : oldFileSet )
>> +        {
>> +            if ( !newFileSet.contains( oldFile ) )
>> +            {
>> +                removed.add( oldFile );
>> +            }
>> +        }
>> +
>> +        for ( String newFile : newFileSet )
>> +        {
>> +            if ( !oldFileSet.contains( newFile ) )
>> +            {
>> +                added.add( newFile );
>> +            }
>> +        }
>> +
>> +        filesAdded = added.toArray( new String[ added.size() ] );
>> +        filesRemoved = removed.toArray( new String[ removed.size() ] );
>> +    }
>> +
>> +}
>>
>> Propchange:
>> maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/DirectorySnapshotScanner.java
>> ------------------------------------------------------------------------------
>>     svn:eol-style = native
>>
>> Added:
>> maven/shared/trunk/maven-shared-utils/src/test/java/org/apache/maven/shared/utils/io/DirectorySnapshotScannerTest.java
>> URL:
>> http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-utils/src/test/java/org/apache/maven/shared/utils/io/DirectorySnapshotScannerTest.java?rev=1384747&view=auto
>> ==============================================================================
>> ---
>> maven/shared/trunk/maven-shared-utils/src/test/java/org/apache/maven/shared/utils/io/DirectorySnapshotScannerTest.java
>> (added)
>> +++
>> maven/shared/trunk/maven-shared-utils/src/test/java/org/apache/maven/shared/utils/io/DirectorySnapshotScannerTest.java
>> Fri Sep 14 12:57:24 2012
>> @@ -0,0 +1,161 @@
>> +package org.apache.maven.shared.utils.io;
>> +
>> +/*
>> + * 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.apache.maven.shared.utils.testhelpers.FileTestHelper;
>> +import org.junit.Test;
>> +import org.junit.Rule;
>> +import org.junit.Ignore;
>> +import org.junit.Assert;
>> +import org.junit.rules.TemporaryFolder;
>> +
>> +import java.io.File;
>> +import java.io.IOException;
>> +
>> +public class DirectorySnapshotScannerTest
>> +{
>> +
>> +    @Rule
>> +    public TemporaryFolder tempFolder = new TemporaryFolder();
>> +
>> +    private void createTestData() throws IOException
>> +    {
>> +        File rootDir = tempFolder.getRoot();
>> +        File folder1 = new File( rootDir, "folder1" );
>> +        folder1.mkdirs();
>> +
>> +        FileTestHelper.generateTestFile( new File( rootDir,
>> "file1.txt" ), 11 );
>> +        FileTestHelper.generateTestFile( new File( rootDir,
>> "file2.txt" ), 12 );
>> +        FileTestHelper.generateTestFile( new File( rootDir,
>> "file3.dat" ), 13 );
>> +
>> +        FileTestHelper.generateTestFile( new File( folder1,
>> "file4.txt" ), 14 );
>> +        FileTestHelper.generateTestFile( new File( folder1,
>> "file5.dat" ), 15 );
>> +
>> +        File folder2 = new File( folder1, "ignorefolder" );
>> +        folder2.mkdirs();
>> +        FileTestHelper.generateTestFile( new File( folder2,
>> "file7.txt" ), 17 );
>> +
>> +    }
>> +
>> +    private void removeAndAddSomeFiles() throws IOException
>> +    {
>> +        File rootDir = tempFolder.getRoot();
>> +        File file2 = new File( rootDir, "file2.txt" );
>> +        file2.delete();
>> +
>> +        FileTestHelper.generateTestFile( new File( rootDir,
>> "folder1/file9.txt" ), 15 );
>> +
>> +        File folder2 = new File( rootDir, "folder1/ignorefolder" );
>> +        FileUtils.deleteDirectory( folder2 );
>> +    }
>> +
>> +    @Test
>> +    public void testInitialScan() throws Exception
>> +    {
>> +        createTestData();
>> +
>> +        DirectorySnapshotScanner dss = new DirectorySnapshotScanner(
>> tempFolder.getRoot() );
>> +        Assert.assertNotNull( dss );
>> +
>> +        // we take the initial snapshot which should result in an empty diff
>> +        dss.capture();
>> +
>> +        //X TODO define result of the initial scan. Full directory tree or just
>> an empty array?
>> +        String[] addedFiles = dss.getFilesAdded();
>> +        String[] removedFiles = dss.getFilesRemoved();
>> +        Assert.assertNotNull( addedFiles );
>> +        Assert.assertNotNull( removedFiles );
>> +        Assert.assertEquals( 0, addedFiles.length );
>> +        Assert.assertEquals(0, removedFiles.length );
>> +
>> +        // now we change 3 files. add one and remove
>> +        removeAndAddSomeFiles();
>> +
>> +        dss.capture();
>> +
>> +        addedFiles = dss.getFilesAdded();
>> +        removedFiles = dss.getFilesRemoved();
>> +        Assert.assertNotNull( addedFiles );
>> +        Assert.assertNotNull( removedFiles );
>> +        Assert.assertEquals( 1, addedFiles.length );
>> +        Assert.assertEquals(2, removedFiles.length );
>> +
>> +        String[] allFiles = dss.getScannedFiles();
>> +        Assert.assertNotNull( allFiles );
>> +        Assert.assertEquals(5, allFiles.length );
>> +
>> +    }
>> +
>> +
>> +
>> +    @Ignore("Enable this test to run performance checks")
>> +    @Test
>> +    public void performanceTest() throws Exception {
>> +
>> +        File rootFolder = tempFolder.getRoot();
>> +
>> +        // do some warmup
>> +        for ( int i = 1; i < 200; i++ )
>> +        {
>> +            createTestData();
>> +            removeAndAddSomeFiles();
>> +            FileUtils.deleteDirectory( rootFolder );
>> +        }
>> +
>> +        int cycles = 2000;
>> +
>> +        // and now we take the time _without_
>> +        long startTime = System.nanoTime();
>> +        for ( int i = 1; i < cycles; i++ )
>> +        {
>> +            createTestData();
>> +            removeAndAddSomeFiles();
>> +            FileUtils.deleteDirectory( rootFolder );
>> +            rootFolder.mkdir();
>> +        }
>> +        long endTime = System.nanoTime();
>> +
>> +        long durationEmptyRun = endTime - startTime;
>> +        System.out.println( "durationEmptyRun            [ns]: " +
>> durationEmptyRun);
>> +
>> +        startTime = System.nanoTime();
>> +        for ( int i = 1; i < cycles; i++ )
>> +        {
>> +            createTestData();
>> +            DirectorySnapshotScanner dss = new DirectorySnapshotScanner(
>> rootFolder );
>> +            dss.capture();
>> +            removeAndAddSomeFiles();
>> +            dss.capture();
>> +
>> +            FileUtils.deleteDirectory( rootFolder );
>> +            rootFolder.mkdir();
>> +        }
>> +        endTime = System.nanoTime();
>> +
>> +        long durationWithSnapshotScanner = endTime - startTime;
>> +        System.out.println( "durationWithSnapshotScanner [ns]: " +
>> durationWithSnapshotScanner);
>> +
>> +        long dirScannerOverhead = durationWithSnapshotScanner -
>> durationEmptyRun;
>> +
>> +        System.out.println( "Overhead for n cycles [ns]: " +
>> dirScannerOverhead);
>> +    }
>> +
>> +}
>>
>> Propchange:
>> maven/shared/trunk/maven-shared-utils/src/test/java/org/apache/maven/shared/utils/io/DirectorySnapshotScannerTest.java
>> ------------------------------------------------------------------------------
>>     svn:eol-style = native
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
> For additional commands, e-mail: dev-help@maven.apache.org
>

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
For additional commands, e-mail: dev-help@maven.apache.org