Skip to content

Commit 2a91857

Browse files
committed
#64 - [client generation] Generate services file and HttpApiProvider inner class
1 parent dcb4be3 commit 2a91857

File tree

3 files changed

+54
-8
lines changed

3 files changed

+54
-8
lines changed

http-generator-client/src/main/java/io/avaje/http/generator/client/ClientProcessor.java

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,19 @@
1212
import javax.lang.model.element.AnnotationValue;
1313
import javax.lang.model.element.Element;
1414
import javax.lang.model.element.TypeElement;
15+
import javax.tools.FileObject;
1516
import java.io.IOException;
17+
import java.io.Writer;
1618
import java.util.LinkedHashSet;
1719
import java.util.List;
1820
import java.util.Set;
1921

2022
public class ClientProcessor extends AbstractProcessor {
2123

24+
private static final String METAINF_SERVICES_PROVIDER = "META-INF/services/io.avaje.http.client.HttpApiProvider";
25+
26+
private final Set<String> generatedClients = new LinkedHashSet<>();
27+
2228
protected ProcessingContext ctx;
2329

2430
@Override
@@ -49,15 +55,30 @@ public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment
4955
for (Element importedElement : round.getElementsAnnotatedWith(Client.Import.class)) {
5056
writeForImported(importedElement);
5157
}
58+
if (round.processingOver()) {
59+
writeServicesFile();
60+
}
5261
return false;
5362
}
5463

64+
private void writeServicesFile() {
65+
try {
66+
final FileObject metaInfWriter = ctx.createMetaInfWriter(METAINF_SERVICES_PROVIDER);
67+
final Writer writer = metaInfWriter.openWriter();
68+
for (String generatedClient : generatedClients) {
69+
writer.append(generatedClient).append("$Provider\n");
70+
}
71+
writer.close();
72+
} catch (IOException e) {
73+
ctx.logError(null, "Error writing services file " + e, e);
74+
}
75+
}
76+
5577
private void writeForImported(Element importedElement) {
5678
for (AnnotationMirror annotationMirror : importedElement.getAnnotationMirrors()) {
5779
for (AnnotationValue value : annotationMirror.getElementValues().values()) {
5880
for (Object apiClassDef : (List<?>) value.getValue()) {
59-
String fullName = apiClassDef.toString();
60-
writeImported(fullName);
81+
writeImported(apiClassDef.toString());
6182
}
6283
}
6384
}
@@ -66,7 +87,6 @@ private void writeForImported(Element importedElement) {
6687
private void writeImported(String fullName) {
6788
// trim .class suffix
6889
String apiClassName = fullName.substring(0, fullName.length() - 6);
69-
//ctx.logError(null, "build import:" + apiClassName);
7090
TypeElement typeElement = ctx.getTypeElement(apiClassName);
7191
if (typeElement != null) {
7292
writeClient(typeElement);
@@ -78,16 +98,16 @@ private void writeClient(Element controller) {
7898
ControllerReader reader = new ControllerReader((TypeElement) controller, ctx);
7999
reader.read(false);
80100
try {
81-
writeClientAdapter(ctx, reader);
101+
generatedClients.add(writeClientAdapter(ctx, reader));
82102
} catch (Throwable e) {
83103
e.printStackTrace();
84104
ctx.logError(reader.getBeanType(), "Failed to write client class " + e);
85105
}
86106
}
87107
}
88108

89-
protected void writeClientAdapter(ProcessingContext ctx, ControllerReader reader) throws IOException {
90-
new ClientWriter(reader, ctx).write();
109+
protected String writeClientAdapter(ProcessingContext ctx, ControllerReader reader) throws IOException {
110+
return new ClientWriter(reader, ctx).write();
91111
}
92112

93113
}

http-generator-client/src/main/java/io/avaje/http/generator/client/ClientWriter.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
class ClientWriter extends BaseControllerWriter {
1616

1717
private static final String HTTP_CLIENT_CONTEXT = "io.avaje.http.client.HttpClientContext";
18+
private static final String HTTP_API_PROVIDER = "io.avaje.http.client.HttpApiProvider";
19+
1820
private static final String AT_GENERATED = "@Generated(\"avaje-http-client-generator\")";
1921
private static final String SUFFIX = "$HttpClient";
2022

@@ -23,6 +25,7 @@ class ClientWriter extends BaseControllerWriter {
2325
ClientWriter(ControllerReader reader, ProcessingContext ctx) throws IOException {
2426
super(reader, ctx, SUFFIX);
2527
reader.addImportType(HTTP_CLIENT_CONTEXT);
28+
reader.addImportType(HTTP_API_PROVIDER);
2629
readMethods();
2730
}
2831

@@ -42,12 +45,27 @@ private void readMethods() {
4245
}
4346
}
4447

45-
void write() {
48+
String write() {
4649
writePackage();
4750
writeImports();
4851
writeClassStart();
4952
writeMethods();
53+
writeProvider();
5054
writeClassEnd();
55+
return fullName;
56+
}
57+
58+
private void writeProvider() {
59+
writer.append(" public static class Provider implements HttpApiProvider<%s> {", shortName).eol();
60+
writer.append(" @Override").eol();
61+
writer.append(" public Class<%s> type() {", shortName).eol();
62+
writer.append(" return %s.class;", shortName).eol();
63+
writer.append(" }").eol();
64+
writer.append(" @Override").eol();
65+
writer.append(" public %s provide(HttpClientContext client) {", shortName).eol();
66+
writer.append(" return new %s$HttpClient(client);", shortName).eol();
67+
writer.append(" }").eol();
68+
writer.append(" }").eol();
5169
}
5270

5371
private void writeMethods() {

http-generator-core/src/main/java/io/avaje/http/generator/core/ProcessingContext.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,16 @@
55
import javax.annotation.processing.Filer;
66
import javax.annotation.processing.Messager;
77
import javax.annotation.processing.ProcessingEnvironment;
8-
import javax.lang.model.SourceVersion;
98
import javax.lang.model.element.Element;
109
import javax.lang.model.element.TypeElement;
1110
import javax.lang.model.type.DeclaredType;
1211
import javax.lang.model.type.TypeMirror;
1312
import javax.lang.model.util.Elements;
1413
import javax.lang.model.util.Types;
1514
import javax.tools.Diagnostic;
15+
import javax.tools.FileObject;
1616
import javax.tools.JavaFileObject;
17+
import javax.tools.StandardLocation;
1718
import java.io.IOException;
1819

1920
public class ProcessingContext {
@@ -59,6 +60,13 @@ public JavaFileObject createWriter(String cls, Element origin) throws IOExceptio
5960
return filer.createSourceFile(cls, origin);
6061
}
6162

63+
/**
64+
* Create a file writer for the META-INF services file.
65+
*/
66+
public FileObject createMetaInfWriter(String target) throws IOException {
67+
return filer.createResource(StandardLocation.CLASS_OUTPUT, "", target);
68+
}
69+
6270
public String getDocComment(Element param) {
6371
return elements.getDocComment(param);
6472
}

0 commit comments

Comments
 (0)