Skip to content
This repository has been archived by the owner on Feb 26, 2023. It is now read-only.

Commit

Permalink
Surround with try catch in all cases
Browse files Browse the repository at this point in the history
  • Loading branch information
yDelouis committed Feb 14, 2014
1 parent df760b7 commit db85e0e
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 108 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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<RestHolder> {

Expand Down Expand Up @@ -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<String, JVar> 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");
Expand All @@ -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) {
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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;
}

/**
Expand All @@ -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);

Expand All @@ -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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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 {

Expand Down Expand Up @@ -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;
Expand All @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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 })
Expand Down Expand Up @@ -113,6 +100,7 @@ public interface MyService {
GenericEvent<GenericEvent<GenericEvent<String>>> getEventsGenericsInception(String location, int year) throws RestClientException;

@Get("/events/{year}/{location}")
@SetsCookie({ "xt", "sjsaid" })
Map<String, Event> getEventsGenericsMap(String location, int year) throws RestClientException;

@RequiresCookie("sjsaid")
Expand Down

0 comments on commit db85e0e

Please sign in to comment.