Skip to content

Commit 58f3a1d

Browse files
committed
Enable to inject a RequestFactory in a RestTemplate
1 parent 4bcb4cc commit 58f3a1d

6 files changed

Lines changed: 95 additions & 60 deletions

File tree

‎AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/rest/Rest.java‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,4 +196,5 @@
196196
Class<?>[] converters();
197197

198198
Class<?>[] interceptors() default {};
199+
Class<?> requestFactory() default Void.class;
199200
}

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@ public void validate(Element element, AnnotationElements validatedElements, IsVa
7575

7676
validatorHelper.validateInterceptors(element, valid);
7777

78+
validatorHelper.validateRequestFactory(element, valid);
79+
7880
validatorHelper.hasInternetPermission(typeElement, androidManifest, valid);
7981
}
8082

@@ -83,6 +85,7 @@ public void process(Element element, RestHolder holder) {
8385
setRootUrl(element, holder);
8486
setConverters(element, holder);
8587
setInterceptors(element, holder);
88+
setRequestFactory(element, holder);
8689
}
8790

8891
private void setRootUrl(Element element, RestHolder holder) {
@@ -116,4 +119,12 @@ private void setInterceptors(Element element, RestHolder holder) {
116119
}
117120
}
118121
}
122+
123+
private void setRequestFactory(Element element, RestHolder holder) {
124+
DeclaredType requestFactoryType = annotationHelper.extractAnnotationClassParameter(element, getTarget(), "requestFactory");
125+
if (requestFactoryType != null) {
126+
JInvocation requestFactory = codeModelHelper.newBeanOrEBean(holder, requestFactoryType, holder.getInitContextParam());
127+
holder.getInit().body().add(invoke(holder.getRestTemplateField(), "setRequestFactory").arg(requestFactory));
128+
}
129+
}
119130
}

