/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.script.py;
import java.util.HashMap;
import java.util.Properties;
import org.geoserver.script.ScriptManager;
import org.geoserver.script.ScriptPlugin;
import org.geoserver.script.app.AppHook;
import org.geoserver.script.wfs.WfsTxHook;
import org.geoserver.script.wps.WpsHook;
import org.python.core.Py;
import org.python.core.PyBoolean;
import org.python.core.PyException;
import org.python.core.PyFloat;
import org.python.core.PyInteger;
import org.python.core.PyLong;
import org.python.core.PyObject;
import org.python.core.PyString;
import org.python.core.PyType;
import org.python.jsr223.PyScriptEngineFactory;
import org.python.util.PythonInterpreter;
/**
* Python script plugin.
*
* @author Justin Deoliveira, OpenGeo
*
*/
public class PythonPlugin extends ScriptPlugin {
public PythonPlugin() {
super("py", PyScriptEngineFactory.class);
}
@Override
public void init(ScriptManager scriptMgr) throws Exception {
//add lib to python.path
Properties props = new Properties();
props.put("python.path", scriptMgr.script("lib/" + "py").dir().getAbsolutePath());
PythonInterpreter.initialize(null, props, null);
// codecs.register(new PyObject() {
// @Override
// public PyObject __call__(PyObject arg0) {
// if ("idna".equals(arg0.toString())) {
// return new PyTuple(
// new PyObject() {
// public PyObject __call__(PyObject v) {
// return new PyTuple(new PyString(IDN.toUnicode(v.toString())), new PyInteger(0));
// }
// },
// new PyObject() {
// public PyObject __call__(PyObject v) {
// return new PyTuple(new PyString(IDN.toASCII(v.toString())), new PyInteger(0));
// }
// }
// );
// }
// return Py.None;
// }
// });
}
@Override
public String getId() {
return "python";
}
@Override
public String getDisplayName() {
return "Python";
}
@Override
public AppHook createAppHook() {
return new PyAppHook(this);
}
@Override
public WpsHook createWpsHook() {
return new PyWpsHook(this);
}
@Override
public WfsTxHook createWfsTxHook() {
return new PyWfsTxHook(this);
}
static HashMap<Class<? extends PyObject>, Class> pyToJava = new HashMap();
static {
pyToJava.put(PyString.class, String.class);
pyToJava.put(PyInteger.class, Integer.class);
pyToJava.put(PyLong.class, Long.class);
pyToJava.put(PyFloat.class, Double.class);
pyToJava.put(PyBoolean.class, Boolean.class);
//pyToJava.put(PyFile.class, File.class);
}
public static Class toJavaClass(PyType type) {
Class clazz = null;
try {
Object o = Py.tojava(type, Object.class);
if (o != null && o instanceof Class) {
clazz = (Class) o;
}
}
catch(PyException e) {}
if (clazz != null && PyObject.class.isAssignableFrom(clazz)) {
try {
PyObject pyobj = (PyObject) clazz.newInstance();
Object obj = pyobj.__tojava__(Object.class);
if (obj != null) {
clazz = obj.getClass();
}
}
catch(Exception e) {}
}
if (clazz != null && PyObject.class.isAssignableFrom(clazz)) {
Class jclass = pyToJava.get(clazz);
if (jclass != null) {
clazz = jclass;
}
}
if (clazz != null && clazz.getName().startsWith("org.python.proxies")) {
//get base type
PyType base = (PyType) type.getBase();
Class c = toJavaClass(base);
if (c != null) {
clazz = c;
}
}
return clazz;
}
}