Skip to content
This repository was archived by the owner on Feb 26, 2023. It is now read-only.
Merged
Changes from 1 commit
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
Prev Previous commit
Next Next commit
Implement SetsCookie, only using an Entity instance if needed
  • Loading branch information
dhleong committed May 5, 2013
commit dd1397b211199378f28cf1a61a5d4e909aa34d0e
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,13 @@
import org.androidannotations.processing.DecoratingElementProcessor;
import org.androidannotations.processing.EBeanHolder;

import com.sun.codemodel.JArray;
import com.sun.codemodel.JBlock;
import com.sun.codemodel.JClass;
import com.sun.codemodel.JCodeModel;
import com.sun.codemodel.JExpr;
import com.sun.codemodel.JExpression;
import com.sun.codemodel.JForEach;
import com.sun.codemodel.JInvocation;
import com.sun.codemodel.JMethod;
import com.sun.codemodel.JMod;
Expand Down Expand Up @@ -115,12 +117,53 @@ protected void generateRestTemplateCallBlock(MethodProcessorHolder methodHolder)
restCall.arg(hashMapVar);
}

JClass voidClass = eBeanHolder.refClass(Void.class);
JClass responseEntityClass = eBeanHolder.refClass(CanonicalNameConstants.RESPONSE_ENTITY).narrow(methodReturnVoid ? voidClass : expectedClass);
JVar responseEntity = body.decl(responseEntityClass, "response", restCall);
final JExpression result;
final boolean usesInstance; // do we have an instance of the entity?

// attempt to retrieve cookies from the response
String[] settingCookies = retrieveSettingCookieNames(executableElement);
boolean setsCookies = settingCookies != null;
if (setsCookies) {

JClass voidClass = eBeanHolder.refClass(Void.class);
JClass responseEntityClass = eBeanHolder.refClass(CanonicalNameConstants.RESPONSE_ENTITY).narrow(methodReturnVoid ? voidClass : expectedClass);
JVar responseEntity = body.decl(responseEntityClass, "response", restCall);

// set cookies
JClass listClass = eBeanHolder.refClass(List.class).narrow(String.class);
JClass stringClass = eBeanHolder.refClass(CanonicalNameConstants.STRING);
JClass stringArrayClass = stringClass.array();
JArray cookiesArray = JExpr.newArray(stringClass);
for (String cookie : settingCookies) {
cookiesArray.add(JExpr.lit(cookie));
}
JVar requestedCookiesVar = body.decl(stringArrayClass, "requestedCookies", cookiesArray);

JInvocation setCookiesList = JExpr.invoke(responseEntity, "getHeaders").invoke("get").arg("Set-Cookie");
JVar allCookiesList = body.decl(listClass, "allCookies", setCookiesList);

// for loop over list... add if in string array
JForEach forEach = body.forEach(stringClass, "rawCookie", allCookiesList);
JVar rawCookieVar = forEach.var();

JBlock forLoopBody = forEach.body();

JForEach innerForEach = forLoopBody.forEach(stringClass, "thisCookieName", requestedCookiesVar);
JBlock innerBody = innerForEach.body();
JBlock thenBlock = innerBody._if(JExpr.invoke(rawCookieVar, "startsWith").arg(innerForEach.var()))._then();
JExpression indexOfValue = rawCookieVar.invoke("indexOf").arg("=").plus(JExpr.lit(1));
JInvocation cookieValue = rawCookieVar.invoke("substring").arg(indexOfValue);
thenBlock.invoke(holder.availableCookiesField, "put").arg(innerForEach.var()).arg(cookieValue);
thenBlock._break();

JExpression result = JExpr.ref(responseEntity.name());
insertRestCallInBody(body, result, methodHolder, methodReturnVoid);
result = JExpr.ref(responseEntity.name());
usesInstance = true;
} else {
result = restCall;
usesInstance = false;
}

insertRestCallInBody(body, result, methodHolder, methodReturnVoid, usesInstance);
}

/**
Expand Down Expand Up @@ -148,10 +191,10 @@ protected JExpression addResultCallMethod(JExpression i, MethodProcessorHolder m
return i;
}

private void insertRestCallInBody(JBlock body, JExpression restCall, MethodProcessorHolder methodHolder, boolean methodReturnVoid) {
if (methodReturnVoid) {
// body.add(restCall);
} else {
private void insertRestCallInBody(JBlock body, JExpression restCall, MethodProcessorHolder methodHolder, boolean methodReturnVoid, boolean usesInstance) {
if (methodReturnVoid && !usesInstance && restCall instanceof JInvocation) {
body.add((JInvocation) restCall);
} else if (!methodReturnVoid) {
restCall = addResultCallMethod(restCall, methodHolder);
body._return(restCall);
}
Expand Down