Skip to content

Commit b1b9458

Browse files
authored
[events] support prototype scope (#840)
now will use a supplier using `BeanScope` to inject observer beans
1 parent aeb7fba commit b1b9458

File tree

7 files changed

+78
-5
lines changed

7 files changed

+78
-5
lines changed

inject-generator/src/main/java/io/avaje/inject/generator/BeanReader.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,14 @@ Set<UType> allGenericTypes() {
263263
if (utype.isGeneric()) {
264264
allUTypes.add(utype);
265265
}
266+
method.params().stream()
267+
.filter(p -> !p.observeEvent())
268+
.map(MethodParam::getFullUType)
269+
.forEach(u -> {
270+
if (u.isGeneric()) {
271+
allUTypes.add(u);
272+
}
273+
});
266274
}
267275

268276
if (constructor != null) {

inject-generator/src/main/java/io/avaje/inject/generator/MethodReader.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.util.List;
99
import java.util.Map;
1010
import java.util.Set;
11+
import java.util.function.Supplier;
1112

1213
import javax.lang.model.element.Element;
1314
import javax.lang.model.element.ExecutableElement;
@@ -419,6 +420,11 @@ void addImports(ImportTypeMap importTypes) {
419420
if (optionalType) {
420421
importTypes.add(Constants.OPTIONAL);
421422
}
423+
424+
if (observeParameter != null && params.size() > 1) {
425+
importTypes.add(Supplier.class.getCanonicalName());
426+
importTypes.add(Constants.BEANSCOPE);
427+
}
422428
conditions.addImports(importTypes);
423429
}
424430

inject-generator/src/main/java/io/avaje/inject/generator/SimpleBeanWriter.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,7 @@ private void writeExtraInjection() {
256256
private void writeObserveMethods() {
257257
final var bean = "bean";
258258
final var builder = "builder";
259+
final var scope = "beanScope";
259260

260261
final var indent = " ";
261262
for (MethodReader methodReader : beanReader.observerMethods()) {
@@ -264,9 +265,18 @@ private void writeObserveMethods() {
264265
final var shortWithoutAnnotations = observeUtype.shortWithoutAnnotations();
265266
var injectParams = methodReader.params().stream().skip(1).collect(toList());
266267

268+
if (!injectParams.isEmpty()) {
269+
writer.indent(indent).append("var %s = %s.get(BeanScope.class);", scope, builder).eol();
270+
}
271+
267272
for (MethodParam param : injectParams) {
268-
writer.indent(indent).append("var %s = ", methodReader.name() + "$" + param.simpleName());
269-
param.builderGetDependency(writer, builder);
273+
if (Constants.BEANSCOPE.equals(param.getFullUType().fullWithoutAnnotations())) {
274+
continue;
275+
}
276+
writer.indent(indent).append("Supplier<%s> %s = () -> ",
277+
param.getFullUType().shortType(),
278+
methodReader.name() + "$" + param.simpleName());
279+
param.builderGetDependency(writer, scope);
270280
writer.append(";").eol();
271281
}
272282

@@ -281,7 +291,10 @@ private void writeObserveMethods() {
281291
writer.append("%s::%s;", bean, methodReader.name());
282292
} else {
283293
var injectParamNames = injectParams.stream()
284-
.map(p -> methodReader.name() + "$" + p.simpleName())
294+
.map(p ->
295+
Constants.BEANSCOPE.equals(p.getFullUType().fullWithoutAnnotations())
296+
? scope
297+
: methodReader.name() + "$" + p.simpleName() + ".get()")
285298
.collect(joining(", "));
286299
writer.append("e -> bean.%s(e, %s);", methodReader.name(), injectParamNames);
287300
}
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
package io.avaje.inject.generator.models.valid.observes;
22

3+
import io.avaje.inject.BeanScope;
34
import io.avaje.inject.events.ObservesAsync;
45
import jakarta.inject.Singleton;
56

67
@Singleton
78
public class TestObserverInjection {
89

9-
void observe(@ObservesAsync String e, TestObserver observer) {}
10+
void observe(@ObservesAsync String e, TestObserver observer, BeanScope scope) {}
1011
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package org.example.observes;
2+
3+
import java.util.ArrayDeque;
4+
5+
import org.example.coffee.prototype.MyProto;
6+
7+
import io.avaje.inject.events.Observes;
8+
import jakarta.inject.Singleton;
9+
10+
@Singleton
11+
public class MyObserverInjectPrototype {
12+
13+
boolean invoked = false;
14+
CustomEvent event;
15+
ArrayDeque<MyProto> beansList = new ArrayDeque<>();
16+
17+
void observe(@Observes CustomEvent e, MyProto proto) {
18+
invoked = true;
19+
event = e;
20+
beansList.add(proto);
21+
}
22+
}

inject-test/src/test/java/org/example/observes/MyObserverInjected.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.example.observes;
22

3+
import io.avaje.inject.events.Event;
34
import io.avaje.inject.events.Observes;
45
import jakarta.inject.Singleton;
56

@@ -9,7 +10,10 @@ public class MyObserverInjected {
910
boolean invoked = false;
1011
CustomEvent event;
1112

12-
void observe(@Observes CustomEvent e, MyObserver observer) {
13+
void observe(
14+
@Observes CustomEvent e,
15+
MyObserver observer,
16+
@StrQualifier(value = "foo") Event<CustomEvent> publisher) {
1317
invoked = true;
1418
event = e;
1519
}

inject-test/src/test/java/org/example/observes/TestEventMessaging.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ class TestEventMessaging {
1616
@Inject MyObserver observer;
1717
@Inject MyQualifiedObserver qualifiedObserver;
1818
@Inject MyObserverInjected observerInjected;
19+
@Inject MyObserverInjectPrototype observerPrototype;
1920
@Inject MyStrQualifiedObserver strQualifiedObserver;
2021
@Inject Event<CustomEvent> event;
2122
@Inject EventSender2 sender2;
@@ -30,6 +31,9 @@ void before() {
3031
qualifiedObserver.event = null;
3132
observerInjected.invoked= false;
3233
observerInjected.event = null;
34+
observerPrototype.invoked = false;
35+
observerPrototype.event = null;
36+
observerPrototype.beansList.clear();
3337
}
3438

3539
@Test
@@ -45,6 +49,21 @@ void test() {
4549
assertThat(observerInjected.event).isSameAs(message);
4650
}
4751

52+
@Test
53+
void testProtoType() {
54+
var message = new CustomEvent("hi");
55+
56+
event.fire(message);
57+
58+
assertThat(observerPrototype.invoked).isTrue();
59+
assertThat(observerPrototype.event).isSameAs(message);
60+
event.fire(message);
61+
62+
assertThat(observerPrototype.invoked).isTrue();
63+
assertThat(observerPrototype.event).isSameAs(message);
64+
assertThat(observerPrototype.beansList.poll()).isNotSameAs(observerPrototype.beansList.poll());
65+
}
66+
4867
@Test
4968
void testWithQualified() {
5069
var message = new CustomEvent("hi");

0 commit comments

Comments
 (0)