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));
}
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;
}
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());
}
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;
}
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;
}
Aggregations