Search in sources :

Example 16 with Expression

use of org.drools.javaparser.ast.expr.Expression in project drools by kiegroup.

the class AccumulateVisitorPatternDSL method addBindAsLastChainCall.

private void addBindAsLastChainCall(MethodCallExpr newBindingExpression, MethodCallExpr pattern) {
    final Expression newScope = (Expression) pattern.getParentNode().orElse(pattern);
    final Optional<Node> optParent = newScope.getParentNode();
    newBindingExpression.setScope(newScope);
    optParent.ifPresent(parent -> parent.replace(newScope, newBindingExpression));
}
Also used : Expression(org.drools.javaparser.ast.expr.Expression) Node(org.drools.javaparser.ast.Node)

Example 17 with Expression

use of org.drools.javaparser.ast.expr.Expression in project drools by kiegroup.

the class AccumulateVisitorPatternDSL method replaceBindingWithPatternBinding.

private MethodCallExpr replaceBindingWithPatternBinding(MethodCallExpr bindExpression, MethodCallExpr lastPattern) {
    final Expression bindingId = lastPattern.getArgument(0);
    bindExpression.findFirst(NameExpr.class, e -> e.equals(bindingId)).ifPresent(name -> {
        bindExpression.remove(name);
        LambdaExpr lambda = (LambdaExpr) bindExpression.getArgument(bindExpression.getArguments().size() - 1);
        if (lambda.getParameters().size() > 1) {
            String formalArg = fromVar(name.getNameAsString());
            for (Parameter param : lambda.getParameters()) {
                if (param.getNameAsString().equals(formalArg)) {
                    lambda.getParameters().remove(param);
                    lambda.getParameters().add(0, param);
                    break;
                }
            }
        }
    });
    return (MethodCallExpr) bindExpression;
}
Also used : PackageModel(org.drools.modelcompiler.builder.PackageModel) Parameter(org.drools.javaparser.ast.body.Parameter) Expression(org.drools.javaparser.ast.expr.Expression) ModelGeneratorVisitor(org.drools.modelcompiler.builder.generator.visitor.ModelGeneratorVisitor) Collection(java.util.Collection) DrlxParseUtil(org.drools.modelcompiler.builder.generator.DrlxParseUtil) BIND_CALL(org.drools.modelcompiler.builder.generator.expression.FlowExpressionBuilder.BIND_CALL) NameExpr(org.drools.javaparser.ast.expr.NameExpr) DrlxParseUtil.fromVar(org.drools.modelcompiler.builder.generator.DrlxParseUtil.fromVar) RuleContext(org.drools.modelcompiler.builder.generator.RuleContext) List(java.util.List) MethodCallExpr(org.drools.javaparser.ast.expr.MethodCallExpr) DrlxParseUtil.toVar(org.drools.modelcompiler.builder.generator.DrlxParseUtil.toVar) Optional(java.util.Optional) LambdaExpr(org.drools.javaparser.ast.expr.LambdaExpr) PatternExpressionBuilder(org.drools.modelcompiler.builder.generator.expression.PatternExpressionBuilder) Node(org.drools.javaparser.ast.Node) Expression(org.drools.javaparser.ast.expr.Expression) LambdaExpr(org.drools.javaparser.ast.expr.LambdaExpr) NameExpr(org.drools.javaparser.ast.expr.NameExpr) Parameter(org.drools.javaparser.ast.body.Parameter) MethodCallExpr(org.drools.javaparser.ast.expr.MethodCallExpr)

Example 18 with Expression

use of org.drools.javaparser.ast.expr.Expression in project drools by kiegroup.

the class DrlxParseUtilTest method prependTest.

@Test
public void prependTest() {
    final Expression expr = JavaParser.parseExpression("getAddressName().startsWith(\"M\")");
    final NameExpr nameExpr = new NameExpr("_this");
    final Expression concatenated = DrlxParseUtil.prepend(nameExpr, expr);
    assertEquals("_this.getAddressName().startsWith(\"M\")", concatenated.toString());
}
Also used : Expression(org.drools.javaparser.ast.expr.Expression) NameExpr(org.drools.javaparser.ast.expr.NameExpr) Test(org.junit.Test)

Example 19 with Expression

use of org.drools.javaparser.ast.expr.Expression in project drools by kiegroup.

the class PackageModel method getRulesSource.

public RuleSourceResult getRulesSource() {
    CompilationUnit cu = new CompilationUnit();
    cu.setPackageDeclaration(name);
    manageImportForCompilationUnit(cu);
    ClassOrInterfaceDeclaration rulesClass = cu.addClass(rulesFileName);
    rulesClass.addImplementedType(Model.class);
    BodyDeclaration<?> dateFormatter = JavaParser.parseBodyDeclaration("public final static DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DateUtils.getDateFormatMask());\n");
    rulesClass.addMember(dateFormatter);
    BodyDeclaration<?> getNameMethod = JavaParser.parseBodyDeclaration("    @Override\n" + "        public String getName() {\n" + "        return \"" + name + "\";\n" + "    }\n");
    rulesClass.addMember(getNameMethod);
    BodyDeclaration<?> getRulesMethod = JavaParser.parseBodyDeclaration("    @Override\n" + "    public List<Rule> getRules() {\n" + "        return rules;\n" + "    }\n");
    rulesClass.addMember(getRulesMethod);
    StringBuilder sb = new StringBuilder("\n");
    sb.append("With the following expression ID:\n");
    sb.append(exprIdGenerator.toString());
    sb.append("\n");
    JavadocComment exprIdComment = new JavadocComment(sb.toString());
    getRulesMethod.setComment(exprIdComment);
    BodyDeclaration<?> getGlobalsMethod = JavaParser.parseBodyDeclaration("    @Override\n" + "    public List<Global> getGlobals() {\n" + "        return globals;\n" + "    }\n");
    rulesClass.addMember(getGlobalsMethod);
    BodyDeclaration<?> getQueriesMethod = JavaParser.parseBodyDeclaration("    @Override\n" + "    public List<Query> getQueries() {\n" + "        return queries;\n" + "    }\n");
    rulesClass.addMember(getQueriesMethod);
    BodyDeclaration<?> getTypeMetaDataMethod = JavaParser.parseBodyDeclaration("    @Override\n" + "    public List<TypeMetaData> getTypeMetaDatas() {\n" + "        return typeMetaDatas;\n" + "    }\n");
    rulesClass.addMember(getTypeMetaDataMethod);
    for (Map.Entry<String, MethodCallExpr> windowReference : windowReferences.entrySet()) {
        FieldDeclaration f = rulesClass.addField(WINDOW_REFERENCE_TYPE, windowReference.getKey(), Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL);
        f.getVariables().get(0).setInitializer(windowReference.getValue());
    }
    for (Map.Entry<String, Class<?>> g : getGlobals().entrySet()) {
        addGlobalField(rulesClass, getName(), g.getKey(), g.getValue());
    }
    for (Map.Entry<String, QueryGenerator.QueryDefWithType> queryDef : queryDefWithType.entrySet()) {
        FieldDeclaration field = rulesClass.addField(queryDef.getValue().getQueryType(), queryDef.getKey(), Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL);
        field.getVariables().get(0).setInitializer(queryDef.getValue().getMethodCallExpr());
    }
    for (Map.Entry<String, MethodDeclaration> methodName : queryMethods.entrySet()) {
        FieldDeclaration field = rulesClass.addField(methodName.getValue().getType(), methodName.getKey(), Modifier.FINAL);
        field.getVariables().get(0).setInitializer(new MethodCallExpr(null, methodName.getKey()));
    }
    // instance initializer block.
    // add to `rules` list the result of invoking each method for rule
    InitializerDeclaration rulesListInitializer = new InitializerDeclaration();
    BlockStmt rulesListInitializerBody = new BlockStmt();
    rulesListInitializer.setBody(rulesListInitializerBody);
    queryMethods.values().forEach(rulesClass::addMember);
    buildArtifactsDeclaration(queryMethods.keySet(), rulesClass, rulesListInitializerBody, "Query", "queries", false);
    buildArtifactsDeclaration(windowReferences.keySet(), rulesClass, rulesListInitializerBody, "WindowReference", "windowReferences", false);
    buildArtifactsDeclaration(getGlobals().keySet(), rulesClass, rulesListInitializerBody, "Global", "globals", true);
    if (!typeMetaDataExpressions.isEmpty()) {
        BodyDeclaration<?> typeMetaDatasList = JavaParser.parseBodyDeclaration("List<TypeMetaData> typeMetaDatas = new ArrayList<>();");
        rulesClass.addMember(typeMetaDatasList);
        for (Expression expr : typeMetaDataExpressions) {
            addInitStatement(rulesListInitializerBody, expr, "typeMetaDatas");
        }
    } else {
        BodyDeclaration<?> typeMetaDatasList = JavaParser.parseBodyDeclaration("List<TypeMetaData> typeMetaDatas = Collections.emptyList();");
        rulesClass.addMember(typeMetaDatasList);
    }
    functions.forEach(rulesClass::addMember);
    RuleSourceResult results = new RuleSourceResult(cu);
    int ruleCount = ruleMethods.size();
    boolean requiresMultipleRulesLists = ruleCount >= RULES_DECLARATION_PER_CLASS - 1;
    MethodCallExpr rules = buildRulesField(rulesClass);
    if (requiresMultipleRulesLists) {
        addRulesList(rulesListInitializerBody, "rulesList");
    }
    // each method per Drlx parser result
    int count = -1;
    Map<Integer, ClassOrInterfaceDeclaration> splitted = new LinkedHashMap<>();
    for (Entry<String, MethodDeclaration> ruleMethodKV : ruleMethods.entrySet()) {
        ClassOrInterfaceDeclaration rulesMethodClass = splitted.computeIfAbsent(++count / RULES_PER_CLASS, i -> {
            CompilationUnit cuRulesMethod = new CompilationUnit();
            results.with(cuRulesMethod);
            cuRulesMethod.setPackageDeclaration(name);
            manageImportForCompilationUnit(cuRulesMethod);
            cuRulesMethod.addImport(JavaParser.parseImport("import static " + name + "." + rulesFileName + ".*;"));
            String currentRulesMethodClassName = rulesFileName + "RuleMethods" + i;
            return cuRulesMethod.addClass(currentRulesMethodClassName);
        });
        rulesMethodClass.addMember(ruleMethodKV.getValue());
        if (count % RULES_DECLARATION_PER_CLASS == RULES_DECLARATION_PER_CLASS - 1) {
            int index = count / RULES_DECLARATION_PER_CLASS;
            rules = buildRulesField(results, index);
            addRulesList(rulesListInitializerBody, rulesFileName + "Rules" + index + ".rulesList");
        }
        // manage in main class init block:
        rules.addArgument(new MethodCallExpr(new NameExpr(rulesMethodClass.getNameAsString()), ruleMethodKV.getKey()));
    }
    BodyDeclaration<?> rulesList = requiresMultipleRulesLists ? JavaParser.parseBodyDeclaration("List<Rule> rules = new ArrayList<>(" + ruleCount + ");") : JavaParser.parseBodyDeclaration("List<Rule> rules = rulesList;");
    rulesClass.addMember(rulesList);
    if (!rulesListInitializer.getBody().getStatements().isEmpty()) {
        rulesClass.addMember(rulesListInitializer);
    }
    return results;
}
Also used : ClassOrInterfaceDeclaration(org.drools.javaparser.ast.body.ClassOrInterfaceDeclaration) NameExpr(org.drools.javaparser.ast.expr.NameExpr) FieldDeclaration(org.drools.javaparser.ast.body.FieldDeclaration) LinkedHashMap(java.util.LinkedHashMap) JavadocComment(org.drools.javaparser.ast.comments.JavadocComment) CompilationUnit(org.drools.javaparser.ast.CompilationUnit) MethodDeclaration(org.drools.javaparser.ast.body.MethodDeclaration) BlockStmt(org.drools.javaparser.ast.stmt.BlockStmt) InitializerDeclaration(org.drools.javaparser.ast.body.InitializerDeclaration) Expression(org.drools.javaparser.ast.expr.Expression) Map(java.util.Map) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) MethodCallExpr(org.drools.javaparser.ast.expr.MethodCallExpr)

