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 "<attribute '" + name + "' of '" + dtype.fastGetName() + "' objects>";
}
/**
* @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;
}
}