From d7653f374c532207ea55a3638e91c9d46be13a21 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Mon, 18 Apr 2022 18:38:58 +0300 Subject: [PATCH] Refactor fieldData mapping --- .../utilities/builders/ModelBuilder.java | 90 ++++++++++--------- .../logic/utilities/helpers/FieldFactory.java | 63 +++++++++++++ .../commons/datafield/FieldData.java | 5 ++ .../components/datasetprofile/FieldSet.java | 4 +- 4 files changed, 117 insertions(+), 45 deletions(-) create mode 100644 dmp-backend/web/src/main/java/eu/eudat/logic/utilities/helpers/FieldFactory.java diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/builders/ModelBuilder.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/builders/ModelBuilder.java index 58786cb16..074524868 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/builders/ModelBuilder.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/builders/ModelBuilder.java @@ -1,5 +1,6 @@ package eu.eudat.logic.utilities.builders; +import eu.eudat.logic.utilities.helpers.FieldFactory; import eu.eudat.models.data.entities.xmlmodels.datasetprofiledefinition.DatabaseViewStyleDefinition; import eu.eudat.models.data.components.commons.datafield.*; import eu.eudat.models.data.entities.xmlmodels.modeldefinition.DatabaseModelDefinition; @@ -20,9 +21,7 @@ public class ModelBuilder { for (U item : items) { try { list.add(item.toDatabaseDefinition(clazz.newInstance())); - } catch (InstantiationException e) { - logger.error(e.getMessage(), e); - } catch (IllegalAccessException e) { + } catch (InstantiationException | IllegalAccessException e) { logger.error(e.getMessage(), e); } } @@ -34,9 +33,7 @@ public class ModelBuilder { for (U item : items) { try { list.add(item.toDatabaseDefinition(clazz.newInstance())); - } catch (InstantiationException e) { - logger.error(e.getMessage(), e); - } catch (IllegalAccessException e) { + } catch (InstantiationException | IllegalAccessException e) { logger.error(e.getMessage(), e); } } @@ -50,64 +47,71 @@ public class ModelBuilder { U modelItem = clazz.newInstance(); modelItem.fromDatabaseDefinition(item); list.add(modelItem); - } catch (InstantiationException e) { - logger.error(e.getMessage(), e); - } catch (IllegalAccessException e) { + } catch (InstantiationException | IllegalAccessException e) { logger.error(e.getMessage(), e); } } return list; } - public FieldData toFieldData(Object data, String type, Element dataElement) { - if (type.equals("combobox")) { + public FieldData toFieldData(Object data, String type, Element dataElement) { + if (dataElement != null && dataElement.hasAttribute("type")) { + logger.info("Type " + type + " SubType " + dataElement.getAttribute("type")); + return FieldFactory.fromData(type, data, dataElement.getAttribute("type")); + } + return FieldFactory.fromData(type, data); + /*if (type.equals("combobox")) { if (dataElement != null) { if (dataElement.getAttribute("type").equals("autocomplete")) { - return (FieldData) new AutoCompleteData().fromData(data); + return new AutoCompleteData().fromData(data); } else if (dataElement.getAttribute("type").equals("wordlist")) - return (FieldData) new WordListData().fromData(data); + return new WordListData().fromData(data); } } if (type.equals("internalDmpEntities")) { if (dataElement != null) { if (dataElement.getAttribute("type").equals("researchers")) { - return (FieldData) new ResearchersAutoCompleteData().fromData(data); + return new ResearchersAutoCompleteData().fromData(data); } else if (dataElement.getAttribute("type").equals("datasets")) - return (FieldData) new DatasetsAutoCompleteData().fromData(data); + return new DatasetsAutoCompleteData().fromData(data); else if (dataElement.getAttribute("type").equals("dmps")) - return (FieldData) new DMPsAutoCompleteData().fromData(data); + return new DMPsAutoCompleteData().fromData(data); } } - if (type.equals("booleanDecision")) return (FieldData) new BooleanDecisionData().fromData(data); - if (type.equals("radiobox")) return (FieldData) new RadioBoxData().fromData(data); - if (type.equals("checkBox")) return (FieldData) new CheckBoxData().fromData(data); - if (type.equals("freetext")) return (FieldData) new FreeTextData().fromData(data); - if (type.equals("textarea")) return (FieldData) new TextAreaData().fromData(data); - if (type.equals("richTextarea")) return (FieldData) new RichTextAreaData().fromData(data); - if (type.equals("upload")) return (FieldData) new UploadData().fromData(data); + if (type.equals("booleanDecision")) return new BooleanDecisionData().fromData(data); + if (type.equals("radiobox")) return new RadioBoxData().fromData(data); + if (type.equals("checkBox")) return new CheckBoxData().fromData(data); + if (type.equals("freetext")) return new FreeTextData().fromData(data); + if (type.equals("textarea")) return new TextAreaData().fromData(data); + if (type.equals("richTextarea")) return new RichTextAreaData().fromData(data); + if (type.equals("upload")) return new UploadData().fromData(data); // if (type.equals("table")) return (FieldData) new TableData().fromData(data); - if (type.equals("datePicker")) return (FieldData) new DatePickerData().fromData(data); - if (type.equals("externalDatasets")) return (FieldData) new ExternalDatasetsData().fromData(data); - if (type.equals("dataRepositories")) return (FieldData) new DataRepositoriesData().fromData(data); - if (type.equals("pubRepositories")) return (FieldData) new DataRepositoriesData().fromData(data); - if (type.equals("journalRepositories")) return (FieldData) new DataRepositoriesData().fromData(data); - if (type.equals("taxonomies")) return (FieldData) new TaxonomiesData().fromData(data); - if (type.equals("licenses")) return (FieldData) new LicensesData().fromData(data); - if (type.equals("publications")) return (FieldData) new PublicationsData().fromData(data); - if (type.equals("registries")) return (FieldData) new RegistriesData().fromData(data); - if (type.equals("services")) return (FieldData) new ServicesData().fromData(data); - if (type.equals("tags")) return (FieldData) new TagsData().fromData(data); - if (type.equals("researchers")) return (FieldData) new ResearcherData().fromData(data); - if (type.equals("organizations")) return (FieldData) new OrganizationsData().fromData(data); - if (type.equals("datasetIdentifier")) return (FieldData) new DatasetIdentifierData().fromData(data); - if (type.equals("currency")) return (FieldData) new CurrencyData().fromData(data); - if (type.equals("validation")) return (FieldData) new ValidationData().fromData(data); - return null; + if (type.equals("datePicker")) return new DatePickerData().fromData(data); + if (type.equals("externalDatasets")) return new ExternalDatasetsData().fromData(data); + if (type.equals("dataRepositories")) return new DataRepositoriesData().fromData(data); + if (type.equals("pubRepositories")) return new DataRepositoriesData().fromData(data); + if (type.equals("journalRepositories")) return new DataRepositoriesData().fromData(data); + if (type.equals("taxonomies")) return new TaxonomiesData().fromData(data); + if (type.equals("licenses")) return new LicensesData().fromData(data); + if (type.equals("publications")) return new PublicationsData().fromData(data); + if (type.equals("registries")) return new RegistriesData().fromData(data); + if (type.equals("services")) return new ServicesData().fromData(data); + if (type.equals("tags")) return new TagsData().fromData(data); + if (type.equals("researchers")) return new ResearcherData().fromData(data); + if (type.equals("organizations")) return new OrganizationsData().fromData(data); + if (type.equals("datasetIdentifier")) return new DatasetIdentifierData().fromData(data); + if (type.equals("currency")) return new CurrencyData().fromData(data); + if (type.equals("validation")) return new ValidationData().fromData(data);*/ + //return null; } - public FieldData toFieldData(Object data, String type) { - if (type.equals("combobox")) { + public FieldData toFieldData(Object data, String type) { + if (data != null && ((Map) data).containsKey("type")) { + return FieldFactory.fromData(type, data, (String) ((Map) data).get("type")); + } + return FieldFactory.fromData(type, data); + /*if (type.equals("combobox")) { String comboboxType = (String) ((Map) data).get("type"); if (comboboxType.equals("autocomplete")) { return (FieldData) new AutoCompleteData().fromData(data); @@ -150,6 +154,6 @@ public class ModelBuilder { if (type.equals("datasetIdentifier")) return (FieldData) new DatasetIdentifierData().fromData(data); if (type.equals("currency")) return (FieldData) new CurrencyData().fromData(data); if (type.equals("validation")) return (FieldData) new ValidationData().fromData(data); - return null; + return null;*/ } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/helpers/FieldFactory.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/helpers/FieldFactory.java new file mode 100644 index 000000000..f63e123c8 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/helpers/FieldFactory.java @@ -0,0 +1,63 @@ +package eu.eudat.logic.utilities.helpers; + +import eu.eudat.models.data.components.commons.datafield.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.lang.reflect.Modifier; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class FieldFactory { + private static final Logger logger = LoggerFactory.getLogger(FieldFactory.class); + private static final Map> fieldMap = Stream.of(new Object[][]{ + {"combobox", ComboBoxData.class}, + {"autocomplete", AutoCompleteData.class}, + {"wordlist", WordListData.class}, + {"internalDmpEntities", InternalDmpEntitiesData.class}, + {"researchers", ResearcherData.class}, + {"datasets", DatasetsAutoCompleteData.class}, + {"dmps", DMPsAutoCompleteData.class}, + {"booleanDecision", BooleanDecisionData.class}, + {"radiobox", RadioBoxData.class}, + {"checkBox", CheckBoxData.class}, + {"freetext", FreeTextData.class}, + {"textarea", TextAreaData.class}, + {"richTextarea", RichTextAreaData.class}, + {"upload", UploadData.class}, + {"datePicker", DatePickerData.class}, + {"externalDatasets", ExternalDatasetsData.class}, + {"dataRepositories", DataRepositoriesData.class}, + {"pubRepositories", DataRepositoriesData.class}, + {"journalRepositories", DataRepositoriesData.class}, + {"taxonomies", TaxonomiesData.class}, + {"licenses", LicensesData.class}, + {"publications", PublicationsData.class}, + {"registries", RegistriesData.class}, + {"services", ServicesData.class}, + {"tags", TagsData.class}, + {"organizations", OrganizationsData.class}, + {"datasetIdentifier", DatasetIdentifierData.class}, + {"currency", CurrencyData.class}, + {"validation", ValidationData.class} + }).collect(Collectors.toMap(data -> (String) data[0], data -> (Class) data[1])); + + public static FieldData fromData(String type, Object data, String subType) { + if (Modifier.isAbstract(fieldMap.get(type).getModifiers())) { + return fromData(subType, data); + } else { + return fromData(type, data); + } + } + + public static FieldData fromData(String type, Object data) { + try { + return (FieldData) fieldMap.get(type).newInstance().fromData(data); + } catch (InstantiationException | IllegalAccessException e) { + logger.error(e.getMessage(), e); + } + return null; + } + +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/components/commons/datafield/FieldData.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/components/commons/datafield/FieldData.java index a992658bd..10f2ced17 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/components/commons/datafield/FieldData.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/components/commons/datafield/FieldData.java @@ -1,5 +1,6 @@ package eu.eudat.models.data.components.commons.datafield; +import eu.eudat.logic.utilities.helpers.FieldFactory; import eu.eudat.logic.utilities.interfaces.XmlSerializable; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -21,6 +22,10 @@ public abstract class FieldData implements XmlSerializable { return null; } + public T fromData(Object data, String subType) { + return (T) FieldFactory.fromData(subType, data); + } + public Object toData() { return null; } diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/user/components/datasetprofile/FieldSet.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/user/components/datasetprofile/FieldSet.java index 80ece4c30..9c17849b7 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/user/components/datasetprofile/FieldSet.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/user/components/datasetprofile/FieldSet.java @@ -175,12 +175,12 @@ public class FieldSet implements Comparable, PropertiesModelBuilder, ViewStyleDe private FieldSet CloneForMultiplicity2(List key, Map properties,String[] ids, int index){ FieldSet newFieldSet = new FieldSet(); - newFieldSet.id = ids[0]+"_"+ids[1]+"_"+ids[2] + (ids.length > 4 ? "_" + ids[3] : ""); + newFieldSet.id = ids[0] + "_" + ids[1] + "_" + ids[2] + (ids.length > 3 && !ids[ids.length - 1].isEmpty() ? "_" + ids[ids.length - 1] : ""); newFieldSet.description = this.description; newFieldSet.extendedDescription = this.extendedDescription; newFieldSet.additionalInformation=this.additionalInformation; newFieldSet.title = this.title; - newFieldSet.ordinal = ids.length > 4 ? Integer.valueOf(ids[3]) : this.ordinal; + newFieldSet.ordinal = ids.length > 3 && !ids[ids.length - 1].isEmpty() && ids[ids.length - 1].matches("[0-9]+") ? Integer.valueOf(ids[ids.length - 1]) : this.ordinal; newFieldSet.fields = new LinkedList(); for (Field field: this.fields) {