Example 20 with Expression

use of org.drools.javaparser.ast.expr.Expression in project drools by kiegroup.

the class Consequence method executeScriptCall.

private MethodCallExpr executeScriptCall(RuleDescr ruleDescr, MethodCallExpr onCall) {
    MethodCallExpr executeCall = new MethodCallExpr(onCall, EXECUTESCRIPT_CALL);
    executeCall.addArgument(new StringLiteralExpr("mvel"));
    ObjectCreationExpr objectCreationExpr = new ObjectCreationExpr();
    objectCreationExpr.setType(StringBuilder.class.getCanonicalName());
    Expression mvelSB = objectCreationExpr;
    for (String i : packageModel.getImports()) {
        if (i.equals(packageModel.getName() + ".*")) {
            // skip same-package star import.
            continue;
        }
        MethodCallExpr appendCall = new MethodCallExpr(mvelSB, "append");
        StringLiteralExpr importAsStringLiteral = new StringLiteralExpr();
        // use the setter method in order for the string literal be properly escaped.
        importAsStringLiteral.setString("import " + i + ";\n");
        appendCall.addArgument(importAsStringLiteral);
        mvelSB = appendCall;
    }
    StringLiteralExpr mvelScriptBodyStringLiteral = new StringLiteralExpr();
    // use the setter method in order for the string literal be properly escaped.
    mvelScriptBodyStringLiteral.setString(ruleDescr.getConsequence().toString());
    MethodCallExpr appendCall = new MethodCallExpr(mvelSB, "append");
    appendCall.addArgument(mvelScriptBodyStringLiteral);
    executeCall.addArgument(new MethodCallExpr(appendCall, "toString"));
    return executeCall;
}
Also used : ObjectCreationExpr(org.drools.javaparser.ast.expr.ObjectCreationExpr) Expression(org.drools.javaparser.ast.expr.Expression) JavaParser.parseExpression(org.drools.javaparser.JavaParser.parseExpression) StringLiteralExpr(org.drools.javaparser.ast.expr.StringLiteralExpr) MethodCallExpr(org.drools.javaparser.ast.expr.MethodCallExpr)

