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

io.github.splotycode.mosaik.spigotlib.pluginyml.YamlProcessor Maven / Gradle / Ivy

The newest version!
package io.github.splotycode.mosaik.spigotlib.pluginyml;

import io.github.splotycode.mosaik.spigotlib.SpigotApplicationType;
import io.github.splotycode.mosaik.util.StringUtil;

import javax.annotation.processing.*;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
import javax.tools.Diagnostic;
import javax.tools.FileObject;
import javax.tools.StandardLocation;
import java.io.IOException;
import java.io.Writer;
import java.util.Set;

@SupportedAnnotationTypes("io.github.splotycode.mosaik.spigotlib.pluginyml.GenerateYaml")
@SupportedSourceVersion(SourceVersion.RELEASE_8)
public class YamlProcessor extends AbstractProcessor {

    private ProcessingEnvironment pEnvironment;

    @Override
    public synchronized void init(ProcessingEnvironment processingEnvironment) {
        pEnvironment = processingEnvironment;
        super.init(processingEnvironment);
    }

    @Override
    public boolean process(Set annotations, RoundEnvironment environment) {
        for (Element element : environment.getElementsAnnotatedWith(GenerateYaml.class)) {
            if (!(element instanceof TypeElement)) {
                processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "@GenerateYaml is not a TypeElement");
                return false;
            }
            TypeElement mainTypeElement = (TypeElement) element;
            if (!processingEnv.getTypeUtils().isSubtype(mainTypeElement.asType(), processingEnv.getElementUtils().getTypeElement(SpigotApplicationType.class.getName()).asType())) {
                processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "@GenerateYaml does not implement SpigotPluginApplicationType");
                return false;
            }
            try {
                FileObject descriptionFile = processingEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT, "", "plugin.yml");
                try (Writer writer = descriptionFile.openWriter()) {
                    writer.append("# plugin.yml generated with Mosaik\n");
                    GenerateYaml annotation = mainTypeElement.getAnnotation(GenerateYaml.class);
                    String main = String.valueOf(pEnvironment.getElementUtils().getBinaryName(mainTypeElement));
                    processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, "Building plugin.yml for " + main);
                    writer.append("main: ").append(main).append("\n");
                    writer.append("name: ").append(annotation.name()).append("\n");
                    writer.append("version: ").append(String.valueOf(annotation.version())).append("\n");
                    writer.append("author: ").append(annotation.author()).append("\n");
                    writer.append("depend: ").append(StringUtil.join(annotation.dependencies(), obj -> " + obj + ", ", ")).append("\n");
                    writer.append("softdepend: ").append(StringUtil.join(annotation.softDependencies(), obj -> " + obj + ", ", ")).append("\n");
                }
            } catch (IOException ex) {
                throw new RuntimeException("Failed to create plugin.yml", ex);
            }
        }
        return true;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy