SavePoint?
Le 14 sept. 2012 20:04, "Anders Hammar" <[email protected]> a écrit :

> Yes, "Snapshot" is not good. "PointInTime"?
>
> /Anders
> On Fri, Sep 14, 2012 at 3:03 PM, Mark Struberg <[email protected]> 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: "[email protected]" <[email protected]>
> >> To: [email protected]
> >> 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: [email protected]
> > For additional commands, e-mail: [email protected]
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>

Reply via email to