Aggregations

Expression (org.drools.javaparser.ast.expr.Expression)48 MethodCallExpr (org.drools.javaparser.ast.expr.MethodCallExpr)32 NameExpr (org.drools.javaparser.ast.expr.NameExpr)25 TypedExpression (org.drools.modelcompiler.builder.generator.TypedExpression)19 List (java.util.List)14 ArrayList (java.util.ArrayList)13 Optional (java.util.Optional)13 FieldAccessExpr (org.drools.javaparser.ast.expr.FieldAccessExpr)13 BinaryExpr (org.drools.javaparser.ast.expr.BinaryExpr)11 EnclosedExpr (org.drools.javaparser.ast.expr.EnclosedExpr)11 PackageModel (org.drools.modelcompiler.builder.PackageModel)11 RuleContext (org.drools.modelcompiler.builder.generator.RuleContext)11 Node (org.drools.javaparser.ast.Node)10 StringLiteralExpr (org.drools.javaparser.ast.expr.StringLiteralExpr)10 Collection (java.util.Collection)9 Parameter (org.drools.javaparser.ast.body.Parameter)9 LambdaExpr (org.drools.javaparser.ast.expr.LambdaExpr)9 DeclarationSpec (org.drools.modelcompiler.builder.generator.DeclarationSpec)9 DrlxParseUtil.toVar (org.drools.modelcompiler.builder.generator.DrlxParseUtil.toVar)8 JavaParser (org.drools.javaparser.JavaParser)7