information-system-model/src/main/java/org/gcube/informationsystem/types/impl/relations/RelationTypeImpl.java

161 lines
5.5 KiB
Java
Raw Normal View History

2019-10-24 11:26:49 +02:00
package org.gcube.informationsystem.types.impl.relations;
2019-11-04 18:06:46 +01:00
import java.lang.reflect.ParameterizedType;
2019-11-08 18:15:42 +01:00
import java.lang.reflect.Type;
2019-10-24 19:50:43 +02:00
import org.gcube.com.fasterxml.jackson.annotation.JsonIgnore;
2020-07-07 17:04:25 +02:00
import org.gcube.com.fasterxml.jackson.annotation.JsonTypeName;
import org.gcube.informationsystem.base.reference.AccessType;
import org.gcube.informationsystem.base.reference.entities.EntityElement;
import org.gcube.informationsystem.base.reference.relations.RelationElement;
import org.gcube.informationsystem.context.reference.relations.IsParentOf;
2019-11-04 18:06:46 +01:00
import org.gcube.informationsystem.model.reference.entities.Facet;
import org.gcube.informationsystem.model.reference.entities.Resource;
2019-10-24 11:26:49 +02:00
import org.gcube.informationsystem.model.reference.relations.ConsistsOf;
import org.gcube.informationsystem.model.reference.relations.IsRelatedTo;
2020-02-03 10:51:29 +01:00
import org.gcube.informationsystem.types.impl.TypeImpl;
import org.gcube.informationsystem.types.impl.entities.EntityTypeImpl;
import org.gcube.informationsystem.types.reference.entities.EntityType;
import org.gcube.informationsystem.types.reference.relations.ConsistsOfType;
import org.gcube.informationsystem.types.reference.relations.IsRelatedToType;
import org.gcube.informationsystem.types.reference.relations.RelationType;
2019-10-24 11:26:49 +02:00
/**
* @author Luca Frosini (ISTI - CNR)
*/
@JsonTypeName(value = RelationType.NAME)
public class RelationTypeImpl<S extends EntityType, T extends EntityType>
2020-02-03 10:51:29 +01:00
extends TypeImpl implements RelationType<S,T> {
2020-01-23 17:14:44 +01:00
2019-10-24 11:26:49 +02:00
/**
2019-10-24 15:03:14 +02:00
* Generated Serial Version UID
2019-10-24 11:26:49 +02:00
*/
private static final long serialVersionUID = 2221831081869571296L;
protected RelationTypeImpl() {
super();
}
public static RelationType<?,?> getRelationTypeDefinitionInstance(
Class<? extends RelationElement<?,?>> clz) {
2020-01-23 17:14:44 +01:00
if(IsRelatedTo.class.isAssignableFrom(clz)) {
2019-11-08 18:15:42 +01:00
@SuppressWarnings("unchecked")
2020-01-23 17:14:44 +01:00
Class<? extends IsRelatedTo<? extends Resource,? extends Resource>> c = (Class<? extends IsRelatedTo<? extends Resource,? extends Resource>>) clz;
return new IsRelatedToTypeImpl(c);
2019-10-24 11:26:49 +02:00
} else if(ConsistsOf.class.isAssignableFrom(clz)) {
2019-11-08 18:15:42 +01:00
@SuppressWarnings("unchecked")
2020-01-23 17:14:44 +01:00
Class<? extends ConsistsOf<? extends Resource,? extends Facet>> c = (Class<? extends ConsistsOf<? extends Resource,? extends Facet>>) clz;
return new ConsistsOfTypeImpl(c);
2020-01-23 17:14:44 +01:00
}
return new RelationTypeImpl<EntityType,EntityType>(clz);
2020-01-23 17:14:44 +01:00
}
public RelationTypeImpl(Class<? extends RelationElement<?,?>> clz) {
2020-01-23 17:14:44 +01:00
super(clz);
if(RelationType.class.isAssignableFrom(clz)) {
2020-01-29 16:33:51 +01:00
@SuppressWarnings({"unchecked"})
Class<RelationType<?,?>> c = (Class<RelationType<?,?>>) clz;
this.superClasses = retrieveSuperClasses(c, RelationType.class, RelationElement.NAME);
2020-01-23 17:14:44 +01:00
} else if(IsParentOf.class.isAssignableFrom(clz)) {
2019-11-08 18:15:42 +01:00
@SuppressWarnings("unchecked")
2019-10-30 09:57:14 +01:00
Class<? extends IsParentOf> c = (Class<? extends IsParentOf>) clz;
this.superClasses = retrieveSuperClasses(c, IsParentOf.class, RelationElement.NAME);
} else if(RelationElement.class.isAssignableFrom(clz)) {
this.superClasses = retrieveSuperClasses(clz, RelationElement.class, null);
} else {
throw new RuntimeException("Type Hierachy Error");
2019-10-24 11:26:49 +02:00
}
2020-02-03 10:51:29 +01:00
this.properties = retrieveListOfProperties(clz);
2019-11-08 18:15:42 +01:00
discoverSourceAndTarget(clz);
}
@SuppressWarnings("unchecked")
protected Type[] getParametersFromSuperClasses(Class<? extends RelationElement<?,?>> clz) {
2020-01-23 17:14:44 +01:00
for(Type t : clz.getGenericInterfaces()) {
2019-11-08 18:15:42 +01:00
if(t instanceof ParameterizedType) {
if(RelationElement.class.isAssignableFrom((Class<?>) ((ParameterizedType) t).getRawType())) {
2019-11-08 18:15:42 +01:00
return ((ParameterizedType) t).getActualTypeArguments();
}
} else if(RelationElement.class.isAssignableFrom((Class<?>) t)) {
return getParametersFromSuperClasses((Class<? extends RelationElement<?,?>>) t);
2019-11-08 18:15:42 +01:00
}
}
throw new RuntimeException("Unable to find Generic Parameters From SuperClasses to set source and target");
}
@SuppressWarnings("unchecked")
private void discoverSourceAndTarget(Class<? extends RelationElement<?,?>> clz) {
2019-11-08 18:15:42 +01:00
Type[] typeParameters = clz.getTypeParameters();
Class<? extends EntityElement> sourceClass;
Class<? extends EntityElement> targetClass;
2020-01-23 17:14:44 +01:00
if(typeParameters.length == 0) {
2019-11-08 18:15:42 +01:00
typeParameters = getParametersFromSuperClasses(clz);
sourceClass = (Class<? extends EntityElement>) typeParameters[0];
targetClass = (Class<? extends EntityElement>) typeParameters[1];
2020-01-23 17:14:44 +01:00
} else {
sourceClass = (Class<? extends EntityElement>) getGenericClass(typeParameters[0]);
targetClass = (Class<? extends EntityElement>) getGenericClass(typeParameters[1]);
2019-11-04 18:06:46 +01:00
}
2019-10-24 11:26:49 +02:00
this.source = (S) new EntityTypeImpl(sourceClass);
this.target = (T) new EntityTypeImpl(targetClass);
2020-01-23 17:14:44 +01:00
2020-01-20 10:24:55 +01:00
}
2019-10-24 19:50:43 +02:00
/*
2019-11-08 12:29:05 +01:00
* Java does not support class multiple inheritance.
2019-10-24 19:50:43 +02:00
* TypeDefinitionImpl is the superclass so that this class does not inherits the methods and field of BaseRelationImpl
* We need to copy them.
*/
2020-01-23 17:14:44 +01:00
protected S source;
protected T target;
2019-10-24 19:50:43 +02:00
@Override
2020-01-23 17:14:44 +01:00
public S getSource() {
2019-10-24 19:50:43 +02:00
return source;
2019-10-24 11:26:49 +02:00
}
2020-01-23 17:14:44 +01:00
2019-10-24 11:26:49 +02:00
@Override
2020-01-23 17:14:44 +01:00
public void setSource(S source) {
2019-10-24 19:50:43 +02:00
this.source = source;
2019-10-24 11:26:49 +02:00
}
2020-01-23 17:14:44 +01:00
2019-10-24 11:26:49 +02:00
@Override
2020-01-23 17:14:44 +01:00
public T getTarget() {
2019-10-24 19:50:43 +02:00
return target;
2019-10-24 11:26:49 +02:00
}
2020-01-23 17:14:44 +01:00
2019-10-24 11:26:49 +02:00
@Override
2020-01-23 17:14:44 +01:00
public void setTarget(T target) {
2019-10-24 19:50:43 +02:00
this.target = target;
2019-10-24 11:26:49 +02:00
}
2020-01-23 17:14:44 +01:00
@Override
@JsonIgnore
public AccessType getAccessType() {
if(name.compareTo(IsParentOf.NAME)==0) {
return AccessType.IS_PARENT_OF;
}
if(name.compareTo(RelationElement.NAME)==0) {
return AccessType.RELATION_ELEMENT;
}
if(name.compareTo(RelationType.NAME)==0 ||
name.compareTo(IsRelatedToType.NAME)==0 ||
name.compareTo(ConsistsOfType.NAME)==0) {
return AccessType.RELATION_TYPE;
}
return AccessType.RELATION;
}
2019-10-24 11:26:49 +02:00
}