diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/ProjectAccess.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/ProjectAccess.java new file mode 100644 index 0000000..5018697 --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/ProjectAccess.java @@ -0,0 +1,23 @@ +package org.gcube.application.cms.implementations; + +import org.bson.Document; +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.RelationshipNavigationObject; +import org.gcube.application.geoportal.common.model.rest.ConfigurationException; +import org.gcube.application.geoportal.common.model.rest.QueryRequest; + +import java.util.List; + +public interface ProjectAccess { + + + public Project getById(String ucid,String id) throws RegistrationException, ConfigurationException, InvalidUserRoleException, ProjectNotFoundException, UnauthorizedAccess; + + public Iterable query(String ucid, QueryRequest query) throws RegistrationException, ConfigurationException, InvalidUserRoleException; + + public List getRelations(String ucid, String id, String relation) throws InvalidUserRoleException, RegistrationException, ProjectNotFoundException, ConfigurationException, UnauthorizedAccess; +} diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/model/internal/faults/DataParsingException.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/DataParsingException.java similarity index 92% rename from geoportal-service/src/main/java/org/gcube/application/geoportal/service/model/internal/faults/DataParsingException.java rename to cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/DataParsingException.java index f91a9a2..4495115 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/model/internal/faults/DataParsingException.java +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/DataParsingException.java @@ -1,4 +1,4 @@ -package org.gcube.application.geoportal.service.model.internal.faults; +package org.gcube.application.cms.implementations.faults; public class DataParsingException extends Exception { diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/model/internal/faults/DeletionException.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/DeletionException.java similarity index 88% rename from geoportal-service/src/main/java/org/gcube/application/geoportal/service/model/internal/faults/DeletionException.java rename to cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/DeletionException.java index bb121e7..d41cfa3 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/model/internal/faults/DeletionException.java +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/DeletionException.java @@ -1,4 +1,4 @@ -package org.gcube.application.geoportal.service.model.internal.faults; +package org.gcube.application.cms.implementations.faults; public class DeletionException extends Exception { diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/model/internal/faults/InvalidLockException.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/InvalidLockException.java similarity index 88% rename from geoportal-service/src/main/java/org/gcube/application/geoportal/service/model/internal/faults/InvalidLockException.java rename to cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/InvalidLockException.java index 634a893..13f9c02 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/model/internal/faults/InvalidLockException.java +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/InvalidLockException.java @@ -1,4 +1,4 @@ -package org.gcube.application.geoportal.service.model.internal.faults; +package org.gcube.application.cms.implementations.faults; public class InvalidLockException extends Exception{ public InvalidLockException() { diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/model/internal/faults/InvalidStateException.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/InvalidStateException.java similarity index 92% rename from geoportal-service/src/main/java/org/gcube/application/geoportal/service/model/internal/faults/InvalidStateException.java rename to cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/InvalidStateException.java index f2f39fa..18762b3 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/model/internal/faults/InvalidStateException.java +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/InvalidStateException.java @@ -1,4 +1,4 @@ -package org.gcube.application.geoportal.service.model.internal.faults; +package org.gcube.application.cms.implementations.faults; public class InvalidStateException extends Exception { diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/model/internal/faults/InvalidUserRoleException.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/InvalidUserRoleException.java similarity index 89% rename from geoportal-service/src/main/java/org/gcube/application/geoportal/service/model/internal/faults/InvalidUserRoleException.java rename to cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/InvalidUserRoleException.java index 0406bb4..1a6de3f 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/model/internal/faults/InvalidUserRoleException.java +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/InvalidUserRoleException.java @@ -1,4 +1,4 @@ -package org.gcube.application.geoportal.service.model.internal.faults; +package org.gcube.application.cms.implementations.faults; public class InvalidUserRoleException extends Exception { diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/model/internal/faults/ProjectLockedException.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/ProjectLockedException.java similarity index 89% rename from geoportal-service/src/main/java/org/gcube/application/geoportal/service/model/internal/faults/ProjectLockedException.java rename to cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/ProjectLockedException.java index 55f4e84..07b9c32 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/model/internal/faults/ProjectLockedException.java +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/ProjectLockedException.java @@ -1,4 +1,4 @@ -package org.gcube.application.geoportal.service.model.internal.faults; +package org.gcube.application.cms.implementations.faults; public class ProjectLockedException extends Exception{ public ProjectLockedException() { diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/model/internal/faults/ProjectNotFoundException.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/ProjectNotFoundException.java similarity index 89% rename from geoportal-service/src/main/java/org/gcube/application/geoportal/service/model/internal/faults/ProjectNotFoundException.java rename to cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/ProjectNotFoundException.java index cea1e08..9bb9f90 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/model/internal/faults/ProjectNotFoundException.java +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/ProjectNotFoundException.java @@ -1,4 +1,4 @@ -package org.gcube.application.geoportal.service.model.internal.faults; +package org.gcube.application.cms.implementations.faults; public class ProjectNotFoundException extends Exception { public ProjectNotFoundException() { diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/model/internal/faults/RegistrationException.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/RegistrationException.java similarity index 88% rename from geoportal-service/src/main/java/org/gcube/application/geoportal/service/model/internal/faults/RegistrationException.java rename to cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/RegistrationException.java index aedfea0..a2e59bc 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/model/internal/faults/RegistrationException.java +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/RegistrationException.java @@ -1,4 +1,4 @@ -package org.gcube.application.geoportal.service.model.internal.faults; +package org.gcube.application.cms.implementations.faults; public class RegistrationException extends Exception { diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/model/internal/faults/UnauthorizedAccess.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/UnauthorizedAccess.java similarity index 88% rename from geoportal-service/src/main/java/org/gcube/application/geoportal/service/model/internal/faults/UnauthorizedAccess.java rename to cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/UnauthorizedAccess.java index a44cb64..3bb5572 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/model/internal/faults/UnauthorizedAccess.java +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/UnauthorizedAccess.java @@ -1,4 +1,4 @@ -package org.gcube.application.geoportal.service.model.internal.faults; +package org.gcube.application.cms.implementations.faults; public class UnauthorizedAccess extends Exception { diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/implementations/AbstractLifeCycleManager.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/implementations/AbstractLifeCycleManager.java index 0b381bd..e718042 100644 --- a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/implementations/AbstractLifeCycleManager.java +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/implementations/AbstractLifeCycleManager.java @@ -2,6 +2,7 @@ package org.gcube.application.cms.plugins.implementations; import lombok.Setter; import lombok.extern.slf4j.Slf4j; +import org.gcube.application.cms.implementations.ProjectAccess; import org.gcube.application.cms.plugins.LifecycleManager; import org.gcube.application.cms.plugins.PluginManagerInterface; import org.gcube.application.cms.plugins.faults.*; @@ -41,6 +42,10 @@ public abstract class AbstractLifeCycleManager extends AbstractPlugin implements @Setter protected PluginManagerInterface pluginManager; + @Setter + protected ProjectAccess projectAccess; + + private Map registeredSteps=new HashMap<>(); private Map registeredEvent=new HashMap<>(); diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/implementations/Default3PhaseManager.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/implementations/Default3PhaseManager.java index 4ff1efe..6eb0835 100644 --- a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/implementations/Default3PhaseManager.java +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/implementations/Default3PhaseManager.java @@ -10,9 +10,11 @@ import org.gcube.application.cms.plugins.faults.EventException; import org.gcube.application.cms.plugins.faults.InvalidPluginRequestException; import org.gcube.application.cms.plugins.faults.MaterializationException; import org.gcube.application.cms.plugins.implementations.executions.GuardedStepExecution; +import org.gcube.application.cms.plugins.reports.DocumentHandlingReport; import org.gcube.application.cms.plugins.reports.EventExecutionReport; import org.gcube.application.cms.plugins.reports.StepExecutionReport; import org.gcube.application.cms.plugins.requests.BaseRequest; +import org.gcube.application.cms.plugins.requests.StepExecutionRequest; import org.gcube.application.geoportal.common.model.configuration.Configuration; import org.gcube.application.geoportal.common.model.configuration.Index; import org.gcube.application.geoportal.common.model.document.lifecycle.LifecycleInformation; @@ -77,42 +79,19 @@ public class Default3PhaseManager extends SimpleLifeCycleManager implements Life setStep(new GuardedStepExecution(STEPS.SUBMIT) { @Override protected StepExecutionReport run() throws Exception { - // Materialize - - for(MaterializationPlugin mat : getMaterializers(theReport.getTheRequest())) - theReport = materializeDocument(theReport,mat,getMaterializationParameters(theReport.getTheRequest())); - if(theReport.getToSetLifecycleInformation().getLastOperationStatus().equals(LifecycleInformation.Status.OK)){ - // Index - for(IndexerPluginInterface indexer : getIndexers(theReport.getTheRequest())) - theReport = index(theReport,indexer,getInternalIndexParams(theReport.getTheRequest())); - // setPhase - if(theReport.getToSetLifecycleInformation().getLastOperationStatus().equals(LifecycleInformation.Status.OK)) - theReport.getToSetLifecycleInformation().setPhase(Phases.PENDING_APPROVAL); - } - return theReport; + return executeSubmit(theReport); } }); - - setStep(new GuardedStepExecution(STEPS.APPROVE) { @Override protected StepExecutionReport run() throws Exception { - // Index - for(IndexerPluginInterface indexer : getIndexers(theReport.getTheRequest())) - theReport = index(theReport,indexer,getPublicIndexParams(theReport.getTheRequest())); - // setPhase - if(theReport.getToSetLifecycleInformation().getLastOperationStatus().equals(LifecycleInformation.Status.OK)) - theReport.getToSetLifecycleInformation().setPhase(Phases.PUBLISHED); - return theReport; + return executeApprove(theReport); } }); - setStep(new GuardedStepExecution(STEPS.REJECT) { @Override protected StepExecutionReport run() throws Exception { - if(theReport.getToSetLifecycleInformation().getLastOperationStatus().equals(LifecycleInformation.Status.OK)) - theReport.getToSetLifecycleInformation().setPhase(LifecycleInformation.CommonPhases.DRAFT_PHASE); - return theReport; + return executeReject(theReport); } }); } @@ -125,104 +104,6 @@ public class Default3PhaseManager extends SimpleLifeCycleManager implements Life } - - -// @Override -// public StepExecutionReport performStep(StepExecutionRequest request) throws StepException, InvalidPluginRequestException, InvalidProfileException, ConfigurationException, InsufficientPrivileges { -// StepExecutionReport report = super.performStep(request); -// LifecycleInformation info=report.getToSetLifecycleInformation(); -// try { -// if(!canInvokeStep(request.getStep(),request.getCaller(),getConfigurationFromProfile(request.getUseCaseDescriptor()))) -// throw new InsufficientPrivileges("Insufficient privileges for executing step "+request.getStep()); -// -// MaterializationPlugin plugin; -// IndexerPluginInterface indexerPlugin; -// plugin= (MaterializationPlugin) pluginManager.getById("SDI-Default-Materializer"); -// indexerPlugin = (IndexerPluginInterface) pluginManager.getById("SDI-Indexer-Plugin"); -// -// -// -// switch (request.getStep()) { -// case STEPS.SUBMIT:{ -// //TODO validation -// -// if(!request.getDocument().getLifecycleInformation().getPhase().equals(LifecycleInformation.CommonPhases.DRAFT_PHASE)) -// throw new StepException("Document is not in "+LifecycleInformation.CommonPhases.DRAFT_PHASE+" phase"); -// //Materialize layers -// MaterializationRequest matReq = new MaterializationRequest(request.getUseCaseDescriptor(),request.getCaller(), request.getContext(), request.getDocument()); -// -// matReq.setDocument(request.getDocument()); -// matReq.setUseCaseDescriptor(request.getUseCaseDescriptor()); -// Document params = new Document(); -// String workspace = request.getUseCaseDescriptor().getId() + request.getContext().getId(); -// params.put("workspace", Files.fixFilename(workspace)); -// -// -// matReq.setCallParameters(params); -// MaterializationReport matRep = plugin.materialize(matReq); -// -// -// report.setResultingDocument(matRep.getResultingDocument()); -// -// -// switch(matRep.getStatus()){ -// case OK : { -// index(report,indexerPlugin); -// //TODO Optional Notifications -// break; -// } -// case ERROR : { -// info.setLastOperationStatus(LifecycleInformation.Status.ERROR); -// matRep.getMessages().forEach(s -> info.addErrorMessage(s)); -// break; -// } -// case WARNING : { -// info.setLastOperationStatus(LifecycleInformation.Status.WARNING); -// matRep.getMessages().forEach(s -> info.addWarningMessage(s)); -// break; -// } -// } -// -// } -// break; -// case STEPS.REJECT:{ -// if(!request.getDocument().getLifecycleInformation().getPhase().equals(Phases.PENDING_APPROVAL)) -// throw new StepException("Document is not in "+Phases.PENDING_APPROVAL+" phase"); -// // TODO OPTIONAL Notification -// -// info.setPhase(Phases.PENDING_APPROVAL); -// if(request.getCallParameters()!=null&&request.getCallParameters().containsKey(PARAMETERS.NOTES)) -// info.setNotes(request.getCallParameters().getString(PARAMETERS.NOTES)); -// break; -// } -// -// case STEPS.APPROVE:{ -// // Index-published -// if(!request.getDocument().getLifecycleInformation().getPhase() -// .equals(Phases.PENDING_APPROVAL)) -// throw new StepException("Document is not in "+Phases.PENDING_APPROVAL+" phase"); -// -// index(report,indexerPlugin); -// break; -// } -// -// default: -// throw new StepException("Invalid Step " + request.getStep()); -// } -// }catch (StepException e){ -// throw e; -// }catch (Throwable t){ -// log.error("Unable to perform step "+request.getStep(),t); -// String msg = "Unable to execute Step "+request.getStep()+". Error was "+t.getMessage(); -// report.setStatus(Report.Status.ERROR); -// report.putMessage(msg); -// info.setLastOperationStatus(LifecycleInformation.Status.ERROR); -// info.addErrorMessage(msg); -// } -// return report; -// } - - @Override public Configuration getCurrentConfiguration(BaseRequest req) throws ConfigurationException { Configuration toReturn = super.getCurrentConfiguration(req); @@ -244,11 +125,45 @@ public class Default3PhaseManager extends SimpleLifeCycleManager implements Life return toReturn; } - private Document getInternalIndexParams(BaseRequest req){ + protected Document getInternalIndexParams(BaseRequest req){ Document callParameters = new Document(); callParameters.put("workspace", Files.fixFilename(req.getUseCaseDescriptor().getId()+"_internal_"+req.getContext().getName())); callParameters.put("indexName",Files.fixFilename(req.getUseCaseDescriptor().getId()+"_internal_"+req.getContext().getName()+"_centroids")); return callParameters; } + + protected StepExecutionReport executeSubmit(StepExecutionReport theReport) throws Exception { + // Materialize + + for(MaterializationPlugin mat : getMaterializers(theReport.getTheRequest())) + theReport = materializeDocument(theReport,mat,getMaterializationParameters(theReport.getTheRequest())); + if(theReport.getToSetLifecycleInformation().getLastOperationStatus().equals(LifecycleInformation.Status.OK)){ + // Index + for(IndexerPluginInterface indexer : getIndexers(theReport.getTheRequest())) + theReport = index(theReport,indexer,getInternalIndexParams(theReport.getTheRequest())); + // setPhase + if(theReport.getToSetLifecycleInformation().getLastOperationStatus().equals(LifecycleInformation.Status.OK)) + theReport.getToSetLifecycleInformation().setPhase(Phases.PENDING_APPROVAL); + } + return theReport; + } + + protected StepExecutionReport executeApprove(StepExecutionReport theReport) throws Exception { + // Index + for(IndexerPluginInterface indexer : getIndexers(theReport.getTheRequest())) + theReport = index(theReport,indexer,getPublicIndexParams(theReport.getTheRequest())); + // setPhase + if(theReport.getToSetLifecycleInformation().getLastOperationStatus().equals(LifecycleInformation.Status.OK)) + theReport.getToSetLifecycleInformation().setPhase(Phases.PUBLISHED); + return theReport; + } + + protected StepExecutionReport executeReject(StepExecutionReport theReport) throws Exception { + if(theReport.getToSetLifecycleInformation().getLastOperationStatus().equals(LifecycleInformation.Status.OK)) + theReport.getToSetLifecycleInformation().setPhase(LifecycleInformation.CommonPhases.DRAFT_PHASE); + return theReport; + } + + } diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/GeoPortalService.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/GeoPortalService.java index e40969d..5c78d48 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/GeoPortalService.java +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/GeoPortalService.java @@ -4,14 +4,12 @@ import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider; import lombok.extern.slf4j.Slf4j; import org.gcube.application.cms.caches.Engine; import org.gcube.application.cms.implementations.ImplementationProvider; +import org.gcube.application.cms.implementations.ProjectAccess; import org.gcube.application.cms.serialization.Serialization; import org.gcube.application.geoportal.common.rest.InterfaceConstants; import org.gcube.application.geoportal.common.utils.StorageUtils; import org.gcube.application.geoportal.service.engine.mongo.UCDManagerI; -import org.gcube.application.geoportal.service.engine.providers.ConfigurationCache; -import org.gcube.application.geoportal.service.engine.providers.MongoClientProvider; -import org.gcube.application.geoportal.service.engine.providers.PluginManager; -import org.gcube.application.geoportal.service.engine.providers.StorageClientProvider; +import org.gcube.application.geoportal.service.engine.providers.*; import org.gcube.application.geoportal.service.engine.providers.ucd.ProfileMap; import org.gcube.application.geoportal.service.engine.providers.ucd.SingleISResourceUCDProvider; import org.gcube.application.geoportal.service.engine.providers.ucd.UCDManager; @@ -54,6 +52,7 @@ public class GeoPortalService extends ResourceConfig{ log.info("Setting implementations .. "); ImplementationProvider.get().setEngine(new MongoClientProvider(), Mongo.class); + ImplementationProvider.get().setEngine(new ProjectAccessProvider(), ProjectAccess.class); ImplementationProvider.get().setEngine(new StorageClientProvider(), StorageUtils.class); ImplementationProvider.get().setEngine(new SingleISResourceUCDProvider(), ProfileMap.class); ImplementationProvider.get().setEngine(new PluginManager(), PluginManager.PluginMap.class); diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/MongoManagerI.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/MongoManagerI.java index 0b8394e..0420b09 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/MongoManagerI.java +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/MongoManagerI.java @@ -2,6 +2,7 @@ package org.gcube.application.geoportal.service.engine.mongo; import com.fasterxml.jackson.core.JsonProcessingException; import org.bson.Document; +import org.gcube.application.cms.implementations.faults.*; import org.gcube.application.cms.plugins.faults.EventException; import org.gcube.application.cms.plugins.faults.InsufficientPrivileges; import org.gcube.application.cms.plugins.faults.StepException; diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java index 6f6cfce..5419e3a 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java @@ -13,6 +13,7 @@ import org.bson.Document; import org.bson.types.ObjectId; import org.gcube.application.cms.implementations.ImplementationProvider; import org.gcube.application.cms.implementations.WorkspaceManager; +import org.gcube.application.cms.implementations.faults.*; import org.gcube.application.cms.plugins.LifecycleManager; import org.gcube.application.cms.plugins.faults.EventException; import org.gcube.application.cms.plugins.faults.InsufficientPrivileges; diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/UCDManagerI.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/UCDManagerI.java index 6281c4f..949dad9 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/UCDManagerI.java +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/UCDManagerI.java @@ -3,7 +3,7 @@ package org.gcube.application.geoportal.service.engine.mongo; import org.gcube.application.geoportal.common.model.rest.ConfigurationException; import org.gcube.application.geoportal.common.model.rest.QueryRequest; import org.gcube.application.geoportal.common.model.useCaseDescriptor.UseCaseDescriptor; -import org.gcube.application.geoportal.service.model.internal.faults.RegistrationException; +import org.gcube.application.cms.implementations.faults.RegistrationException; public interface UCDManagerI { diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/UCDMongoManager.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/UCDMongoManager.java index 0920a3d..c6c48e5 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/UCDMongoManager.java +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/UCDMongoManager.java @@ -12,7 +12,7 @@ import org.gcube.application.geoportal.common.model.rest.ConfigurationException; import org.gcube.application.geoportal.common.model.rest.QueryRequest; import org.gcube.application.geoportal.common.model.useCaseDescriptor.UseCaseDescriptor; import org.gcube.application.geoportal.common.utils.ContextUtils; -import org.gcube.application.geoportal.service.model.internal.faults.RegistrationException; +import org.gcube.application.cms.implementations.faults.RegistrationException; import javax.ws.rs.WebApplicationException; import java.util.NoSuchElementException; diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/providers/ProjectAccessImpl.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/providers/ProjectAccessImpl.java new file mode 100644 index 0000000..91fc567 --- /dev/null +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/providers/ProjectAccessImpl.java @@ -0,0 +1,70 @@ +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) throws InvalidUserRoleException, RegistrationException, ProjectNotFoundException, ConfigurationException, UnauthorizedAccess { + return getRelationshipChain(ucid,id,relation,true); + } + + + 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; + } +} diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/providers/ProjectAccessProvider.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/providers/ProjectAccessProvider.java new file mode 100644 index 0000000..39922ab --- /dev/null +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/providers/ProjectAccessProvider.java @@ -0,0 +1,26 @@ +package org.gcube.application.geoportal.service.engine.providers; + +import org.gcube.application.cms.caches.Engine; +import org.gcube.application.cms.implementations.ProjectAccess; +import org.gcube.application.geoportal.common.model.rest.ConfigurationException; + +public class ProjectAccessProvider implements Engine { + + + @Override + public void init() { + + } + + @Override + public void shutdown() { + + } + + @Override + public ProjectAccess getObject() throws ConfigurationException { + return new ProjectAccessImpl(); + } + + +} diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/providers/ucd/UCDManager.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/providers/ucd/UCDManager.java index 46b7246..fab43dd 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/providers/ucd/UCDManager.java +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/providers/ucd/UCDManager.java @@ -13,7 +13,7 @@ import org.gcube.application.geoportal.common.model.useCaseDescriptor.UseCaseDes import org.gcube.application.geoportal.common.utils.ContextUtils; import org.gcube.application.geoportal.service.engine.mongo.UCDManagerI; import org.gcube.application.geoportal.service.engine.mongo.UCDMongoManager; -import org.gcube.application.geoportal.service.model.internal.faults.RegistrationException; +import org.gcube.application.cms.implementations.faults.RegistrationException; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Response; diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/model/internal/db/PostgisTable.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/model/internal/db/PostgisTable.java index b075ce7..21180f3 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/model/internal/db/PostgisTable.java +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/model/internal/db/PostgisTable.java @@ -3,7 +3,7 @@ package org.gcube.application.geoportal.service.model.internal.db; import lombok.*; import lombok.extern.slf4j.Slf4j; import org.gcube.application.geoportal.common.model.legacy.BBOX; -import org.gcube.application.geoportal.service.model.internal.faults.DataParsingException; +import org.gcube.application.cms.implementations.faults.DataParsingException; import java.sql.PreparedStatement; import java.sql.SQLException; diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/rest/GuardedMethod.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/rest/GuardedMethod.java index 1ae830c..37f89cf 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/rest/GuardedMethod.java +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/rest/GuardedMethod.java @@ -4,10 +4,10 @@ import lombok.extern.slf4j.Slf4j; import org.gcube.application.cms.plugins.faults.InsufficientPrivileges; import org.gcube.application.cms.plugins.faults.UnrecognizedStepException; import org.gcube.application.geoportal.common.model.rest.ConfigurationException; -import org.gcube.application.geoportal.service.model.internal.faults.InvalidLockException; -import org.gcube.application.geoportal.service.model.internal.faults.InvalidUserRoleException; -import org.gcube.application.geoportal.service.model.internal.faults.ProjectLockedException; -import org.gcube.application.geoportal.service.model.internal.faults.ProjectNotFoundException; +import org.gcube.application.cms.implementations.faults.InvalidLockException; +import org.gcube.application.cms.implementations.faults.InvalidUserRoleException; +import org.gcube.application.cms.implementations.faults.ProjectLockedException; +import org.gcube.application.cms.implementations.faults.ProjectNotFoundException; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Response.Status; diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/rest/ProfiledDocuments.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/rest/ProfiledDocuments.java index 5a32787..fa3dfc3 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/rest/ProfiledDocuments.java +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/rest/ProfiledDocuments.java @@ -18,6 +18,7 @@ import org.gcube.application.geoportal.common.model.rest.StepExecutionRequest; import org.gcube.application.geoportal.common.rest.InterfaceConstants; import org.gcube.application.geoportal.service.engine.mongo.ProfiledMongoManager; import org.gcube.application.geoportal.service.engine.providers.ConfigurationCache; +import org.gcube.application.geoportal.service.engine.providers.ProjectAccessImpl; import javax.ws.rs.*; import javax.ws.rs.core.MediaType; @@ -262,14 +263,10 @@ public class ProfiledDocuments { return new GuardedMethod(){ @Override protected String run() throws Exception, WebApplicationException { - // recursive - 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 Serialization.write(toReturn); + return Serialization.write(ProjectAccessImpl.getRelationshipChain( + manager.getUseCaseDescriptor().getId(), + id, relationshipId,deep + )); } }.execute().getResult(); } @@ -319,23 +316,5 @@ public class ProfiledDocuments { - private static List getLinked(Project current, String relationName, Boolean recurse)throws Exception{ - 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; - } + } diff --git a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/engine/mongo/LockTests.java b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/engine/mongo/LockTests.java index 73312b5..aa83182 100644 --- a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/engine/mongo/LockTests.java +++ b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/engine/mongo/LockTests.java @@ -1,6 +1,7 @@ package org.gcube.application.geoportal.service.engine.mongo; import org.bson.Document; +import org.gcube.application.cms.implementations.faults.*; import org.gcube.application.cms.plugins.faults.EventException; import org.gcube.application.cms.plugins.faults.InsufficientPrivileges; import org.gcube.application.cms.plugins.faults.StepException;