Added version managed with a dedicated type in TypeDefinition
This commit is contained in:
parent
c593c383a6
commit
b0b5fdf3cd
|
@ -31,6 +31,7 @@ import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
import org.gcube.informationsystem.model.reference.properties.Property;
|
import org.gcube.informationsystem.model.reference.properties.Property;
|
||||||
|
import org.gcube.informationsystem.utils.TypeVersion;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Lucio Lelii (ISTI - CNR)
|
* @author Lucio Lelii (ISTI - CNR)
|
||||||
|
@ -143,6 +144,7 @@ public class OrientDBType {
|
||||||
TYPES_BY_CLASS.put(URI.class, OType.STRING);
|
TYPES_BY_CLASS.put(URI.class, OType.STRING);
|
||||||
TYPES_BY_CLASS.put(URL.class, OType.STRING);
|
TYPES_BY_CLASS.put(URL.class, OType.STRING);
|
||||||
TYPES_BY_CLASS.put(UUID.class, OType.STRING);
|
TYPES_BY_CLASS.put(UUID.class, OType.STRING);
|
||||||
|
TYPES_BY_CLASS.put(TypeVersion.class, OType.STRING);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,9 +6,11 @@ import java.lang.reflect.TypeVariable;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.gcube.com.fasterxml.jackson.annotation.JsonGetter;
|
||||||
import org.gcube.com.fasterxml.jackson.annotation.JsonInclude;
|
import org.gcube.com.fasterxml.jackson.annotation.JsonInclude;
|
||||||
import org.gcube.com.fasterxml.jackson.annotation.JsonInclude.Include;
|
import org.gcube.com.fasterxml.jackson.annotation.JsonInclude.Include;
|
||||||
import org.gcube.com.fasterxml.jackson.annotation.JsonProperty;
|
import org.gcube.com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import org.gcube.com.fasterxml.jackson.annotation.JsonSetter;
|
||||||
import org.gcube.informationsystem.base.reference.Element;
|
import org.gcube.informationsystem.base.reference.Element;
|
||||||
import org.gcube.informationsystem.base.reference.entities.EntityElement;
|
import org.gcube.informationsystem.base.reference.entities.EntityElement;
|
||||||
import org.gcube.informationsystem.base.reference.properties.PropertyElement;
|
import org.gcube.informationsystem.base.reference.properties.PropertyElement;
|
||||||
|
@ -23,6 +25,7 @@ import org.gcube.informationsystem.types.impl.properties.PropertyTypeImpl;
|
||||||
import org.gcube.informationsystem.types.impl.relations.RelationTypeImpl;
|
import org.gcube.informationsystem.types.impl.relations.RelationTypeImpl;
|
||||||
import org.gcube.informationsystem.types.reference.Type;
|
import org.gcube.informationsystem.types.reference.Type;
|
||||||
import org.gcube.informationsystem.types.reference.properties.PropertyDefinition;
|
import org.gcube.informationsystem.types.reference.properties.PropertyDefinition;
|
||||||
|
import org.gcube.informationsystem.utils.TypeVersion;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
@ -42,7 +45,7 @@ public class TypeImpl implements Type {
|
||||||
|
|
||||||
protected String name;
|
protected String name;
|
||||||
protected String description;
|
protected String description;
|
||||||
protected String version;
|
protected TypeVersion version;
|
||||||
@JsonProperty(value="abstract")
|
@JsonProperty(value="abstract")
|
||||||
protected boolean abstractType;
|
protected boolean abstractType;
|
||||||
protected Set<String> superClasses;
|
protected Set<String> superClasses;
|
||||||
|
@ -135,7 +138,8 @@ public class TypeImpl implements Type {
|
||||||
protected TypeImpl(Class<? extends Element> clz) {
|
protected TypeImpl(Class<? extends Element> clz) {
|
||||||
this.name = TypeMapper.getType(clz);
|
this.name = TypeMapper.getType(clz);
|
||||||
this.description = TypeMapper.getStaticStringFieldByName(clz, DESCRIPTION, "");
|
this.description = TypeMapper.getStaticStringFieldByName(clz, DESCRIPTION, "");
|
||||||
this.version = TypeMapper.getStaticStringFieldByName(clz, VERSION, "1.0.0");
|
String versionString = TypeMapper.getStaticStringFieldByName(clz, VERSION, "1.0.0");
|
||||||
|
this.version = new TypeVersion(versionString);
|
||||||
this.abstractType = false;
|
this.abstractType = false;
|
||||||
|
|
||||||
if(clz.isAnnotationPresent(Abstract.class)){
|
if(clz.isAnnotationPresent(Abstract.class)){
|
||||||
|
@ -166,9 +170,19 @@ public class TypeImpl implements Type {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getVersion() {
|
public TypeVersion getVersion() {
|
||||||
return version;
|
return version;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@JsonGetter(value=VERSION_PROPERTY)
|
||||||
|
protected String getVersionAsString() {
|
||||||
|
return version.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@JsonSetter(value = VERSION_PROPERTY)
|
||||||
|
protected void setVersion(String version) {
|
||||||
|
this.version = new TypeVersion(version);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isAbstract() {
|
public boolean isAbstract() {
|
||||||
|
|
|
@ -16,6 +16,7 @@ import org.gcube.informationsystem.types.TypeMapper;
|
||||||
import org.gcube.informationsystem.types.annotations.ISProperty;
|
import org.gcube.informationsystem.types.annotations.ISProperty;
|
||||||
import org.gcube.informationsystem.types.impl.TypeImpl;
|
import org.gcube.informationsystem.types.impl.TypeImpl;
|
||||||
import org.gcube.informationsystem.types.reference.properties.PropertyDefinition;
|
import org.gcube.informationsystem.types.reference.properties.PropertyDefinition;
|
||||||
|
import org.gcube.informationsystem.utils.TypeVersion;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
@ -30,9 +31,10 @@ public final class PropertyDefinitionImpl implements PropertyDefinition {
|
||||||
|
|
||||||
private static Logger logger = LoggerFactory.getLogger(TypeImpl.class);
|
private static Logger logger = LoggerFactory.getLogger(TypeImpl.class);
|
||||||
|
|
||||||
public final static String UUID_PATTERN = "^([a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}){1}$";
|
public final static String UUID_REGEX = "^([a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}){1}$";
|
||||||
public final static String URI_PATTERN = null;
|
public final static String URI_REGEX = null;
|
||||||
public final static String URL_PATTERN = null;
|
public final static String URL_REGEX = null;
|
||||||
|
public final static String TYPE_VERSION_REGEX = "^(0|([1-9][0-9]{0,}))\\.(0|([1-9][0-9]{0,}))\\.(0|([1-9][0-9]{0,}))$";
|
||||||
|
|
||||||
private String name= "";
|
private String name= "";
|
||||||
private String description= "";
|
private String description= "";
|
||||||
|
@ -126,14 +128,18 @@ public final class PropertyDefinitionImpl implements PropertyDefinition {
|
||||||
this.regexp = stringBuilder.toString();
|
this.regexp = stringBuilder.toString();
|
||||||
}
|
}
|
||||||
if(UUID.class.isAssignableFrom(type)){
|
if(UUID.class.isAssignableFrom(type)){
|
||||||
this.regexp = UUID_PATTERN;
|
this.regexp = UUID_REGEX;
|
||||||
}
|
}
|
||||||
if(URI.class.isAssignableFrom(type)){
|
if(URI.class.isAssignableFrom(type)){
|
||||||
this.regexp = URI_PATTERN;
|
this.regexp = URI_REGEX;
|
||||||
}
|
}
|
||||||
if(URL.class.isAssignableFrom(type)){
|
if(URL.class.isAssignableFrom(type)){
|
||||||
this.regexp = URL_PATTERN;
|
this.regexp = URL_REGEX;
|
||||||
}
|
}
|
||||||
|
if(TypeVersion.class.isAssignableFrom(type)){
|
||||||
|
this.regexp = TYPE_VERSION_REGEX;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(this.regexp!=null && this.regexp.compareTo("")==0){
|
if(this.regexp!=null && this.regexp.compareTo("")==0){
|
||||||
|
|
|
@ -27,6 +27,8 @@ public final class PropertyTypeImpl<P extends PropertyElement> extends TypeImpl
|
||||||
super(clz);
|
super(clz);
|
||||||
this.superClasses = retrieveSuperClasses(clz, PropertyElement.class,
|
this.superClasses = retrieveSuperClasses(clz, PropertyElement.class,
|
||||||
clz == PropertyElement.class ? null : PropertyElement.NAME);
|
clz == PropertyElement.class ? null : PropertyElement.NAME);
|
||||||
|
|
||||||
|
this.properties = retrieveListOfProperties(clz);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -6,6 +6,7 @@ import org.gcube.com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||||
import org.gcube.informationsystem.base.reference.IdentifiableElement;
|
import org.gcube.informationsystem.base.reference.IdentifiableElement;
|
||||||
import org.gcube.informationsystem.types.annotations.Abstract;
|
import org.gcube.informationsystem.types.annotations.Abstract;
|
||||||
import org.gcube.informationsystem.types.reference.properties.PropertyDefinition;
|
import org.gcube.informationsystem.types.reference.properties.PropertyDefinition;
|
||||||
|
import org.gcube.informationsystem.utils.TypeVersion;
|
||||||
|
|
||||||
@Abstract
|
@Abstract
|
||||||
@JsonIgnoreProperties(ignoreUnknown=true)
|
@JsonIgnoreProperties(ignoreUnknown=true)
|
||||||
|
@ -24,8 +25,8 @@ public interface Type extends IdentifiableElement {
|
||||||
public String getName();
|
public String getName();
|
||||||
|
|
||||||
public String getDescription();
|
public String getDescription();
|
||||||
|
|
||||||
public String getVersion();
|
public TypeVersion getVersion();
|
||||||
|
|
||||||
public boolean isAbstract();
|
public boolean isAbstract();
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
package org.gcube.informationsystem.types.reference.properties;
|
||||||
|
|
||||||
|
import org.gcube.com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||||
|
import org.gcube.com.fasterxml.jackson.databind.annotation.JsonDeserialize;
|
||||||
|
import org.gcube.informationsystem.base.reference.properties.PropertyElement;
|
||||||
|
import org.gcube.informationsystem.types.annotations.ISProperty;
|
||||||
|
import org.gcube.informationsystem.types.impl.properties.PropertyDefinitionImpl;
|
||||||
|
import org.gcube.informationsystem.utils.TypeVersion;
|
||||||
|
|
||||||
|
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||||
|
@JsonDeserialize(as = PropertyDefinitionImpl.class)
|
||||||
|
public interface Changelog extends PropertyElement {
|
||||||
|
|
||||||
|
public static final String VERSION_PROPERTY = "version";
|
||||||
|
public static final String CHANGE_PROPERTY = "changelog";
|
||||||
|
|
||||||
|
@ISProperty(name = VERSION_PROPERTY, readonly = true, mandatory = true, nullable = false, regexpr = "")
|
||||||
|
public TypeVersion getVersion();
|
||||||
|
|
||||||
|
@ISProperty(name = CHANGE_PROPERTY, readonly = true, mandatory = true, nullable = false)
|
||||||
|
public String getChange();
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,113 @@
|
||||||
|
package org.gcube.informationsystem.utils;
|
||||||
|
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import org.gcube.com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
|
import org.gcube.informationsystem.types.impl.properties.PropertyDefinitionImpl;
|
||||||
|
|
||||||
|
public class TypeVersion implements Comparable<TypeVersion> {
|
||||||
|
|
||||||
|
public final static String TYPE_VERSION_REGEX = PropertyDefinitionImpl.TYPE_VERSION_REGEX;
|
||||||
|
|
||||||
|
public final static Pattern TYPE_VERSION_PATTERN;
|
||||||
|
|
||||||
|
static {
|
||||||
|
TYPE_VERSION_PATTERN = Pattern.compile(TYPE_VERSION_REGEX);
|
||||||
|
}
|
||||||
|
|
||||||
|
@JsonIgnore
|
||||||
|
protected int major;
|
||||||
|
@JsonIgnore
|
||||||
|
protected int minor;
|
||||||
|
@JsonIgnore
|
||||||
|
protected int revision;
|
||||||
|
|
||||||
|
protected TypeVersion(){}
|
||||||
|
|
||||||
|
public TypeVersion(String version) {
|
||||||
|
setVersion(version);
|
||||||
|
}
|
||||||
|
|
||||||
|
public TypeVersion(int major, int minor, int revision) {
|
||||||
|
this.major = major;
|
||||||
|
this.minor = minor;
|
||||||
|
this.revision = revision;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setVersion(String version) {
|
||||||
|
if(!TYPE_VERSION_PATTERN.matcher(version).matches()) {
|
||||||
|
throw new RuntimeException("The provided version (i.e. " + version + ") MUST respect the regex " + TYPE_VERSION_REGEX);
|
||||||
|
}
|
||||||
|
String[] parts = version.split("\\.");
|
||||||
|
this.major = Integer.valueOf(parts[0]);
|
||||||
|
this.minor = Integer.valueOf(parts[1]);
|
||||||
|
this.revision = Integer.valueOf(parts[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getMajor() {
|
||||||
|
return major;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setMajor(int major) {
|
||||||
|
this.major = major;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getMinor() {
|
||||||
|
return minor;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setMinor(int minor) {
|
||||||
|
this.minor = minor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getRevision() {
|
||||||
|
return revision;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setRevision(int revision) {
|
||||||
|
this.revision = revision;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return major + "." + minor + "." + revision;
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public int compareTo(TypeVersion other) {
|
||||||
|
if(other == null) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int compare = Integer.compare(major, other.major);
|
||||||
|
if(compare!=0) {
|
||||||
|
return compare;
|
||||||
|
}
|
||||||
|
|
||||||
|
compare = Integer.compare(minor, other.minor);
|
||||||
|
if(compare!=0) {
|
||||||
|
return compare;
|
||||||
|
}
|
||||||
|
|
||||||
|
compare = Integer.compare(revision, other.revision);
|
||||||
|
return compare;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj)
|
||||||
|
return true;
|
||||||
|
if (obj == null)
|
||||||
|
return false;
|
||||||
|
if (getClass() != obj.getClass())
|
||||||
|
return false;
|
||||||
|
TypeVersion other = (TypeVersion) obj;
|
||||||
|
if (major != other.major)
|
||||||
|
return false;
|
||||||
|
if (minor != other.minor)
|
||||||
|
return false;
|
||||||
|
if (revision != other.revision)
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -24,6 +24,7 @@ import org.gcube.informationsystem.types.reference.relations.ConsistsOfType;
|
||||||
import org.gcube.informationsystem.types.reference.relations.IsRelatedToType;
|
import org.gcube.informationsystem.types.reference.relations.IsRelatedToType;
|
||||||
import org.gcube.informationsystem.types.reference.relations.RelationType;
|
import org.gcube.informationsystem.types.reference.relations.RelationType;
|
||||||
import org.gcube.informationsystem.utils.ElementMapper;
|
import org.gcube.informationsystem.utils.ElementMapper;
|
||||||
|
import org.gcube.informationsystem.utils.TypeVersion;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
@ -155,6 +156,11 @@ public class SerializationTest {
|
||||||
public void testTypeSerialization() throws Exception {
|
public void testTypeSerialization() throws Exception {
|
||||||
String serialized = TypeMapper.serializeType(Header.class);
|
String serialized = TypeMapper.serializeType(Header.class);
|
||||||
logger.info(serialized);
|
logger.info(serialized);
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
PropertyType<Header> propertyType = (PropertyType<Header>) TypeMapper.deserializeTypeDefinition(serialized);
|
||||||
|
TypeVersion typeVersion = propertyType.getVersion();
|
||||||
|
logger.debug("Version {}", typeVersion.toString());
|
||||||
|
logger.info(ElementMapper.marshal(propertyType));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
package org.gcube.informationsystem.utils;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class TypeVersionTest {
|
||||||
|
|
||||||
|
String[] validVersions = new String[] {"1.0.0", "13.23.45", "1.12.3"};
|
||||||
|
String[] inValidVersions = new String[] {"1.0", "01.23.45", "1.02.3"};
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPatterns() throws Exception {
|
||||||
|
for(String version : validVersions) {
|
||||||
|
TypeVersion typeVersion = new TypeVersion(version);
|
||||||
|
Assert.assertTrue(version.compareTo(typeVersion.toString())==0);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(String version : inValidVersions) {
|
||||||
|
try {
|
||||||
|
TypeVersion typeVersion = new TypeVersion(version);
|
||||||
|
throw new Exception("The version " + version + " is not valid but the validation succeded. Parsed version is " + typeVersion.toString());
|
||||||
|
}catch (RuntimeException e) {
|
||||||
|
// OK
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue