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
|
|
|
|
2019-10-24 11:26:49 +02:00
|
|
|
import org.gcube.informationsystem.base.reference.entities.BaseEntity;
|
|
|
|
import org.gcube.informationsystem.base.reference.relations.BaseRelation;
|
2019-10-25 17:46:13 +02:00
|
|
|
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;
|
|
|
|
import org.gcube.informationsystem.model.reference.relations.Relation;
|
2019-10-24 11:57:21 +02:00
|
|
|
import org.gcube.informationsystem.types.impl.TypeDefinitionImpl;
|
2019-11-08 12:29:05 +01:00
|
|
|
import org.gcube.informationsystem.types.impl.entities.EntityTypeDefinitionImpl;
|
2019-10-24 15:03:14 +02:00
|
|
|
import org.gcube.informationsystem.types.reference.entities.EntityTypeDefinition;
|
|
|
|
import org.gcube.informationsystem.types.reference.relations.RelationTypeDefinition;
|
2019-10-24 11:26:49 +02:00
|
|
|
|
2019-10-24 15:03:14 +02:00
|
|
|
import com.fasterxml.jackson.annotation.JsonTypeName;
|
2019-10-24 11:26:49 +02:00
|
|
|
|
2019-10-24 15:03:14 +02:00
|
|
|
@JsonTypeName(value=RelationTypeDefinition.NAME)
|
2020-01-16 16:48:08 +01:00
|
|
|
public final class RelationTypeDefinitionImpl extends TypeDefinitionImpl implements RelationTypeDefinition {
|
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;
|
|
|
|
|
2019-10-28 17:36:09 +01:00
|
|
|
protected RelationTypeDefinitionImpl() {
|
|
|
|
super();
|
|
|
|
}
|
|
|
|
|
2019-11-08 12:29:05 +01:00
|
|
|
public RelationTypeDefinitionImpl(Class<? extends BaseRelation<?, ?>> clz) {
|
2019-10-24 11:26:49 +02:00
|
|
|
super(clz);
|
|
|
|
|
|
|
|
if(IsRelatedTo.class.isAssignableFrom(clz)){
|
2019-11-08 18:15:42 +01:00
|
|
|
@SuppressWarnings("unchecked")
|
2019-11-04 18:06:46 +01:00
|
|
|
Class<? extends IsRelatedTo<? extends Resource, ? extends Resource>> c = (Class<? extends IsRelatedTo<? extends Resource, ? extends Resource>>) clz;
|
2019-10-24 11:26:49 +02:00
|
|
|
this.superClasses = retrieveSuperClasses(c, IsRelatedTo.class, Relation.NAME);
|
|
|
|
} else if(ConsistsOf.class.isAssignableFrom(clz)) {
|
2019-11-08 18:15:42 +01:00
|
|
|
@SuppressWarnings("unchecked")
|
2019-11-04 18:06:46 +01:00
|
|
|
Class<? extends ConsistsOf<? extends Resource, ? extends Facet>> c = (Class<? extends ConsistsOf<? extends Resource, ? extends Facet>>) clz;
|
2019-10-24 11:26:49 +02:00
|
|
|
this.superClasses = retrieveSuperClasses(c, ConsistsOf.class, Relation.NAME);
|
2019-10-25 17:46:13 +02:00
|
|
|
} else if(RelationTypeDefinition.class.isAssignableFrom(clz)){
|
2019-11-08 18:15:42 +01:00
|
|
|
@SuppressWarnings("unchecked")
|
2019-11-08 12:29:05 +01:00
|
|
|
Class<RelationTypeDefinition> c = (Class<RelationTypeDefinition>) clz;
|
2019-10-30 09:57:14 +01:00
|
|
|
this.superClasses = retrieveSuperClasses(c, RelationTypeDefinition.class, BaseRelation.NAME);
|
2019-10-25 17:46:13 +02: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, BaseRelation.NAME);
|
|
|
|
} else if(BaseRelation.class.isAssignableFrom(clz)){
|
|
|
|
this.superClasses = retrieveSuperClasses(clz, BaseRelation.class, null);
|
2019-10-25 17:46:13 +02:00
|
|
|
} else {
|
|
|
|
throw new RuntimeException("Type Hierachy Error");
|
2019-10-24 11:26:49 +02:00
|
|
|
}
|
|
|
|
|
2019-11-08 18:15:42 +01:00
|
|
|
discoverSourceAndTarget(clz);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
@SuppressWarnings("unchecked")
|
|
|
|
protected Type[] getParametersFromSuperClasses(Class<? extends BaseRelation<?, ?>> clz) {
|
|
|
|
for(Type t : clz.getGenericInterfaces()){
|
|
|
|
if(t instanceof ParameterizedType) {
|
|
|
|
if(BaseRelation.class.isAssignableFrom((Class<?>) ((ParameterizedType) t).getRawType())) {
|
|
|
|
return ((ParameterizedType) t).getActualTypeArguments();
|
|
|
|
}
|
|
|
|
}else if(BaseRelation.class.isAssignableFrom((Class<?>) t)){
|
|
|
|
return getParametersFromSuperClasses((Class<? extends BaseRelation<?, ?>>) t);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
throw new RuntimeException("Unable to find Generic Parameters From SuperClasses to set source and target");
|
|
|
|
}
|
|
|
|
|
|
|
|
@SuppressWarnings("unchecked")
|
|
|
|
private void discoverSourceAndTarget(Class<? extends BaseRelation<?, ?>> clz) {
|
|
|
|
Type[] typeParameters = clz.getTypeParameters();
|
|
|
|
|
2019-11-08 12:29:05 +01:00
|
|
|
Class<? extends BaseEntity> sourceClass;
|
|
|
|
Class<? extends BaseEntity> targetClass;
|
2019-11-04 18:06:46 +01:00
|
|
|
if(typeParameters.length==0) {
|
2019-11-08 18:15:42 +01:00
|
|
|
typeParameters = getParametersFromSuperClasses(clz);
|
2019-11-08 12:29:05 +01:00
|
|
|
sourceClass = (Class<? extends BaseEntity>) typeParameters[0];
|
|
|
|
targetClass = (Class<? extends BaseEntity>) typeParameters[1];
|
2019-11-04 18:06:46 +01:00
|
|
|
}else {
|
2019-11-08 12:29:05 +01:00
|
|
|
sourceClass = (Class<? extends BaseEntity>) getGenericClass(typeParameters[0]);
|
|
|
|
targetClass = (Class<? extends BaseEntity>) getGenericClass(typeParameters[1]);
|
2019-11-04 18:06:46 +01:00
|
|
|
}
|
2019-10-24 11:26:49 +02:00
|
|
|
|
2019-11-08 12:29:05 +01:00
|
|
|
this.source = new EntityTypeDefinitionImpl(sourceClass);
|
|
|
|
this.target = new EntityTypeDefinitionImpl(targetClass);
|
2019-10-24 11:26:49 +02: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.
|
|
|
|
*/
|
|
|
|
|
2019-11-08 12:29:05 +01:00
|
|
|
protected EntityTypeDefinition source;
|
|
|
|
protected EntityTypeDefinition target;
|
2019-10-24 19:50:43 +02:00
|
|
|
|
|
|
|
@Override
|
2019-11-08 12:29:05 +01:00
|
|
|
public EntityTypeDefinition getSource() {
|
2019-10-24 19:50:43 +02:00
|
|
|
return source;
|
2019-10-24 11:26:49 +02:00
|
|
|
}
|
|
|
|
|
2019-10-24 19:50:43 +02:00
|
|
|
|
2019-10-24 11:26:49 +02:00
|
|
|
@Override
|
2019-11-08 12:29:05 +01:00
|
|
|
public void setSource(EntityTypeDefinition source) {
|
2019-10-24 19:50:43 +02:00
|
|
|
this.source = source;
|
2019-10-24 11:26:49 +02:00
|
|
|
}
|
|
|
|
|
2019-10-24 19:50:43 +02:00
|
|
|
|
2019-10-24 11:26:49 +02:00
|
|
|
@Override
|
2019-11-08 12:29:05 +01:00
|
|
|
public EntityTypeDefinition getTarget() {
|
2019-10-24 19:50:43 +02:00
|
|
|
return target;
|
2019-10-24 11:26:49 +02:00
|
|
|
}
|
|
|
|
|
2019-10-24 19:50:43 +02:00
|
|
|
|
2019-10-24 11:26:49 +02:00
|
|
|
@Override
|
2019-11-08 12:29:05 +01:00
|
|
|
public void setTarget(EntityTypeDefinition target) {
|
2019-10-24 19:50:43 +02:00
|
|
|
this.target = target;
|
2019-10-24 11:26:49 +02:00
|
|
|
}
|
2019-11-08 12:29:05 +01:00
|
|
|
|
2019-10-24 11:26:49 +02:00
|
|
|
}
|