package org.gcube.informationsystem.types.impl.relations; import java.lang.reflect.Type; import org.gcube.com.fasterxml.jackson.annotation.JsonIgnore; import org.gcube.com.fasterxml.jackson.annotation.JsonTypeName; import org.gcube.informationsystem.base.reference.AccessType; import org.gcube.informationsystem.model.reference.entities.Facet; import org.gcube.informationsystem.model.reference.entities.Resource; import org.gcube.informationsystem.model.reference.relations.ConsistsOf; import org.gcube.informationsystem.model.reference.relations.Relation; import org.gcube.informationsystem.types.impl.entities.FacetTypeImpl; import org.gcube.informationsystem.types.impl.entities.ResourceTypeImpl; import org.gcube.informationsystem.types.reference.entities.FacetType; import org.gcube.informationsystem.types.reference.entities.ResourceType; import org.gcube.informationsystem.types.reference.relations.ConsistsOfType; /** * @author Luca Frosini (ISTI - CNR) */ @JsonTypeName(value=ConsistsOfType.NAME) public final class ConsistsOfTypeImpl extends RelationTypeImpl implements ConsistsOfType { /** * Generated Serial Version UID */ private static final long serialVersionUID = 2891976493165330476L; protected ConsistsOfTypeImpl() { super(); } public ConsistsOfTypeImpl(Class> clz) { super(clz); this.extendedTypes = retrieveSuperClasses(clz, ConsistsOf.class, Relation.NAME); this.properties = retrieveListOfProperties(clz); discoverSourceAndTarget(clz); } @SuppressWarnings("unchecked") private void discoverSourceAndTarget(Class> clz) { Type[] typeParameters = clz.getTypeParameters(); Class sourceClass; Class targetClass; if(typeParameters.length==0) { typeParameters = getParametersFromSuperClasses(clz); sourceClass = (Class) typeParameters[0]; targetClass = (Class) typeParameters[1]; }else { sourceClass = (Class) getGenericClass(typeParameters[0]); targetClass = (Class) getGenericClass(typeParameters[1]); } this.source = new ResourceTypeImpl((Class) sourceClass); this.target = new FacetTypeImpl((Class) targetClass); } @Override @JsonIgnore public AccessType getAccessType() { return AccessType.CONSISTS_OF; } }