org.python.core.PyGetSetDescr Maven / Gradle / Ivy
Go to download
Jython is an implementation of the high-level, dynamic, object-oriented
language Python written in 100% Pure Java, and seamlessly integrated with
the Java platform. It thus allows you to run Python on any Java platform.
package org.python.core;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class PyGetSetDescr extends PyDescriptor {
private Method get_meth;
private Method set_meth;
private Method del_meth;
private Class getset_type;
public PyGetSetDescr(PyType dtype,
String name,
Class c,
String get,
String set) {
this(dtype, name, c, get, set, null);
}
public PyGetSetDescr(String name, Class c, String get, String set) {
this(PyType.fromClass(c), name, c, get, set, null);
}
public PyGetSetDescr(PyType dtype,
String name,
Class c,
String get,
String set,
String del) {
this.name = name;
this.dtype = dtype;
try {
get_meth = c.getMethod(get, new Class[] {});
} catch(NoSuchMethodException e) {
throw Py.SystemError("method "+get+" doesn't exist: "+c.getName());
}
if(Modifier.isStatic(get_meth.getModifiers()))
throw Py.SystemError("static "+get+" not supported: "+c.getName());
getset_type = get_meth.getReturnType();
if(set != null) {
try {
set_meth = c.getMethod(set, new Class[] {getset_type});
} catch(NoSuchMethodException e) {
throw Py.SystemError("method "+set+" doesn't exist: "+c.getName());
}
if(Modifier.isStatic(set_meth.getModifiers()))
throw Py.SystemError("static "+set+" not supported: "+c.getName());
}
if(del != null) {
try {
del_meth = c.getMethod(del, new Class[] {});
} catch(NoSuchMethodException e) {
throw Py.SystemError("method "+set+" doesn't exist: "+c.getName());
}
if(Modifier.isStatic(del_meth.getModifiers()))
throw Py.SystemError("static "+del+" not supported: "+c.getName());
}
}
public PyGetSetDescr(String name, Class c, String get, String set, String del) {
this(PyType.fromClass(c), name, c, get, set, del);
}
public String toString() {
return "";
}
/**
* @see org.python.core.PyObject#__get__(org.python.core.PyObject,
* org.python.core.PyObject)
*/
public PyObject __get__(PyObject obj, PyObject type) {
try {
if(obj != null) {
PyType objtype = obj.getType();
if(objtype != dtype && !objtype.isSubType(dtype))
throw get_wrongtype(objtype);
Object v = get_meth.invoke(obj, new Object[0]);
if(v == null) {
obj.noAttributeError(name);
}
return Py.java2py(v);
}
return this;
} catch(IllegalArgumentException e) {
throw Py.JavaError(e);
} catch(IllegalAccessException e) {
throw Py.JavaError(e); // unexpected
} catch(InvocationTargetException e) {
throw Py.JavaError(e);
}
}
/**
* @see org.python.core.PyObject#__set__(org.python.core.PyObject,
* org.python.core.PyObject)
*/
public void __set__(PyObject obj, PyObject value) {
try {
// obj != null
PyType objtype = obj.getType();
if(objtype != dtype && !objtype.isSubType(dtype))
throw get_wrongtype(objtype);
Object converted = value.__tojava__(getset_type);
if(converted == Py.NoConversion) {
throw Py.TypeError(""); // xxx
}
set_meth.invoke(obj, new Object[] {converted});
} catch(IllegalArgumentException e) {
throw Py.JavaError(e);
} catch(IllegalAccessException e) {
throw Py.JavaError(e); // unexpected
} catch(InvocationTargetException e) {
throw Py.JavaError(e);
}
}
public void __delete__(PyObject obj) {
try {
if(obj != null) {
PyType objtype = obj.getType();
if(objtype != dtype && !objtype.isSubType(dtype))
throw get_wrongtype(objtype);
del_meth.invoke(obj, new Object[0]);
}
} catch(IllegalArgumentException e) {
throw Py.JavaError(e);
} catch(IllegalAccessException e) {
throw Py.JavaError(e); // unexpected
} catch(InvocationTargetException e) {
throw Py.JavaError(e);
}
}
/**
* @see org.python.core.PyObject#implementsDescrSet()
*/
public boolean implementsDescrSet() {
return set_meth != null;
}
public boolean implementsDescrDelete() {
return del_meth != null;
}
/**
* @see org.python.core.PyObject#isDataDescr()
*/
public boolean isDataDescr() {
return true;
}
}