You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by st...@apache.org on 2012/08/30 01:05:59 UTC
svn commit: r1378765 - in /maven/shared/trunk/maven-shared-utils/src:
main/java/org/apache/maven/shared/utils/io/
test/java/org/apache/maven/shared/utils/io/ test/resources/directorywalker/
test/resources/directorywalker/directory1/ test/resources/dire...
Author: struberg
Date: Wed Aug 29 23:05:58 2012
New Revision: 1378765
URL: http://svn.apache.org/viewvc?rev=1378765&view=rev
Log:
MSHARED-236 import ALv2 (c) ASF DirectoryWalker
I rewrote parts which had no clear license header (WalkCollector).
Added:
maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/DirectoryWalkListener.java (with props)
maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/DirectoryWalker.java (with props)
maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/WalkCollector.java (with props)
maven/shared/trunk/maven-shared-utils/src/test/java/org/apache/maven/shared/utils/io/DirectoryWalkerTest.java (with props)
maven/shared/trunk/maven-shared-utils/src/test/resources/directorywalker/
maven/shared/trunk/maven-shared-utils/src/test/resources/directorywalker/directory1/
maven/shared/trunk/maven-shared-utils/src/test/resources/directorywalker/directory1/file1.txt (with props)
maven/shared/trunk/maven-shared-utils/src/test/resources/directorywalker/directory2/
maven/shared/trunk/maven-shared-utils/src/test/resources/directorywalker/directory2/directory21/
maven/shared/trunk/maven-shared-utils/src/test/resources/directorywalker/directory2/directory21/file21.txt (with props)
maven/shared/trunk/maven-shared-utils/src/test/resources/directorywalker/directory2/file2.txt (with props)
maven/shared/trunk/maven-shared-utils/src/test/resources/directorywalker/file.txt (with props)
Added: maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/DirectoryWalkListener.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/DirectoryWalkListener.java?rev=1378765&view=auto
==============================================================================
--- maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/DirectoryWalkListener.java (added)
+++ maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/DirectoryWalkListener.java Wed Aug 29 23:05:58 2012
@@ -0,0 +1,48 @@
+package org.apache.maven.shared.utils.io;
+
+/*
+ * Copyright 2001-2006 The Apache Software Foundation.
+ *
+ * Licensed 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 java.io.File;
+
+/**
+ * DirectoryWalkListener
+ * @version $Id$
+ */
+public interface DirectoryWalkListener
+{
+ /**
+ * The directory walking has begun.
+ *
+ * @param basedir the basedir that walk started in.
+ */
+ void directoryWalkStarting( File basedir );
+
+ /**
+ * The included entry that was encountered.
+ *
+ * @param percentage rough percentage of the walk completed. (inaccurate)
+ * @param file the file that was included.
+ */
+ void directoryWalkStep( int percentage, File file );
+
+ /**
+ * The directory walking has finished.
+ */
+ void directoryWalkFinished();
+
+ void debug( String message );
+}
Propchange: maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/DirectoryWalkListener.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/DirectoryWalker.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/DirectoryWalker.java?rev=1378765&view=auto
==============================================================================
--- maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/DirectoryWalker.java (added)
+++ maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/DirectoryWalker.java Wed Aug 29 23:05:58 2012
@@ -0,0 +1,443 @@
+package org.apache.maven.shared.utils.io;
+
+/*
+ * Copyright 2001-2006 The Apache Software Foundation.
+ *
+ * Licensed 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 java.io.File;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Stack;
+
+/**
+ * DirectoryWalker
+ * @version $Id$
+ */
+public class DirectoryWalker
+{
+ /**
+ * DirStackEntry is an Item on the {@link DirectoryWalker#dirStack}
+ */
+ class DirStackEntry
+ {
+ /**
+ * Count of files in the directory.
+ */
+ public int count;
+
+ /**
+ * Current Directory.
+ */
+ public File dir;
+
+ /**
+ * Index (or offset) within the directory count.
+ */
+ public int index;
+
+ /**
+ * Offset for percentage calculations. Based on parent DirStackEntry.
+ */
+ public double percentageOffset;
+
+ /**
+ * Size of percentage space to work with.
+ */
+ public double percentageSize;
+
+ /**
+ * Create a DirStackEntry.
+ *
+ * @param d the directory to track
+ * @param length the length of entries in the directory.
+ */
+ public DirStackEntry( File d, int length )
+ {
+ dir = d;
+ count = length;
+ }
+
+ /**
+ * Calculate the next percentage offset.
+ * Used by the next DirStackEntry.
+ *
+ * @return the value for the next percentage offset.
+ */
+ public double getNextPercentageOffset()
+ {
+ return percentageOffset + ( index * ( percentageSize / count ) );
+ }
+
+ /**
+ * Calculate the next percentage size.
+ * Used by the next DirStackEntry.
+ *
+ * @return the value for the next percentage size.
+ */
+ public double getNextPercentageSize()
+ {
+ return ( percentageSize / count );
+ }
+
+ /**
+ * The percentage of the DirStackEntry right now.
+ * Based on count, index, percentageOffset, and percentageSize.
+ *
+ * @return the percentage right now.
+ */
+ public int getPercentage()
+ {
+ double percentageWithinDir = (double) index / (double) count;
+ return (int) Math.floor( percentageOffset + ( percentageWithinDir * percentageSize ) );
+ }
+
+ public String toString()
+ {
+ return "DirStackEntry[" + "dir=" + dir.getAbsolutePath() + ",count=" + count + ",index=" + index
+ + ",percentageOffset=" + percentageOffset + ",percentageSize=" + percentageSize + ",percentage()="
+ + getPercentage() + ",getNextPercentageOffset()=" + getNextPercentageOffset()
+ + ",getNextPercentageSize()=" + getNextPercentageSize() + "]";
+ }
+ }
+
+ private File baseDir;
+
+ private int baseDirOffset;
+
+ private Stack dirStack;
+
+ private List excludes;
+
+ private List includes;
+
+ private boolean isCaseSensitive = true;
+
+ private List listeners;
+
+ private boolean debugEnabled = false;
+
+ public DirectoryWalker()
+ {
+ this.includes = new ArrayList();
+ this.excludes = new ArrayList();
+ this.listeners = new ArrayList();
+ }
+
+ public void addDirectoryWalkListener( DirectoryWalkListener listener )
+ {
+ this.listeners.add( listener );
+ }
+
+ public void addExclude( String exclude )
+ {
+ this.excludes.add( fixPattern( exclude ) );
+ }
+
+ public void addInclude( String include )
+ {
+ this.includes.add( fixPattern( include ) );
+ }
+
+ /**
+ * Add's to the Exclude List the default list of SCM excludes.
+ */
+ public void addSCMExcludes()
+ {
+ String scmexcludes[] = DirectoryScanner.DEFAULTEXCLUDES;
+ for ( int i = 0; i < scmexcludes.length; i++ )
+ {
+ addExclude( scmexcludes[i] );
+ }
+ }
+
+ private void fireStep( File file )
+ {
+ DirStackEntry dsEntry = (DirStackEntry) dirStack.peek();
+ int percentage = dsEntry.getPercentage();
+ Iterator it = this.listeners.iterator();
+ while ( it.hasNext() )
+ {
+ DirectoryWalkListener listener = (DirectoryWalkListener) it.next();
+ listener.directoryWalkStep( percentage, file );
+ }
+ }
+
+ private void fireWalkFinished()
+ {
+ Iterator it = this.listeners.iterator();
+ while ( it.hasNext() )
+ {
+ DirectoryWalkListener listener = (DirectoryWalkListener) it.next();
+ listener.directoryWalkFinished();
+ }
+ }
+
+ private void fireWalkStarting()
+ {
+ Iterator it = this.listeners.iterator();
+ while ( it.hasNext() )
+ {
+ DirectoryWalkListener listener = (DirectoryWalkListener) it.next();
+ listener.directoryWalkStarting( this.baseDir );
+ }
+ }
+
+ private void fireDebugMessage( String message )
+ {
+ Iterator it = this.listeners.iterator();
+ while ( it.hasNext() )
+ {
+ DirectoryWalkListener listener = (DirectoryWalkListener) it.next();
+ listener.debug( message );
+ }
+ }
+
+ private String fixPattern( String pattern )
+ {
+ String cleanPattern = pattern;
+
+ if ( File.separatorChar != '/' )
+ {
+ cleanPattern = cleanPattern.replace( '/', File.separatorChar );
+ }
+
+ if ( File.separatorChar != '\\' )
+ {
+ cleanPattern = cleanPattern.replace( '\\', File.separatorChar );
+ }
+
+ return cleanPattern;
+ }
+
+ public void setDebugMode( boolean debugEnabled )
+ {
+ this.debugEnabled = debugEnabled;
+ }
+
+ /**
+ * @return Returns the baseDir.
+ */
+ public File getBaseDir()
+ {
+ return baseDir;
+ }
+
+ /**
+ * @return Returns the excludes.
+ */
+ public List getExcludes()
+ {
+ return excludes;
+ }
+
+ /**
+ * @return Returns the includes.
+ */
+ public List getIncludes()
+ {
+ return includes;
+ }
+
+ private boolean isExcluded( String name )
+ {
+ return isMatch( this.excludes, name );
+ }
+
+ private boolean isIncluded( String name )
+ {
+ return isMatch( this.includes, name );
+ }
+
+ private boolean isMatch( List patterns, String name )
+ {
+ Iterator it = patterns.iterator();
+ while ( it.hasNext() )
+ {
+ String pattern = (String) it.next();
+ if ( SelectorUtils.matchPath( pattern, name, isCaseSensitive ) )
+ {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ private String relativeToBaseDir( File file )
+ {
+ return file.getAbsolutePath().substring( baseDirOffset + 1 );
+ }
+
+ /**
+ * Removes a DirectoryWalkListener.
+ *
+ * @param listener the listener to remove.
+ */
+ public void removeDirectoryWalkListener( DirectoryWalkListener listener )
+ {
+ this.listeners.remove( listener );
+ }
+
+ /**
+ * Performs a Scan against the provided {@link #setBaseDir(File)}
+ */
+ public void scan()
+ {
+ if ( baseDir == null )
+ {
+ throw new IllegalStateException( "Scan Failure. BaseDir not specified." );
+ }
+
+ if ( !baseDir.exists() )
+ {
+ throw new IllegalStateException( "Scan Failure. BaseDir does not exist." );
+ }
+
+ if ( !baseDir.isDirectory() )
+ {
+ throw new IllegalStateException( "Scan Failure. BaseDir is not a directory." );
+ }
+
+ if ( this.includes.isEmpty() )
+ {
+ // default to include all.
+ addInclude( "**" );
+ }
+
+ if ( debugEnabled )
+ {
+ Iterator it;
+ StringBuffer dbg = new StringBuffer();
+ dbg.append( "DirectoryWalker Scan" );
+ dbg.append( "\n Base Dir: " ).append( this.baseDir.getAbsolutePath() );
+ dbg.append( "\n Includes: " );
+ it = this.includes.iterator();
+ while ( it.hasNext() )
+ {
+ String include = (String) it.next();
+ dbg.append( "\n - \"" ).append( include ).append( "\"" );
+ }
+ dbg.append( "\n Excludes: " );
+ it = this.excludes.iterator();
+ while ( it.hasNext() )
+ {
+ String exclude = (String) it.next();
+ dbg.append( "\n - \"" ).append( exclude ).append( "\"" );
+ }
+ fireDebugMessage( dbg.toString() );
+ }
+
+ fireWalkStarting();
+ dirStack = new Stack();
+ scanDir( this.baseDir );
+ fireWalkFinished();
+ }
+
+ private void scanDir( File dir )
+ {
+ File files[] = dir.listFiles();
+
+ if ( files == null )
+ {
+ return;
+ }
+
+ DirStackEntry curStackEntry = new DirStackEntry( dir, files.length );
+ if ( dirStack.isEmpty() )
+ {
+ curStackEntry.percentageOffset = 0;
+ curStackEntry.percentageSize = 100;
+ }
+ else
+ {
+ DirStackEntry previousStackEntry = (DirStackEntry) dirStack.peek();
+ curStackEntry.percentageOffset = previousStackEntry.getNextPercentageOffset();
+ curStackEntry.percentageSize = previousStackEntry.getNextPercentageSize();
+ }
+
+ dirStack.push( curStackEntry );
+
+ for ( int idx = 0; idx < files.length; idx++ )
+ {
+ curStackEntry.index = idx;
+ String name = relativeToBaseDir( files[idx] );
+
+ if ( isExcluded( name ) )
+ {
+ fireDebugMessage( name + " is excluded." );
+ continue;
+ }
+
+ if ( files[idx].isDirectory() )
+ {
+ scanDir( files[idx] );
+ }
+ else
+ {
+ if ( isIncluded( name ) )
+ {
+ fireStep( files[idx] );
+ }
+ }
+ }
+
+ dirStack.pop();
+ }
+
+ /**
+ * @param baseDir The baseDir to set.
+ */
+ public void setBaseDir( File baseDir )
+ {
+ this.baseDir = baseDir;
+ this.baseDirOffset = baseDir.getAbsolutePath().length();
+ }
+
+ /**
+ * @param entries The excludes to set.
+ */
+ public void setExcludes( List entries )
+ {
+ this.excludes.clear();
+ if ( entries != null )
+ {
+ Iterator it = entries.iterator();
+ while ( it.hasNext() )
+ {
+ String pattern = (String) it.next();
+ this.excludes.add( fixPattern( pattern ) );
+ }
+ }
+ }
+
+ /**
+ * @param entries The includes to set.
+ */
+ public void setIncludes( List entries )
+ {
+ this.includes.clear();
+ if ( entries != null )
+ {
+ Iterator it = entries.iterator();
+ while ( it.hasNext() )
+ {
+ String pattern = (String) it.next();
+ this.includes.add( fixPattern( pattern ) );
+ }
+ }
+ }
+
+}
Propchange: maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/DirectoryWalker.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/WalkCollector.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/WalkCollector.java?rev=1378765&view=auto
==============================================================================
--- maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/WalkCollector.java (added)
+++ maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/WalkCollector.java Wed Aug 29 23:05:58 2012
@@ -0,0 +1,78 @@
+package org.apache.maven.shared.utils.io;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+public class WalkCollector implements DirectoryWalkListener
+{
+ protected List steps;
+ protected File startingDir;
+ protected int startCount;
+ protected int finishCount;
+ protected int percentageLow;
+ protected int percentageHigh;
+
+ public WalkCollector()
+ {
+ steps = new ArrayList();
+ startCount = 0;
+ finishCount = 0;
+ percentageLow = 0;
+ percentageHigh = 0;
+ }
+
+ public void debug( String message )
+ {
+ // can be used to set some message
+ }
+
+ public void directoryWalkStarting( File basedir )
+ {
+ startingDir = basedir;
+ startCount++;
+ }
+
+ public void directoryWalkStep( int percentage, File file )
+ {
+ steps.add( file );
+ percentageLow = Math.min( percentageLow, percentage );
+ percentageHigh = Math.max( percentageHigh, percentage );
+ }
+
+ public void directoryWalkFinished()
+ {
+ finishCount++;
+ }
+
+
+ public int getFinishCount()
+ {
+ return finishCount;
+ }
+
+ public int getPercentageHigh()
+ {
+ return percentageHigh;
+ }
+
+ public int getPercentageLow()
+ {
+ return percentageLow;
+ }
+
+ public int getStartCount()
+ {
+ return startCount;
+ }
+
+ public File getStartingDir()
+ {
+ return startingDir;
+ }
+
+ public List getSteps()
+ {
+ return steps;
+ }
+}
Propchange: maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/WalkCollector.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: maven/shared/trunk/maven-shared-utils/src/test/java/org/apache/maven/shared/utils/io/DirectoryWalkerTest.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-utils/src/test/java/org/apache/maven/shared/utils/io/DirectoryWalkerTest.java?rev=1378765&view=auto
==============================================================================
--- maven/shared/trunk/maven-shared-utils/src/test/java/org/apache/maven/shared/utils/io/DirectoryWalkerTest.java (added)
+++ maven/shared/trunk/maven-shared-utils/src/test/java/org/apache/maven/shared/utils/io/DirectoryWalkerTest.java Wed Aug 29 23:05:58 2012
@@ -0,0 +1,47 @@
+package org.apache.maven.shared.utils.io;
+
+/*
+ * Copyright 2001-2006 The Apache Software Foundation.
+ *
+ * Licensed 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 java.io.File;
+
+import org.junit.Test;
+import org.junit.Assert;
+
+public class DirectoryWalkerTest
+{
+ @Test
+ public void testDirectoryWalk()
+ {
+ DirectoryWalker walker = new DirectoryWalker();
+
+ walker.addSCMExcludes();
+
+ walker.setBaseDir( new File("src/test/resources/directorywalker") );
+
+ WalkCollector collector = new WalkCollector();
+ walker.addDirectoryWalkListener( collector );
+
+ walker.scan();
+
+ Assert.assertEquals( "Walk Collector / Starting Count", 1, collector.startCount );
+ Assert.assertNotNull( "Walk Collector / Starting Dir", collector.startingDir );
+ Assert.assertEquals( "Walk Collector / Finish Count", 1, collector.finishCount );
+ Assert.assertEquals( "Walk Collector / Steps Count", 4, collector.steps.size() );
+ Assert.assertTrue( "Walk Collector / percentage low >= 0", collector.percentageLow >= 0 );
+ Assert.assertTrue( "Walk Collector / percentage high <= 100", collector.percentageHigh <= 100 );
+ }
+}
Propchange: maven/shared/trunk/maven-shared-utils/src/test/java/org/apache/maven/shared/utils/io/DirectoryWalkerTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: maven/shared/trunk/maven-shared-utils/src/test/resources/directorywalker/directory1/file1.txt
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-utils/src/test/resources/directorywalker/directory1/file1.txt?rev=1378765&view=auto
==============================================================================
(empty)
Propchange: maven/shared/trunk/maven-shared-utils/src/test/resources/directorywalker/directory1/file1.txt
------------------------------------------------------------------------------
svn:eol-style = native
Added: maven/shared/trunk/maven-shared-utils/src/test/resources/directorywalker/directory2/directory21/file21.txt
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-utils/src/test/resources/directorywalker/directory2/directory21/file21.txt?rev=1378765&view=auto
==============================================================================
(empty)
Propchange: maven/shared/trunk/maven-shared-utils/src/test/resources/directorywalker/directory2/directory21/file21.txt
------------------------------------------------------------------------------
svn:eol-style = native
Added: maven/shared/trunk/maven-shared-utils/src/test/resources/directorywalker/directory2/file2.txt
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-utils/src/test/resources/directorywalker/directory2/file2.txt?rev=1378765&view=auto
==============================================================================
(empty)
Propchange: maven/shared/trunk/maven-shared-utils/src/test/resources/directorywalker/directory2/file2.txt
------------------------------------------------------------------------------
svn:eol-style = native
Added: maven/shared/trunk/maven-shared-utils/src/test/resources/directorywalker/file.txt
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-utils/src/test/resources/directorywalker/file.txt?rev=1378765&view=auto
==============================================================================
(empty)
Propchange: maven/shared/trunk/maven-shared-utils/src/test/resources/directorywalker/file.txt
------------------------------------------------------------------------------
svn:eol-style = native