throw new UnableToCompleteException();
}
desc.eventFullName = eventType.getQualifiedSourceName();
// Make sure the eventType has a static getType method
JMethod getTypeMethod = eventType.findMethod("getType", new JType[0]);
if (getTypeMethod == null || !getTypeMethod.isStatic()
|| getTypeMethod.getParameters().length != 0) {
logger.log(TreeLogger.ERROR, "In presenter " + presenterClassName
+ ", method " + desc.functionName + " annotated with @"
+ ProxyEvent.class.getSimpleName() + ". The event class "
+ eventType.getName()
+ " does not have a static getType method with no parameters.");
throw new UnableToCompleteException();
}
JClassType getTypeReturnType = getTypeMethod.getReturnType().isClassOrInterface();
if (getTypeReturnType == null
|| !getTypeReturnType.isAssignableTo(gwtEventTypeClass)) {
logger.log(TreeLogger.ERROR, "In presenter " + presenterClassName
+ ", method " + desc.functionName + " annotated with @"
+ ProxyEvent.class.getSimpleName() + ". The event class "
+ eventType.getName()
+ " getType() method not return a GwtEvent.Type object.");
throw new UnableToCompleteException();
}
// Find the handler class via the dispatch method
JClassType handlerType = null;
for (JMethod eventMethod : eventType.getMethods()) {
if (eventMethod.getName().equals("dispatch")
&& eventMethod.getParameters().length == 1) {
JClassType maybeHandlerType = eventMethod.getParameters()[0].getType().isClassOrInterface();
if (maybeHandlerType != null
&& maybeHandlerType.isAssignableTo(eventHandlerClass)) {
if (handlerType != null) {
logger.log(TreeLogger.ERROR, "In presenter "
+ presenterClassName + ", method " + desc.functionName
+ " annotated with @" + ProxyEvent.class.getSimpleName()
+ ". The event class " + eventType.getName()
+ " has more than one potential 'dispatch' method.");
throw new UnableToCompleteException();
}
handlerType = maybeHandlerType;
}
}
}
if (handlerType == null) {
logger.log(TreeLogger.ERROR, "In presenter " + presenterClassName
+ ", method " + desc.functionName + " annotated with @"
+ ProxyEvent.class.getSimpleName() + ". The event class "
+ eventType.getName() + " has no valid 'dispatch' method.");
throw new UnableToCompleteException();
}
desc.handlerFullName = handlerType.getQualifiedSourceName();
// Find the handler method
if (handlerType.getMethods().length != 1) {
logger.log(TreeLogger.ERROR, "In presenter " + presenterClassName
+ ", method " + desc.functionName + " annotated with @"
+ ProxyEvent.class.getSimpleName() + ". The handler class "
+ handlerType.getName() + " has more than one method.");
throw new UnableToCompleteException();
}
JMethod handlerMethod = handlerType.getMethods()[0];
JClassType handlerMethodReturnType = handlerMethod.getReturnType().isClassOrInterface();
if (handlerMethodReturnType != null
|| handlerMethod.getReturnType().isPrimitive() != JPrimitiveType.VOID) {
logger.log(
TreeLogger.WARN,
"In presenter "
+ presenterClassName
+ ", method "
+ desc.functionName
+ " annotated with @"
+ ProxyEvent.class.getSimpleName()
+ ". The handler class "
+ handlerType.getName()
+ " method "
+ handlerMethod.getName()
+ " returns something else than void. Return value will be ignored.");
}
desc.handlerMethodName = handlerMethod.getName();
// Warn if handlerMethodName is different
if (!desc.handlerMethodName.equals(desc.functionName)) {
logger.log(
TreeLogger.WARN,
"In presenter "
+ presenterClassName
+ ", method "
+ desc.functionName
+ " annotated with @"
+ ProxyEvent.class.getSimpleName()
+ ". The handler class "
+ handlerType.getName()
+ " method "
+ handlerMethod.getName()
+ " differs from the annotated method. You should use the same method name for easier reference.");
}
// Make sure that handler method name is not already used
for (ProxyEventDescription prevDesc : result) {
if (prevDesc.handlerMethodName.equals(desc.handlerMethodName)
&& prevDesc.eventFullName.equals(desc.eventFullName)) {
logger.log(TreeLogger.ERROR, "In presenter " + presenterClassName
+ ", method " + desc.functionName + " annotated with @"
+ ProxyEvent.class.getSimpleName() + ". The handler method "
+ handlerMethod.getName() + " is already used by method "
+ prevDesc.functionName + ".");
throw new UnableToCompleteException();
}
}