package eu.eudat.models.data.user.components.datasetprofile; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import eu.eudat.models.data.components.commons.DefaultValue; import eu.eudat.models.data.components.commons.Multiplicity; import eu.eudat.models.data.components.commons.ViewStyle; import eu.eudat.models.data.components.commons.Visibility; import eu.eudat.models.data.properties.PropertiesGenerator; import eu.eudat.models.data.user.composite.PropertiesModelBuilder; import eu.eudat.logic.utilities.interfaces.ViewStyleDefinition; import eu.eudat.logic.utilities.builders.ModelBuilder; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Collection; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Field implements Comparable, PropertiesModelBuilder, ViewStyleDefinition, PropertiesGenerator { private static final Logger logger = LoggerFactory.getLogger(Field.class); private String id; private Integer ordinal; private Object value; private ViewStyle viewStyle; private String datatype; private String numbering; private int page; private DefaultValue defaultValue; private Multiplicity multiplicity; private Object data; private List multiplicityItems; private List validations; private Visibility visible; private String rdaProperty; public List getMultiplicityItems() { return multiplicityItems; } public void setMultiplicityItems(List multiplicityItems) { this.multiplicityItems = multiplicityItems; } public void setOrdinal(Integer ordinal) { this.ordinal = ordinal; } public String getId() { return id; } public void setId(String id) { this.id = id; } public int getOrdinal() { return ordinal; } public void setOrdinal(int ordinal) { this.ordinal = ordinal; } public Object getValue() { return value; } public void setValue(Object value) { this.value = value; } public ViewStyle getViewStyle() { return viewStyle; } public void setViewStyle(ViewStyle viewStyle) { this.viewStyle = viewStyle; } public int getPage() { return page; } public void setPage(int page) { this.page = page; } public DefaultValue getDefaultValue() { return defaultValue; } public void setDefaultValue(DefaultValue defaultValue) { this.defaultValue = defaultValue; } public String getDatatype() { return datatype; } public void setDatatype(String datatype) { this.datatype = datatype; } public Multiplicity getMultiplicity() { return multiplicity; } public void setMultiplicity(Multiplicity multiplicity) { this.multiplicity = multiplicity; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } public Visibility getVisible() { return visible; } public void setVisible(Visibility visible) { this.visible = visible; } public List getValidations() { return this.validations.stream().map(item -> (int) item.getValue()).collect(Collectors.toList()); } public void setValidations(List validations) { this.validations = eu.eudat.models.data.admin.components.datasetprofile.Field.ValidationType.fromIntegers(validations); } public String getNumbering() { return numbering; } public void setNumbering(String numbering) { this.numbering = numbering; } public String getRdaProperty() { return rdaProperty; } public void setRdaProperty(String rdaProperty) { this.rdaProperty = rdaProperty; } Field cloneForMultiplicity(String key, Map properties, int index) { Field newField = new Field(); newField.id = key; newField.ordinal = this.ordinal; newField.value = properties.containsKey(key)? properties.get(key): null; newField.viewStyle = this.viewStyle; newField.datatype = this.datatype; newField.page = this.page; newField.defaultValue = this.defaultValue; newField.data = this.data; newField.validations = this.validations; newField.rdaProperty = this.rdaProperty; newField.numbering = "mult" + index + "_" + this.numbering; return newField; } @Override public eu.eudat.models.data.entities.xmlmodels.datasetprofiledefinition.Field toDatabaseDefinition(eu.eudat.models.data.entities.xmlmodels.datasetprofiledefinition.Field field) { field.setId(this.id); field.setOrdinal(this.ordinal); field.setViewStyle(this.viewStyle); field.setData(new ModelBuilder().toFieldData(data, this.viewStyle.getRenderStyle())); field.setDefaultValue(this.defaultValue); field.setVisible(this.visible); field.setValidations(this.validations); field.setRdaCommonStandard(this.rdaProperty); return field; } @Override public void fromDatabaseDefinition(eu.eudat.models.data.entities.xmlmodels.datasetprofiledefinition.Field item) { this.id = item.getId(); this.ordinal = item.getOrdinal(); this.viewStyle = item.getViewStyle(); this.numbering = item.getNumbering(); this.data = item.getData(); this.defaultValue = item.getDefaultValue(); this.visible = item.getVisible(); this.validations = item.getValidations(); this.rdaProperty = item.getRdaCommonStandard(); } @Override public void fromJsonObject(Map properties) { try { JSONArray jsonArray = new JSONArray(properties.get(this.id).toString()); List stringList = new LinkedList<>(); for (int i = 0; i < jsonArray.length(); i++) { stringList.add(jsonArray.getJSONObject(i).toString()); } this.value = stringList; } catch (JSONException | NullPointerException e) { this.value = (String) properties.get(this.id); } this.multiplicityItems = new LinkedList<>(); List compositeKeys = properties.keySet().stream().filter(keys -> keys.startsWith("multiple_" + this.getId())).collect(Collectors.toList()); int index = 1; for (String key : compositeKeys) { this.multiplicityItems.add(this.cloneForMultiplicity(key, properties, index)); } } @Override public int compareTo(Object o) { return this.ordinal.compareTo(((Field) o).getOrdinal()); } @Override public void fromJsonObject(Map properties, String path) { this.value = (String) properties.get(path); } @Override public void toMap(Map fieldValues) { if (this.value != null) { if (this.viewStyle != null && this.viewStyle.getRenderStyle().equals("datasetIdentifier")) { ObjectMapper mapper = new ObjectMapper(); String valueString = null; try { valueString = mapper.writeValueAsString(this.value); fieldValues.put(this.id, valueString); } catch (JsonProcessingException e) { logger.error(e.getMessage(), e); } } else if (this.value instanceof Collection) { Collection valueCollection = (Collection) this.value; StringBuilder valueBuilder = new StringBuilder(); valueBuilder.append("["); for (int i = 0; i < valueCollection.size(); i++) { valueBuilder.append(parseString(valueCollection.stream().toArray()[i])); if (i < valueCollection.size() - 1) { valueBuilder.append(", "); } } valueBuilder.append("]"); fieldValues.put(this.id, valueBuilder.toString()); } else { fieldValues.put(this.id, this.value.toString()); } } else { fieldValues.put(this.id, ""); } } @Override public void toMap(Map fieldValues, int index) { fieldValues.put(this.id, this.value); } private String parseString(Object value) { if (value instanceof String) { if (((String)value).contains(",")) { return "\"" + value + "\""; } } return value.toString(); } }