X Tutup
Skip to content
This repository was archived by the owner on Feb 26, 2023. It is now read-only.
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -287,6 +287,12 @@ public JExpression getResponseClass(Element element, RestHolder holder) {
JExpression responseClassExpr = nullCastedToNarrowedClass(holder);
TypeMirror returnType = executableElement.getReturnType();
if (returnType.getKind() != TypeKind.VOID) {
if (getElementUtils().getTypeElement(RestSpringClasses.PARAMETERIZED_TYPE_REFERENCE) != null //
&& returnType.getKind() == TypeKind.DECLARED && !((DeclaredType) returnType).getTypeArguments().isEmpty() //
&& !returnType.toString().startsWith(RestSpringClasses.RESPONSE_ENTITY)) {
return createParameterizedTypeReferenceAnonymousSubclassInstance(returnType, holder);
}

JClass responseClass = retrieveResponseClass(returnType, holder);
if (responseClass != null) {
responseClassExpr = responseClass.dotclass();
Expand All @@ -295,6 +301,12 @@ public JExpression getResponseClass(Element element, RestHolder holder) {
return responseClassExpr;
}

public JExpression createParameterizedTypeReferenceAnonymousSubclassInstance(TypeMirror returnType, RestHolder holder) {
JClass narrowedTypeReference = holder.getEnvironment().getJClass(RestSpringClasses.PARAMETERIZED_TYPE_REFERENCE).narrow(codeModelHelper.typeMirrorToJClass(returnType));
JDefinedClass anonymousClass = holder.getEnvironment().getCodeModel().anonymousClass(narrowedTypeReference);
return JExpr._new(anonymousClass);
}

public JClass retrieveResponseClass(TypeMirror returnType, RestHolder holder) {
String returnTypeString = returnType.toString();

Expand All @@ -303,12 +315,12 @@ public JClass retrieveResponseClass(TypeMirror returnType, RestHolder holder) {
if (returnTypeString.startsWith(RESPONSE_ENTITY)) {
DeclaredType declaredReturnType = (DeclaredType) returnType;
if (declaredReturnType.getTypeArguments().size() > 0) {
responseClass = resolveResponseClass(declaredReturnType.getTypeArguments().get(0), holder);
responseClass = resolveResponseClass(declaredReturnType.getTypeArguments().get(0), holder, false);
} else {
responseClass = getEnvironment().getJClass(RESPONSE_ENTITY);
}
} else {
responseClass = resolveResponseClass(returnType, holder);
responseClass = resolveResponseClass(returnType, holder, true);
}

return responseClass;
Expand Down Expand Up @@ -336,7 +348,7 @@ public JClass retrieveResponseClass(TypeMirror returnType, RestHolder holder) {
* </ul>
*
*/
private JClass resolveResponseClass(TypeMirror expectedType, RestHolder holder) {
private JClass resolveResponseClass(TypeMirror expectedType, RestHolder holder, boolean useTypeReference) {
// is a class or an interface
if (expectedType.getKind() == TypeKind.DECLARED) {
DeclaredType declaredType = (DeclaredType) expectedType;
Expand All @@ -351,6 +363,10 @@ private JClass resolveResponseClass(TypeMirror expectedType, RestHolder holder)
// 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);
}

JClass baseClass = codeModelHelper.typeMirrorToJClass(declaredType).erasure();
JClass decoratedExpectedClass = retrieveDecoratedResponseClass(declaredType, declaredElement, holder);
if (decoratedExpectedClass == null) {
Expand All @@ -359,7 +375,18 @@ private JClass resolveResponseClass(TypeMirror expectedType, RestHolder holder)
return decoratedExpectedClass;
} else if (expectedType.getKind() == TypeKind.ARRAY) {
ArrayType arrayType = (ArrayType) expectedType;
return resolveResponseClass(arrayType.getComponentType(), holder).array();

TypeMirror componentType = arrayType.getComponentType();

if (componentType.getKind() == TypeKind.DECLARED) {
DeclaredType declaredType = (DeclaredType) componentType;

if (useTypeReference && getElementUtils().getTypeElement(RestSpringClasses.PARAMETERIZED_TYPE_REFERENCE) != null) {
return codeModelHelper.typeMirrorToJClass(expectedType);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

shouldnt the expectedType be declaredType? if not you should remove the unused variable declaredType.

}
}

return resolveResponseClass(componentType, holder, false).array();
}

// is not a class nor an interface, return directly
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ public final class RestSpringClasses {
public static final String HTTP_BASIC_AUTHENTICATION = "org.springframework.http.HttpBasicAuthentication";
public static final String REST_CLIENT_EXCEPTION = "org.springframework.web.client.RestClientException";
public static final String NESTED_RUNTIME_EXCEPTION = "org.springframework.core.NestedRuntimeException";
public static final String PARAMETERIZED_TYPE_REFERENCE = "org.springframework.core.ParameterizedTypeReference";

private RestSpringClasses() {

Expand Down
X Tutup