use of org.ehrbase.webtemplate.model.WebTemplateNode in project ehrbase by ehrbase.
the class KnowledgeCacheService method resolveForTemplate.
@Override
public JsonPathQueryResult resolveForTemplate(String templateId, Collection<NodeId> nodeIds) {
TemplateIdQueryTuple key = new TemplateIdQueryTuple(templateId, nodeIds);
JsonPathQueryResult jsonPathQueryResult = jsonPathQueryResultCache.get(key, JsonPathQueryResult.class);
if (jsonPathQueryResult == null) {
WebTemplate webTemplate = getQueryOptMetaData(templateId);
List<WebTemplateNode> webTemplateNodeList = new ArrayList<>();
webTemplateNodeList.add(webTemplate.getTree());
for (NodeId nodeId : nodeIds) {
webTemplateNodeList = webTemplateNodeList.stream().map(n -> n.findMatching(f -> {
if (f.getNodeId() == null) {
return false;
} else // compere only classname
if (nodeId.getNodeId() == null) {
return nodeId.getClassName().equals(new NodeId(f.getNodeId()).getClassName());
} else {
return nodeId.equals(new NodeId(f.getNodeId()));
}
})).flatMap(List::stream).collect(Collectors.toList());
}
Set<String> uniquePaths = new TreeSet<>();
webTemplateNodeList.stream().map(n -> n.getAqlPath(false)).forEach(uniquePaths::add);
if (!uniquePaths.isEmpty()) {
jsonPathQueryResult = new JsonPathQueryResult(templateId, uniquePaths);
} else {
// dummy result since null can not be path of a cache
jsonPathQueryResult = new JsonPathQueryResult(null, Collections.emptyMap());
}
jsonPathQueryResultCache.put(key, jsonPathQueryResult);
}
if (jsonPathQueryResult.getTemplateId() != null) {
return jsonPathQueryResult;
} else // Is dummy result
{
return null;
}
}
use of org.ehrbase.webtemplate.model.WebTemplateNode in project openEHR_SDK by ehrbase.
the class PathMatcher method matchesPath.
String matchesPath(Context<?> context, WebTemplateNode child, Map.Entry<String, ?> e) {
String aqlPath = FlatPath.removeStart(new FlatPath(child.getAqlPath()), new FlatPath(context.getNodeDeque().peek().getAqlPath())).toString();
if (StringUtils.startsWith(e.getKey(), aqlPath)) {
return remove(e, aqlPath, child);
} else {
FlatPath childPath = new FlatPath(aqlPath);
FlatPath pathLast = childPath.getLast();
FlatPath pathWithoutLastName = FlatPath.addEnd(FlatPath.removeEnd(childPath, pathLast), new FlatPath(pathLast.format(false)));
if (StringUtils.startsWith(e.getKey(), pathWithoutLastName.toString()) && context.getNodeDeque().peek().getChildren().stream().filter(n -> Objects.equals(n.getNodeId(), child.getNodeId())).count() == 1) {
logger.warn("name/value not set in dto for {}", child.getAqlPath());
return remove(e, pathWithoutLastName.toString(), child);
} else {
return null;
}
}
}
use of org.ehrbase.webtemplate.model.WebTemplateNode in project openEHR_SDK by ehrbase.
the class ClassGenerator method addSimpleField.
private void addSimpleField(ClassGeneratorContext context, TypeSpec.Builder classBuilder, String path, WebTemplateNode endNode) {
Class<?> clazz = extractClass(endNode);
if (clazz == null) {
logger.warn("No class for path {} ", path);
return;
}
ValueSet valueSet = buildValueSet(endNode);
RmClassGeneratorConfig classGeneratorConfig = configMap.get(clazz);
if (classGeneratorConfig == null && !clazz.getName().contains("java.lang")) {
logger.debug("No ClassGenerator for {}", clazz);
}
boolean expand = classGeneratorConfig != null && classGeneratorConfig.isExpandField();
if (endNode.getRmType().equals("DV_CODED_TEXT") && !List.of("transition", "language", "setting", "category", "territory", "math_function", "null_flavour").contains(endNode.getId(false))) {
expand = expand && endNode.getInputs().stream().filter(i -> i.getType().equals("CODED_TEXT")).map(WebTemplateInput::getList).flatMap(List::stream).findAny().isPresent();
}
if (!expand) {
TypeName className = Optional.ofNullable(clazz).map(ClassName::get).orElse(ClassName.get(Object.class));
if (endNode.isMulti() && !context.nodeDeque.peek().getRmType().equals("ELEMENT")) {
className = ParameterizedTypeName.get(ClassName.get(List.class), className);
}
addField(context, classBuilder, path, endNode, className, valueSet, false);
} else {
Map<String, Field> fieldMap = Arrays.stream(FieldUtils.getAllFields(clazz)).filter(f -> !f.isSynthetic()).collect(Collectors.toMap(Field::getName, f -> f));
Set<String> expandFields = classGeneratorConfig.getExpandFields();
expandFields.forEach(fieldName -> addField(context, classBuilder, path + "|" + new SnakeCase(fieldName).camelToSnake(), endNode, ClassName.get(fieldMap.get(fieldName).getType()), valueSet, false));
}
}
use of org.ehrbase.webtemplate.model.WebTemplateNode in project openEHR_SDK by ehrbase.
the class ClassGenerator method build.
private TypeSpec.Builder build(ClassGeneratorContext context, WebTemplateNode next) {
String className = defaultNamingStrategy.buildClassName(context, next, false, false);
context.currentFieldNameMap.push(new HashMap<>());
context.nodeDeque.push(next);
context.unFilteredNodeDeque.push(next);
TypeSpec.Builder classBuilder = TypeSpec.classBuilder(className);
if (StringUtils.isBlank(context.currentMainClass)) {
context.currentMainClass = className;
}
classBuilder.addModifiers(Modifier.PUBLIC);
classBuilder.addAnnotation(AnnotationSpec.builder(Entity.class).build());
if (next.isArchetype()) {
AnnotationSpec archetypeAnnotation = AnnotationSpec.builder(Archetype.class).addMember(Archetype.VALUE, "$S", next.getNodeId()).build();
classBuilder.addAnnotation(archetypeAnnotation);
}
AnnotationSpec generatedAnnotation = buildGeneratedAnnotation();
classBuilder.addAnnotation(generatedAnnotation);
classBuilder.addSuperinterface(findRMInterface(next));
if (next.getChildren().stream().anyMatch(n -> n.getRmType().equals("EVENT"))) {
WebTemplateNode event = next.getChildren().stream().filter(n -> n.getRmType().equals("EVENT")).findAny().orElseThrow();
Walker.EventHelper eventHelper = new Walker.EventHelper(event).invoke();
WebTemplateNode pointEvent = eventHelper.getPointEvent();
WebTemplateNode intervalEvent = eventHelper.getIntervalEvent();
next.getChildren().add(intervalEvent);
next.getChildren().add(pointEvent);
next.getChildren().remove(event);
}
Map<String, List<WebTemplateNode>> choices = next.getChoicesInChildren();
List<WebTemplateNode> children = next.getChildren().stream().filter(c -> choices.values().stream().flatMap(List::stream).noneMatch(l -> l.equals(c))).collect(Collectors.toList());
for (WebTemplateNode child : children) {
Deque<WebTemplateNode> filtersNodes = pushToUnfiltered(context, child);
String relativPath = context.nodeDeque.peek().buildRelativePath(child);
if (child.getChildren().isEmpty() && !choices.containsKey(child.getAqlPath())) {
addSimpleField(context, classBuilder, relativPath, child);
} else if (!choices.containsKey(child.getAqlPath())) {
addComplexField(context, classBuilder, relativPath, child);
}
if (!CollectionUtils.isEmpty(filtersNodes)) {
filtersNodes.forEach(n -> context.unFilteredNodeDeque.poll());
}
}
for (List<WebTemplateNode> choice : choices.values()) {
WebTemplateNode node = choice.get(0);
WebTemplateNode relativeNode = buildRelativeNode(context, node);
Deque<WebTemplateNode> filtersNodes = pushToUnfiltered(context, node);
TypeSpec interfaceSpec;
TypeName interfaceClassName;
if (context.currentTypeSpec.containsKey(relativeNode)) {
interfaceSpec = context.currentTypeSpec.get(relativeNode);
String interfacePackage = context.currentPackageName + "." + context.currentMainClass.toLowerCase() + DEFINITION_PACKAGE;
context.classes.put(interfacePackage, interfaceSpec);
interfaceClassName = ClassName.get(interfacePackage, interfaceSpec.name);
} else {
List<Pair<TypeSpec.Builder, WebTemplateNode>> builders = new ArrayList<>();
for (WebTemplateNode child : choice) {
TypeSpec.Builder build = build(context, child);
builders.add(new ImmutablePair<>(build, child));
}
TypeSpec.Builder interfaceBuilder = TypeSpec.interfaceBuilder(defaultNamingStrategy.buildClassName(context, choice.get(0), true, false)).addModifiers(Modifier.PUBLIC);
interfaceBuilder.addAnnotation(buildGeneratedAnnotation());
Set<FieldSpec> cowmenField = null;
for (Set<FieldSpec> fields : builders.stream().map(Pair::getLeft).map(s -> s.fieldSpecs).map(HashSet::new).collect(Collectors.toList())) {
if (cowmenField == null) {
cowmenField = fields;
} else {
cowmenField = SetUtils.intersection(cowmenField, fields);
}
}
if (cowmenField == null) {
cowmenField = Collections.emptySet();
}
cowmenField.forEach(f -> {
interfaceBuilder.addMethod(buildGetter(f, true));
interfaceBuilder.addMethod(buildSetter(f, true));
});
interfaceSpec = interfaceBuilder.build();
context.currentTypeSpec.put(relativeNode, interfaceSpec);
String interfacePackage = context.currentPackageName + "." + context.currentMainClass.toLowerCase() + DEFINITION_PACKAGE;
context.classes.put(interfacePackage, interfaceSpec);
interfaceClassName = ClassName.get(interfacePackage, interfaceSpec.name);
TypeName finalInterfaceClassName = interfaceClassName;
builders.forEach(pair -> {
TypeSpec.Builder builder = pair.getKey().addSuperinterface(finalInterfaceClassName).addAnnotation(AnnotationSpec.builder(OptionFor.class).addMember(OptionFor.VALUE, "$S", pair.getRight().getRmType()).build());
context.classes.put(interfacePackage, builder.build());
});
}
if (choice.stream().anyMatch(WebTemplateNode::isMulti)) {
interfaceClassName = ParameterizedTypeName.get(ClassName.get(List.class), interfaceClassName);
}
String relativPath = FlatPath.removeStart(new FlatPath(node.getAqlPath()), new FlatPath(next.getAqlPath())).toString();
addField(context, classBuilder, relativPath, node, interfaceClassName, new ValueSet(ValueSet.LOCAL, ValueSet.LOCAL, Collections.emptySet()), true);
if (!CollectionUtils.isEmpty(filtersNodes)) {
filtersNodes.forEach(n -> context.unFilteredNodeDeque.poll());
}
}
if (next.isArchetype()) {
context.currentArchetypeName.poll();
}
if (children.isEmpty() && choices.isEmpty()) {
addSimpleField(context, classBuilder, "", next);
}
context.currentFieldNameMap.poll();
context.nodeDeque.poll();
context.unFilteredNodeDeque.poll();
return classBuilder;
}
use of org.ehrbase.webtemplate.model.WebTemplateNode in project openEHR_SDK by ehrbase.
the class StdToCompositionWalker method handleDVTextInternal.
public static void handleDVTextInternal(WebTemplateNode node) {
WebTemplateNode merged = Filter.mergeDVText(node);
node.getChildren().removeIf(childNode -> List.of("coded_text_value", "text_value").contains(childNode.getId()));
node.getChildren().add(merged);
}
Aggregations