package io.trygvis.container.compiler; import io.trygvis.container.log.Log; import org.springframework.transaction.annotation.Transactional; import javax.annotation.processing.Completion; import javax.annotation.processing.ProcessingEnvironment; import javax.annotation.processing.Processor; import javax.annotation.processing.RoundEnvironment; import javax.lang.model.SourceVersion; import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.Element; import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.TypeElement; import javax.lang.model.util.Elements; import javax.lang.model.util.Types; import java.util.HashSet; import java.util.Set; import static java.util.Arrays.asList; import static java.util.Collections.emptyList; import static java.util.Collections.emptySet; public class MyProcessor implements Processor { private ProcessingEnvironment processingEnv; private Elements elements; private Types types; @Override public Set getSupportedOptions() { return emptySet(); } @Override public SourceVersion getSupportedSourceVersion() { return SourceVersion.RELEASE_5; } @Override public void init(ProcessingEnvironment processingEnv) { this.processingEnv = processingEnv; elements = processingEnv.getElementUtils(); types = processingEnv.getTypeUtils(); } @Override public Iterable getCompletions(Element element, AnnotationMirror annotation, ExecutableElement member, String userText) { return emptyList(); } @Override public Set getSupportedAnnotationTypes() { return new HashSet<>(asList(Transactional.class.getName(), Log.class.getName())); } @Override public boolean process(Set annotations, RoundEnvironment roundEnv) { Set transactional = roundEnv.getElementsAnnotatedWith(Transactional.class); TypeElement tx = elements.getTypeElement(Transactional.class.getCanonicalName()); TypeElement log = elements.getTypeElement(Transactional.class.getCanonicalName()); for (Element element : transactional) { try { System.out.println("Processing: " + element); for (AnnotationMirror annotationMirror : element.getAnnotationMirrors()) { if (types.isSameType(tx.asType(), annotationMirror.getAnnotationType())) { new TransactionalHandler(processingEnv).processTransactional((TypeElement) element); } if (types.isSameType(log.asType(), annotationMirror.getAnnotationType())) { new LogHandler(processingEnv).processLog((TypeElement) element); } } } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new RuntimeException(e); } } return true; } }