diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/rest/RestMethodHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/rest/RestMethodHandler.java index 662dec0cb4..49cb67617c 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/rest/RestMethodHandler.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/rest/RestMethodHandler.java @@ -15,16 +15,7 @@ */ package org.androidannotations.handler.rest; -import java.util.List; -import java.util.Locale; -import java.util.TreeMap; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; -import javax.lang.model.element.ExecutableElement; -import javax.lang.model.element.VariableElement; -import javax.lang.model.type.TypeKind; - +import com.sun.codemodel.*; import org.androidannotations.handler.BaseAnnotationHandler; import org.androidannotations.helper.APTCodeModelHelper; import org.androidannotations.helper.CanonicalNameConstants; @@ -33,22 +24,14 @@ import org.androidannotations.model.AnnotationElements; import org.androidannotations.process.IsValid; -import com.sun.codemodel.JArray; -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JCatchBlock; -import com.sun.codemodel.JClass; -import com.sun.codemodel.JConditional; -import com.sun.codemodel.JExpr; -import com.sun.codemodel.JExpression; -import com.sun.codemodel.JFieldRef; -import com.sun.codemodel.JForEach; -import com.sun.codemodel.JInvocation; -import com.sun.codemodel.JMethod; -import com.sun.codemodel.JMod; -import com.sun.codemodel.JOp; -import com.sun.codemodel.JTryBlock; -import com.sun.codemodel.JType; -import com.sun.codemodel.JVar; +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.Element; +import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.VariableElement; +import javax.lang.model.type.TypeKind; +import java.util.List; +import java.util.Locale; +import java.util.TreeMap; public abstract class RestMethodHandler extends BaseAnnotationHandler { @@ -81,7 +64,7 @@ public void process(Element element, RestHolder holder) { JMethod method = holder.getGeneratedClass().method(JMod.PUBLIC, methodReturnClass, methodName); method.annotate(Override.class); TreeMap params = addMethodParams(executableElement, holder, method); - JBlock methodBody = method.body(); + JBlock methodBody = new JBlock(false, false); // RestTemplate exchange() method call JInvocation exchangeCall = JExpr.invoke(holder.getRestTemplateField(), "exchange"); @@ -94,18 +77,14 @@ public void process(Element element, RestHolder holder) { exchangeCall.arg(urlVariables); } - JExpression returnCall = exchangeCall; - JExpression result = setCookies(executableElement, holder, methodBody, exchangeCall); - if (result != null) { - returnCall = result; - } - - if (methodReturnVoid && result == null) { - insertRestTryCatchBlock(holder, methodBody, exchangeCall, methodReturnVoid); + JExpression response = setCookies(executableElement, holder, methodBody, exchangeCall); + if (methodReturnVoid && response.equals(exchangeCall)) { + methodBody.add(exchangeCall); } else if (!methodReturnVoid) { - returnCall = addResultCallMethod(returnCall, methodReturnClass); - insertRestTryCatchBlock(holder, methodBody, returnCall, methodReturnVoid); + methodBody._return(addResultCallMethod(response, methodReturnClass)); } + methodBody = surroundWithRestTryCatch(holder, methodBody, methodReturnVoid); + method.body().add(methodBody); } protected JClass getMethodReturnClass(Element element, RestHolder holder) { @@ -171,13 +150,14 @@ protected JExpression addResultCallMethod(JExpression exchangeCall, JClass metho return exchangeCall; } - private JFieldRef setCookies(ExecutableElement executableElement, RestHolder restHolder, JBlock methodBody, JInvocation exchangeCall) { + private JExpression setCookies(ExecutableElement executableElement, RestHolder restHolder, JBlock methodBody, JInvocation exchangeCall) { String[] settingCookies = restAnnotationHelper.settingCookies(executableElement); if (settingCookies != null) { boolean methodReturnVoid = executableElement.getReturnType().getKind() == TypeKind.VOID; - JClass methodReturnClass = getMethodReturnClass(executableElement, restHolder); - JClass responseEntityClass = classes().RESPONSE_ENTITY.narrow(methodReturnVoid ? codeModel().VOID : methodReturnClass); + JClass exchangeResponseClass = restAnnotationHelper.retrieveResponseClass(executableElement.getReturnType(), restHolder); + JType narrowType = exchangeResponseClass == null || methodReturnVoid ? codeModel().VOID : exchangeResponseClass; + JClass responseEntityClass = classes().RESPONSE_ENTITY.narrow(narrowType); JVar responseEntity = methodBody.decl(responseEntityClass, "response", exchangeCall); // set cookies @@ -214,9 +194,9 @@ private JFieldRef setCookies(ExecutableElement executableElement, RestHolder res thenBlock.invoke(restHolder.getAvailableCookiesField(), "put").arg(innerForEach.var()).arg(cookieValue); thenBlock._break(); - return JExpr.ref(responseEntity.name()); + return responseEntity; } - return null; + return exchangeCall; } /** @@ -227,14 +207,11 @@ private JFieldRef setCookies(ExecutableElement executableElement, RestHolder res * if void). If the handler isn't set, it will re-throw the exception so * that it behaves as it did previous to this feature. */ - private void insertRestTryCatchBlock(RestHolder holder, JBlock body, JExpression returnCall, boolean methodReturnVoid) { - JTryBlock tryBlock = body._try(); + private JBlock surroundWithRestTryCatch(RestHolder holder, JBlock block, boolean methodReturnVoid) { + JBlock newBlock = new JBlock(false, false); - if (methodReturnVoid) { - tryBlock.body().add((JInvocation) returnCall); - } else { - tryBlock.body()._return(returnCall); - } + JTryBlock tryBlock = newBlock._try(); + codeModelHelper.copy(block, tryBlock.body()); JCatchBlock jCatch = tryBlock._catch(classes().REST_CLIENT_EXCEPTION); @@ -254,5 +231,7 @@ private void insertRestTryCatchBlock(RestHolder holder, JBlock body, JExpression // re-throw the exception if handler wasn't set. conditional._else()._throw(exceptionParam); + + return newBlock; } } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/APTCodeModelHelper.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/APTCodeModelHelper.java index 0bb4549783..ea8d072e1d 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/APTCodeModelHelper.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/APTCodeModelHelper.java @@ -15,46 +15,17 @@ */ package org.androidannotations.helper; -import java.io.StringWriter; -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -import javax.lang.model.element.Element; -import javax.lang.model.element.ExecutableElement; -import javax.lang.model.element.TypeElement; -import javax.lang.model.element.TypeParameterElement; -import javax.lang.model.element.VariableElement; -import javax.lang.model.type.ArrayType; -import javax.lang.model.type.DeclaredType; -import javax.lang.model.type.TypeKind; -import javax.lang.model.type.TypeMirror; -import javax.lang.model.type.WildcardType; -import javax.lang.model.util.ElementFilter; -import javax.lang.model.util.Types; - +import com.sun.codemodel.*; import org.androidannotations.holder.EComponentHolder; import org.androidannotations.holder.GeneratedClassHolder; -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JClass; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JDefinedClass; -import com.sun.codemodel.JExpr; -import com.sun.codemodel.JExpression; -import com.sun.codemodel.JFieldRef; -import com.sun.codemodel.JFormatter; -import com.sun.codemodel.JInvocation; -import com.sun.codemodel.JMethod; -import com.sun.codemodel.JMod; -import com.sun.codemodel.JStatement; -import com.sun.codemodel.JSuperWildcard; -import com.sun.codemodel.JType; -import com.sun.codemodel.JVar; +import javax.lang.model.element.*; +import javax.lang.model.type.*; +import javax.lang.model.util.ElementFilter; +import javax.lang.model.util.Types; +import java.io.StringWriter; +import java.lang.reflect.Field; +import java.util.*; public class APTCodeModelHelper { @@ -265,7 +236,11 @@ public JBlock removeBody(JMethod method) { } JBlock clonedBody = new JBlock(false, false); + copy(body, clonedBody); + return clonedBody; + } + public void copy(JBlock body, JBlock newBody) { for (Object statement : body.getContents()) { if (statement instanceof JVar) { JVar var = (JVar) statement; @@ -274,16 +249,14 @@ public JBlock removeBody(JMethod method) { varInitField.setAccessible(true); JExpression varInit = (JExpression) varInitField.get(var); - clonedBody.decl(var.type(), var.name(), varInit); + newBody.decl(var.type(), var.name(), varInit); } catch (Exception e) { throw new RuntimeException(e); } } else { - clonedBody.add((JStatement) statement); + newBody.add((JStatement) statement); } } - - return clonedBody; } public void replaceSuperCall(JMethod method, JBlock replacement) { diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/rest/MyService.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/rest/MyService.java index 7839f366fc..c65bcd617b 100644 --- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/rest/MyService.java +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/rest/MyService.java @@ -15,10 +15,8 @@ */ package org.androidannotations.test15.rest; -import java.util.List; -import java.util.Map; -import java.util.Set; - +import org.androidannotations.annotations.rest.*; +import org.androidannotations.api.rest.MediaType; import org.springframework.http.HttpAuthentication; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; @@ -27,20 +25,9 @@ import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; -import org.androidannotations.annotations.rest.Accept; -import org.androidannotations.annotations.rest.Delete; -import org.androidannotations.annotations.rest.Get; -import org.androidannotations.annotations.rest.Head; -import org.androidannotations.annotations.rest.Options; -import org.androidannotations.annotations.rest.Post; -import org.androidannotations.annotations.rest.Put; -import org.androidannotations.annotations.rest.RequiresAuthentication; -import org.androidannotations.annotations.rest.RequiresCookie; -import org.androidannotations.annotations.rest.RequiresCookieInUrl; -import org.androidannotations.annotations.rest.RequiresHeader; -import org.androidannotations.annotations.rest.Rest; -import org.androidannotations.annotations.rest.SetsCookie; -import org.androidannotations.api.rest.MediaType; +import java.util.List; +import java.util.Map; +import java.util.Set; // if defined, the rootUrl will be added as a prefix to every request @Rest(rootUrl = "http://company.com/ajax/services", converters = { MappingJacksonHttpMessageConverter.class }, interceptors = { RequestInterceptor.class }) @@ -113,6 +100,7 @@ public interface MyService { GenericEvent>> getEventsGenericsInception(String location, int year) throws RestClientException; @Get("/events/{year}/{location}") + @SetsCookie({ "xt", "sjsaid" }) Map getEventsGenericsMap(String location, int year) throws RestClientException; @RequiresCookie("sjsaid")