‎AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/CanonicalNameConstants.java‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ public final class CanonicalNameConstants {
132132
public static final String REST_TEMPLATE = "org.springframework.web.client.RestTemplate";
133133
public static final String HTTP_MESSAGE_CONVERTER = "org.springframework.http.converter.HttpMessageConverter";
134134
public static final String CLIENT_HTTP_REQUEST_INTERCEPTOR = "org.springframework.http.client.ClientHttpRequestInterceptor";
135+
public static final String CLIENT_HTTP_REQUEST_FACTORY = "org.springframework.http.client.ClientHttpRequestFactory";
135136
public static final String HTTP_AUTHENTICATION = "org.springframework.http.HttpAuthentication";
136137
public static final String HTTP_BASIC_AUTHENTICATION = "org.springframework.http.HttpBasicAuthentication";
137138
public static final String REST_CLIENT_EXCEPTION = "org.springframework.web.client.RestClientException";

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

Lines changed: 49 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -15,65 +15,9 @@
1515
*/
1616
package org.androidannotations.helper;
1717

18-
import static java.util.Arrays.asList;
19-
import static org.androidannotations.helper.AndroidConstants.LOG_DEBUG;
20-
import static org.androidannotations.helper.AndroidConstants.LOG_ERROR;
21-
import static org.androidannotations.helper.AndroidConstants.LOG_INFO;
22-
import static org.androidannotations.helper.AndroidConstants.LOG_VERBOSE;
23-
import static org.androidannotations.helper.AndroidConstants.LOG_WARN;
24-
import static org.androidannotations.helper.CanonicalNameConstants.CLIENT_HTTP_REQUEST_INTERCEPTOR;
25-
import static org.androidannotations.helper.CanonicalNameConstants.HTTP_MESSAGE_CONVERTER;
26-
import static org.androidannotations.helper.CanonicalNameConstants.INTERNET_PERMISSION;
27-
import static org.androidannotations.helper.ModelConstants.GENERATION_SUFFIX;
28-
import static org.androidannotations.helper.ModelConstants.VALID_ENHANCED_COMPONENT_ANNOTATIONS;
29-
import static org.androidannotations.helper.ModelConstants.VALID_ENHANCED_VIEW_SUPPORT_ANNOTATIONS;
30-
31-
import java.lang.annotation.Annotation;
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;
40-
41-
import javax.lang.model.element.AnnotationMirror;
42-
import javax.lang.model.element.Element;
43-
import javax.lang.model.element.ElementKind;
44-
import javax.lang.model.element.ExecutableElement;
45-
import javax.lang.model.element.Modifier;
46-
import javax.lang.model.element.TypeElement;
47-
import javax.lang.model.element.VariableElement;
48-
import javax.lang.model.type.ArrayType;
49-
import javax.lang.model.type.DeclaredType;
50-
import javax.lang.model.type.ErrorType;
51-
import javax.lang.model.type.TypeKind;
52-
import javax.lang.model.type.TypeMirror;
53-
import javax.lang.model.util.ElementFilter;
54-
import javax.lang.model.util.Elements;
55-
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;
64-
import org.androidannotations.annotations.rest.Delete;
65-
import org.androidannotations.annotations.rest.Get;
66-
import org.androidannotations.annotations.rest.Head;
67-
import org.androidannotations.annotations.rest.Options;
68-
import org.androidannotations.annotations.rest.Post;
69-
import org.androidannotations.annotations.rest.Put;
70-
import org.androidannotations.annotations.rest.Rest;
71-
import org.androidannotations.annotations.sharedpreferences.DefaultBoolean;
72-
import org.androidannotations.annotations.sharedpreferences.DefaultFloat;
73-
import org.androidannotations.annotations.sharedpreferences.DefaultInt;
74-
import org.androidannotations.annotations.sharedpreferences.DefaultLong;
75-
import org.androidannotations.annotations.sharedpreferences.DefaultString;
76-
import org.androidannotations.annotations.sharedpreferences.SharedPref;
18+
import org.androidannotations.annotations.*;
19+
import org.androidannotations.annotations.rest.*;
20+
import org.androidannotations.annotations.sharedpreferences.*;
7721
import org.androidannotations.api.rest.RestClientErrorHandling;
7822
import org.androidannotations.api.rest.RestClientHeaders;
7923
import org.androidannotations.api.rest.RestClientRootUrl;
@@ -83,6 +27,18 @@
8327
import org.androidannotations.model.AnnotationElements;
8428
import org.androidannotations.process.IsValid;
8529

30+
import javax.lang.model.element.*;
31+
import javax.lang.model.type.*;
32+
import javax.lang.model.util.ElementFilter;
33+
import javax.lang.model.util.Elements;
34+
import java.lang.annotation.Annotation;
35+
import java.util.*;
36+
37+
import static java.util.Arrays.asList;
38+
import static org.androidannotations.helper.AndroidConstants.*;
39+
import static org.androidannotations.helper.CanonicalNameConstants.*;
40+
import static org.androidannotations.helper.ModelConstants.*;
41+
8642
public class ValidatorHelper {
8743

8844
private static final List<String> VALID_REST_INTERFACES = asList(RestClientHeaders.class.getName(), RestClientErrorHandling.class.getName(), RestClientRootUrl.class.getName(), RestClientSupport.class.getName());
@@ -1161,6 +1117,40 @@ public void hasInternetPermission(Element element, AndroidManifest androidManife
11611117
}
11621118
}
11631119

1120+
public void validateRequestFactory(Element element, IsValid valid) {
1121+
TypeMirror clientHttpRequestFactoryType = annotationHelper.typeElementFromQualifiedName(CLIENT_HTTP_REQUEST_FACTORY).asType();
1122+
DeclaredType requestFactory = annotationHelper.extractAnnotationClassParameter(element, annotationHelper.getTarget(), "requestFactory");
1123+
if (requestFactory != null) {
1124+
if (annotationHelper.isSubtype(requestFactory, clientHttpRequestFactoryType)) {
1125+
Element requestFactoryElement = requestFactory.asElement();
1126+
if (requestFactoryElement.getKind().isClass()) {
1127+
if (!annotationHelper.isAbstract(requestFactoryElement)) {
1128+
if (requestFactoryElement.getAnnotation(EBean.class) != null) {
1129+
return;
1130+
}
1131+
List<ExecutableElement> constructors = ElementFilter.constructorsIn(requestFactoryElement.getEnclosedElements());
1132+
for (ExecutableElement constructor : constructors) {
1133+
if (annotationHelper.isPublic(constructor) && constructor.getParameters().isEmpty()) {
1134+
return;
1135+
}
1136+
}
1137+
valid.invalidate();
1138+
annotationHelper.printAnnotationError(element, "The requestFactory class must have a public no argument constructor or must be annotated with @EBean");
1139+
} else {
1140+
valid.invalidate();
1141+
annotationHelper.printAnnotationError(element, "The requestFactory class must not be abstract");
1142+
}
1143+
} else {
1144+
valid.invalidate();
1145+
annotationHelper.printAnnotationError(element, "The requestFactory class must be a class");
1146+
}
1147+
} else {
1148+
valid.invalidate();
1149+
annotationHelper.printAnnotationError(element, "The requestFactory class must be a subtype of " + CLIENT_HTTP_REQUEST_FACTORY);
1150+
}
1151+
}
1152+
}
1153+
11641154
public void hasBeforeTextChangedMethodParameters(ExecutableElement executableElement, IsValid valid) {
11651155
List<? extends VariableElement> parameters = executableElement.getParameters();
11661156
boolean charSequenceParameterFound = false;
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/**
2+
* Copyright (C) 2010-2013 eBusiness Information, Excilys Group
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
5+
* use this file except in compliance with the License. You may obtain a copy of
6+
* the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed To in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12+
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13+
* License for the specific language governing permissions and limitations under
14+
* the License.
15+
*/
16+
package org.androidannotations.test15.rest;
17+
18+
import org.androidannotations.annotations.EBean;
19+
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
20+
21+
@EBean
22+
public class MyRequestFactory extends HttpComponentsClientHttpRequestFactory {
23+
24+
private static final int TIME_OUT = 30 * 1000;
25+
26+
public MyRequestFactory() {
27+
setConnectTimeout(TIME_OUT);
28+
setReadTimeout(TIME_OUT);
29+
}
30+
}

‎AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/rest/MyService.java‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@
4242
import org.springframework.web.client.RestTemplate;
4343

4444
// if defined, the rootUrl will be added as a prefix to every request
45-
@Rest(rootUrl = "http://company.com/ajax/services", converters = { MappingJacksonHttpMessageConverter.class, EBeanConverter.class }, interceptors = { RequestInterceptor.class, EBeanInterceptor.class })
45+
@Rest(rootUrl = "http://company.com/ajax/services", converters = { MappingJacksonHttpMessageConverter.class, EBeanConverter.class },
46+
interceptors = { RequestInterceptor.class, EBeanInterceptor.class },
47+
requestFactory = MyRequestFactory.class)
4648
public interface MyService {
4749

4850
// *** GET ***

0 commit comments

Comments
 (0)