2019-03-22 15:18:23 +01:00
|
|
|
/**
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
package org.gcube.informationsystem.model.impl.entities;
|
|
|
|
|
|
|
|
import java.util.HashMap;
|
|
|
|
import java.util.HashSet;
|
|
|
|
import java.util.Map;
|
|
|
|
import java.util.Set;
|
|
|
|
|
2020-07-07 17:04:25 +02:00
|
|
|
import org.gcube.com.fasterxml.jackson.annotation.JsonIgnore;
|
|
|
|
import org.gcube.com.fasterxml.jackson.annotation.JsonTypeName;
|
2020-01-30 10:26:43 +01:00
|
|
|
import org.gcube.informationsystem.base.reference.Element;
|
2019-03-22 15:18:23 +01:00
|
|
|
import org.gcube.informationsystem.model.reference.entities.Facet;
|
2019-10-24 11:26:49 +02:00
|
|
|
import org.gcube.informationsystem.model.reference.properties.Property;
|
2023-02-03 14:39:25 +01:00
|
|
|
import org.gcube.informationsystem.serialization.ElementMapper;
|
2019-03-22 15:18:23 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @author Luca Frosini (ISTI - CNR)
|
|
|
|
*/
|
|
|
|
@JsonTypeName(value=Facet.NAME)
|
|
|
|
public abstract class FacetImpl extends EntityImpl implements Facet {
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Generated Serial Version UID
|
|
|
|
*/
|
|
|
|
private static final long serialVersionUID = 6075565284892615813L;
|
|
|
|
|
|
|
|
@JsonIgnore
|
|
|
|
protected Map<String, Object> additionalProperties;
|
|
|
|
|
|
|
|
@JsonIgnore
|
|
|
|
/**
|
|
|
|
* Used to allow to have an additional property starting with '_' or '@'
|
|
|
|
*/
|
|
|
|
protected final Set<String> allowedAdditionalKeys;
|
|
|
|
|
|
|
|
protected FacetImpl(){
|
|
|
|
super();
|
|
|
|
this.additionalProperties = new HashMap<>();
|
|
|
|
this.allowedAdditionalKeys = new HashSet<>();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Map<String, Object> getAdditionalProperties() {
|
|
|
|
return additionalProperties;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void setAdditionalProperties(Map<String, Object> additionalProperties) {
|
|
|
|
this.additionalProperties = additionalProperties;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Object getAdditionalProperty(String key) {
|
|
|
|
return additionalProperties.get(key);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void setAdditionalProperty(String key, Object value) {
|
|
|
|
if(!allowedAdditionalKeys.contains(key)){
|
|
|
|
if(key.startsWith("_")) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if(key.startsWith("@")) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
Additional properties are not deserialized to the proper property type.
|
|
|
|
The first attempt was to try to write a specific deserializer but it fails.
|
|
|
|
This fix the issue.
|
|
|
|
*/
|
|
|
|
try {
|
|
|
|
if(value instanceof Map<?,?>) {
|
|
|
|
@SuppressWarnings("unchecked")
|
|
|
|
Map<String, Object> map = (Map<String,Object>) value;
|
2023-04-27 10:40:36 +02:00
|
|
|
if(map.containsKey(Element.TYPE_PROPERTY)) {
|
2020-02-03 10:51:29 +01:00
|
|
|
String reserialized = ElementMapper.getObjectMapper().writeValueAsString(map);
|
|
|
|
Property property = ElementMapper.unmarshal(Property.class, reserialized);
|
2019-03-22 15:18:23 +01:00
|
|
|
value = property;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}catch (Throwable e) {
|
|
|
|
e.getMessage();
|
|
|
|
// Any type of error/exception must be catched
|
|
|
|
}
|
|
|
|
/* END of fix to properly deserialize Property types*/
|
|
|
|
|
|
|
|
this.additionalProperties.put(key, value);
|
|
|
|
}
|
|
|
|
|
|
|
|
public void addAllowedAdditionalKey(String allowedAdditionalKey){
|
|
|
|
this.allowedAdditionalKeys.add(allowedAdditionalKey);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|