use of io.automatiko.engine.workflow.base.core.context.variable.Variable in project automatiko-engine by automatiko-io.
the class UserTaskModelMetaData method compilationUnitInput.
private CompilationUnit compilationUnitInput() {
// task input handling
CompilationUnit compilationUnit = parse(this.getClass().getResourceAsStream("/class-templates/TaskInputTemplate.java"));
compilationUnit.setPackageDeclaration(packageName);
Optional<ClassOrInterfaceDeclaration> processMethod = compilationUnit.findFirst(ClassOrInterfaceDeclaration.class, sl1 -> true);
if (!processMethod.isPresent()) {
throw new RuntimeException("Cannot find class declaration in the template");
}
ClassOrInterfaceDeclaration modelClass = processMethod.get();
compilationUnit.addOrphanComment(new LineComment("Task input model for user task '" + humanTaskNode.getName() + "' in process '" + processId + "'"));
addUserTaskAnnotation(modelClass);
modelClass.setName(inputModelClassSimpleName);
if (templateSupported) {
modelClass.addAnnotation("io.quarkus.qute.TemplateData");
}
modelClass.addAnnotation(new NormalAnnotationExpr(new Name("org.eclipse.microprofile.openapi.annotations.media.Schema"), NodeList.nodeList(new MemberValuePair("name", new StringLiteralExpr(("Input model for " + humanTaskNode.getName()).replaceAll("\\s", ""))), new MemberValuePair("description", new StringLiteralExpr("Task input model for user task '" + humanTaskNode.getName() + "' in '" + processId + "'")))));
// setup of static fromMap method body
ClassOrInterfaceType modelType = new ClassOrInterfaceType(null, modelClass.getNameAsString());
BlockStmt staticFromMap = new BlockStmt();
VariableDeclarationExpr itemField = new VariableDeclarationExpr(modelType, "item");
staticFromMap.addStatement(new AssignExpr(itemField, new ObjectCreationExpr(null, modelType, NodeList.nodeList()), AssignExpr.Operator.ASSIGN));
NameExpr item = new NameExpr("item");
for (Entry<String, String> entry : humanTaskNode.getInMappings().entrySet()) {
Variable variable = Optional.ofNullable(variableScope.findVariable(entry.getValue())).orElse(processVariableScope.findVariable(entry.getValue()));
if (variable == null) {
throw new IllegalStateException("Task " + humanTaskNode.getName() + " (input) " + entry.getKey() + " reference not existing variable " + entry.getValue());
}
FieldDeclaration fd = new FieldDeclaration().addVariable(new VariableDeclarator().setType(variable.getType().getStringType()).setName(entry.getKey())).addModifier(Modifier.Keyword.PRIVATE);
modelClass.addMember(fd);
addUserTaskParamAnnotation(fd, UserTaskParam.ParamType.INPUT);
fd.createGetter();
fd.createSetter();
// fromMap static method body
FieldAccessExpr field = new FieldAccessExpr(item, entry.getKey());
ClassOrInterfaceType type = parseClassOrInterfaceType(variable.getType().getStringType());
staticFromMap.addStatement(new AssignExpr(field, new CastExpr(type, new MethodCallExpr(new NameExpr("params"), "get").addArgument(new StringLiteralExpr(entry.getKey()))), AssignExpr.Operator.ASSIGN));
}
for (Entry<String, Object> entry : humanTaskNode.getWork().getParameters().entrySet()) {
if (entry.getValue() == null || INTERNAL_FIELDS.contains(entry.getKey())) {
continue;
}
Map<String, String> dataInputs = (Map<String, String>) humanTaskNode.getMetaData(DATA_INPUTS);
FieldDeclaration fd = new FieldDeclaration().addVariable(new VariableDeclarator().setType(dataInputs.get(entry.getKey())).setName(entry.getKey())).addModifier(Modifier.Keyword.PUBLIC);
modelClass.addMember(fd);
addUserTaskParamAnnotation(fd, UserTaskParam.ParamType.INPUT);
fd.createGetter();
fd.createSetter();
// fromMap static method body
FieldAccessExpr field = new FieldAccessExpr(item, entry.getKey());
ClassOrInterfaceType type = parseClassOrInterfaceType(fd.getVariable(0).getType().asString());
staticFromMap.addStatement(new AssignExpr(field, new CastExpr(type, new MethodCallExpr(new NameExpr("params"), "get").addArgument(new StringLiteralExpr(entry.getKey()))), AssignExpr.Operator.ASSIGN));
}
Optional<MethodDeclaration> staticFromMapMethod = modelClass.findFirst(MethodDeclaration.class, sl -> sl.getName().asString().equals("fromMap") && sl.isStatic());
if (staticFromMapMethod.isPresent()) {
MethodDeclaration fromMap = staticFromMapMethod.get();
fromMap.setType(modelClass.getNameAsString());
staticFromMap.addStatement(new ReturnStmt(new NameExpr("item")));
fromMap.setBody(staticFromMap);
}
// setup of the toMap method body
BlockStmt toMapBody = new BlockStmt();
ClassOrInterfaceType toMap = new ClassOrInterfaceType(null, new SimpleName(Map.class.getSimpleName()), NodeList.nodeList(new ClassOrInterfaceType(null, String.class.getSimpleName()), new ClassOrInterfaceType(null, Object.class.getSimpleName())));
VariableDeclarationExpr paramsField = new VariableDeclarationExpr(toMap, "params");
toMapBody.addStatement(new AssignExpr(paramsField, new ObjectCreationExpr(null, new ClassOrInterfaceType(null, HashMap.class.getSimpleName()), NodeList.nodeList()), AssignExpr.Operator.ASSIGN));
for (Entry<String, String> entry : humanTaskNode.getInMappings().entrySet()) {
if (entry.getValue() == null || INTERNAL_FIELDS.contains(entry.getKey())) {
continue;
}
Variable variable = Optional.ofNullable(variableScope.findVariable(entry.getValue())).orElse(processVariableScope.findVariable(entry.getValue()));
if (variable == null) {
// check if given mapping is an expression
Matcher matcher = PatternConstants.PARAMETER_MATCHER.matcher(entry.getValue());
if (matcher.find()) {
Map<String, String> dataOutputs = (Map<String, String>) humanTaskNode.getMetaData(DATA_INPUTS);
variable = new Variable();
variable.setName(entry.getKey());
variable.setType(new ObjectDataType(constructClass(dataOutputs.get(entry.getKey())), dataOutputs.get(entry.getKey())));
} else {
throw new IllegalStateException("Task " + humanTaskNode.getName() + " (output) " + entry.getKey() + " reference not existing variable " + entry.getValue());
}
}
// toMap method body
MethodCallExpr putVariable = new MethodCallExpr(new NameExpr("params"), "put");
putVariable.addArgument(new StringLiteralExpr(entry.getKey()));
putVariable.addArgument(new FieldAccessExpr(new ThisExpr(), entry.getKey()));
toMapBody.addStatement(putVariable);
}
Optional<MethodDeclaration> toMapMethod = modelClass.findFirst(MethodDeclaration.class, sl -> sl.getName().asString().equals("toMap"));
toMapBody.addStatement(new ReturnStmt(new NameExpr("params")));
toMapMethod.ifPresent(methodDeclaration -> methodDeclaration.setBody(toMapBody));
return compilationUnit;
}
use of io.automatiko.engine.workflow.base.core.context.variable.Variable in project automatiko-engine by automatiko-io.
the class VariableDeclarations method ofRawInfo.
public static VariableDeclarations ofRawInfo(Map<String, String> vscope) {
HashMap<String, Variable> vs = new HashMap<>();
if (vscope != null) {
for (Entry<String, String> entry : vscope.entrySet()) {
Variable variable = new Variable();
variable.setName(entry.getKey());
variable.setType(new ObjectDataType(constructClass(entry.getValue()), entry.getValue()));
vs.put(entry.getKey(), variable);
}
}
return new VariableDeclarations(vs);
}
use of io.automatiko.engine.workflow.base.core.context.variable.Variable in project automatiko-engine by automatiko-io.
the class ProcessContextMetaModel method getVariable.
public Expression getVariable(String procVar) {
String interpolatedVar = extractVariableFromExpression(procVar);
Variable v = variableScope.findVariable(interpolatedVar);
if (v == null) {
throw new IllegalArgumentException("No such variable " + procVar);
}
MethodCallExpr getter = new MethodCallExpr().setScope(new NameExpr(kcontext)).setName("getVariable").addArgument(new StringLiteralExpr(interpolatedVar));
CastExpr castExpr = new CastExpr().setExpression(new EnclosedExpr(getter)).setType(v.getType().getStringType());
return castExpr;
}
use of io.automatiko.engine.workflow.base.core.context.variable.Variable in project automatiko-engine by automatiko-io.
the class ProcessContextMetaModel method setVariable.
public MethodCallExpr setVariable(String procVar) {
Variable v = variableScope.findVariable(procVar);
if (v == null) {
throw new IllegalArgumentException("No such variable " + procVar);
}
MethodCallExpr setter = new MethodCallExpr().setScope(new NameExpr(kcontext)).setName("setVariable").addArgument(new StringLiteralExpr(procVar));
return setter;
}
use of io.automatiko.engine.workflow.base.core.context.variable.Variable in project automatiko-engine by automatiko-io.
the class ProcessVisitor method visitVariableScope.
private void visitVariableScope(VariableScope variableScope, BlockStmt body, Set<String> visitedVariables) {
if (variableScope != null && !variableScope.getVariables().isEmpty()) {
for (Variable variable : variableScope.getVariables()) {
if (!visitedVariables.add(variable.getName())) {
continue;
}
ClassOrInterfaceType variableType = new ClassOrInterfaceType(null, ObjectDataType.class.getSimpleName());
ObjectCreationExpr variableValue = new ObjectCreationExpr(null, variableType, new NodeList<>(new ClassExpr(new ClassOrInterfaceType(null, ClassUtils.parseClassname(variable.getType().getStringType()))), new StringLiteralExpr(variable.getType().getStringType())));
body.addStatement(getAssignedFactoryMethod(FACTORY_FIELD_NAME, VariableFactory.class, "$var_" + variable.getSanitizedName(), "variable", new Expression[] { new StringLiteralExpr(variable.getId()), new StringLiteralExpr(variable.getName()), variableValue }));
visitMetaData(variable.getMetaData(), body, "$var_" + variable.getSanitizedName());
body.addStatement(getFactoryMethod("$var_" + variable.getSanitizedName(), METHOD_DONE));
}
}
}
Aggregations