Skip to content

Commit aac8204

Browse files
SentryManrbygrave
andauthored
Mark Generated Avaje HttpClient implementations as Closeable (#734)
* mark generated avaje clients as autocloseable * Format only --------- Co-authored-by: Rob Bygrave <[email protected]>
1 parent cfc8399 commit aac8204

File tree

8 files changed

+32
-20
lines changed

8 files changed

+32
-20
lines changed

inject-generator/pom.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,15 @@
3939
<artifactId>avaje-spi-service</artifactId>
4040
<version>2.8</version>
4141
</dependency>
42+
43+
<dependency>
44+
<groupId>io.avaje</groupId>
45+
<artifactId>avaje-http-api</artifactId>
46+
<version>2.8</version>
47+
<optional>true</optional>
48+
<scope>provided</scope>
49+
</dependency>
50+
4251
<!-- test dependencies -->
4352
<dependency>
4453
<groupId>io.avaje</groupId>

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,6 @@ final class Constants {
1818
static final String QUALIFIER = "jakarta.inject.Qualifier";
1919
static final String NAMED = "jakarta.inject.Named";
2020

21-
static final String PATH = "io.avaje.http.api.Path";
22-
static final String CONTROLLER = "io.avaje.http.api.Controller";
23-
static final String HTTP_GENERATED = "io.avaje.http.api.Generated";
24-
2521
static final String AT_SINGLETON = "@Singleton";
2622
static final String AT_PROXY = "@Proxy";
2723
static final String AT_GENERATED = "@Generated(\"io.avaje.inject.generator\")";

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ final class IncludeAnnotations {
1515

1616
static {
1717
EXCLUDED_ANNOTATIONS.add(Constants.KOTLIN_METADATA);
18-
EXCLUDED_ANNOTATIONS.add(Constants.PATH);
18+
EXCLUDED_ANNOTATIONS.add(PathPrism.PRISM_TYPE);
1919
}
2020

2121
/**

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
AssistFactoryPrism.PRISM_TYPE,
3535
ComponentPrism.PRISM_TYPE,
3636
Constants.TESTSCOPE,
37-
Constants.CONTROLLER,
37+
ControllerPrism.PRISM_TYPE,
3838
ExternalPrism.PRISM_TYPE,
3939
FactoryPrism.PRISM_TYPE,
4040
ImportPrism.PRISM_TYPE,
@@ -150,7 +150,7 @@ public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment
150150

151151
readImported(importedElements(roundEnv));
152152

153-
maybeElements(roundEnv, Constants.CONTROLLER).ifPresent(this::readBeans);
153+
maybeElements(roundEnv, ControllerPrism.PRISM_TYPE).ifPresent(this::readBeans);
154154
maybeElements(roundEnv, ProxyPrism.PRISM_TYPE).ifPresent(this::readBeans);
155155
maybeElements(roundEnv, AssistFactoryPrism.PRISM_TYPE).ifPresent(this::readAssisted);
156156

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

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import static io.avaje.inject.generator.APContext.logWarn;
44
import static io.avaje.inject.generator.APContext.types;
55
import static io.avaje.inject.generator.ProcessingContext.asElement;
6+
67
import java.util.ArrayList;
78
import java.util.List;
89
import java.util.Objects;
@@ -50,27 +51,28 @@ final class TypeExtendsReader {
5051
this.baseTypeIsInterface = baseType.getKind() == ElementKind.INTERFACE;
5152
this.publicAccess = baseType.getModifiers().contains(Modifier.PUBLIC);
5253
this.proxyBean = proxyBean;
53-
this.controller = hasAnnotation(Constants.CONTROLLER);
54+
this.controller = ControllerPrism.isPresent(baseType);
55+
this.closeable = closeableClient(baseType);
5456
this.autoProvide = autoProvide();
5557
}
5658

59+
/**
60+
* generated Avaje Http Clients are autoCloseable on JDK 21+
61+
*/
62+
private boolean closeableClient(TypeElement baseType) {
63+
return ClientPrism.isPresent(baseType)
64+
&& APContext.typeElement("io.avaje.http.client.HttpClient").getInterfaces().stream()
65+
.map(Object::toString)
66+
.anyMatch(AutoCloseable.class.getCanonicalName()::equals);
67+
}
68+
5769
private boolean autoProvide() {
5870
return publicAccess
5971
&& !controller
6072
&& !FactoryPrism.isPresent(baseType)
6173
&& !ProxyPrism.isPresent(baseType);
6274
}
6375

64-
private boolean hasAnnotation(String annotationFQN) {
65-
for (final var m : baseType.getAnnotationMirrors()) {
66-
final CharSequence mfqn = ((TypeElement) m.getAnnotationType().asElement()).getQualifiedName();
67-
if (annotationFQN.contentEquals(mfqn)) {
68-
return true;
69-
}
70-
}
71-
return false;
72-
}
73-
7476
UType baseType() {
7577
return baseUType;
7678
}
@@ -124,7 +126,7 @@ List<UType> autoProvides() {
124126
// http controller, or request scoped controller via BeanFactory
125127
return List.of();
126128
}
127-
if (hasAnnotation(Constants.HTTP_GENERATED)) {
129+
if (HttpGeneratedPrism.isPresent(baseType)) {
128130
// http route
129131
return providesTypes.stream()
130132
.filter(ut -> ROUTE_TYPES.contains(ut.mainType()))

inject-generator/src/main/java/io/avaje/inject/generator/package-info.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@
3131
@GeneratePrism(Scope.class)
3232
@GeneratePrism(Secondary.class)
3333
@GeneratePrism(io.avaje.spi.ServiceProvider.class)
34+
@GeneratePrism(io.avaje.http.api.Client.class)
35+
@GeneratePrism(io.avaje.http.api.Controller.class)
36+
@GeneratePrism(io.avaje.http.api.Path.class)
37+
@GeneratePrism(name = "HttpGeneratedPrism", value = io.avaje.http.api.Generated.class)
3438
package io.avaje.inject.generator;
3539

3640
import io.avaje.inject.*;

inject-generator/src/main/java/module-info.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
requires io.avaje.inject.aop;
66
requires io.avaje.inject.events;
77

8+
requires static io.avaje.http.api;
89
requires static io.avaje.prism;
910
requires static io.avaje.spi;
1011

inject-generator/src/test/java/io/avaje/inject/generator/IncludeAnnotationsTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public void exclude_di_annotations() {
3434
assertFalse(include(Constants.FACTORY));
3535
assertFalse(include(Constants.PRIMARY));
3636
assertFalse(include(Constants.SECONDARY));
37-
assertFalse(include(Constants.PATH));
37+
assertFalse(include(PathPrism.PRISM_TYPE));
3838
}
3939

4040
}

0 commit comments

Comments
 (0)