gcube-cms-suite/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/implementations/Default3PhaseManager.java

242 lines
12 KiB
Java

package org.gcube.application.cms.plugins.implementations;
import lombok.extern.slf4j.Slf4j;
import org.bson.Document;
import org.gcube.application.cms.plugins.IndexerPluginInterface;
import org.gcube.application.cms.plugins.MaterializationPlugin;
import org.gcube.application.cms.plugins.LifecycleManager;
import org.gcube.application.cms.plugins.faults.*;
import org.gcube.application.cms.plugins.model.PluginDescriptor;
import org.gcube.application.cms.plugins.reports.*;
import org.gcube.application.cms.plugins.requests.*;
import org.gcube.application.cms.plugins.model.ComparableVersion;
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;
import org.gcube.application.geoportal.common.model.document.lifecycle.TriggeredEvents;
import org.gcube.application.geoportal.common.model.rest.ConfigurationException;
import org.gcube.application.geoportal.common.utils.Files;
import java.util.ArrayList;
@Slf4j
public class Default3PhaseManager extends SimpleLifeCycleManager implements LifecycleManager {
private static class Phases {
public static final String PENDING_APPROVAL="Pending Approval";
public static final String PUBLISHED="Published";
}
private static class STEPS{
public static final String SUBMIT="SUBMIT-FOR-REVIEW";
public static final String REJECT="REJECT-DRAFT";
public static final String APPROVE="APPROVE-SUBMITTED";
}
private static class PARAMETERS{
public static final String NOTES="notes";
}
@Override
protected EventExecutionReport onDeleteDocument(EventExecutionReport report) throws ConfigurationException, InvalidPluginRequestException, MaterializationException, EventException {
report = super.onDeleteDocument(report);
return deIndex(report,getIndexer(),getInternalIndexParams(report.getTheRequest()));
}
@Override
protected EventExecutionReport onDeleteFileSet(EventExecutionReport theReport) throws ConfigurationException, InvalidPluginRequestException, MaterializationException, EventException {
theReport = super.onDeleteFileSet(theReport);
String phase = theReport.getTheRequest().getDocument().getLifecycleInformation().getPhase();
if(phase.equals(Phases.PENDING_APPROVAL))
return index(theReport,getIndexer(),getInternalIndexParams(theReport.getTheRequest()));
if(phase.equals(Phases.PUBLISHED))
return index(theReport,getIndexer(),getPublicIndexParams(theReport.getTheRequest()));
return theReport;
}
@Override
protected void registerSteps() {
// register steps
setStep(STEPS.SUBMIT, new GuardedStepExecution() {
@Override
protected StepExecutionReport run() throws Exception {
if(!theReport.getTheRequest().getDocument().getLifecycleInformation().getPhase().equals(LifecycleInformation.CommonPhases.DRAFT_PHASE))
throw new StepException("Document is not in "+LifecycleInformation.CommonPhases.DRAFT_PHASE+" phase");
// Materialize
theReport = materializeDocument(theReport,getMaterializer(),getMaterializationParameters(theReport.getTheRequest()));
if(theReport.getToSetLifecycleInformation().getLastOperationStatus().equals(LifecycleInformation.Status.OK)){
// Index
theReport = index(theReport,getIndexer(),
getInternalIndexParams(theReport.getTheRequest()));
// setPhase
if(theReport.getToSetLifecycleInformation().getLastOperationStatus().equals(LifecycleInformation.Status.OK))
theReport.getToSetLifecycleInformation().setPhase(Phases.PENDING_APPROVAL);
}
return theReport;
}
});
setStep(STEPS.APPROVE, new GuardedStepExecution() {
@Override
protected StepExecutionReport run() throws Exception {
if(!theReport.getTheRequest().getDocument().getLifecycleInformation().getPhase().equals(Phases.PENDING_APPROVAL))
throw new StepException("Document is not in "+Phases.PENDING_APPROVAL+" phase");
// Index
theReport = index(theReport,getIndexer(),
getPublicIndexParams(theReport.getTheRequest()));
// setPhase
if(theReport.getToSetLifecycleInformation().getLastOperationStatus().equals(LifecycleInformation.Status.OK))
theReport.getToSetLifecycleInformation().setPhase(Phases.PUBLISHED);
return theReport;
}
});
setStep(STEPS.REJECT, new GuardedStepExecution() {
@Override
protected StepExecutionReport run() throws Exception {
if(!theReport.getTheRequest().getDocument().getLifecycleInformation().getPhase().equals(Phases.PENDING_APPROVAL))
throw new StepException("Document is not in "+Phases.PENDING_APPROVAL+" phase");
if(theReport.getToSetLifecycleInformation().getLastOperationStatus().equals(LifecycleInformation.Status.OK))
theReport.getToSetLifecycleInformation().setPhase(LifecycleInformation.CommonPhases.DRAFT_PHASE);
return theReport;
}
});
}
public Default3PhaseManager() {
DESCRIPTOR.setDescription("Default 3-phase lifecycle manager. This plugin supports a simple moderated publication lifecycle.");
DESCRIPTOR.setVersion(new ComparableVersion("1.0.0"));
}
// @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);
IndexerPluginInterface indexerPlugin;
indexerPlugin = (IndexerPluginInterface) pluginManager.getById("SDI-Indexer-Plugin");
BaseRequest indexRequest = new BaseRequest(req.getUseCaseDescriptor(),req.getCaller(),req.getContext());
// Info on internal_index
try {
indexRequest.setCallParameters(getInternalIndexParams(req));
Index internalIndex = indexerPlugin.getIndex(indexRequest);
internalIndex.put("flag", "internal");
toReturn.getIndexes().add(internalIndex);
}catch(ConfigurationException e){
toReturn.addErrorMessage("Unable to gather information on internal GIS Centroids Index : "+e.getMessage());
log.error("Unable to gather information on internal GIS Centroids Index",e);
}
return toReturn;
}
private 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;
}
}