protected final ClassOrInterfaceDeclaration classDeclaration()

in jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/descriptors/AbstractServiceTaskDescriptor.java [127:216]


    protected final ClassOrInterfaceDeclaration classDeclaration() {
        String unqualifiedName = StaticJavaParser.parseName(getName()).removeQualifier().asString();
        ClassOrInterfaceDeclaration cls = new ClassOrInterfaceDeclaration()
                .setName(unqualifiedName)
                .setModifiers(Modifier.Keyword.PUBLIC)
                .addExtendedType(DefaultKogitoWorkItemHandler.class.getCanonicalName());
        ClassOrInterfaceType serviceType = new ClassOrInterfaceType(null, interfaceName);

        String serviceName = "service";
        FieldDeclaration serviceField = new FieldDeclaration()
                .addVariable(new VariableDeclarator(serviceType, serviceName));
        cls.addMember(serviceField);
        cls
                .addConstructor(Modifier.Keyword.PUBLIC)
                .setBody(
                        new BlockStmt()
                                .addStatement(new MethodCallExpr("this", new ObjectCreationExpr().setType(serviceType))));
        cls
                .addConstructor(Modifier.Keyword.PUBLIC)
                .addParameter(serviceType, serviceName)
                .setBody(
                        new BlockStmt()
                                .addStatement(
                                        new AssignExpr(
                                                new FieldAccessExpr(
                                                        new ThisExpr(),
                                                        serviceName),
                                                new NameExpr(serviceName),
                                                AssignExpr.Operator.ASSIGN)));

        Type workItemTransitionType = parseClassOrInterfaceType(WorkItemTransition.class.getName());
        ClassOrInterfaceType optionalClass = parseClassOrInterfaceType(Optional.class.getName()).setTypeArguments(workItemTransitionType);

        // executeWorkItem method
        BlockStmt executeWorkItemBody = new BlockStmt();
        MethodCallExpr callService = new MethodCallExpr(new NameExpr("service"), operationName);
        this.handleParametersForServiceCall(executeWorkItemBody, callService);

        // execute work item handler
        getWorkItemOutput(callService).forEach(executeWorkItemBody::addStatement);

        Expression completeExpression = new ThisExpr();
        completeExpression = new FieldAccessExpr(completeExpression, "workItemLifeCycle");
        NodeList<Expression> arguments = new NodeList<>();
        arguments.add(new StringLiteralExpr("complete"));
        arguments.add(new MethodCallExpr(new NameExpr("workItem"), "getPhaseStatus"));
        arguments.add(new NameExpr(RESULT_NAME));

        completeExpression = new MethodCallExpr(completeExpression, "newTransition", arguments);
        Statement completeWorkItem = new ReturnStmt(new MethodCallExpr(new NameExpr(Optional.class.getName()), "of", NodeList.nodeList(completeExpression)));
        executeWorkItemBody.addStatement(completeWorkItem);

        executeWorkItemBody = tryStmt(executeWorkItemBody, getCompleteWorkItemExceptionTypes());

        MethodDeclaration executeWorkItem = new MethodDeclaration()
                .setModifiers(Modifier.Keyword.PUBLIC)
                .setType(optionalClass)
                .setName("activateWorkItemHandler")
                .setBody(executeWorkItemBody)
                .addParameter(KogitoWorkItemManager.class.getCanonicalName(), "workItemManager")
                .addParameter(KogitoWorkItemHandler.class.getCanonicalName(), "workItemHandler")
                .addParameter(KogitoWorkItem.class.getCanonicalName(), "workItem")
                .addParameter(WorkItemTransition.class.getCanonicalName(), "transition");

        // abortWorkItem method
        BlockStmt abortWorkItemBody = new BlockStmt();
        MethodDeclaration abortWorkItem = new MethodDeclaration()
                .setModifiers(Modifier.Keyword.PUBLIC)
                .setType(optionalClass)
                .setName("abortWorkItemHandler")
                .setBody(abortWorkItemBody)
                .addParameter(KogitoWorkItemManager.class.getCanonicalName(), "workItemManager")
                .addParameter(KogitoWorkItemHandler.class.getCanonicalName(), "workItemHandler")
                .addParameter(KogitoWorkItem.class.getCanonicalName(), "workItem")
                .addParameter(WorkItemTransition.class.getCanonicalName(), "transition");

        abortWorkItemBody.addStatement(new ReturnStmt(new MethodCallExpr(new NameExpr(Optional.class.getName()), "empty")));

        // getName method
        MethodDeclaration getName = new MethodDeclaration()
                .setModifiers(Modifier.Keyword.PUBLIC)
                .setType(String.class)
                .setName("getName")
                .setBody(new BlockStmt().addStatement(new ReturnStmt(new StringLiteralExpr(getName()))));
        cls.addMember(executeWorkItem)
                .addMember(abortWorkItem)
                .addMember(getName);

        return cls;
    }