From 11ff99fd7771a0f8284d6961d417c961924d0348 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Fri, 18 Feb 2022 17:51:32 +0200 Subject: [PATCH] Improve and generalize prefilling logic --- .../eu/eudat/queryable/QueryableList.java | 8 +- .../QueryableHibernateList.java | 8 +- .../logic/managers/DatasetProfileManager.java | 12 +- .../logic/managers/PrefillingManager.java | 8 +- .../mapper/prefilling/PrefillingMapper.java | 195 ++++++++++++++++++ .../entities/DefaultPrefillingMapping.java | 20 ++ .../entities/PrefillingFixedMapping.java | 10 + .../config/entities/PrefillingMapping.java | 4 + .../utilities/documents/word/WordBuilder.java | 6 +- .../commons/datafield/AutoCompleteData.java | 8 +- .../commons/datafield/ComboBoxData.java | 4 +- .../data/datasetprofile/RenderStyle.java | 42 ++++ .../datasetwizard/DatasetWizardModel.java | 152 -------------- .../resources/externalUrls/ExternalUrls.xml | 2 +- 14 files changed, 300 insertions(+), 179 deletions(-) create mode 100644 dmp-backend/web/src/main/java/eu/eudat/logic/mapper/prefilling/PrefillingMapper.java create mode 100644 dmp-backend/web/src/main/java/eu/eudat/models/data/datasetprofile/RenderStyle.java diff --git a/dmp-backend/queryable/src/main/java/eu/eudat/queryable/QueryableList.java b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/QueryableList.java index ac457b28a..9d36e802c 100644 --- a/dmp-backend/queryable/src/main/java/eu/eudat/queryable/QueryableList.java +++ b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/QueryableList.java @@ -4,8 +4,8 @@ import eu.eudat.queryable.jpa.predicates.*; import eu.eudat.queryable.queryableentity.DataEntity; import eu.eudat.queryable.types.SelectionField; -import javax.persistence.TypedQuery; -import javax.persistence.criteria.Expression; +import javax.persistence.criteria.Join; +import javax.persistence.criteria.JoinType; import javax.persistence.criteria.Subquery; import java.util.List; import java.util.Map; @@ -69,4 +69,8 @@ public interface QueryableList { Subquery subQueryMax(SinglePredicate predicate, List fields, Class uClass); Subquery subQueryMax(NestedQuerySinglePredicate predicate, List fields, Class uClass); + + Join getJoin(String field, JoinType type); + + } diff --git a/dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/hibernatequeryablelist/QueryableHibernateList.java b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/hibernatequeryablelist/QueryableHibernateList.java index 75cad534f..54800f43a 100644 --- a/dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/hibernatequeryablelist/QueryableHibernateList.java +++ b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/hibernatequeryablelist/QueryableHibernateList.java @@ -64,7 +64,7 @@ public class QueryableHibernateList implements QueryableLi } private QueryableList selectFields() { - List rootFields = fields.stream().map(field -> this.convertFieldToPath(field)).filter(x -> x != null).collect(Collectors.toList()); + List rootFields = fields.stream().map(this::convertFieldToPath).filter(Objects::nonNull).collect(Collectors.toList()); this.query.select(this.manager.getCriteriaBuilder().tuple(rootFields.toArray(new Selection[rootFields.size()]))); return this; } @@ -95,7 +95,7 @@ public class QueryableHibernateList implements QueryableLi return join; } - private Join getJoin(String field, JoinType type) { + public Join getJoin(String field, JoinType type) { if (this.joinsMap.containsKey(field)) return this.joinsMap.get(field); Join join = this.root.join(field, type); this.joinsMap.put(field, join); @@ -135,11 +135,11 @@ public class QueryableHibernateList implements QueryableLi } public List select(SelectPredicate predicate) { - return this.toList().stream().map(item -> predicate.applySelection(item)).collect(Collectors.toList()); + return this.toList().stream().map(predicate::applySelection).collect(Collectors.toList()); } public CompletableFuture> selectAsync(SelectPredicate predicate) { - return this.toListAsync().thenApplyAsync(items -> items.stream().map(item -> predicate.applySelection(item)).collect(Collectors.toList())); + return this.toListAsync().thenApplyAsync(items -> items.stream().map(predicate::applySelection).collect(Collectors.toList())); } public QueryableList distinct() { diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetProfileManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetProfileManager.java index cc2b30f3f..68707978b 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetProfileManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetProfileManager.java @@ -57,11 +57,12 @@ import java.util.stream.Collectors; @Component public class DatasetProfileManager { private static final Logger logger = LoggerFactory.getLogger(DatasetProfileManager.class); + private static final List cache = new ArrayList<>(); private ApiContext apiContext; private DatabaseRepository databaseRepository; private Environment environment; - private List cache; + private final MetricsManager metricsManager; @Autowired @@ -70,7 +71,6 @@ public class DatasetProfileManager { this.databaseRepository = apiContext.getOperationsContext().getDatabaseRepository(); this.environment = environment; this.metricsManager = metricsManager; - this.cache = new ArrayList<>(); } @Transactional @@ -133,7 +133,7 @@ public class DatasetProfileManager { return field; } - public List getAutocomplete(AutoCompleteData data, String like) { + public static List getAutocomplete(AutoCompleteData data, String like) { List result = new LinkedList<>(); SimpleClientHttpRequestFactory simpleFactory = new SimpleClientHttpRequestFactory(); @@ -182,9 +182,9 @@ public class DatasetProfileManager { headers.setContentType(MediaType.TEXT_PLAIN); entity = new HttpEntity<>("parameters", headers); - if (this.cache.size() <= i) { + if (cache.size() <= i) { response = restTemplate.exchange(singleData.getUrl(), HttpMethod.GET, entity, String.class); - this.cache.add((String) response.getBody()); + cache.add((String) response.getBody()); } jsonContext = JsonPath.parse(cache.get(i)); jsonItems = jsonContext.read(singleData.getOptionsRoot() + "['" + singleData.getAutoCompleteOptions().getLabel() + "','" + singleData.getAutoCompleteOptions().getValue() + "','" + singleData.getAutoCompleteOptions().getSource() + "','" + "uri" + "']"); @@ -201,7 +201,7 @@ public class DatasetProfileManager { //return result; } - private String parseItem(Object item) { + private static String parseItem(Object item) { if (item instanceof String) { return (String) item; } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/PrefillingManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/PrefillingManager.java index de03af282..0010fe997 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/PrefillingManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/PrefillingManager.java @@ -2,12 +2,12 @@ package eu.eudat.logic.managers; import com.fasterxml.jackson.databind.ObjectMapper; import eu.eudat.data.entities.DatasetProfile; +import eu.eudat.logic.mapper.prefilling.PrefillingMapper; import eu.eudat.logic.proxy.config.ExternalUrlCriteria; import eu.eudat.logic.proxy.config.configloaders.ConfigLoader; import eu.eudat.logic.proxy.config.entities.PrefillingConfig; import eu.eudat.logic.proxy.config.entities.PrefillingGet; import eu.eudat.logic.services.ApiContext; -import eu.eudat.models.data.datasetprofile.DatasetProfileOverviewModel; import eu.eudat.models.data.datasetwizard.DatasetWizardModel; import eu.eudat.models.data.prefilling.Prefilling; import org.springframework.beans.factory.annotation.Autowired; @@ -28,15 +28,13 @@ public class PrefillingManager { private final ConfigLoader configLoader; private final ObjectMapper objectMapper; private final DatasetManager datasetManager; - private final DatasetProfileManager datasetProfileManager; @Autowired - public PrefillingManager(ApiContext apiContext, ConfigLoader configLoader, DatasetManager datasetManager, DatasetProfileManager datasetProfileManager) { + public PrefillingManager(ApiContext apiContext, ConfigLoader configLoader, DatasetManager datasetManager) { this.apiContext = apiContext; this.configLoader = configLoader; this.objectMapper = new ObjectMapper(); this.datasetManager = datasetManager; - this.datasetProfileManager = datasetProfileManager; } public List getPrefillings(String like, String configId) { @@ -52,7 +50,7 @@ public class PrefillingManager { PrefillingGet prefillingGet = prefillingConfig.getPrefillingGet(); Map prefillingEntity = getSingle(prefillingGet.getUrl(), prefillId); DatasetProfile datasetProfile = apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().find(profileId); - return DatasetWizardModel.fromPrefilledEntity(prefillingEntity, prefillingGet, datasetProfile, datasetManager); + return PrefillingMapper.mapPrefilledEntityToDatasetWizard(prefillingEntity, prefillingGet, datasetProfile, datasetManager); } private Map getSingle(String url, String id) { diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/prefilling/PrefillingMapper.java b/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/prefilling/PrefillingMapper.java new file mode 100644 index 000000000..8ae2da143 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/prefilling/PrefillingMapper.java @@ -0,0 +1,195 @@ +package eu.eudat.logic.mapper.prefilling; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import eu.eudat.data.entities.Dataset; +import eu.eudat.data.entities.DatasetProfile; +import eu.eudat.elastic.entities.Tag; +import eu.eudat.logic.managers.DatasetManager; +import eu.eudat.logic.managers.DatasetProfileManager; +import eu.eudat.logic.proxy.config.entities.DefaultPrefillingMapping; +import eu.eudat.logic.proxy.config.entities.PrefillingFixedMapping; +import eu.eudat.logic.proxy.config.entities.PrefillingGet; +import eu.eudat.logic.proxy.config.entities.PrefillingMapping; +import eu.eudat.logic.utilities.helpers.StreamDistinctBy; +import eu.eudat.logic.utilities.json.JsonSearcher; +import eu.eudat.models.data.components.commons.datafield.AutoCompleteData; +import eu.eudat.models.data.datasetprofile.DatasetProfileOverviewModel; +import eu.eudat.models.data.datasetprofile.RenderStyle; +import eu.eudat.models.data.datasetwizard.DatasetWizardModel; +import eu.eudat.models.data.externaldataset.ExternalAutocompleteFieldModel; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.*; +import java.util.stream.Collectors; + +public class PrefillingMapper { + private static final ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true); + + public static DatasetWizardModel mapPrefilledEntityToDatasetWizard(Map prefilledEntity, PrefillingGet prefillingGet, + DatasetProfile profile, DatasetManager datasetManager) throws Exception { + DatasetWizardModel datasetWizardModel = new DatasetWizardModel(); + datasetWizardModel.setProfile(new DatasetProfileOverviewModel().fromDataModel(profile)); + Dataset dataset = new Dataset(); + dataset.setProfile(profile); + Map properties = new HashMap<>(); + JsonNode parentNode = mapper.readTree(mapper.writeValueAsString(datasetManager.getPagedProfile(datasetWizardModel, dataset))); + for (DefaultPrefillingMapping prefillingMapping: prefillingGet.getMappings()) { + List sourceKeys = Arrays.asList(prefillingMapping.getSource().split("\\.")); + Object sourceValue = null; + for (String sourceKey: sourceKeys) { + if (sourceValue == null) { + sourceValue = prefilledEntity.get(sourceKey); + } else if (sourceValue instanceof Map) { + sourceValue = ((Map)sourceValue).get(sourceKey); + } + } + setValue(prefillingMapping, mapper.writeValueAsString(sourceValue), datasetWizardModel, parentNode, properties); + } + for (PrefillingFixedMapping fixedMapping: prefillingGet.getFixedMappings()) { + setValue(fixedMapping, fixedMapping.getValue(), datasetWizardModel, parentNode, properties); + } + dataset.setProperties(mapper.writeValueAsString(properties)); + datasetWizardModel.setDatasetProfileDefinition(datasetManager.getPagedProfile(datasetWizardModel, dataset)); + return datasetWizardModel; + } + + private static void setValue(PrefillingMapping prefillingMapping, String value, DatasetWizardModel datasetWizardModel, JsonNode parentNode, Map properties) throws InvocationTargetException, IllegalAccessException, JsonProcessingException { + if (prefillingMapping.getTarget() != null) { + try { + String methodName = "set" + prefillingMapping.getTarget().substring(0, 1).toUpperCase(Locale.ROOT) + prefillingMapping.getTarget().substring(1); + Method setterMethod = Arrays.stream(DatasetWizardModel.class.getDeclaredMethods()) + .filter(method -> method.getName().equals(methodName)).collect(Collectors.toList()).get(0); + Class[] params = setterMethod.getParameterTypes(); + //GK: Tags Special logic + if (!value.equals("null") && prefillingMapping.getTarget().equals("tags")) { + value = mapper.valueToTree(parseTags(value)).toString(); + } + setterMethod.invoke(datasetWizardModel, mapper.readValue(value, params[0])); + }catch (InvocationTargetException | IllegalAccessException | JsonProcessingException e) { + throw e; + } + } else { + List nodes = JsonSearcher.findNodes(parentNode, "rdaProperty", prefillingMapping.getMaDmpTarget()); + /*if(prefillingMapping.getMaDmpTarget().equals("dataset.distribution.available_until") && !value.equals("null")){ + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd"); + LocalDate date = LocalDate.parse(value.replace("\"", ""), formatter); + date = date.plusYears(20); + value = date.toString(); + }*/ + String trimRegex = prefillingMapping.getTrimRegex() != null ? prefillingMapping.getTrimRegex() : ""; + if (!value.startsWith("\"") && !value.startsWith("[") && !value.equals("null")) { + value = "\"" + value + "\""; + } + JsonNode valueNode = mapper.readTree(value); + List parsedValues = new ArrayList<>(); + if (valueNode.isArray()) { + if (prefillingMapping.getSubSource() == null || prefillingMapping.getSubSource().isEmpty()) { + throw new IllegalArgumentException("Source value is an array but no subSource field have been set"); + } + String parsedValue; + for(int i = 0; i < valueNode.size(); i++){ + JsonNode jsonObj = valueNode.get(i); + String subSource = jsonObj.get(prefillingMapping.getSubSource()).asText(); + parsedValue = subSource.replaceAll(trimRegex, ""); + parsedValues.add(parsedValue); + } + parsedValues = parsedValues.stream().distinct().collect(Collectors.toList()); + } + String parsedValue = null; + if (valueNode.isTextual()) { + parsedValue = valueNode.textValue().replace(trimRegex, ""); + } + + for (JsonNode node: nodes) { + String id = node.isArray() ? node.get(0).get("id").asText() : node.get("id").asText(); + String renderStyle = node.isArray() ? node.get(0).get("viewStyle").get("renderStyle").asText() : node.get("viewStyle").get("renderStyle").asText(); + + switch (RenderStyle.fromValue(renderStyle)) { + case COMBO_BOX: + if (parsedValues.isEmpty()) + parsedValues.add(parsedValue); + properties.put(id, parseComboBoxValues(node, parsedValues)); + break; + case TAGS: + properties.put(id, parseTags(parsedValue)); + break; + default: + if (!parsedValues.isEmpty()) + properties.put(id, String.join(", ", parsedValues)); + else + properties.put(id, parsedValue); + break; + } + /*if(prefillingMapping.getMaDmpTarget().equals("dataset.distribution.data_access")){ + value = value.replace("\"", ""); + if(value.equals("open")){ + properties.put(id, value); + } + else if(value.equals("restricted")){ + properties.put(id, "shared"); + } + else{ + properties.put(id, "closed"); + } + }*/ + } + } + } + + private static Object parseComboBoxValues(JsonNode node, List parsedValues) throws JsonProcessingException { + List normalizedValues = new ArrayList<>(); + boolean isMultiSelect; + String type = node.isArray() ? node.get(0).get("data").get("type").asText() : node.get("data").get("type").asText(); + if(type.equals("autocomplete")) { + JsonNode dataNode = node.isArray() ? node.get(0).get("data") : node.get("data"); + AutoCompleteData autoCompleteData = mapper.treeToValue(dataNode, AutoCompleteData.class); + isMultiSelect = autoCompleteData.getMultiAutoComplete(); + for (String format : parsedValues) { + List result = DatasetProfileManager.getAutocomplete(autoCompleteData, format); + result = result.stream().filter(StreamDistinctBy.distinctByKey(ExternalAutocompleteFieldModel::getId)).collect(Collectors.toList()); + if(!result.isEmpty()){ + List tempValues = new LinkedList<>(); + for (ExternalAutocompleteFieldModel f : result) { + if (format.equals(f.getId()) || f.getLabel().toUpperCase(Locale.ROOT).contains(format.toUpperCase(Locale.ROOT))) + tempValues.add(mapper.valueToTree(f).toString()); + } + if (isMultiSelect) + normalizedValues.addAll(tempValues); + else if (!tempValues.isEmpty()) + normalizedValues.add(tempValues.get(0)); + } + } + return !normalizedValues.isEmpty() ? (isMultiSelect ? normalizedValues : normalizedValues.get(0)) : null; + } else { + JsonNode optionsNode = node.isArray() ? node.get(0).get("data").get("options") : node.get("data").get("options"); + isMultiSelect = node.isArray() ? node.get(0).get("data").get("multiList").booleanValue() : node.get("data").get("multiList").booleanValue(); + for (int i = 0; i < optionsNode.size(); i++) { + String value = optionsNode.get(i).get("value").textValue(); + if (parsedValues.contains(value)) { + normalizedValues.add(value); + } + } + List normalizedStringValues = normalizedValues.stream().map(Object::toString).collect(Collectors.toList()); + + return !normalizedValues.isEmpty() ? (isMultiSelect ? String.join(", ", normalizedStringValues) : normalizedValues.get(0)) : null; + } + } + + private static List parseTags(String value) throws JsonProcessingException { + JsonNode rawTags = mapper.readTree(value); + List parsedTags = new LinkedList<>(); + if (rawTags.isArray()) { + for (int i = 0; i < rawTags.size(); i++) { + parsedTags.add(new Tag(rawTags.get(i).textValue(), rawTags.get(i).textValue())); + } + } else if (rawTags.isTextual()){ + List tags = Arrays.asList(rawTags.textValue().split(", ")); + parsedTags.addAll(tags.stream().map(s -> new Tag(s, s)).collect(Collectors.toList())); + } + return parsedTags; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/DefaultPrefillingMapping.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/DefaultPrefillingMapping.java index f348087c6..5fee3d153 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/DefaultPrefillingMapping.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/DefaultPrefillingMapping.java @@ -8,6 +8,8 @@ public class DefaultPrefillingMapping implements PrefillingMapping{ private String source; private String target; private String maDmpTarget; + private String subSource; + private String trimRegex; public String getSource() { return source; @@ -35,4 +37,22 @@ public class DefaultPrefillingMapping implements PrefillingMapping{ public void setMaDmpTarget(String maDmpTarget) { this.maDmpTarget = maDmpTarget; } + + public String getSubSource() { + return subSource; + } + + @XmlAttribute(name = "subSource") + public void setSubSource(String subSource) { + this.subSource = subSource; + } + + public String getTrimRegex() { + return trimRegex; + } + + @XmlAttribute(name = "trimRegex") + public void setTrimRegex(String trimRegex) { + this.trimRegex = trimRegex; + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/PrefillingFixedMapping.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/PrefillingFixedMapping.java index d9b3309b6..4514308f1 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/PrefillingFixedMapping.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/PrefillingFixedMapping.java @@ -27,6 +27,16 @@ public class PrefillingFixedMapping implements PrefillingMapping{ this.maDmpTarget = maDmpTarget; } + @Override + public String getSubSource() { + return ""; + } + + @Override + public String getTrimRegex() { + return ""; + } + public String getValue() { return value; } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/PrefillingMapping.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/PrefillingMapping.java index ce3422123..34f1ca95f 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/PrefillingMapping.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/PrefillingMapping.java @@ -10,4 +10,8 @@ public interface PrefillingMapping { String getMaDmpTarget(); void setMaDmpTarget(String maDmpTarget); + + String getSubSource(); + + String getTrimRegex(); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java index a5cb7d4a3..1abfd5f98 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java @@ -358,7 +358,7 @@ public class WordBuilder { for (Map map: mapList) { for (Map.Entry entry : map.entrySet()) { if (entry.getValue() != null && (entry.getKey().equals("label") || entry.getKey().equals("description") || entry.getKey().equals("name"))) { - sb.append(entry.getValue().toString()); + sb.append(entry.getValue()); break; } } @@ -369,9 +369,9 @@ public class WordBuilder { } else if (comboboxType.equals("wordlist")) { WordListData wordListData = (WordListData) field.getData(); if (field.getValue() != null){ - ComboBoxData.Option selectedOption = null; + ComboBoxData.Option selectedOption = null; if (!wordListData.getOptions().isEmpty()) { - for (ComboBoxData.Option option : wordListData.getOptions()) { + for (ComboBoxData.Option option : wordListData.getOptions()) { if (option.getValue().equals(field.getValue())) { selectedOption = option; } diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/components/commons/datafield/AutoCompleteData.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/components/commons/datafield/AutoCompleteData.java index e4e5fcf94..977110dfc 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/components/commons/datafield/AutoCompleteData.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/components/commons/datafield/AutoCompleteData.java @@ -10,10 +10,10 @@ import java.util.List; import java.util.Map; public class AutoCompleteData extends ComboBoxData { - public class AutoCompleteSingleData { + public static class AutoCompleteSingleData { private int autocompleteType; private String url; - private Option autoCompleteOptions; + private ComboBoxData.Option autoCompleteOptions; private String optionsRoot; public int getAutocompleteType() { @@ -38,10 +38,10 @@ public class AutoCompleteData extends ComboBoxData { this.url = url; } - public Option getAutoCompleteOptions() { + public ComboBoxData.Option getAutoCompleteOptions() { return autoCompleteOptions; } - public void setAutoCompleteOptions(Option autoCompleteOptions) { + public void setAutoCompleteOptions(ComboBoxData.Option autoCompleteOptions) { this.autoCompleteOptions = autoCompleteOptions; } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/components/commons/datafield/ComboBoxData.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/components/commons/datafield/ComboBoxData.java index 59bc6ea79..d7e1b1371 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/components/commons/datafield/ComboBoxData.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/components/commons/datafield/ComboBoxData.java @@ -8,7 +8,7 @@ import java.util.HashMap; import java.util.Map; public abstract class ComboBoxData extends FieldData { - public class Option implements XmlSerializable