package org.jspringbot; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; import org.python.core.*; import org.springframework.aop.framework.ProxyFactory; import java.util.*; public class PythonUtils { @SuppressWarnings("unchecked") public static Object toJava(Object arg) { if(List.class.isInstance(arg)) { return proxy(List.class, (List) arg); } else if(Set.class.isInstance(arg)) { return proxy(Set.class, (Set) arg); } else if(Map.class.isInstance(arg)) { return proxy(Map.class, (Map) arg); } else if(PyObject.class.isInstance(arg)) { return ((PyObject) arg).__tojava__(Object.class); } else if(PyNone.class.isInstance(arg)) { return null; } else { return arg; } } public static <T> Object proxy(Class<T> clazz, T object) { return new PyProxyFactory<T>(clazz, object).getProxy(); } private static class PyProxyFactory<T> implements MethodInterceptor { private T delegate; private Class<T> clazz; private PyProxyFactory(Class<T> clazz, T delegate) { this.clazz = clazz; this.delegate = delegate; } public T getProxy() { return ProxyFactory.getProxy(clazz, this); } @Override public Object invoke(MethodInvocation invocation) throws Throwable { Object returnedValue = invocation.getMethod().invoke(delegate, invocation.getArguments()); return toJava(returnedValue); } } }