64 lines
3.5 KiB
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);
|
|
}
|
|
}
|