file-transformer-rda-json/core/src/main/java/eu/eudat/file/transformer/utils/descriptionTemplate/TemplateFieldSearcher.java

64 lines
3.5 KiB
Java

package eu.eudat.file.transformer.utils.descriptionTemplate;
import eu.eudat.file.transformer.models.descriptiontemplate.DescriptionTemplateFileTransformerModel;
import eu.eudat.file.transformer.models.descriptiontemplate.definition.FieldFileTransformerModel;
import eu.eudat.file.transformer.models.descriptiontemplate.definition.FieldSetFileTransformerModel;
import eu.eudat.file.transformer.models.descriptiontemplate.definition.PageFileTransformerModel;
import eu.eudat.file.transformer.models.descriptiontemplate.definition.SectionFileTransformerModel;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
public class TemplateFieldSearcher {
public static List<FieldFileTransformerModel> searchFields(DescriptionTemplateFileTransformerModel template, String key, String value) {
List<FieldFileTransformerModel> result;
List<PageFileTransformerModel> pages = template.getDefinition().getPages();
result = pages.stream().flatMap(pageFileTransformerModel -> searchFieldsFromSections(pageFileTransformerModel.getSections(), key, value).stream()).toList();
return result;
}
private static List<FieldFileTransformerModel> searchFieldsFromSections(List<SectionFileTransformerModel> sections, String key, String value) {
List<FieldFileTransformerModel> result = new ArrayList<>();
for (SectionFileTransformerModel section : sections) {
if (section.getSections() != null && !section.getSections().isEmpty()) {
result.addAll(searchFieldsFromSections(section.getSections(), key, value));
}
if (section.getFieldSets() != null && !section.getFieldSets().isEmpty()) {
List<FieldSetFileTransformerModel> fieldSets = section.getFieldSets();
for (FieldSetFileTransformerModel fieldSet : fieldSets) {
List<FieldFileTransformerModel> fields = fieldSet.getFields();
for (FieldFileTransformerModel field : fields) {
Method keyGetter = Arrays.stream(FieldFileTransformerModel.class.getDeclaredMethods()).filter(method -> method.getName().equals(makeGetter(key))).findFirst().orElse(null);
if (keyGetter != null && keyGetter.canAccess(field)) {
try {
if (keyGetter.invoke(field).equals(value) || keyGetter.invoke(field).toString().startsWith(value)) {
result.add(field);
} else if(keyGetter.getReturnType().isAssignableFrom(List.class)) {
List nodes = (List) keyGetter.invoke(field);
for (Object item : nodes) {
if (item.toString().equals(value) || item.toString().startsWith(value)) {
result.add(field);
}
}
}
} catch (IllegalAccessException | InvocationTargetException e) {
throw new RuntimeException(e);
}
}
}
}
}
}
return result;
}
private static String makeGetter(String fieldName) {
return "get" + fieldName.substring(0, 1).toUpperCase(Locale.ROOT) + fieldName.substring(1);
}
}