From 1d955fbcfaebcfbd3c303114c9271bd5d463d8ae Mon Sep 17 00:00:00 2001 From: Fabio Sinibaldi Date: Thu, 27 Oct 2022 17:17:44 +0200 Subject: [PATCH] Manage display last of chain --- .../plugins/ConcessioniLifeCycleManager.java | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/concessioni-lifecycle/src/main/java/org/gcube/application/cms/concessioni/plugins/ConcessioniLifeCycleManager.java b/concessioni-lifecycle/src/main/java/org/gcube/application/cms/concessioni/plugins/ConcessioniLifeCycleManager.java index 5645d44..66297ec 100644 --- a/concessioni-lifecycle/src/main/java/org/gcube/application/cms/concessioni/plugins/ConcessioniLifeCycleManager.java +++ b/concessioni-lifecycle/src/main/java/org/gcube/application/cms/concessioni/plugins/ConcessioniLifeCycleManager.java @@ -4,19 +4,33 @@ import com.vdurmont.semver4j.Semver; import lombok.extern.slf4j.Slf4j; import org.bson.Document; import org.gcube.application.cms.custom.gna.concessioni.model.ProfiledConcessione; +import org.gcube.application.cms.implementations.ImplementationProvider; +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.cms.plugins.IndexerPluginInterface; import org.gcube.application.cms.plugins.LifecycleManager; import org.gcube.application.cms.plugins.implementations.Default3PhaseManager; import org.gcube.application.cms.plugins.reports.EventExecutionReport; import org.gcube.application.cms.plugins.reports.Report; +import org.gcube.application.cms.plugins.reports.StepExecutionReport; +import org.gcube.application.cms.plugins.requests.BaseRequest; +import org.gcube.application.cms.plugins.requests.IndexDocumentRequest; import org.gcube.application.cms.serialization.Serialization; import org.gcube.application.geoportal.common.model.JSONPathWrapper; import org.gcube.application.geoportal.common.model.document.Project; import org.gcube.application.geoportal.common.model.document.access.Access; import org.gcube.application.geoportal.common.model.document.access.AccessPolicy; import org.gcube.application.geoportal.common.model.document.filesets.RegisteredFileSet; +import org.gcube.application.geoportal.common.model.document.lifecycle.LifecycleInformation; +import org.gcube.application.geoportal.common.model.document.relationships.RelationshipNavigationObject; import org.gcube.application.geoportal.common.model.legacy.report.ConstraintCheck; +import org.gcube.application.geoportal.common.model.rest.ConfigurationException; import java.io.IOException; +import java.util.ArrayList; import java.util.List; @Slf4j @@ -26,6 +40,10 @@ import java.util.List; public class ConcessioniLifeCycleManager extends Default3PhaseManager implements LifecycleManager { + private static final String FOLLOWS="follows"; + private static final String PRECEDES="precedes"; + + public ConcessioniLifeCycleManager() { DESCRIPTOR.setId("GNA-CONCESSIONI-LC"); DESCRIPTOR.setDescription("GNA Concessioni. This plugin supports custom lifecycle management for the GNA Concessioni UseCase."); @@ -173,4 +191,71 @@ public class ConcessioniLifeCycleManager extends Default3PhaseManager implements } + @Override + protected Document evaluateAdditionalIndexParameters(IndexDocumentRequest request) throws InvalidUserRoleException, RegistrationException, ProjectNotFoundException, ConfigurationException, UnauthorizedAccess { + Document toReturn = super.evaluateAdditionalIndexParameters(request); + Project indexingProject = request.getDocument(); + + // Evaluate to display project IDs + log.info("Evaluating Last ID in relationship chain. Current Concessione ID is {}",indexingProject.getId()); + try { + ArrayList projects = new ArrayList<>(); + ProjectAccess access = ImplementationProvider.get().getProvidedObjectByClass(ProjectAccess.class); + // get Last ID in relation chain + projects.add(indexingProject); + if(!indexingProject.getRelationshipsByName(PRECEDES).isEmpty()) + scanRelation(projects,access.getRelations(indexingProject.getProfileID(), indexingProject.getId(), PRECEDES,true).get(0),false); + if(!indexingProject.getRelationshipsByName(FOLLOWS).isEmpty()) + scanRelation(projects,access.getRelations(indexingProject.getProfileID(), indexingProject.getId(), FOLLOWS,true).get(0),false); + + log.debug("Produced full chain from {}, evaluating last available for PHASE {} ",indexingProject.getId(), + indexingProject.getLifecycleInformation().getPhase()); + + List toDisplayId = new ArrayList<>(); + List toHideIds = new ArrayList<>(); + + log.trace("Checking from LAST.. "); + // recurse from last + for(int i = projects.size()-1;i>=0;i--) { + Project p = projects.get(i); + log.debug("Currently checking {} : {}",p.getId(),p.getTheDocument().get("nome")); + if(!toDisplayId.isEmpty()) + toHideIds.add(p.getId()); + else { + //Still need to find candidate for displaying feature + // Check PHASE + switch(indexingProject.getLifecycleInformation().getPhase()){ + case Phases.PENDING_APPROVAL:{ + if (p.getLifecycleInformation().getPhase().equals(Phases.PENDING_APPROVAL)|| + p.getLifecycleInformation().getPhase().equals(Phases.PUBLISHED)) + toDisplayId.add(p.getId()); + break; + } + case Phases.PUBLISHED:{ + if (p.getLifecycleInformation().getPhase().equals(Phases.PUBLISHED)) + toDisplayId.add(p.getId()); + break; + } + } + if(toDisplayId != null) + log.debug("Found last concessioni candidate for displaying. ID {}, PHASE {} ",toDisplayId,p.getLifecycleInformation().getPhase()); + else toHideIds.add(p.getId()); // Still not found + } + } + + toReturn.put("_toHideIds",toHideIds); + toReturn.put("_toDisplayIds",toDisplayId); + return toReturn; + } catch (Exception e) { + log.error("Unable to evaluate to Hide and Display Ids ",e); + throw e; + } + + } + + private static void scanRelation(ArrayList chain,RelationshipNavigationObject obj, boolean putBefore){ + if(putBefore)chain.add(0,obj.getTarget()); + else chain.add(obj.getTarget()); + if(obj.getChildren()!=null && !obj.getChildren().isEmpty())scanRelation(chain,obj,putBefore); + } }