Package org.geoserver.python.web

Source Code of org.geoserver.python.web.PythonConsolePage$PythonInterpreterDetachableModel

package org.geoserver.python.web;

import java.io.ByteArrayOutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

import org.apache.wicket.ajax.AjaxEventBehavior;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.util.time.Duration;
import org.geoserver.python.Python;
import org.geoserver.web.GeoServerSecuredPage;
import org.python.core.Py;
import org.python.core.PyException;
import org.python.core.PySystemState;
import org.python.util.PythonInterpreter;

public class PythonConsolePage extends GeoServerSecuredPage {

    PythonInterpreterDetachableModel model;
    TextArea outputTextArea;
    String output = ">>> ";
    String input = "";
   
    public PythonConsolePage() {
        Python python = getGeoServerApplication().getBeanOfType(Python.class);
        python.interpreter();
        model = new PythonInterpreterDetachableModel();
       
        Form form = new Form("form");
        add(form);
       
        final AjaxButton execute = new AjaxButton("execute") {
            @Override
            protected void onSubmit(AjaxRequestTarget target, Form form) {
                String[] lines = output.split("\n");
                String line = lines[lines.length-1];
                if (line.startsWith(">>> ")) {
                    line = line.substring(4);
                }
                PythonInterpreter pi = (PythonInterpreter) model.getObject();
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                pi.setOut(out);
                try {
                    pi.exec(line);
               }
                catch( PyException pe ) {
                    pe.printStackTrace(new PrintWriter(out, true));
                }
                output += "\n";
                output += new String(out.toByteArray());
                output += ">>> ";
                   
                target.addComponent(outputTextArea);
                target.appendJavascript(
                    "var ta = document.getElementById('" + outputTextArea.getMarkupId() + "');" +
                    "ta.scrollTop = ta.scrollHeight;"
                );
            }
        };
        form.add(execute);
       
        AjaxButton clear = new AjaxButton("clear") {
           
            @Override
            protected void onSubmit(AjaxRequestTarget target, Form form) {
                output = ">>> ";
                target.addComponent(outputTextArea);
            }
           
        };
        form.add(clear);
        outputTextArea = new TextArea("output", new PropertyModel(this, "output")) {
            @Override
            protected void onComponentTag(ComponentTag tag) {
                super.onComponentTag(tag);
                tag.put("onkeypress", "if (event.keyCode == 13) { " +
                    "document.getElementById('" + execute.getMarkupId() + "').click();" +
                    "return true;" +
                "}");
            }
        };
        outputTextArea.setOutputMarkupId(true);
       
        //outputTextArea.setEnabled(false);
       
        form.add(outputTextArea);
        /*form.add(new Label("prompt", ">>> "));
        form.add(new TextField("input", new PropertyModel(this, "input")));*/
    }
   
    class PythonInterpreterDetachableModel extends LoadableDetachableModel {

        PySystemState state;
       
        public PythonInterpreterDetachableModel() {
        }
       
        @Override
        protected Object load() {
            return new PythonInterpreter(null, state);
        }
       
        @Override
        public void detach() {
            state = Py.getSystemState();
            super.detach();
        }
    }
}
TOP

Related Classes of org.geoserver.python.web.PythonConsolePage$PythonInterpreterDetachableModel

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.