/** * */ package org.gcube.informationsystem.model.impl.entities; import java.util.ArrayList; import java.util.List; import java.util.UUID; import org.gcube.com.fasterxml.jackson.annotation.JsonTypeName; import org.gcube.informationsystem.model.impl.relations.ConsistsOfImpl; 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.IsRelatedTo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author Luca Frosini (ISTI - CNR) */ @JsonTypeName(value=Resource.NAME) public abstract class ResourceImpl extends EntityImpl implements Resource { /** * Generated Serial Version UID */ private static final long serialVersionUID = -3117918737458706846L; private static Logger logger = LoggerFactory.getLogger(ResourceImpl.class); protected List> consistsOfList; protected List> isRelatedToList; /* private List facets; @SuppressWarnings("rawtypes") private Map, List> relationByClass; @SuppressWarnings("rawtypes") private Map, Class>, List> relationByClassAndTarget; private Map, List> entityByClass; @SuppressWarnings("rawtypes") private Map, Class>, List> entityByClassAndTarget; */ protected ResourceImpl() { super(); consistsOfList = new ArrayList<>(); isRelatedToList = new ArrayList<>(); /* facets = new ArrayList<>(); relationByClass = new HashMap<>(); relationByClassAndTarget = new HashMap<>(); entityByClass = new HashMap<>(); entityByClassAndTarget = new HashMap<>(); */ } /* @SuppressWarnings({ "rawtypes"}) private void addRelationByClassAndTarget(Entry, Class> entry, Relation relation){ List relations = relationByClassAndTarget.get(entry); if(relations==null){ relations = new ArrayList<>(); relationByClassAndTarget.put(entry, relations); } relations.add(relation); addRelationByClass(entry.getKey(), relation); } @SuppressWarnings({ "rawtypes"}) private void addRelationByClass(Class relationClass, Relation r){ List relations = (List) relationByClass.get(relationClass); if(relations==null){ relations = new ArrayList<>(); relationByClass.put(relationClass, relations); } relations.add(r); } @SuppressWarnings({ "rawtypes"}) private void addEntityByClassAndTarget(Entry, Class> entry, Entity entity){ List entities = entityByClassAndTarget.get(entry); if(entities==null){ entities = new ArrayList<>(); entityByClassAndTarget.put(entry, entities); } entities.add(entity); addEntityByClass(entry.getValue(), entity); } private void addEntityByClass(Class entityClass, Entity entity){ List entities = entityByClass.get(entityClass); if(entities==null){ entities = new ArrayList<>(); entityByClass.put(entityClass, entities); } entities.add(entity); } @SuppressWarnings({ "rawtypes", "unchecked" }) private Entry, Class> getEntry(Class realtionClass, Class entityClass){ Map, Class> mapForEntry = new HashMap<>(); mapForEntry.put(realtionClass, entityClass); return (Entry, Class>) mapForEntry.entrySet().toArray()[0]; } @SuppressWarnings({ "rawtypes", "unchecked" }) private void addRelation(Relation relation){ Entity entity = (Entity) relation.getTarget(); Entry, Class> entry = getEntry((Class) relation.getClass(), (Class) entity.getClass()); addRelationByClassAndTarget(entry, relation); addEntityByClassAndTarget(entry, entity); } */ @Override public void addFacet(UUID uuid) { Facet facet = new DummyFacet(uuid); addFacet(facet); } @Override public void addFacet(F facet) { ConsistsOf consistsOf = new ConsistsOfImpl(this, facet, null); addFacet(consistsOf); } @Override public > void addFacet(C relation) { if (relation.getSource() != this) { String message = String.format( "%s Source %s is not this. %s != %s", ConsistsOf.NAME, Resource.NAME, relation.getSource().toString(), this.toString()); logger.error(message); throw new RuntimeException(message); } consistsOfList.add(relation); /* addRelation(relation); facets.add(relation.getTarget()); */ } /* @Override public void attachResource(UUID uuid) { Resource resource = new DummyResource(uuid); attachResource(resource); } @Override public void attachResource(R resource) { IsRelatedTo isRelatedTo = new IsRelatedToImpl(this, resource, null); attachResource(isRelatedTo); } */ @Override @SuppressWarnings({ "rawtypes", "unchecked" }) public void attachResource(IsRelatedTo relation) { String message = String.format( "%s Source %s is not this. %s != %s", IsRelatedTo.NAME, Resource.NAME, relation.getSource(), this.toString()); if (relation.getSource()==null){ throw new RuntimeException(message); } if (relation.getSource().getMetadata()!= null && relation.getSource().getID() != null && this.metadata !=null && this.uuid != null && relation.getSource().getID().compareTo(this.uuid)!=0) { throw new RuntimeException(message); } if(relation.getSource()!=this){ relation.setSource(this); } isRelatedToList.add(relation); /* addRelation(relation); */ } @Override public List> getConsistsOf() { return consistsOfList; } @Override public > List getConsistsOf(Class clz) { List list = new ArrayList<>(); for(ConsistsOf consistsOf : consistsOfList){ if(clz.isInstance(consistsOf)){ @SuppressWarnings("unchecked") C c = (C) consistsOf; list.add(c); } } return list; } @Override public List> getIsRelatedTo() { return isRelatedToList; } @Override public > List getIsRelatedTo(Class clz) { List list = new ArrayList<>(); for(IsRelatedTo isRelatedTo : isRelatedToList){ if(clz.isInstance(isRelatedTo)){ @SuppressWarnings("unchecked") I i = (I) isRelatedTo; list.add(i); } } return list; } @Override public List getFacets() { List list = new ArrayList<>(); for(ConsistsOf consistsOf : consistsOfList){ list.add(consistsOf.getTarget()); } return list; } @Override public List getFacets(Class clz) { List list = new ArrayList<>(); for(ConsistsOf consistsOf : consistsOfList){ if(clz.isInstance(consistsOf.getTarget())){ @SuppressWarnings("unchecked") F f = (F) consistsOf.getTarget(); list.add(f); } } return list; } @Override public > List getConsistsOf(Class clz, Class facetClz) { List list = new ArrayList<>(); for(ConsistsOf consistsOf : consistsOfList){ if(clz.isInstance(consistsOf)){ if(facetClz.isInstance(consistsOf.getTarget())){ @SuppressWarnings("unchecked") C c = (C) consistsOf; list.add(c); } } } return list; } @Override public > List getFacets(Class clz, Class facetClz) { List list = new ArrayList<>(); for(ConsistsOf consistsOf : consistsOfList){ if(clz.isInstance(consistsOf)){ if(facetClz.isInstance(consistsOf.getTarget())){ @SuppressWarnings("unchecked") F f = (F) consistsOf.getTarget(); list.add(f); } } } return list; } }