package org.jython; import org.python.core.Py; import org.python.core.PyObject; import org.python.core.PySystemState; /** * Jython Object Factory using PySystemState * from: http://www.jython.org/jythonbook/en/1.0/JythonAndJavaIntegration.html#more-efficient-version-of-loosely-coupled-object-factory */ @SuppressWarnings("rawtypes") public class JythonObjectFactory { private final Class interfaceType; private final PyObject klass; // Constructor obtains a reference to the importer, module, and the class name public JythonObjectFactory(PySystemState state, Class interfaceType, String moduleName, String className) { this.interfaceType = interfaceType; PyObject importer = state.getBuiltins().__getitem__(Py.newString("__import__")); PyObject module = importer.__call__(Py.newString(moduleName)); klass = module.__getattr__(className); //System.err.println("module=" + module + ",class=" + klass); } // This constructor passes through to the other constructor public JythonObjectFactory(Class interfaceType, String moduleName, String className) { this(new PySystemState(), interfaceType, moduleName, className); } // All of the followng methods return // a coerced Jython object based upon the pieces of information // that were passed into the factory. The differences are // between them are the number of arguments that can be passed // in as arguents to the object. public Object createObject() { return klass.__call__().__tojava__(interfaceType); } public Object createObject(Object arg1) { return klass.__call__(Py.java2py(arg1)).__tojava__(interfaceType); } public Object createObject(Object arg1, Object arg2) { return klass.__call__(Py.java2py(arg1), Py.java2py(arg2)).__tojava__(interfaceType); } public Object createObject(Object arg1, Object arg2, Object arg3) { return klass.__call__(Py.java2py(arg1), Py.java2py(arg2), Py.java2py(arg3)).__tojava__(interfaceType); } public Object createObject(Object args[], String keywords[]) { PyObject convertedArgs[] = new PyObject[args.length]; for (int i = 0; i < args.length; i++) { convertedArgs[i] = Py.java2py(args[i]); } return klass.__call__(convertedArgs, keywords).__tojava__(interfaceType); } public Object createObject(Object... args) { return createObject(args, Py.NoKeywords); } }