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 searchFields(DescriptionTemplateFileTransformerModel template, String key, String value) { List result; List pages = template.getDefinition().getPages(); result = pages.stream().flatMap(pageFileTransformerModel -> searchFieldsFromSections(pageFileTransformerModel.getSections(), key, value).stream()).toList(); return result; } private static List searchFieldsFromSections(List sections, String key, String value) { List 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 fieldSets = section.getFieldSets(); for (FieldSetFileTransformerModel fieldSet : fieldSets) { List 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); } }