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

Commit 26b22a5

Browse files
committed
Merge pull request #1405 from WonderCsabo/1402_RestServiceGeneric
Fix generic issues
2 parents 43d9503 + 5b8b9d4 commit 26b22a5

11 files changed

Lines changed: 138 additions & 24 deletions

File tree

‎AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/FragmentArgHandler.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ private void createBuilderInjectionMethod(Element element, EFragmentHolder holde
109109
TypeMirror type = codeModelHelper.getActualType(element, holder);
110110
JClass paramClass = codeModelHelper.typeMirrorToJClass(type, holder);
111111

112-
JMethod method = builderClass.method(PUBLIC, builderClass, fieldName);
112+
JMethod method = builderClass.method(PUBLIC, holder.narrow(builderClass), fieldName);
113113
JVar arg = method.param(paramClass, fieldName);
114114
method.body().invoke(builderArgsField, bundleHelper.getMethodNameToSave()).arg(argKeyStaticField).arg(arg);
115115
method.body()._return(_this());

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,20 @@
2424
import org.androidannotations.annotations.rest.Rest;
2525
import org.androidannotations.annotations.rest.RestService;
2626
import org.androidannotations.handler.BaseAnnotationHandler;
27+
import org.androidannotations.helper.APTCodeModelHelper;
2728
import org.androidannotations.holder.EComponentHolder;
2829
import org.androidannotations.model.AnnotationElements;
2930
import org.androidannotations.process.IsValid;
3031

3132
import com.sun.codemodel.JBlock;
33+
import com.sun.codemodel.JClass;
3234
import com.sun.codemodel.JExpr;
3335
import com.sun.codemodel.JFieldRef;
3436

3537
public class RestServiceHandler extends BaseAnnotationHandler<EComponentHolder> {
3638

39+
private APTCodeModelHelper codeModelHelper = new APTCodeModelHelper();
40+
3741
public RestServiceHandler(ProcessingEnvironment processingEnvironment) {
3842
super(RestService.class, processingEnvironment);
3943
}
@@ -52,14 +56,17 @@ public void process(Element element, EComponentHolder holder) {
5256
String fieldName = element.getSimpleName().toString();
5357

5458
TypeMirror fieldTypeMirror = element.asType();
55-
String interfaceName = fieldTypeMirror.toString();
59+
TypeMirror erasedFieldTypeMirror = processingEnv.getTypeUtils().erasure(fieldTypeMirror);
60+
String interfaceName = erasedFieldTypeMirror.toString();
5661

5762
String generatedClassName = interfaceName + classSuffix();
5863

64+
JClass clazz = codeModelHelper.narrowGeneratedClass(refClass(generatedClassName), fieldTypeMirror, holder);
65+
5966
JBlock methodBody = holder.getInitBody();
6067

6168
JFieldRef field = JExpr.ref(fieldName);
6269

63-
methodBody.assign(field, JExpr._new(refClass(generatedClassName)).arg(holder.getContextRef()));
70+
methodBody.assign(field, JExpr._new(clazz).arg(holder.getContextRef()));
6471
}
6572
}

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,16 @@ public void generifyStaticHelper(GeneratedClassHolder holder, JMethod staticHelp
226226
}
227227
}
228228

