package org.geoserver.python.app;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.geoserver.python.Python;
import org.geoserver.rest.RestletException;
import org.python.util.PythonInterpreter;
import org.restlet.data.Form;
import org.restlet.data.MediaType;
import org.restlet.data.Request;
import org.restlet.data.Response;
import org.restlet.data.Status;
import org.restlet.resource.OutputRepresentation;
import org.restlet.resource.Resource;
public class PythonResource extends Resource {
Python jython;
File script;
public PythonResource(Python jython, File script, Request request, Response response) {
super(null, request, response);
this.jython = jython;
this.script = script;
}
@Override
public void handleGet() {
try {
final ByteArrayOutputStream out = new ByteArrayOutputStream();
PythonInterpreter pi = jython.interpreter();
//set arguments as local variables
Form query = getRequest().getResourceRef().getQueryAsForm();
for (String name : query.getNames()) {
pi.set(name, query.getFirstValue(name));
}
pi.setOut(out);
pi.execfile(new FileInputStream(script));
getResponse().setEntity(new OutputRepresentation(MediaType.TEXT_PLAIN) {
@Override
public void write(OutputStream output) throws IOException {
output.write(out.toByteArray());
}
});
getResponse().setStatus(Status.SUCCESS_OK);
}
catch (Exception e) {
throw new RestletException("Error executing script " + script.getName(),
Status.SERVER_ERROR_INTERNAL, e);
}
}
}