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

io.github.factoryfx.initializr.template.ServerBuilderTemplate Maven / Gradle / Ivy

package io.github.factoryfx.initializr.template;

import java.io.IOException;
import java.nio.file.Path;

import javax.lang.model.element.Modifier;

import io.github.factoryfx.jetty.builder.SimpleJettyServerBuilder;
import org.eclipse.jetty.server.Server;

import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.JavaFile;
import com.squareup.javapoet.MethodSpec;
import com.squareup.javapoet.ParameterizedTypeName;
import com.squareup.javapoet.TypeSpec;

import io.github.factoryfx.factory.builder.FactoryTreeBuilder;

public class ServerBuilderTemplate {

    private final String projectName;
    private final Path targetDir;
    private final RootFactoryTemplate rootFactoryTemplate;
    private final String packageName ;
    private final ExampleResourceFactoryTemplate exampleResourceFactoryTemplate;


    public ServerBuilderTemplate(String projectName, RootFactoryTemplate rootFactoryTemplate, Path targetDir, String packageName, ExampleResourceFactoryTemplate exampleResourceFactoryTemplate) {
        this.projectName = projectName;
        this.targetDir = targetDir;
        this.rootFactoryTemplate = rootFactoryTemplate;
        this.packageName = packageName;
        this.exampleResourceFactoryTemplate = exampleResourceFactoryTemplate;
    }

    public void generateFile(){
        ParameterizedTypeName factoryTreeBuilderType = ParameterizedTypeName.get(ClassName.get(FactoryTreeBuilder.class), ClassName.get(Server.class), ClassName.bestGuess(rootFactoryTemplate.generate().name));

        MethodSpec build = MethodSpec.methodBuilder("builder")
                .addModifiers(Modifier.PUBLIC)
                .returns(factoryTreeBuilderType)
                .addStatement("return this.builder")
                .build();

//        AnnotationSpec annotationSpec = AnnotationSpec.builder(SuppressWarnings.class)
//                .addMember("value", "$S", "unchecked")
//                .build();

        MethodSpec constructor = MethodSpec.constructorBuilder()
                .addModifiers(Modifier.PUBLIC)
                .addStatement("this.builder= new FactoryTreeBuilder<>($N.class)", rootFactoryTemplate.generate().name)
                .addStatement("this.builder.addBuilder((ctx)->\n"
                        + "            new $T<$N>()\n" +
                        "                    .withHost(\"localhost\").withPort(8080)\n" +
                        "                    .withResource(ctx.get($N.class)))"
                    , SimpleJettyServerBuilder.class, rootFactoryTemplate.getName(), exampleResourceFactoryTemplate.getName())
                .addStatement("this.builder.addSingleton($N.class)",exampleResourceFactoryTemplate.getName())
                .addComment("register more factories here")
//                .addAnnotation(annotationSpec)
                .build();

        TypeSpec serverBuilder = TypeSpec.classBuilder(projectName+"Builder")
                .addField(factoryTreeBuilderType, "builder", Modifier.PRIVATE, Modifier.FINAL)
                .addModifiers(Modifier.PUBLIC)
                .addMethod(constructor)
                .addMethod(build)
                .addJavadoc("Utility class to construct the factory tree")
                .build();

        JavaFile javaFile = JavaFile.builder(packageName, serverBuilder)
                .build();
        try {
            javaFile.writeTo(targetDir);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy