if (className!=null) {
try {
ClassLoader classLoader = wireContext.getClassLoader();
clazz = ReflectUtil.loadClass(classLoader, className);
} catch (Exception e) {
throw new WireException("couldn't create object"+(name!=null ? " '"+name+"'" : "")+": "+e.getMessage(), e);
}
if (methodName==null) {
// plain instantiation
try {
Object[] args = getArgs(wireContext, argDescriptors);
Constructor<?> constructor = ReflectUtil.findConstructor(clazz, argDescriptors, args);
if (constructor==null) {
throw new WireException("couldn't find constructor "+clazz.getName()+" with args "+Arrays.toString(args));
}
object = constructor.newInstance(args);
} catch (WireException e) {
throw e;
} catch (Exception e) {
throw new WireException("couldn't create object '"+(name!=null ? name : className)+"': "+e.getMessage(), e);
}
}
} else if (factoryObjectName!=null) {
// referenced factory object
object = wireContext.get(factoryObjectName, false);
if (object==null) {
throw new WireException("can't invoke method '"+methodName+"' on null, resulted from fetching object '"+factoryObjectName+"' from this wiring environment");
}
} else if (factoryDescriptor!=null) {
// factory object descriptor
object = wireContext.create(factoryDescriptor, false);
if (object==null) {
throw new WireException("created factory object is null, can't invoke method '"+methodName+"' on it");
}
} else if (expr!=null) {
ScriptManager scriptManager = EnvironmentDefaults.getScriptManager();
object = scriptManager.evaluateExpression(expr, lang);
}
if (methodName!=null) {
// method invocation on object or static method invocation in case object is null
if (object!=null) {
clazz = object.getClass();
}
try {
Object[] args = ObjectDescriptor.getArgs(wireContext, argDescriptors);
Method method = ReflectUtil.findMethod(clazz, methodName, argDescriptors, args);
if (method==null) {
// throw exception but first, generate decent message
throw new WireException("method "+ReflectUtil.getSignature(methodName, argDescriptors, args)+" is not available on "+
(object!=null ? "object "+object+" ("+clazz.getName()+")" : "class "+clazz.getName()));
}
if (object == null && (!Modifier.isStatic(method.getModifiers()))) {
// A non static method is invoked on a null object
throw new WireException("method "+ clazz.getName() + "." + ReflectUtil.getSignature(methodName, argDescriptors, args)+" is not static. It cannot be called on a null object.");
}
object = ReflectUtil.invoke(method, object, args);
} catch (WireException e) {
throw e;
} catch (Exception e) {
throw new WireException("couldn't invoke factory method "+methodName+": "+e.getMessage(), e);
}
}
return object;
}