"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 <[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/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: [email protected]
> > For additional commands, e-mail: [email protected]
> 
> ---------------------------------------------------------------------
> 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