Skip to content

Commit

Permalink
Merge pull request #170 from SentryMan/static
Browse files Browse the repository at this point in the history
Static Processor Context
  • Loading branch information
rbygrave authored Mar 2, 2023
2 parents 115187f + 8e80643 commit e519b87
Show file tree
Hide file tree
Showing 24 changed files with 190 additions and 205 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package io.avaje.http.generator.client;

import static io.avaje.http.generator.core.ProcessingContext.*;
import io.avaje.http.generator.core.*;

import javax.lang.model.element.TypeElement;
Expand All @@ -20,18 +21,16 @@ class ClientMethodWriter {
private final MethodReader method;
private final Append writer;
private final WebMethod webMethod;
private final ProcessingContext ctx;
private final UType returnType;
private MethodParam bodyHandlerParam;
private String methodGenericParams = "";
private final boolean useJsonb;
private final Optional<RequestTimeoutPrism> timeout;

ClientMethodWriter(MethodReader method, Append writer, ProcessingContext ctx, boolean useJsonb) {
ClientMethodWriter(MethodReader method, Append writer, boolean useJsonb) {
this.method = method;
this.writer = writer;
this.webMethod = method.webMethod();
this.ctx = ctx;
this.returnType = Util.parseType(method.returnType());
this.useJsonb = useJsonb;
this.timeout = method.timeout();
Expand Down Expand Up @@ -215,8 +214,8 @@ private void writeBeanParams(PathSegments segments) {
ParamType paramType = param.paramType();
PathSegments.Segment segment = segments.segment(varName);
if (segment == null && paramType == ParamType.BEANPARAM) {
TypeElement formBeanType = ctx.typeElement(param.rawType());
BeanParamReader form = new BeanParamReader(ctx, formBeanType, param.name(), param.shortType(), ParamType.QUERYPARAM);
TypeElement formBeanType = typeElement(param.rawType());
BeanParamReader form = new BeanParamReader(formBeanType, param.name(), param.shortType(), ParamType.QUERYPARAM);
form.writeFormParams(writer);
}
}
Expand All @@ -242,8 +241,8 @@ private void writeFormParam(MethodParam param, ParamType paramType) {
writer.append(" .formParam(\"%s\", %s)", param.paramName(), param.name()).eol();
}
} else if (paramType == ParamType.FORM) {
TypeElement formBeanType = ctx.typeElement(param.rawType());
BeanParamReader form = new BeanParamReader(ctx, formBeanType, param.name(), param.shortType(), ParamType.FORMPARAM);
TypeElement formBeanType = typeElement(param.rawType());
BeanParamReader form = new BeanParamReader(formBeanType, param.name(), param.shortType(), ParamType.FORMPARAM);
form.writeFormParams(writer);
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package io.avaje.http.generator.client;

import static io.avaje.http.generator.core.ProcessingContext.*;
import java.io.IOException;
import java.io.Writer;
import java.util.LinkedHashSet;
Expand Down Expand Up @@ -28,8 +29,6 @@ public class ClientProcessor extends AbstractProcessor {

private final Set<String> generatedClients = new LinkedHashSet<>();

protected ProcessingContext ctx;

private final boolean useJsonB;

public ClientProcessor() {
Expand All @@ -49,17 +48,17 @@ public SourceVersion getSupportedSourceVersion() {
public synchronized void init(ProcessingEnvironment processingEnv) {
super.init(processingEnv);
this.processingEnv = processingEnv;
this.ctx = new ProcessingContext(processingEnv, new ClientPlatformAdapter());
ProcessingContext.init(processingEnv, new ClientPlatformAdapter());
}

@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment round) {
for (final Element controller :
round.getElementsAnnotatedWith(ctx.typeElement(ClientPrism.PRISM_TYPE))) {
round.getElementsAnnotatedWith(typeElement(ClientPrism.PRISM_TYPE))) {
writeClient(controller);
}
for (final Element importedElement :
round.getElementsAnnotatedWith(ctx.typeElement(ImportPrism.PRISM_TYPE))) {
round.getElementsAnnotatedWith(typeElement(ImportPrism.PRISM_TYPE))) {
writeForImported(importedElement);
}
if (round.processingOver()) {
Expand All @@ -70,40 +69,40 @@ public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment

private void writeServicesFile() {
try {
final FileObject metaInfWriter = ctx.createMetaInfWriter(METAINF_SERVICES_PROVIDER);
final FileObject metaInfWriter = createMetaInfWriter(METAINF_SERVICES_PROVIDER);
final Writer writer = metaInfWriter.openWriter();
for (String generatedClient : generatedClients) {
writer.append(generatedClient).append("$Provider\n");
}
writer.close();
} catch (IOException e) {
ctx.logError(null, "Error writing services file " + e, e);
logError(null, "Error writing services file " + e, e);
}
}

private void writeForImported(Element importedElement) {

ImportPrism.getInstanceOn(importedElement).types().stream()
.map(ctx::asElement)
.map(ProcessingContext::asElement)
.filter(Objects::nonNull)
.forEach(this::writeClient);
}

private void writeClient(Element controller) {
if (controller instanceof TypeElement) {
ControllerReader reader = new ControllerReader((TypeElement) controller, ctx);
ControllerReader reader = new ControllerReader((TypeElement) controller);
reader.read(false);
try {
generatedClients.add(writeClientAdapter(ctx, reader));
generatedClients.add(writeClientAdapter(reader));
} catch (Throwable e) {
e.printStackTrace();
ctx.logError(reader.beanType(), "Failed to write client class " + e);
logError(reader.beanType(), "Failed to write client class " + e);
}
}
}
}

protected String writeClientAdapter(ProcessingContext ctx, ControllerReader reader) throws IOException {
return new ClientWriter(reader, ctx, useJsonB).write();
protected String writeClientAdapter(ControllerReader reader) throws IOException {
return new ClientWriter(reader, useJsonB).write();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ class ClientWriter extends BaseControllerWriter {
private final List<ClientMethodWriter> methodList = new ArrayList<>();
private final boolean useJsonb;

ClientWriter(ControllerReader reader, ProcessingContext ctx, boolean useJsonB) throws IOException {
super(reader, ctx, SUFFIX);
ClientWriter(ControllerReader reader, boolean useJsonB) throws IOException {
super(reader, SUFFIX);
reader.addImportType(HTTP_CLIENT);
reader.addImportType(HTTP_API_PROVIDER);
this.useJsonb = useJsonB;
Expand All @@ -41,7 +41,7 @@ protected String initPackageName(String originName) {
private void readMethods() {
for (MethodReader method : reader.methods()) {
if (method.isWebMethod()) {
final var methodWriter = new ClientMethodWriter(method, writer, ctx, useJsonb);
final var methodWriter = new ClientMethodWriter(method, writer, useJsonb);
methodWriter.addImportTypes(reader);
methodList.add(methodWriter);
}
Expand Down
4 changes: 2 additions & 2 deletions http-generator-core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
<dependency>
<groupId>io.avaje</groupId>
<artifactId>avaje-prisms</artifactId>
<version>1.4</version>
<version>1.5</version>
<optional>true</optional>
<scope>provided</scope>
</dependency>
Expand Down Expand Up @@ -83,7 +83,7 @@
<path>
<groupId>io.avaje</groupId>
<artifactId>avaje-prisms</artifactId>
<version>1.4</version>
<version>1.5</version>
</path>
</annotationProcessorPaths>
</configuration>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package io.avaje.http.generator.core;

import static io.avaje.http.generator.core.ProcessingContext.*;
import javax.lang.model.element.TypeElement;
import javax.tools.JavaFileObject;
import java.io.IOException;
Expand All @@ -11,21 +12,19 @@
public abstract class BaseControllerWriter {

protected final ControllerReader reader;
protected final ProcessingContext ctx;
protected final String originName;
protected final String shortName;
protected final String fullName;
protected final String packageName;
protected final boolean router;
protected Append writer;

protected BaseControllerWriter(ControllerReader reader, ProcessingContext ctx) throws IOException {
this(reader, ctx, "$Route");
protected BaseControllerWriter(ControllerReader reader) throws IOException {
this(reader, "$Route");
}

protected BaseControllerWriter(ControllerReader reader, ProcessingContext ctx, String suffix) throws IOException {
protected BaseControllerWriter(ControllerReader reader, String suffix) throws IOException {
this.reader = reader;
this.ctx = ctx;
this.router = "$Route".equals(suffix);
TypeElement origin = reader.beanType();
this.originName = origin.getQualifiedName().toString();
Expand All @@ -50,7 +49,7 @@ protected void initWriter() throws IOException {
}

protected Writer createFileWriter() throws IOException {
JavaFileObject jfo = ctx.createWriter(fullName, reader.beanType());
JavaFileObject jfo = createWriter(fullName, reader.beanType());
return jfo.openWriter();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package io.avaje.http.generator.core;

import static io.avaje.http.generator.core.ProcessingContext.*;
import java.io.IOException;
import java.util.Set;
import javax.annotation.processing.AbstractProcessor;
Expand All @@ -13,7 +14,6 @@
@SupportedOptions({"useJavax", "useSingleton"})
public abstract class BaseProcessor extends AbstractProcessor {

protected ProcessingContext ctx;

@Override
public SourceVersion getSupportedSourceVersion() {
Expand All @@ -28,7 +28,7 @@ public Set<String> getSupportedAnnotationTypes() {
@Override
public synchronized void init(ProcessingEnvironment processingEnv) {
super.init(processingEnv);
this.ctx = new ProcessingContext(processingEnv, providePlatformAdapter());
ProcessingContext.init(processingEnv, providePlatformAdapter());
}

/** Provide the platform specific adapter to use for Javalin, Helidon etc. */
Expand All @@ -37,16 +37,16 @@ public synchronized void init(ProcessingEnvironment processingEnv) {
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment round) {

if (ctx.isOpenApiAvailable()) {
if (isOpenApiAvailable()) {
readOpenApiDefinition(round);
readTagDefinitions(round);
readSecuritySchemes(round);
}

final Set<? extends Element> controllers =
round.getElementsAnnotatedWith(ctx.typeElement(ControllerPrism.PRISM_TYPE));
round.getElementsAnnotatedWith(typeElement(ControllerPrism.PRISM_TYPE));
for (Element controller : controllers) {
writeControllerAdapter(controller);
writeAdapter(controller);
}

if (round.processingOver()) {
Expand All @@ -57,57 +57,57 @@ public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment

private void readOpenApiDefinition(RoundEnvironment round) {
final Set<? extends Element> elements =
round.getElementsAnnotatedWith(ctx.typeElement(OpenAPIDefinitionPrism.PRISM_TYPE));
round.getElementsAnnotatedWith(typeElement(OpenAPIDefinitionPrism.PRISM_TYPE));
for (Element element : elements) {
ctx.doc().readApiDefinition(element);
doc().readApiDefinition(element);
}
}

private void readTagDefinitions(RoundEnvironment round) {
Set<? extends Element> elements =
round.getElementsAnnotatedWith(ctx.typeElement(TagPrism.PRISM_TYPE));
round.getElementsAnnotatedWith(typeElement(TagPrism.PRISM_TYPE));
for (Element element : elements) {
ctx.doc().addTagDefinition(element);
doc().addTagDefinition(element);
}

elements = round.getElementsAnnotatedWith(ctx.typeElement(TagsPrism.PRISM_TYPE));
elements = round.getElementsAnnotatedWith(typeElement(TagsPrism.PRISM_TYPE));
for (Element element : elements) {
ctx.doc().addTagsDefinition(element);
doc().addTagsDefinition(element);
}
}

private void readSecuritySchemes(RoundEnvironment round) {
Set<? extends Element> elements = round.getElementsAnnotatedWith(ctx.typeElement(SecuritySchemePrism.PRISM_TYPE));
Set<? extends Element> elements = round.getElementsAnnotatedWith(typeElement(SecuritySchemePrism.PRISM_TYPE));
for (Element element : elements) {
ctx.doc().addSecurityScheme(element);
doc().addSecurityScheme(element);
}

elements = round.getElementsAnnotatedWith(ctx.typeElement(SecuritySchemesPrism.PRISM_TYPE));
elements = round.getElementsAnnotatedWith(typeElement(SecuritySchemesPrism.PRISM_TYPE));
for (Element element : elements) {
ctx.doc().addSecuritySchemes(element);
doc().addSecuritySchemes(element);
}
}

private void writeOpenAPI() {
ctx.doc().writeApi();
doc().writeApi();
}

private void writeControllerAdapter(Element controller) {
private void writeAdapter(Element controller) {
if (controller instanceof TypeElement) {
ControllerReader reader = new ControllerReader((TypeElement) controller, ctx);
ControllerReader reader = new ControllerReader((TypeElement) controller);
reader.read(true);
try {
writeControllerAdapter(ctx, reader);
writeControllerAdapter(reader);
} catch (Throwable e) {
e.printStackTrace();
ctx.logError(reader.beanType(), "Failed to write $Route class " + e);
logError(reader.beanType(), "Failed to write $Route class " + e);
}
}
}

/**
* Write the adapter code for the given controller.
*/
public abstract void writeControllerAdapter(ProcessingContext ctx, ControllerReader reader) throws IOException;
public abstract void writeControllerAdapter(ControllerReader reader) throws IOException;

}
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package io.avaje.http.generator.core;

import static io.avaje.http.generator.core.ProcessingContext.*;
import javax.lang.model.element.*;
import java.util.*;

public class BeanParamReader {

private final ProcessingContext ctx;
private final String beanVarName;
private final String beanShortType;
private final TypeElement beanType;
Expand All @@ -15,8 +15,7 @@ public class BeanParamReader {
private final List<ExecutableElement> constructors = new ArrayList<>();
private final Map<String, ExecutableElement> methodMap = new LinkedHashMap<>();

public BeanParamReader(ProcessingContext ctx, TypeElement beanType, String beanVarName, String beanShortType, ParamType defaultParamType) {
this.ctx = ctx;
public BeanParamReader(TypeElement beanType, String beanVarName, String beanShortType, ParamType defaultParamType) {
this.beanType = beanType;
this.beanVarName = beanVarName;
this.beanShortType = beanShortType;
Expand All @@ -41,7 +40,7 @@ private void read() {
}

private void readField(Element enclosedElement) {
FieldReader field = new FieldReader(ctx, enclosedElement, defaultParamType);
FieldReader field = new FieldReader(enclosedElement, defaultParamType);
fieldMap.put(field.varName(), field);
}

Expand Down Expand Up @@ -141,14 +140,12 @@ private ExecutableElement findGetter(String varName) {

static class FieldReader {

private final ProcessingContext ctx;
private final ElementReader element;
private String setterMethod;
private boolean constructorParam;

FieldReader(ProcessingContext ctx, Element enclosedElement, ParamType defaultParamType) {
this.ctx = ctx;
this.element = new ElementReader(enclosedElement, ctx, defaultParamType, false);
FieldReader(Element enclosedElement, ParamType defaultParamType) {
this.element = new ElementReader(enclosedElement, defaultParamType, false);
}

boolean isPublic() {
Expand Down Expand Up @@ -181,13 +178,13 @@ boolean isConstructorParam() {
void writeSet(Append writer, String beanVarName) {
if (setterMethod != null) {
// populate via setter method
writer.append("%s %s.%s(", ctx.platform().indent(), beanVarName, setterMethod);
writer.append("%s %s.%s(", platform().indent(), beanVarName, setterMethod);
element.setValue(writer);
writer.append(");").eol();

} else {
// populate via field put
writer.append("%s %s.%s = ", ctx.platform().indent(), beanVarName, varName());
writer.append("%s %s.%s = ", platform().indent(), beanVarName, varName());
element.setValue(writer);
writer.append(";").eol();
}
Expand Down
Loading

0 comments on commit e519b87

Please sign in to comment.