in jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/WorkItemModelMetaData.java [170:272]
private CompilationUnit compilationUnitInput() {
// task input handling
CompilationUnit compilationUnit = parse(this.getClass().getResourceAsStream("/class-templates/TaskInputTemplate.java"));
compilationUnit.setPackageDeclaration(packageName);
ClassOrInterfaceDeclaration modelClass = compilationUnit.findFirst(ClassOrInterfaceDeclaration.class,
sl1 -> true).orElseThrow(this::cannotFindClass);
addComment(compilationUnit, "Task input");
addUserTaskAnnotation(modelClass);
modelClass.setName(inputModelClassSimpleName);
// setup of static from 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");
// map is task input -> context variable / process variable
Map<String, String> inputTypes = workItemNode.getIoSpecification().getInputTypes();
for (Entry<String, String> entry : workItemNode.getIoSpecification().getInputMapping().entrySet()) {
if (HumanTaskNode.TASK_PARAMETERS.contains(entry.getKey())) {
continue;
}
Variable variable = Optional.ofNullable(variableScope.findVariable(entry.getValue()))
.orElse(processVariableScope.findVariable(entry.getValue()));
if (variable == null) {
variable = new Variable();
variable.setName(entry.getKey());
DataType type = DataTypeResolver.fromType(inputTypes.get(entry.getKey()), Thread.currentThread().getContextClassLoader());
variable.setType(type);
if (!PatternConstants.PARAMETER_MATCHER.matcher(entry.getValue()).find()) {
variable.setValue(type.readValue(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();
// from 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 : workItemNode.getWork().getParameters().entrySet()) {
if (entry.getValue() == null || HumanTaskNode.TASK_PARAMETERS.contains(entry.getKey())) {
continue;
}
FieldDeclaration fd = new FieldDeclaration().addVariable(
new VariableDeclarator()
.setType(entry.getValue().getClass().getCanonicalName())
.setName(entry.getKey()))
.addModifier(Modifier.Keyword.PRIVATE);
modelClass.addMember(fd);
addUserTaskParamAnnotation(fd, UserTaskParam.ParamType.INPUT);
fd.createGetter();
fd.createSetter();
// from static method body
FieldAccessExpr field = new FieldAccessExpr(item, entry.getKey());
ClassOrInterfaceType type = parseClassOrInterfaceType(entry.getValue().getClass().getCanonicalName());
staticFromMap.addStatement(new AssignExpr(field, new CastExpr(
type,
new MethodCallExpr(
new NameExpr(PARAMS),
"get")
.addArgument(new StringLiteralExpr(entry.getKey()))),
AssignExpr.Operator.ASSIGN));
}
Optional<MethodDeclaration> staticFromMethod = modelClass.findFirst(
MethodDeclaration.class, sl -> sl.getName().asString().equals("fromMap") && sl.isStatic());
if (staticFromMethod.isPresent()) {
MethodDeclaration from = staticFromMethod.get();
from.setType(modelClass.getNameAsString());
staticFromMap.addStatement(new ReturnStmt(new NameExpr("item")));
from.setBody(staticFromMap);
}
return compilationUnit;
}