Skip to content

Commit 41538df

Browse files
committed
Merge branch '661_ebeanInterceptors' of https://github.com/yDelouis/androidannotations into yDelouis-661_ebeanInterceptors
Conflicts: AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/Pair.java AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ValidatorHelper.java AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/rest/MyService.java
2 parents 4e08a3e + d474cdb commit 41538df

11 files changed

Lines changed: 225 additions & 97 deletions

File tree

AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/rest/RestHandler.java

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -15,39 +15,39 @@
1515
*/
1616
package org.androidannotations.handler.rest;
1717

18-
import static com.sun.codemodel.JExpr._new;
19-
import static com.sun.codemodel.JExpr.invoke;
20-
import static com.sun.codemodel.JExpr.lit;
21-
import static org.androidannotations.helper.CanonicalNameConstants.ARRAYLIST;
22-
import static org.androidannotations.helper.CanonicalNameConstants.CLIENT_HTTP_REQUEST_INTERCEPTOR;
23-
24-
import java.util.List;
25-
26-
import javax.annotation.processing.ProcessingEnvironment;
27-
import javax.lang.model.element.Element;
28-
import javax.lang.model.element.TypeElement;
29-
import javax.lang.model.type.DeclaredType;
30-
18+
import com.sun.codemodel.JBlock;
19+
import com.sun.codemodel.JClass;
20+
import com.sun.codemodel.JFieldVar;
21+
import com.sun.codemodel.JInvocation;
3122
import org.androidannotations.annotations.rest.Rest;
3223
import org.androidannotations.handler.BaseAnnotationHandler;
3324
import org.androidannotations.handler.GeneratingAnnotationHandler;
25+
import org.androidannotations.helper.APTCodeModelHelper;
3426
import org.androidannotations.helper.AnnotationHelper;
3527
import org.androidannotations.holder.RestHolder;
3628
import org.androidannotations.model.AnnotationElements;
3729
import org.androidannotations.process.IsValid;
3830
import org.androidannotations.process.ProcessHolder;
3931

40-
import com.sun.codemodel.JBlock;
41-
import com.sun.codemodel.JClass;
42-
import com.sun.codemodel.JFieldVar;
32+
import javax.annotation.processing.ProcessingEnvironment;
33+
import javax.lang.model.element.Element;
34+
import javax.lang.model.element.TypeElement;
35+
import javax.lang.model.type.DeclaredType;
36+
import java.util.List;
37+
38+
import static com.sun.codemodel.JExpr.*;
39+
import static org.androidannotations.helper.CanonicalNameConstants.ARRAYLIST;
40+
import static org.androidannotations.helper.CanonicalNameConstants.CLIENT_HTTP_REQUEST_INTERCEPTOR;
4341

4442
public class RestHandler extends BaseAnnotationHandler<RestHolder> implements GeneratingAnnotationHandler<RestHolder> {
4543

4644
private final AnnotationHelper annotationHelper;
45+
private final APTCodeModelHelper codeModelHelper;
4746

4847
public RestHandler(ProcessingEnvironment processingEnvironment) {
4948
super(Rest.class, processingEnvironment);
5049
annotationHelper = new AnnotationHelper(processingEnv);
50+
codeModelHelper = new APTCodeModelHelper();
5151
}
5252

5353
@Override
@@ -96,8 +96,8 @@ private void setConverters(Element element, RestHolder holder) {
9696
JFieldVar restTemplateField = holder.getRestTemplateField();
9797
JBlock init = holder.getInit().body();
9898
for (DeclaredType converterType : converters) {
99-
JClass converterClass = refClass(converterType.toString());
100-
init.add(invoke(restTemplateField, "getMessageConverters").invoke("add").arg(_new(converterClass)));
99+
JInvocation newConverter = codeModelHelper.newBeanOrEBean(holder, converterType, holder.getInitContextParam());
100+
init.add(invoke(restTemplateField, "getMessageConverters").invoke("add").arg(newConverter));
101101
}
102102
}
103103

@@ -111,8 +111,8 @@ private void setInterceptors(Element element, RestHolder holder) {
111111
JBlock init = holder.getInit().body();
112112
init.add(invoke(restTemplateField, "setInterceptors").arg(_new(listClass)));
113113
for (DeclaredType interceptorType : interceptors) {
114-
JClass interceptorClass = refClass(interceptorType.toString());
115-
init.add(invoke(restTemplateField, "getInterceptors").invoke("add").arg(_new(interceptorClass)));
114+
JInvocation newInterceptor = codeModelHelper.newBeanOrEBean(holder, interceptorType, holder.getInitContextParam());
115+
init.add(invoke(restTemplateField, "getInterceptors").invoke("add").arg(newInterceptor));
116116
}
117117
}
118118
}

AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/rest/RestServiceHandler.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
1919
import javax.lang.model.element.Element;
2020
import javax.lang.model.type.TypeMirror;
2121

22+
import com.sun.codemodel.JBlock;
23+
import com.sun.codemodel.JExpr;
24+
import com.sun.codemodel.JFieldRef;
2225
import org.androidannotations.annotations.rest.Rest;
2326
import org.androidannotations.annotations.rest.RestService;
2427
import org.androidannotations.handler.BaseAnnotationHandler;
@@ -27,9 +30,6 @@
2730
import org.androidannotations.model.AnnotationElements;
2831
import org.androidannotations.process.IsValid;
2932

30-
import com.sun.codemodel.JBlock;
31-
import com.sun.codemodel.JExpr;
32-
import com.sun.codemodel.JFieldRef;
3333

3434
public class RestServiceHandler extends BaseAnnotationHandler<EComponentHolder> {
3535

@@ -59,6 +59,6 @@ public void process(Element element, EComponentHolder holder) {
5959

6060
JFieldRef field = JExpr.ref(fieldName);
6161

62-
methodBody.assign(field, JExpr._new(refClass(generatedClassName)));
62+
methodBody.assign(field, JExpr._new(refClass(generatedClassName)).arg(holder.getContextRef()));
6363
}
6464
}

AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/APTCodeModelHelper.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@
3737
import javax.lang.model.util.ElementFilter;
3838
import javax.lang.model.util.Types;
3939

40+
import org.androidannotations.annotations.EBean;
41+
import org.androidannotations.holder.EBeanHolder;
4042
import org.androidannotations.holder.EComponentHolder;
4143
import org.androidannotations.holder.GeneratedClassHolder;
4244

@@ -56,6 +58,9 @@
5658
import com.sun.codemodel.JType;
5759
import com.sun.codemodel.JVar;
5860

