package org.glassfish.pfl.basic.tools.file ;
import java.io.IOException ;
import java.util.Map ;
import java.util.HashMap ;
public class Recognizer implements Scanner.Action {
private final int verbose ;
private final boolean dryRun ;
private final Map<String,Scanner.Action> nameActions ;
private final Map<String,Scanner.Action> suffixActions ;
private Scanner.Action shellScriptAction ;
private Scanner.Action defaultAction ;
Recognizer( final int verbose, final boolean dryRun ) {
this.verbose = verbose ;
this.dryRun = dryRun ;
nameActions = new HashMap<String,Scanner.Action>() ;
suffixActions = new HashMap<String,Scanner.Action>() ;
shellScriptAction = null ;
defaultAction = new Scanner.Action() {
@Override
public String toString() {
return "Built-in Default Action" ;
}
@Override
public boolean evaluate( FileWrapper fw ) {
System.out.println( "No action defined for " + fw ) ;
return false ;
}
} ;
}
public void dump() {
System.out.println( "Contents of Recognizer:" ) ;
System.out.println( "verbose = " + verbose ) ;
System.out.println( "dryRun = " + dryRun ) ;
System.out.println( "Name actions:" ) ;
for (Map.Entry<String,Scanner.Action> entry : nameActions.entrySet() ) {
System.out.println( "\tName = " + entry.getKey()
+ ", Action = " + entry.getValue() ) ;
}
System.out.println( "Suffix actions:" ) ;
for (Map.Entry<String,Scanner.Action> entry : suffixActions.entrySet() ) {
System.out.println( "\tSuffix = " + entry.getKey()
+ ", Action = " + entry.getValue() ) ;
}
System.out.println( "Shell action:" + shellScriptAction ) ;
System.out.println( "Default action:" + defaultAction ) ;
}
@Override
public String toString() {
return "Recognizer()" ;
}
public void addKnownName( final String name, final Scanner.Action action ) {
nameActions.put( name, action ) ;
}
public void addKnownSuffix( final String suffix, final Scanner.Action action ) {
suffixActions.put( suffix, action ) ;
}
public void setShellScriptAction( final Scanner.Action action ) {
shellScriptAction = action ;
}
public void setDefaultAction( final Scanner.Action action ) {
if (action != null) {
defaultAction = action;
}
}
@Override
public boolean evaluate( final FileWrapper file ) {
final String name = file.getName() ;
Scanner.Action action = nameActions.get( name ) ;
if (action == null) {
final int dotIndex = name.lastIndexOf( '.' ) ;
if (dotIndex >= 0) {
String suffix = name.substring( dotIndex + 1 ) ;
action = suffixActions.get( suffix ) ;
}
}
if (action == null) {
try {
file.open( FileWrapper.OpenMode.READ ) ;
final String str = file.readLine() ;
if ((str != null) && str.startsWith( "#!" )) {
action = shellScriptAction ;
}
file.close() ;
} catch (IOException exc) {
System.out.println( "Could not read file " + file + " to check for shell script" ) ;
}
}
if (action == null) {
action = defaultAction;
}
if (verbose > 1) {
System.out.println(
"Recognizer: calling action " + action
+ " on file " + file ) ;
}
if (!dryRun) {
return action.evaluate(file);
}
return true ;
}
}