litesoft
@ 939
litesoft / trunk / Java / ScarPlus / src / com / esotericsoftware / wildcard / RegexScanner.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
package com.esotericsoftware.wildcard; import java.io.*; import org.litesoft.core.typeutils.Objects; import java.util.*; import java.util.regex.Pattern; import com.esotericsoftware.utils.*; class RegexScanner { private final File rootDir; private final List<Pattern> includePatterns; private final List<String> matches = new ArrayList( 128 ); public RegexScanner( File rootDir, List<String> includes, List<String> excludes ) { if ( rootDir == null ) { throw new IllegalArgumentException( "rootDir cannot be null." ); } if ( !rootDir.exists() ) { throw new IllegalArgumentException( "Directory does not exist: " + rootDir ); } if ( !rootDir.isDirectory() ) { throw new IllegalArgumentException( "File must be a directory: " + rootDir ); } try { rootDir = rootDir.getCanonicalFile(); } catch ( IOException ex ) { throw new WrappedIOException( "OS error determining canonical path: " + rootDir, ex ); } this.rootDir = rootDir; if ( includes == null ) { throw new IllegalArgumentException( "includes cannot be null." ); } if ( excludes == null ) { throw new IllegalArgumentException( "excludes cannot be null." ); } includePatterns = new ArrayList(); for ( String include : includes ) { includePatterns.add( Pattern.compile( include, Pattern.CASE_INSENSITIVE ) ); } List<Pattern> excludePatterns = new ArrayList(); for ( String exclude : excludes ) { excludePatterns.add( Pattern.compile( exclude, Pattern.CASE_INSENSITIVE ) ); } scanDir( rootDir ); for ( Iterator matchIter = matches.iterator(); matchIter.hasNext(); ) { String filePath = (String) matchIter.next(); for ( Pattern exclude : excludePatterns ) { if ( exclude.matcher( filePath ).matches() ) { matchIter.remove(); } } } } private void scanDir( File dir ) { for ( File file : dir.listFiles() ) { for ( Pattern include : includePatterns ) { String filePath = file.getPath().substring( rootDir.getPath().length() + 1 ); if ( include.matcher( filePath ).matches() ) { matches.add( filePath ); break; } } if ( file.isDirectory() ) { scanDir( file ); } } } public List<String> matches() { return matches; } public File rootDir() { return rootDir; } public static void main( String[] args ) { // System.out.println(new Paths("C:\\Java\\ls", "**")); List<String> includes = new ArrayList(); includes.add( "core[^T]+php" ); // includes.add(".*/lavaserver/.*"); List<String> excludes = new ArrayList(); // excludes.add("website/**/doc**"); long start = System.nanoTime(); List<String> files = new RegexScanner( new File( "..\\website\\includes" ), includes, excludes ).matches(); long end = System.nanoTime(); System.out.println( files.toString().replaceAll( ", ", "\n" ).replaceAll( "[\\[\\]]", "" ) ); System.out.println( (end - start) / 1000000f ); } } |