Skip to content

Commit 9772deb

Browse files
committed
allow to inject @ebean's into an @bean annotated method
1 parent 077e8d5 commit 9772deb

3 files changed

Lines changed: 65 additions & 20 deletions

File tree

  • AndroidAnnotations/androidannotations-core

‎AndroidAnnotations/androidannotations-core/androidannotations-api/src/main/java/org/androidannotations/annotations/Bean.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@
5858
* @see EBean
5959
*/
6060
@Retention(RetentionPolicy.CLASS)
61-
@Target(ElementType.FIELD)
61+
@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER })
6262
public @interface Bean {
6363

6464
/**

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

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -308,17 +308,40 @@ public void typeHasAnnotation(Class<? extends Annotation> annotation, TypeMirror
308308
}
309309

310310
public void typeOrTargetValueHasAnnotation(Class<? extends Annotation> annotation, Element element, ElementValidation valid) {
311+
Element targetElement = findTargetElement(element, valid);
312+
if (targetElement == null) {
313+
return;
314+
}
315+
311316
DeclaredType targetAnnotationClassValue = annotationHelper.extractAnnotationClassParameter(element);
312317

313318
if (targetAnnotationClassValue != null) {
314319
typeHasAnnotation(annotation, targetAnnotationClassValue, valid);
315320

316-
if (!annotationHelper.getTypeUtils().isAssignable(targetAnnotationClassValue, element.asType())) {
321+
if (!annotationHelper.getTypeUtils().isAssignable(targetAnnotationClassValue, targetElement.asType())) {
317322
valid.addError("The value of %s must be assignable into the annotated field");
318323
}
319324
} else {
320-
typeHasAnnotation(annotation, element, valid);
325+
typeHasAnnotation(annotation, targetElement, valid);
326+
}
327+
}
328+
329+
Element findTargetElement(Element element, ElementValidation valid) {
330+
if (element instanceof ExecutableElement) {
331+
ExecutableElement executableElement = (ExecutableElement) element;
332+
returnTypeIsVoid(executableElement, valid);
333+
if (!valid.isValid()) {
334+
return null;
335+
}
336+
337+
List<? extends VariableElement> parameters = executableElement.getParameters();
338+
if (parameters.size() != 1) {
339+
valid.addError("The method can only have 1 parameter");
340+
return null;
341+
}
342+
return parameters.get(0);
321343
}
344+
return element;
322345
}
323346

324347
private boolean elementHasAnnotationSafe(Class<? extends Annotation> annotation, Element element) {

‎AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/core/handler/BeanHandler.java‎

Lines changed: 39 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@
1616
package org.androidannotations.internal.core.handler;
1717

1818
import static com.helger.jcodemodel.JExpr._null;
19-
import static com.helger.jcodemodel.JExpr.ref;
2019

2120
import javax.lang.model.element.Element;
21+
import javax.lang.model.element.ElementKind;
2222
import javax.lang.model.type.TypeMirror;
2323

2424
import org.androidannotations.AndroidAnnotationsEnvironment;
@@ -27,50 +27,72 @@
2727
import org.androidannotations.annotations.EBean;
2828
import org.androidannotations.annotations.NonConfigurationInstance;
2929
import org.androidannotations.handler.BaseAnnotationHandler;
30+
import org.androidannotations.handler.MethodInjectionHandler;
31+
import org.androidannotations.helper.InjectHelper;
3032
import org.androidannotations.holder.EBeanHolder;
3133
import org.androidannotations.holder.EComponentHolder;
3234

3335
import com.helger.jcodemodel.AbstractJClass;
36+
import com.helger.jcodemodel.IJAssignmentTarget;
37+
import com.helger.jcodemodel.IJStatement;
3438
import com.helger.jcodemodel.JBlock;
35-
import com.helger.jcodemodel.JFieldRef;
39+
import com.helger.jcodemodel.JConditional;
3640
import com.helger.jcodemodel.JInvocation;
3741

38-
public class BeanHandler extends BaseAnnotationHandler<EComponentHolder> {
42+
public class BeanHandler extends BaseAnnotationHandler<EComponentHolder>implements MethodInjectionHandler<EComponentHolder> {
43+
44+
private final InjectHelper<EComponentHolder> injectHelper;
3945

4046
public BeanHandler(AndroidAnnotationsEnvironment environment) {
4147
super(Bean.class, environment);
48+
injectHelper = new InjectHelper<>(validatorHelper, this);
4249
}
4350

4451
@Override
4552
public void validate(Element element, ElementValidation validation) {
46-
validatorHelper.enclosingElementHasEnhancedComponentAnnotation(element, validation);
53+
injectHelper.validate(Bean.class, element, validation);
54+
55+
validatorHelper.typeOrTargetValueHasAnnotation(EBean.class, element, validation);
4756

4857
validatorHelper.isNotPrivate(element, validation);
58+
}
4959

50-
validatorHelper.typeOrTargetValueHasAnnotation(EBean.class, element, validation);
60+
@Override
61+
public void process(Element element, EComponentHolder holder) {
62+
injectHelper.process(element, holder);
63+
}
64+
65+
@Override
66+
public JBlock getInvocationBlock(EComponentHolder holder) {
67+
return holder.getInitBodyInjectionBlock();
5168
}
5269

5370
@Override
54-
public void process(Element element, EComponentHolder holder) throws Exception {
71+
public void assignValue(JBlock targetBlock, IJAssignmentTarget fieldRef, EComponentHolder holder, Element element, Element param) {
5572
TypeMirror typeMirror = annotationHelper.extractAnnotationClassParameter(element);
5673
if (typeMirror == null) {
57-
typeMirror = element.asType();
74+
typeMirror = param.asType();
5875
typeMirror = getProcessingEnvironment().getTypeUtils().erasure(typeMirror);
5976
}
60-
6177
String typeQualifiedName = typeMirror.toString();
6278
AbstractJClass injectedClass = getJClass(annotationHelper.generatedClassQualifiedNameFromQualifiedName(typeQualifiedName));
79+
JInvocation beanInstance = injectedClass.staticInvoke(EBeanHolder.GET_INSTANCE_METHOD_NAME).arg(holder.getContextRef());
6380

64-
String fieldName = element.getSimpleName().toString();
65-
JFieldRef beanField = ref(fieldName);
66-
JBlock block = holder.getInitBodyInjectionBlock();
67-
68-
boolean hasNonConfigurationInstanceAnnotation = element.getAnnotation(NonConfigurationInstance.class) != null;
69-
if (hasNonConfigurationInstanceAnnotation) {
70-
block = block._if(beanField.eq(_null()))._then();
81+
IJStatement assignment = fieldRef.assign(beanInstance);
82+
if (param.getKind() == ElementKind.FIELD) {
83+
boolean hasNonConfigurationInstanceAnnotation = element.getAnnotation(NonConfigurationInstance.class) != null;
84+
if (hasNonConfigurationInstanceAnnotation) {
85+
JConditional conditional = targetBlock._if(fieldRef.eq(_null()));
86+
conditional._then().add(assignment);
87+
assignment = conditional;
88+
}
7189
}
7290

73-
JInvocation getInstance = injectedClass.staticInvoke(EBeanHolder.GET_INSTANCE_METHOD_NAME).arg(holder.getContextRef());
74-
block.assign(beanField, getInstance);
91+
targetBlock.add(assignment);
92+
}
93+
94+
@Override
95+
public void validateEnclosingElement(Element element, ElementValidation valid) {
96+
validatorHelper.enclosingElementHasEnhancedComponentAnnotation(element, valid);
7597
}
7698
}

0 commit comments

Comments
 (0)