package pygmy.handlers.bsf;
import pygmy.core.*;
import java.io.*;
import java.net.HttpURLConnection;
import java.util.StringTokenizer;
import org.apache.bsf.BSFManager;
import org.apache.bsf.BSFException;
public class BsfScriptingHandler extends AbstractHandler {
private static final ConfigOption SCRIPT_DIR_OPTION = new ConfigOption("script-dir", true, "Directory path to scripts for the BSF interpreter." );
private static final ConfigOption LANGUAGE_OPTION = new ConfigOption("languages", true, "A comma seperated list of languages to register with the BSF." );
private static final ConfigOption CLASSNAME_OPTION = new ConfigOption("classname", true, "Class name of a bsf interpreter." );
private static final ConfigOption FILE_EXTS_OPTION = new ConfigOption("file-exts", true, "A comma seperated list of file extensions associated with this language." );
private BSFManager manager;
private String scriptDir;
public boolean initialize(String handlerName, Server server) {
super.initialize(handlerName, server);
registerLanguages();
manager = new BSFManager();
scriptDir = SCRIPT_DIR_OPTION.getProperty( server, handlerName ) ;
return true;
}
private void registerLanguages() {
StringTokenizer tokenizer = new StringTokenizer( LANGUAGE_OPTION.getProperty(server,handlerName), "," );
while( tokenizer.hasMoreTokens() ) {
String language = tokenizer.nextToken();
if( !BSFManager.isLanguageRegistered( language ) ) {
String classname = CLASSNAME_OPTION.getProperty( server, handlerName + "." + language ) ;
String fileExts = FILE_EXTS_OPTION .getProperty( server, handlerName + "." + language );
BSFManager.registerScriptingEngine( language, classname, fileExts.split( "," ) );
}
}
}
protected boolean handleBody(HttpRequest request, HttpResponse response) throws IOException {
try {
File scriptFile = Http.translatePath( scriptDir, request.getUrl().substring( getUrlPrefix().length() ) );
String language = BSFManager.getLangFromFilename( scriptFile.getName() );
return executeScript( language, scriptFile, request, response );
} catch( BSFException e ) {
return false;
}
}
private boolean executeScript(String language, File scriptFile, HttpRequest request, HttpResponse response) throws IOException {
try {
manager.declareBean( "request", request, request.getClass() );
manager.declareBean( "response", response, response.getClass() );
manager.exec( language, scriptFile.getPath(), 0, 0, fetchScript( scriptFile ) );
} catch( BSFException e ) {
response.sendError( HttpURLConnection.HTTP_INTERNAL_ERROR, e.getMessage(), e );
}
return true;
}
private StringBuffer fetchScript(File scriptFile) throws IOException {
Reader reader = new BufferedReader( new FileReader( scriptFile ) );
try {
StringBuffer buffer = new StringBuffer();
char[] buf = new char[1024];
int length = 0;
while( length >= 0 ) {
length = reader.read( buf );
buffer.append( buf, 0, length );
}
return buffer;
} finally {
reader.close();
}
}
}