*/
public Object execute(Object o, InternalContextAdapter context)
throws MethodInvocationException
{
VelPropertyGet vg = null;
try
{
Class c = o.getClass();
/*
* first, see if we have this information cached.
*/
IntrospectionCacheData icd = context.icacheGet(this);
/*
* if we have the cache data and the class of the object we are
* invoked with is the same as that in the cache, then we must
* be allright. The last 'variable' is the method name, and
* that is fixed in the template :)
*/
if (icd != null && icd.contextData == c)
{
vg = (VelPropertyGet) icd.thingy;
}
else
{
/*
* otherwise, do the introspection, and cache it. Use the
* uberspector
*/
vg = rsvc.getUberspect().getPropertyGet(o,identifier, uberInfo);
if (vg != null && vg.isCacheable())
{
icd = new IntrospectionCacheData();
icd.contextData = c;
icd.thingy = vg;
context.icachePut(this,icd);
}
}
}
catch(Exception e)
{
rsvc.error("ASTIdentifier.execute() : identifier = "
+ identifier + " : " + e);
}
/*
* we have no getter... punt...
*/
if (vg == null)
{
return null;
}
/*
* now try and execute. If we get a MIE, throw that
* as the app wants to get these. If not, log and punt.
*/
try
{
return vg.invoke(o);
}
catch(InvocationTargetException ite)
{
EventCartridge ec = context.getEventCartridge();
/*
* if we have an event cartridge, see if it wants to veto
* also, let non-Exception Throwables go...
*/
if (ec != null
&& ite.getTargetException() instanceof java.lang.Exception)
{
try
{
return ec.methodException(o.getClass(), vg.getMethodName(),
(Exception)ite.getTargetException());
}
catch(Exception e)
{
throw new MethodInvocationException(
"Invocation of method '" + vg.getMethodName() + "'"
+ " in " + o.getClass()
+ " threw exception "
+ ite.getTargetException().getClass() + " : "
+ ite.getTargetException().getMessage(),
ite.getTargetException(), vg.getMethodName());
}
}
else
{
/*
* no event cartridge to override. Just throw
*/
throw new MethodInvocationException(
"Invocation of method '" + vg.getMethodName() + "'"
+ " in " + o.getClass()
+ " threw exception "
+ ite.getTargetException().getClass() + " : "
+ ite.getTargetException().getMessage(),
ite.getTargetException(), vg.getMethodName());
}
}
catch(IllegalArgumentException iae)