61+
import static com.sun.codemodel.JExpr._new;
62+
import static org.androidannotations.helper.ModelConstants.GENERATION_SUFFIX;
63+
5964
public class APTCodeModelHelper {
6065

6166
public JClass typeMirrorToJClass(TypeMirror type, GeneratedClassHolder holder) {
@@ -433,4 +438,14 @@ private ExecutableElement getMethod(List<ExecutableElement> methods, String meth
433438
return null;
434439
}
435440

441+
public JInvocation newBeanOrEBean(GeneratedClassHolder holder, DeclaredType beanType, JVar contextVar) {
442+
if (beanType.asElement().getAnnotation(EBean.class) != null) {
443+
String typeQualifiedName = beanType.toString();
444+
JClass injectedClass = holder.refClass(typeQualifiedName + GENERATION_SUFFIX);
445+
return injectedClass.staticInvoke(EBeanHolder.GET_INSTANCE_METHOD_NAME).arg(contextVar);
446+
} else {
447+
return _new(holder.refClass(beanType.toString()));
448+
}
449+
}
450+
436451
}

AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ValidatorHelper.java

Lines changed: 61 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,14 @@
2929
import static org.androidannotations.helper.ModelConstants.VALID_ENHANCED_VIEW_SUPPORT_ANNOTATIONS;
3030

3131
import java.lang.annotation.Annotation;
32-
import java.util.*;
32+
import java.util.ArrayList;
33+
import java.util.Arrays;
34+
import java.util.Collection;
35+
import java.util.HashMap;
36+
import java.util.List;
37+
import java.util.Map;
38+
import java.util.Set;
39+
import java.util.TreeSet;
3340

3441
import javax.lang.model.element.AnnotationMirror;
3542
import javax.lang.model.element.Element;
@@ -46,7 +53,14 @@
4653
import javax.lang.model.util.ElementFilter;
4754
import javax.lang.model.util.Elements;
4855

49-
import org.androidannotations.annotations.*;
56+
import org.androidannotations.annotations.EActivity;
57+
import org.androidannotations.annotations.EBean;
58+
import org.androidannotations.annotations.EFragment;
59+
import org.androidannotations.annotations.EIntentService;
60+
import org.androidannotations.annotations.EService;
61+
import org.androidannotations.annotations.Receiver;
62+
import org.androidannotations.annotations.Trace;
63+
import org.androidannotations.annotations.ViewById;
5064
import org.androidannotations.annotations.rest.Delete;
5165
import org.androidannotations.annotations.rest.Get;
5266
import org.androidannotations.annotations.rest.Head;
@@ -93,7 +107,6 @@ public class ValidatorHelper {
93107
private static final List<Receiver.RegisterAt> VALID_SERVICE_REGISTER_AT = Arrays.asList(Receiver.RegisterAt.OnCreateOnDestroy);
94108
private static final List<Receiver.RegisterAt> VALID_FRAGMENT_REGISTER_AT = Arrays.asList(Receiver.RegisterAt.OnCreateOnDestroy, Receiver.RegisterAt.OnResumeOnPause, Receiver.RegisterAt.OnStartOnStop, Receiver.RegisterAt.OnAttachOnDetach);
95109

96-
97110
protected final TargetAnnotationHelper annotationHelper;
98111

99112
public final ValidatorParameterHelper param;
@@ -1058,14 +1071,19 @@ public void validateConverters(Element element, IsValid valid) {
10581071
Element converterElement = converterType.asElement();
10591072
if (converterElement.getKind().isClass()) {
10601073
if (!annotationHelper.isAbstract(converterElement)) {
1061-
List<ExecutableElement> constructors = ElementFilter.constructorsIn(converterElement.getEnclosedElements());
1062-
for (ExecutableElement constructor : constructors) {
1063-
if (annotationHelper.isPublic(constructor) && constructor.getParameters().isEmpty()) {
1064-
return;
1074+
if (converterElement.getAnnotation(EBean.class) == null) {
1075+
List<ExecutableElement> constructors = ElementFilter.constructorsIn(converterElement.getEnclosedElements());
1076+
boolean hasPublicWithNoArgumentConstructor = false;
1077+
for (ExecutableElement constructor : constructors) {
1078+
if (annotationHelper.isPublic(constructor) && constructor.getParameters().isEmpty()) {
1079+
hasPublicWithNoArgumentConstructor = true;
1080+
}
1081+
}
1082+
if (!hasPublicWithNoArgumentConstructor) {
1083+
valid.invalidate();
1084+
annotationHelper.printAnnotationError(element, "The converter class must have a public no argument constructor");
10651085
}
10661086
}
1067-
valid.invalidate();
1068-
annotationHelper.printAnnotationError(element, "The converter class must have a public no argument constructor");
10691087
} else {
10701088
valid.invalidate();
10711089
annotationHelper.printAnnotationError(element, "The converter class must not be abstract");
@@ -1079,28 +1097,6 @@ public void validateConverters(Element element, IsValid valid) {
10791097
annotationHelper.printAnnotationError(element, "The converter class must be a subtype of " + HTTP_MESSAGE_CONVERTER);
10801098
}
10811099
}
1082-
1083-
}
1084-
1085-
public void isDebuggable(Element element, AndroidManifest androidManifest, IsValid valid) {
1086-
if (!androidManifest.isDebuggable()) {
1087-
valid.invalidate();
1088-
annotationHelper.printAnnotationError(element, "The application must be in debuggable mode. Please set android:debuggable to true in your AndroidManifest.xml file.");
1089-
}
1090-
}
1091-
1092-
public void hasInternetPermission(Element element, AndroidManifest androidManifest, IsValid valid) {
1093-
if (androidManifest.isLibraryProject()) {
1094-
return;
1095-
}
1096-
1097-
String internetPermissionQualifiedName = INTERNET_PERMISSION;
1098-
1099-
List<String> permissionQualifiedNames = androidManifest.getPermissionQualifiedNames();
1100-
if (!permissionQualifiedNames.contains(internetPermissionQualifiedName)) {
1101-
valid.invalidate();
1102-
annotationHelper.printAnnotationError(element, "Your application must require the INTERNET permission.");
1103-
}
11041100
}
11051101

11061102
public void validateInterceptors(Element element, IsValid valid) {
@@ -1116,14 +1112,19 @@ public void validateInterceptors(Element element, IsValid valid) {
11161112
Element interceptorElement = interceptorType.asElement();
11171113
if (interceptorElement.getKind().isClass()) {
11181114
if (!annotationHelper.isAbstract(interceptorElement)) {
1119-
List<ExecutableElement> constructors = ElementFilter.constructorsIn(interceptorElement.getEnclosedElements());
1120-
for (ExecutableElement constructor : constructors) {
1121-
if (annotationHelper.isPublic(constructor) && constructor.getParameters().isEmpty()) {
1122-
return;
1115+
if (interceptorElement.getAnnotation(EBean.class) == null) {
1116+
List<ExecutableElement> constructors = ElementFilter.constructorsIn(interceptorElement.getEnclosedElements());
1117+
boolean hasPublicWithNoArgumentConstructor = false;
1118+
for (ExecutableElement constructor : constructors) {
1119+
if (annotationHelper.isPublic(constructor) && constructor.getParameters().isEmpty()) {
1120+
hasPublicWithNoArgumentConstructor = true;
1121+
}
1122+
}
1123+
if (!hasPublicWithNoArgumentConstructor) {
1124+
valid.invalidate();
1125+
annotationHelper.printAnnotationError(element, "The interceptor class must have a public no argument constructor or be annotated with @EBean");
11231126
}
11241127
}
1125-
valid.invalidate();
1126-
annotationHelper.printAnnotationError(element, "The interceptor class must have a public no argument constructor");
11271128
} else {
11281129
valid.invalidate();
11291130
annotationHelper.printAnnotationError(element, "The interceptor class must not be abstract");
@@ -1139,6 +1140,27 @@ public void validateInterceptors(Element element, IsValid valid) {
11391140
}
11401141
}
11411142

1143+
public void isDebuggable(Element element, AndroidManifest androidManifest, IsValid valid) {
1144+
if (!androidManifest.isDebuggable()) {
1145+
valid.invalidate();
1146+
annotationHelper.printAnnotationError(element, "The application must be in debuggable mode. Please set android:debuggable to true in your AndroidManifest.xml file.");
1147+
}
1148+
}
1149+
1150+
public void hasInternetPermission(Element element, AndroidManifest androidManifest, IsValid valid) {
1151+
if (androidManifest.isLibraryProject()) {
1152+
return;
1153+
}
1154+
1155+
String internetPermissionQualifiedName = INTERNET_PERMISSION;
1156+
1157+
List<String> permissionQualifiedNames = androidManifest.getPermissionQualifiedNames();
1158+
if (!permissionQualifiedNames.contains(internetPermissionQualifiedName)) {
1159+
valid.invalidate();
1160+
annotationHelper.printAnnotationError(element, "Your application must require the INTERNET permission.");
1161+
}
1162+
}
1163+
11421164
public void hasBeforeTextChangedMethodParameters(ExecutableElement executableElement, IsValid valid) {
11431165
List<? extends VariableElement> parameters = executableElement.getParameters();
11441166
boolean charSequenceParameterFound = false;
@@ -1352,9 +1374,9 @@ public void hasRightRegisterAtValueDependingOnEnclosingElement(Element element,
13521374
for (Map.Entry<String, List<Receiver.RegisterAt>> validRegisterAt : validRegisterAts.entrySet()) {
13531375
String enclosingType = validRegisterAt.getKey();
13541376
Collection<Receiver.RegisterAt> validRegisterAtValues = validRegisterAt.getValue();
1355-
if(extendsType(enclosingElement, enclosingType) && !validRegisterAtValues.contains(registerAt)) {
1377+
if (extendsType(enclosingElement, enclosingType) && !validRegisterAtValues.contains(registerAt)) {
13561378
valid.invalidate();
1357-
annotationHelper.printAnnotationError(element, "The parameter registerAt of @Receiver in "+enclosingType+" can only be one of the following values : "+validRegisterAtValues);
1379+
annotationHelper.printAnnotationError(element, "The parameter registerAt of @Receiver in " + enclosingType + " can only be one of the following values : " + validRegisterAtValues);
13581380
}
13591381
}
13601382
}

AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/RestHolder.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
public class RestHolder extends BaseGeneratedClassHolder {
5050

5151
private JMethod init;
52+
private JVar initContextParam;
5253
private JFieldVar rootUrlField;
5354
private JFieldVar restTemplateField;
5455
private JFieldVar availableHeadersField;
@@ -215,8 +216,16 @@ public JMethod getInit() {
215216
return init;
216217
}
217218

219+
public JVar getInitContextParam() {
220+
if (initContextParam == null) {
221+
setInit();
222+
}
223+
return initContextParam;
224+
}
225+
218226
private void setInit() {
219227
init = getGeneratedClass().constructor(JMod.PUBLIC);
228+
initContextParam = init.param(classes().CONTEXT, "context");
220229
}
221230

222231
public JFieldVar getRootUrlField() {

AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/rest/HttpMethodServiceTest.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public class HttpMethodServiceTest {
3434

3535
@Test
3636
public void use_delete_http_method() {
37-
HttpMethodsService_ service = new HttpMethodsService_();
37+
HttpMethodsService_ service = new HttpMethodsService_(null);
3838

3939
RestTemplate restTemplate = mock(RestTemplate.class);
4040
service.setRestTemplate(restTemplate);
@@ -46,7 +46,7 @@ public void use_delete_http_method() {
4646

4747
@Test
4848
public void use_get_http_method() {
49-
HttpMethodsService_ service = new HttpMethodsService_();
49+
HttpMethodsService_ service = new HttpMethodsService_(null);
5050

5151
RestTemplate restTemplate = mock(RestTemplate.class);
5252
service.setRestTemplate(restTemplate);
@@ -59,7 +59,7 @@ public void use_get_http_method() {
5959
@Test
6060
@SuppressWarnings("unchecked")
6161
public void use_head_http_method() {
62-
HttpMethodsService_ service = new HttpMethodsService_();
62+
HttpMethodsService_ service = new HttpMethodsService_(null);
6363

6464
RestTemplate restTemplate = mock(RestTemplate.class);
6565
ResponseEntity<Object> response = mock(ResponseEntity.class);
@@ -75,7 +75,7 @@ public void use_head_http_method() {
7575
@Test
7676
@SuppressWarnings("unchecked")
7777
public void use_options_http_method() {
78-
HttpMethodsService_ service = new HttpMethodsService_();
78+
HttpMethodsService_ service = new HttpMethodsService_(null);
7979

8080
RestTemplate restTemplate = mock(RestTemplate.class);
8181
ResponseEntity<Object> response = mock(ResponseEntity.class);
@@ -92,7 +92,7 @@ public void use_options_http_method() {
9292

9393
@Test
9494
public void use_post_http_method() {
95-
HttpMethodsService_ service = new HttpMethodsService_();
95+
HttpMethodsService_ service = new HttpMethodsService_(null);
9696

9797
RestTemplate restTemplate = mock(RestTemplate.class);
9898
service.setRestTemplate(restTemplate);
@@ -104,7 +104,7 @@ public void use_post_http_method() {
104104

105105
@Test
106106
public void use_put_http_method() {
107-
HttpMethodsService_ service = new HttpMethodsService_();
107+
HttpMethodsService_ service = new HttpMethodsService_(null);
108108

109109
RestTemplate restTemplate = mock(RestTemplate.class);
110110
service.setRestTemplate(restTemplate);

0 commit comments

Comments
 (0)