use of javax.lang.model.type.DeclaredType in project androidannotations by androidannotations.
the class RestAnnotationHelper method checkIfParameterizedTypeReferenceShouldBeUsed.
private boolean checkIfParameterizedTypeReferenceShouldBeUsed(TypeMirror returnType) {
switch(returnType.getKind()) {
case DECLARED:
return !((DeclaredType) returnType).getTypeArguments().isEmpty();
case ARRAY:
ArrayType arrayType = (ArrayType) returnType;
TypeMirror componentType = arrayType.getComponentType();
return checkIfParameterizedTypeReferenceShouldBeUsed(componentType);
}
return false;
}
use of javax.lang.model.type.DeclaredType in project androidannotations by androidannotations.
the class RestAnnotationHelper method getResponseClass.
public IJExpression getResponseClass(Element element, RestHolder holder) {
ExecutableElement executableElement = (ExecutableElement) element;
IJExpression responseClassExpr = nullCastedToNarrowedClass(holder);
TypeMirror returnType = executableElement.getReturnType();
if (returnType.getKind() != TypeKind.VOID) {
if (getElementUtils().getTypeElement(RestSpringClasses.PARAMETERIZED_TYPE_REFERENCE) != null) {
if (returnType.toString().startsWith(RestSpringClasses.RESPONSE_ENTITY)) {
List<? extends TypeMirror> typeArguments = ((DeclaredType) returnType).getTypeArguments();
if (!typeArguments.isEmpty()) {
returnType = typeArguments.get(0);
}
}
if (checkIfParameterizedTypeReferenceShouldBeUsed(returnType)) {
return createParameterizedTypeReferenceAnonymousSubclassInstance(returnType);
}
}
AbstractJClass responseClass = retrieveResponseClass(returnType, holder);
if (responseClass != null) {
responseClassExpr = responseClass.dotclass();
}
}
return responseClassExpr;
}
use of javax.lang.model.type.DeclaredType in project androidannotations by androidannotations.
the class RestAnnotationHelper method resolveResponseClass.
/**
* Resolve the expected class for the input type according to the following
* rules :
* <ul>
* <li>The type is a primitive : Directly return the JClass as usual</li>
* <li>The type is NOT a generics : Directly return the JClass as usual</li>
* <li>The type is a generics and enclosing type is a class C<T> :
* Generate a subclass of C<T> and return it</li>
* <li>The type is a generics and enclosing type is an interface I<T>
* : Looking the inheritance tree, then</li>
* <ol>
* <li>One of the parent is a {@link java.util.Map Map} : Generate a
* subclass of {@link LinkedHashMap}<T> one and return it</li>
* <li>One of the parent is a {@link Set} : Generate a subclass of
* {@link TreeSet}<T> one and return it</li>
* <li>One of the parent is a {@link java.util.Collection Collection} :
* Generate a subclass of {@link ArrayList}<T> one and return it</li>
* <li>Return {@link Object} definition</li>
* </ol>
* </ul>
*
*/
private AbstractJClass resolveResponseClass(TypeMirror expectedType, RestHolder holder, boolean useTypeReference) {
// is a class or an interface
if (expectedType.getKind() == TypeKind.DECLARED) {
DeclaredType declaredType = (DeclaredType) expectedType;
List<? extends TypeMirror> typeArguments = declaredType.getTypeArguments();
// is NOT a generics, return directly
if (typeArguments.isEmpty()) {
return codeModelHelper.typeMirrorToJClass(declaredType);
}
// is a generics, must generate a new super class
TypeElement declaredElement = (TypeElement) declaredType.asElement();
if (useTypeReference && getElementUtils().getTypeElement(RestSpringClasses.PARAMETERIZED_TYPE_REFERENCE) != null) {
return codeModelHelper.typeMirrorToJClass(declaredType);
}
AbstractJClass baseClass = codeModelHelper.typeMirrorToJClass(declaredType).erasure();
AbstractJClass decoratedExpectedClass = retrieveDecoratedResponseClass(declaredType, declaredElement, holder);
if (decoratedExpectedClass == null) {
decoratedExpectedClass = baseClass;
}
return decoratedExpectedClass;
} else if (expectedType.getKind() == TypeKind.ARRAY) {
ArrayType arrayType = (ArrayType) expectedType;
TypeMirror componentType = arrayType.getComponentType();
return resolveResponseClass(componentType, holder, false).array();
}
// is not a class nor an interface, return directly
return codeModelHelper.typeMirrorToJClass(expectedType);
}
use of javax.lang.model.type.DeclaredType in project androidannotations by androidannotations.
the class RestSpringValidatorHelper method hasSetOfHttpMethodReturnType.
public void hasSetOfHttpMethodReturnType(ExecutableElement element, ElementValidation valid) {
TypeMirror returnType = element.getReturnType();
String returnTypeString = returnType.toString();
if (!returnTypeString.equals("java.util.Set<org.springframework.http.HttpMethod>")) {
valid.addError("%s annotated methods can only return a Set of HttpMethod, not " + returnTypeString);
} else {
DeclaredType declaredType = (DeclaredType) returnType;
List<? extends TypeMirror> typeArguments = declaredType.getTypeArguments();
if (typeArguments.size() != 1) {
valid.addError("%s annotated methods can only return a parameterized Set (with HttpMethod)");
} else {
TypeMirror typeArgument = typeArguments.get(0);
if (!typeArgument.toString().equals("org.springframework.http.HttpMethod")) {
valid.addError("%s annotated methods can only return a parameterized Set of HttpMethod, not " + typeArgument.toString());
}
}
}
}
use of javax.lang.model.type.DeclaredType in project androidannotations by androidannotations.
the class RestHandler method setResponseErrorHandler.
private void setResponseErrorHandler(Element element, RestHolder holder) {
DeclaredType responseErrorHandler = annotationHelper.extractAnnotationClassParameter(element, getTarget(), "responseErrorHandler");
if (responseErrorHandler != null) {
JInvocation errorHandler = codeModelHelper.newBeanOrEBean(responseErrorHandler, holder.getInitContextParam());
holder.getInit().body().add(invoke(holder.getRestTemplateField(), "setErrorHandler").arg(errorHandler));
}
}
Aggregations