229+
public JClass narrowGeneratedClass(JClass generatedClass, TypeMirror fromTypeArguments, GeneratedClassHolder holder) {
230+
DeclaredType type = (DeclaredType) fromTypeArguments;
231+
232+
for (TypeMirror param : type.getTypeArguments()) {
233+
JClass paramClass = typeMirrorToJClass(param, holder);
234+
generatedClass = generatedClass.narrow(paramClass);
235+
}
236+
return generatedClass;
237+
}
238+
229239
private JMethod findAlreadyGeneratedMethod(ExecutableElement executableElement, GeneratedClassHolder holder) {
230240
JDefinedClass definedClass = holder.getGeneratedClass();
231241
String methodName = executableElement.getSimpleName().toString();

‎AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/BaseGeneratedClassHolder.java‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@
2020
import static com.sun.codemodel.JMod.STATIC;
2121
import static org.androidannotations.helper.ModelConstants.classSuffix;
2222

23+
import java.util.ArrayList;
24+
import java.util.List;
25+
2326
import javax.annotation.processing.ProcessingEnvironment;
2427
import javax.lang.model.element.Element;
2528
import javax.lang.model.element.TypeElement;
@@ -32,6 +35,7 @@
3235
import com.sun.codemodel.JClass;
3336
import com.sun.codemodel.JCodeModel;
3437
import com.sun.codemodel.JDefinedClass;
38+
import com.sun.codemodel.JTypeVar;
3539

3640
public abstract class BaseGeneratedClassHolder implements GeneratedClassHolder {
3741

@@ -117,4 +121,15 @@ public JClass refClass(Class<?> clazz) {
117121
public JDefinedClass definedClass(String fullyQualifiedClassName) {
118122
return processHolder.definedClass(fullyQualifiedClassName);
119123
}
124+
125+
public JClass narrow(JClass toNarrow) {
126+
List<JClass> classes = new ArrayList<JClass>();
127+
for (JTypeVar type : generatedClass.typeParams()) {
128+
classes.add(codeModel().directClass(type.name()));
129+
}
130+
if (classes.isEmpty()) {
131+
return toNarrow;
132+
}
133+
return toNarrow.narrow(classes);
134+
}
120135
}

‎AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EBeanHolder.java‎

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.androidannotations.process.ProcessHolder;
3232

3333
import com.sun.codemodel.JBlock;
34+
import com.sun.codemodel.JClass;
3435
import com.sun.codemodel.JFieldVar;
3536
import com.sun.codemodel.JMethod;
3637
import com.sun.codemodel.JVar;
@@ -83,7 +84,11 @@ public void invokeInitInConstructor() {
8384

8485
public void createFactoryMethod(boolean hasSingletonScope) {
8586

86-
JMethod factoryMethod = generatedClass.method(PUBLIC | STATIC, generatedClass, GET_INSTANCE_METHOD_NAME);
87+
JClass narrowedGeneratedClass = codeModelHelper.narrowGeneratedClass(generatedClass, annotatedElement.asType(), this);
88+
89+
JMethod factoryMethod = generatedClass.method(PUBLIC | STATIC, narrowedGeneratedClass, GET_INSTANCE_METHOD_NAME);
90+
91+
codeModelHelper.generifyStaticHelper(this, factoryMethod, annotatedElement);
8792

8893
JVar factoryMethodContextParam = factoryMethod.param(classes().CONTEXT, "context");
8994

@@ -100,13 +105,13 @@ public void createFactoryMethod(boolean hasSingletonScope) {
100105
._if(instanceField.eq(_null())) //
101106
._then();
102107
JVar previousNotifier = viewNotifierHelper.replacePreviousNotifierWithNull(creationBlock);
103-
creationBlock.assign(instanceField, _new(generatedClass).arg(factoryMethodContextParam.invoke("getApplicationContext")));
108+
creationBlock.assign(instanceField, _new(narrowedGeneratedClass).arg(factoryMethodContextParam.invoke("getApplicationContext")));
104109
creationBlock.invoke(instanceField, getInit());
105110
viewNotifierHelper.resetPreviousNotifier(creationBlock, previousNotifier);
106111

107112
factoryMethodBody._return(instanceField);
108113
} else {
109-
factoryMethodBody._return(_new(generatedClass).arg(factoryMethodContextParam));
114+
factoryMethodBody._return(_new(narrowedGeneratedClass).arg(factoryMethodContextParam));
110115
}
111116
}
112117

‎AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EFragmentHolder.java‎

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,6 @@
2525
import static com.sun.codemodel.JMod.STATIC;
2626
import static org.androidannotations.helper.ModelConstants.generationSuffix;
2727

28-
import java.util.ArrayList;
29-
import java.util.List;
30-
3128
import javax.lang.model.element.TypeElement;
3229
import javax.lang.model.type.TypeMirror;
3330

@@ -147,17 +144,6 @@ private void setFragmentBuilder() throws JClassAlreadyExistsException {
147144
setFragmentBuilderCreate();
148145
}
149146

150-
private JClass narrow(JClass toNarrow) {
151-
List<JClass> classes = new ArrayList<>();
152-
for (JTypeVar type : generatedClass.typeParams()) {
153-
classes.add(codeModel().directClass(type.name()));
154-
}
155-
if (classes.isEmpty()) {
156-
return toNarrow;
157-
}
158-
return toNarrow.narrow(classes);
159-
}
160-
161147
private void setFragmentBuilderBuild() {
162148
JMethod method = fragmentBuilderClass.method(PUBLIC, generatedClass._extends(), "build");
163149
method.annotate(Override.class);

‎AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EViewHolder.java‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,9 @@ private void createConstructorAndBuilder() {
8787

8888
JBlock body = copyConstructor.body();
8989
JInvocation superCall = body.invoke("super");
90-
JInvocation newInvocation = JExpr._new(generatedClass);
90+
JClass narrowedGeneratedClass = narrow(generatedClass);
91+
92+
JInvocation newInvocation = JExpr._new(narrowedGeneratedClass);
9193
for (VariableElement param : userConstructor.getParameters()) {
9294
String paramName = param.getSimpleName().toString();
9395
JClass paramType = codeModelHelper.typeMirrorToJClass(param.asType(), this);
@@ -97,7 +99,7 @@ private void createConstructorAndBuilder() {
9799
newInvocation.arg(JExpr.ref(paramName));
98100
}
99101

100-
JVar newCall = staticHelper.body().decl(generatedClass, "instance", newInvocation);
102+
JVar newCall = staticHelper.body().decl(narrowedGeneratedClass, "instance", newInvocation);
101103
staticHelper.body().invoke(newCall, getOnFinishInflate());
102104
staticHelper.body()._return(newCall);
103105
body.invoke(getInit());

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public RestHolder(ProcessHolder processHolder, TypeElement annotatedElement) thr
6262
protected void setExtends() {
6363
String annotatedComponentQualifiedName = annotatedElement.getQualifiedName().toString();
6464
JClass annotatedComponent = codeModel().directClass(annotatedComponentQualifiedName);
65-
generatedClass._implements(annotatedComponent);
65+
generatedClass._implements(narrow(annotatedComponent));
6666
}
6767

6868
private void implementMethods() {
@@ -286,7 +286,8 @@ private void setAuthenticationField() {
286286
}
287287

288288
public JFieldVar getRestErrorHandlerField() {
289-
// restErrorHandlerField is created only if the method setRestErrorHandler is implemented
289+
// restErrorHandlerField is created only if the method
290+
// setRestErrorHandler is implemented
290291
return restErrorHandlerField;
291292
}
292293

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/**
2+
* Copyright (C) 2010-2015 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.rest;
17+
18+
import org.androidannotations.annotations.rest.Rest;
19+
import org.springframework.http.converter.StringHttpMessageConverter;
20+
21+
@Rest(converters = { StringHttpMessageConverter.class })
22+
public interface GenericClient<T> {
23+
24+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/**
2+
* Copyright (C) 2010-2015 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.rest;
17+
18+
import org.androidannotations.annotations.EBean;
19+
import org.androidannotations.annotations.rest.RestService;
20+
21+
@EBean
22+
public class GenericClientHolderBean {
23+
24+
@RestService
25+
GenericClient<String> client;
26+
}

0 commit comments

Comments
 (0)