Package pygmy.handlers.bsf

Source Code of pygmy.handlers.bsf.BsfScriptingHandler

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();
        }
    }
}
TOP

Related Classes of pygmy.handlers.bsf.BsfScriptingHandler

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.