package org.gcube.application.geoportal.service.engine.providers; import lombok.extern.slf4j.Slf4j; import org.bson.Document; import org.gcube.application.cms.implementations.ProjectAccess; import org.gcube.application.cms.implementations.faults.InvalidUserRoleException; import org.gcube.application.cms.implementations.faults.ProjectNotFoundException; import org.gcube.application.cms.implementations.faults.RegistrationException; import org.gcube.application.cms.implementations.faults.UnauthorizedAccess; import org.gcube.application.geoportal.common.model.document.Project; import org.gcube.application.geoportal.common.model.document.relationships.Relationship; import org.gcube.application.geoportal.common.model.document.relationships.RelationshipNavigationObject; import org.gcube.application.geoportal.common.model.rest.ConfigurationException; import org.gcube.application.geoportal.common.model.rest.QueryRequest; import org.gcube.application.geoportal.service.engine.mongo.ProfiledMongoManager; import java.util.ArrayList; import java.util.List; @Slf4j public class ProjectAccessImpl implements ProjectAccess { @Override public Project getById(String ucid, String id) throws RegistrationException, ConfigurationException, InvalidUserRoleException, ProjectNotFoundException, UnauthorizedAccess { return new ProfiledMongoManager(ucid).getByID(id); } @Override public Iterable query(String ucid, QueryRequest query) throws RegistrationException, ConfigurationException, InvalidUserRoleException { return new ProfiledMongoManager(ucid).query(query); } @Override public List getRelations(String ucid, String id, String relation, Boolean deep) throws InvalidUserRoleException, RegistrationException, ProjectNotFoundException, ConfigurationException, UnauthorizedAccess { return getRelationshipChain(ucid,id,relation,deep); } public static List getRelationshipChain(String ucid, String id, String relationshipId, Boolean deep) throws RegistrationException, ConfigurationException, InvalidUserRoleException, ProjectNotFoundException, UnauthorizedAccess { // recursive ProfiledMongoManager manager = new ProfiledMongoManager(ucid); log.info("UCD {} : Getting Relationships List for {} [rel : {}, recurse {}]", manager.getUseCaseDescriptor().getId(), id, relationshipId, deep); Project current = manager.getByID(id); long startTime = System.currentTimeMillis(); List toReturn = getLinked(current, relationshipId, deep); log.info("Got {} relationship elements in {}ms", toReturn.size(), (System.currentTimeMillis() - startTime)); return toReturn; } private static List getLinked(Project current, String relationName, Boolean recurse) { log.debug("Getting Relationships Lists for {} [rel : {}, recurse {}]", current.getId(), relationName, recurse); ArrayList toReturn = new ArrayList<>(); List existing = current.getRelationshipsByName(relationName); for (Relationship relationship : existing) { try { log.trace("Navigating from {} : {} to[rel {} ] {} : {}", relationship.getTargetUCD(), relationship.getTargetID(), relationship.getRelationshipName(), current.getProfileID(), current.getId()); RelationshipNavigationObject linkedProject = new RelationshipNavigationObject(); linkedProject.setTarget(new ProfiledMongoManager(relationship.getTargetUCD()).getByID(relationship.getTargetID())); if (recurse) linkedProject.setChildren(getLinked(linkedProject.getTarget(), relationName, recurse)); toReturn.add(linkedProject); } catch (Exception e) { log.warn("Unable to navigate from {} : {} to[rel {} ] {} : {}", relationship.getTargetUCD(), relationship.getTargetID(), relationship.getRelationshipName(), current.getProfileID(), current.getId(), e); } } return toReturn; } }