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]
