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

io.automatiko.engine.codegen.di.CDIDependencyInjectionAnnotator Maven / Gradle / Ivy

The newest version!

package io.automatiko.engine.codegen.di;

import com.github.javaparser.ast.Modifier.Keyword;
import com.github.javaparser.ast.NodeList;
import com.github.javaparser.ast.body.MethodDeclaration;
import com.github.javaparser.ast.expr.BinaryExpr;
import com.github.javaparser.ast.expr.BooleanLiteralExpr;
import com.github.javaparser.ast.expr.Expression;
import com.github.javaparser.ast.expr.MemberValuePair;
import com.github.javaparser.ast.expr.MethodCallExpr;
import com.github.javaparser.ast.expr.Name;
import com.github.javaparser.ast.expr.NameExpr;
import com.github.javaparser.ast.expr.NormalAnnotationExpr;
import com.github.javaparser.ast.expr.SingleMemberAnnotationExpr;
import com.github.javaparser.ast.expr.StringLiteralExpr;
import com.github.javaparser.ast.nodeTypes.NodeWithAnnotations;
import com.github.javaparser.ast.stmt.BlockStmt;

public class CDIDependencyInjectionAnnotator implements DependencyInjectionAnnotator {

    @Override
    public > T withNamed(T node, String name) {
        node.addAnnotation(new SingleMemberAnnotationExpr(new Name("jakarta.inject.Named"), new StringLiteralExpr(name)));
        return node;
    }

    @Override
    public > T withApplicationComponent(T node) {
        node.addAnnotation("jakarta.enterprise.context.ApplicationScoped");
        return node;
    }

    @Override
    public > T withNamedApplicationComponent(T node, String name) {
        return withNamed(withApplicationComponent(node), name);
    }

    @Override
    public > T withSingletonComponent(T node) {
        node.addAnnotation("jakarta.inject.Singleton");
        return node;
    }

    @Override
    public > T withNamedSingletonComponent(T node, String name) {
        return withNamed(withSingletonComponent(node), name);
    }

    @Override
    public > T withInjection(T node) {
        node.addAnnotation("jakarta.inject.Inject");
        return node;
    }

    @Override
    public > T withNamedInjection(T node, String name) {
        return withNamed(withInjection(node), name);
    }

    @Override
    public > T withOptionalInjection(T node) {
        return withInjection(node);
    }

    @Override
    public > T withIncomingMessage(T node, String channel) {
        node.addAnnotation(new SingleMemberAnnotationExpr(
                new Name("org.eclipse.microprofile.reactive.messaging.Incoming"), new StringLiteralExpr(channel)));
        return node;
    }

    @Override
    public > T withOutgoingMessage(T node, String channel) {
        node.addAnnotation(new SingleMemberAnnotationExpr(
                new Name("org.eclipse.microprofile.reactive.messaging.Channel"), new StringLiteralExpr(channel)));
        return node;
    }

    @Override
    public MethodCallExpr withMessageProducer(MethodCallExpr produceMethod, String channel, Expression event) {
        produceMethod.addArgument(event);
        return produceMethod;
    }

    @Override
    public MethodDeclaration withInitMethod(Expression... expression) {
        BlockStmt body = new BlockStmt();
        for (Expression exp : expression) {
            body.addStatement(exp);
        }
        MethodDeclaration method = new MethodDeclaration().addModifier(Keyword.PUBLIC).setName("init")
                .setType(void.class).setBody(body);

        method.addAndGetParameter("io.quarkus.runtime.StartupEvent", "event")
                .addAnnotation("jakarta.enterprise.event.Observes")
                .addSingleMemberAnnotation("jakarta.annotation.Priority",
                        new NameExpr("jakarta.interceptor.Interceptor.Priority.APPLICATION"));

        return method;
    }

    @Override
    public String optionalInstanceInjectionType() {
        return "jakarta.enterprise.inject.Instance";
    }

    @Override
    public Expression optionalInstanceExists(String fieldName) {
        MethodCallExpr condition = new MethodCallExpr(new NameExpr(fieldName), "isUnsatisfied");
        return new BinaryExpr(condition, new BooleanLiteralExpr(false), BinaryExpr.Operator.EQUALS);
    }

    @Override
    public String multiInstanceInjectionType() {
        return optionalInstanceInjectionType();
    }

    @Override
    public Expression getMultiInstance(String fieldName) {
        return new MethodCallExpr(
                new MethodCallExpr(new NameExpr("java.util.stream.StreamSupport"), "stream",
                        NodeList.nodeList(new MethodCallExpr(new NameExpr(fieldName), "spliterator"),
                                new BooleanLiteralExpr(false))),
                "collect",
                NodeList.nodeList(new MethodCallExpr(new NameExpr("java.util.stream.Collectors"), "toList")));
    }

    @Override
    public String applicationComponentType() {
        return "jakarta.enterprise.context.ApplicationScoped";
    }

    @Override
    public String emitterType(String dataType) {
        return "org.eclipse.microprofile.reactive.messaging.Emitter<" + dataType + ">";
    }

    @Override
    public > T withConfig(T node, String configKey) {
        node.addAnnotation(new NormalAnnotationExpr(new Name("org.eclipse.microprofile.config.inject.ConfigProperty"),
                NodeList.nodeList(new MemberValuePair("name", new StringLiteralExpr(configKey)))));
        return node;
    }

    @Override
    public > T withConfigInjection(T node, String configKey) {
        node.addAnnotation(new NormalAnnotationExpr(new Name("org.eclipse.microprofile.config.inject.ConfigProperty"),
                NodeList.nodeList(new MemberValuePair("name", new StringLiteralExpr(configKey)))));
        withInjection(node);
        return node;
    }

    @Override
    public > T withConfigInjection(T node, String configKey, String defaultValue) {
        node.addAnnotation(new NormalAnnotationExpr(new Name("org.eclipse.microprofile.config.inject.ConfigProperty"),
                NodeList.nodeList(new MemberValuePair("name", new StringLiteralExpr(configKey)),
                        new MemberValuePair("defaultValue", new StringLiteralExpr(defaultValue)))));
        return node;
    }

    @Override
    public String objectMapperInjectorSource(String packageName) {

        return null;
    }

    @Override
    public > T withRestClientInjection(T node) {
        node.addAnnotation("org.eclipse.microprofile.rest.client.inject.RestClient");
        return node;
    }

    @Override
    public > T withFunction(T node) {
        node.addAnnotation("io.quarkus.funqy.Funq");
        return node;
    }

    @Override
    public > T withCloudEventMapping(T node, String trigger, String filter) {
        if (filter != null && !filter.isEmpty()) {
            String[] filterElements = filter.split("=");

            node.addAnnotation(new NormalAnnotationExpr(new Name("io.quarkus.funqy.knative.events.CloudEventMapping"),
                    NodeList.nodeList(new MemberValuePair("trigger", new StringLiteralExpr(trigger)),
                            new MemberValuePair("attributes",
                                    new NormalAnnotationExpr(new Name("io.quarkus.funqy.knative.events.EventAttribute"),
                                            NodeList.nodeList(
                                                    new MemberValuePair("name", new StringLiteralExpr(filterElements[0])),
                                                    new MemberValuePair("value",
                                                            new StringLiteralExpr(filterElements[1]))))))));
        } else {
            node.addAnnotation(new NormalAnnotationExpr(new Name("io.quarkus.funqy.knative.events.CloudEventMapping"),
                    NodeList.nodeList(new MemberValuePair("trigger", new StringLiteralExpr(trigger)))));
        }
        return node;
    }

    @Override
    public > T withManualMessageAckMode(T node) {
        node.addAnnotation(new SingleMemberAnnotationExpr(
                new Name("org.eclipse.microprofile.reactive.messaging.Acknowledgment"),
                new NameExpr("org.eclipse.microprofile.reactive.messaging.Acknowledgment.Strategy.MANUAL")));
        return node;
    }

    @Override
    public > T withPreMessageAckMode(T node) {
        node.addAnnotation(new SingleMemberAnnotationExpr(
                new Name("org.eclipse.microprofile.reactive.messaging.Acknowledgment"),
                new NameExpr("org.eclipse.microprofile.reactive.messaging.Acknowledgment.Strategy.PRE_PROCESSING")));
        return node;
    }

    @Override
    public > T withPostMessageAckMode(T node) {
        node.addAnnotation(new SingleMemberAnnotationExpr(
                new Name("org.eclipse.microprofile.reactive.messaging.Acknowledgment"),
                new NameExpr("org.eclipse.microprofile.reactive.messaging.Acknowledgment.Strategy.POST_PROCESSING")));
        return node;
    }

    @Override
    public > T withNoneMessageAckMode(T node) {
        node.addAnnotation(new SingleMemberAnnotationExpr(
                new Name("org.eclipse.microprofile.reactive.messaging.Acknowledgment"),
                new NameExpr("org.eclipse.microprofile.reactive.messaging.Acknowledgment.Strategy.NONE")));
        return node;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy