/* examples for the jcifs smb client library in Java
* Copyright (C) 2000 "Michael B. Allen" <jcifs at samba dot org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
import jcifs.smb.SmbFile;
import java.util.LinkedList;
import java.util.ListIterator;
import java.net.MalformedURLException;
import java.io.IOException;
public class ThreadedSmbCrawler {
static int workingThreads = 0;
class DirEntry {
SmbFile dir;
int depth;
DirEntry( SmbFile dir, int depth ) {
this.dir = dir;
this.depth = depth;
}
}
class SmbCrawlerThread extends Thread {
StringBuffer sb = new StringBuffer();
public void run() {
while( true ) {
try {
DirEntry e;
synchronized( dirList ) {
while( dirList.isEmpty() ) {
//System.err.println( "workingThreads=" + workingThreads );
if( workingThreads == 0 ) {
return; // done
}
dirList.wait( 2000 );
}
e = (DirEntry)dirList.remove( 0 );
if( e.depth == 0 ) {
continue;
}
workingThreads++;
}
SmbFile[] l = e.dir.listFiles();
int n = maxDepth - e.depth;
for(int i = 0; l != null && i < l.length; i++ ) {
try {
sb.setLength( 0 );
for( int k = 0; k < n; k++ ) {
sb.append( " " );
}
SmbFile d = l[i];
System.err.println( sb.append( d ));
if( d.isDirectory() ) {
synchronized( dirList ) {
dirList.add( new DirEntry( d, e.depth - 1 ));
dirList.notify();
}
}
} catch( IOException ioe ) {
ioe.printStackTrace();
}
}
synchronized( dirList ) {
workingThreads--;
}
} catch( Exception x ) {
synchronized( dirList ) {
workingThreads--;
}
x.printStackTrace();
}
}
}
}
LinkedList dirList;
int maxDepth, numThreads;
Thread[] threads;
ThreadedSmbCrawler( String dir, int maxDepth, int numThreads ) throws Exception {
this.maxDepth = maxDepth;
this.numThreads = numThreads;
threads = new Thread[numThreads];
dirList = new LinkedList();
dirList.add( new DirEntry( new SmbFile( dir ), maxDepth ));
}
long go() throws Exception {
int i;
long start = System.currentTimeMillis();
for( i = 0; i < numThreads; i++ ) {
threads[i] = new SmbCrawlerThread();
threads[i].start();
}
for( i = 0; i < numThreads; i++ ) {
threads[i].join();
}
return System.currentTimeMillis() - start;
}
public static void main(String[] argv) throws Exception {
ThreadedSmbCrawler tsc;
if( argv.length < 3 ) {
System.err.println( "usage: ThreadedSmbCrawler dir depth numThreads" );
System.exit( 1 );
}
tsc = new ThreadedSmbCrawler( argv[0], Integer.parseInt( argv[1] ), Integer.parseInt( argv[2] ));
System.err.println( "Crawling Complete: " + (tsc.go() / 1000) + "sec" );
}
}