All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.dinject.javalin.generator.Processor Maven / Gradle / Ivy

package io.dinject.javalin.generator;

import io.dinject.controller.Controller;
import io.swagger.v3.oas.annotations.OpenAPIDefinition;

import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.ProcessingEnvironment;
import javax.annotation.processing.RoundEnvironment;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
import java.util.LinkedHashSet;
import java.util.Set;

public class Processor extends AbstractProcessor {

  private ProcessingContext ctx;

  @Override
  public SourceVersion getSupportedSourceVersion() {
    return SourceVersion.latest();
  }

  @Override
  public Set getSupportedAnnotationTypes() {

    Set annotations = new LinkedHashSet<>();
    annotations.add(Controller.class.getCanonicalName());
    annotations.add(OpenAPIDefinition.class.getCanonicalName());
    return annotations;
  }

  @Override
  public synchronized void init(ProcessingEnvironment processingEnv) {
    super.init(processingEnv);
    this.ctx = new ProcessingContext(processingEnv);
  }

  @Override
  public boolean process(Set annotations, RoundEnvironment round) {

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

    Set controllers = round.getElementsAnnotatedWith(Controller.class);
    for (Element controller : controllers) {
      writeControllerAdapter(controller);
    }

    if (round.processingOver()) {
      writeOpenAPI();
    }
    return false;
  }

  private void readOpenApiDefinition(RoundEnvironment round) {

    Set elements = round.getElementsAnnotatedWith(OpenAPIDefinition.class);
    for (Element element : elements) {
      ctx.doc().readApiDefinition(element);
    }
  }

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

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




© 2015 - 2024 Weber Informatics LLC | Privacy Policy