Package pygmy.handlers.jython

Source Code of pygmy.handlers.jython.JythonHandler

package pygmy.handlers.jython;

import pygmy.core.*;

import java.io.IOException;
import java.io.Writer;
import java.util.logging.Logger;
import java.util.logging.Level;
import java.util.Properties;
import java.net.HttpURLConnection;

import org.python.util.PythonInterpreter;
import org.python.core.PyException;
import org.python.core.PySystemState;

public class JythonHandler extends AbstractHandler {

    private static final Logger log = Logger.getLogger( JythonHandler.class.getName() );

    private static final ConfigOption SCRIPT_DIRECTORY_OPTION = new ConfigOption( "script-dir", true, "Location of the scripts you want to run.");


    String pythonDir;
    PythonInterpreter interpreter;
    private static final ConfigOption PYTHON_HOME = new ConfigOption("python.home", true, "Home of the jython interpreter.");
    private static final ConfigOption PYTHON_PATH = new ConfigOption("python.path", true, "Path used to resolve jython libaries.");

    public boolean initialize(String handlerName, Server server) {
        super.initialize(handlerName, server);
        pythonDir = SCRIPT_DIRECTORY_OPTION.getProperty( server, handlerName );

        Properties props = new Properties();

        putPythonProperty( PYTHON_HOME, props);
        putPythonProperty( PYTHON_PATH, props);
        PythonInterpreter.initialize( System.getProperties(), props, new String[0] );

        interpreter = new PythonInterpreter(null, new PySystemState());
        interpreter.setErr( new LogWriter( Level.SEVERE ) );
        interpreter.setOut( new LogWriter( Level.INFO ) );
//        PySystemState sys = Py.getSystemState();
//        sys.path.append(new PyString(rootPath));
        return true;
    }

    private void putPythonProperty( ConfigOption option, Properties props ) {
        if ( System.getProperty( option.getName() ) == null ) {
            String pythonHome = option.getProperty( server, handlerName );
            if( pythonHome != null )
                props.put( option.getName(), pythonHome );
        }
    }

    protected boolean handleBody(HttpRequest request, HttpResponse response) throws IOException {
        if( request.getUrl().endsWith(".py") ) {
            try {
                if( log.isLoggable( Level.INFO ) ) {
                    log.log( Level.INFO, "Executing script: " + request.getUrl() );
                }
                interpreter.set("request", request);
                interpreter.set("response", response);
                interpreter.execfile( Http.translatePath( pythonDir, request.getUrl() ).getAbsolutePath() );
            } catch( PyException e ) {
                log.log( Level.SEVERE, e.getMessage(), e );
                response.sendError( HttpURLConnection.HTTP_INTERNAL_ERROR, "Script error", e);
            }
            return true;
        }
        return false;
    }

    public class LogWriter extends Writer {
        Level level;
        StringBuffer buf = new StringBuffer();

        public LogWriter(Level level) {
            this.level = level;
        }

        public synchronized void write(char cbuf[], int off, int len) throws IOException {
            buf.append( cbuf, off, len );
        }

        public synchronized void flush() throws IOException {
            log.log( level, buf.toString()  );
            buf.delete( 0, buf.length() - 1 );
        }

        public void close() throws IOException {
            flush();
        }
    }
}
TOP

Related Classes of pygmy.handlers.jython.JythonHandler

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.