Report model

This commit is contained in:
Fabio Sinibaldi 2022-03-04 11:30:11 +01:00
parent 5387f6ce04
commit bb1bda69f8
19 changed files with 131 additions and 31 deletions

View File

@ -44,6 +44,15 @@
<artifactId>jackson-datatype-jsr310</artifactId> <artifactId>jackson-datatype-jsr310</artifactId>
</dependency> </dependency>
<!-- https://mvnrepository.com/artifact/de.grundid.opendatalab/geojson-jackson -->
<dependency>
<groupId>de.grundid.opendatalab</groupId>
<artifactId>geojson-jackson</artifactId>
<version>1.14</version>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -1,9 +1,11 @@
package org.gcube.application.cms.plugins; package org.gcube.application.cms.plugins;
import org.gcube.application.cms.plugins.faults.InvalidProfileException; import org.gcube.application.cms.plugins.faults.InvalidProfileException;
import org.gcube.application.cms.plugins.faults.PluginExecutionException;
import org.gcube.application.cms.plugins.model.PluginDescriptor; import org.gcube.application.cms.plugins.model.PluginDescriptor;
import org.gcube.application.cms.plugins.reports.DocumentHandlingReport; import org.gcube.application.cms.plugins.reports.DocumentHandlingReport;
import org.gcube.application.cms.plugins.requests.BaseExecutionRequest; import org.gcube.application.cms.plugins.requests.BaseExecutionRequest;
import org.gcube.application.geoportal.common.faults.InvalidRequestException;
import org.gcube.application.geoportal.common.model.profile.HandlerDeclaration; import org.gcube.application.geoportal.common.model.profile.HandlerDeclaration;
import org.gcube.application.geoportal.common.model.profile.Profile; import org.gcube.application.geoportal.common.model.profile.Profile;
@ -19,10 +21,12 @@ public abstract class AbstractPlugin implements Plugin{
protected HandlerDeclaration getConfigurationFromProfile(Profile profile) throws InvalidProfileException{ protected HandlerDeclaration getConfigurationFromProfile(Profile profile) throws InvalidProfileException{
return getMultipleDeclarationsFromProfile(profile).get(0); return getMultipleDeclarationsFromProfile(profile).get(0);
} }
protected List<HandlerDeclaration> getMultipleDeclarationsFromProfile(Profile p)throws InvalidProfileException { protected List<HandlerDeclaration> getMultipleDeclarationsFromProfile(Profile p)throws InvalidProfileException {
Map<String,List<HandlerDeclaration>> map = p.getHandlersMapByID(); Map<String,List<HandlerDeclaration>> map = p.getHandlersMapByID();
if(map.containsKey(getDescriptor().getId())) if(map.containsKey(getDescriptor().getId()))
return map.get(getDescriptor().getId()); return map.get(getDescriptor().getId());
else throw new InvalidProfileException("No Configuration found for "+getDescriptor().getId()+" in "+p.getId()); else throw new InvalidProfileException("No Configuration found for "+getDescriptor().getId()+" in "+p.getId());
} }
} }

View File

@ -1,10 +1,11 @@
package org.gcube.application.cms.plugins; package org.gcube.application.cms.plugins;
import org.gcube.application.cms.plugins.faults.InvalidPluginRequestException;
import org.gcube.application.cms.plugins.reports.IndexDocumentReport; import org.gcube.application.cms.plugins.reports.IndexDocumentReport;
import org.gcube.application.cms.plugins.requests.IndexDocumentRequest; import org.gcube.application.cms.plugins.requests.IndexDocumentRequest;
public interface IndexerPluginInterface extends InitializablePlugin{ public interface IndexerPluginInterface extends InitializablePlugin{
public IndexDocumentReport index(IndexDocumentRequest request); public IndexDocumentReport index(IndexDocumentRequest request) throws InvalidPluginRequestException;
} }

View File

@ -1,6 +1,7 @@
package org.gcube.application.cms.plugins; package org.gcube.application.cms.plugins;
import org.gcube.application.cms.plugins.faults.EventException; import org.gcube.application.cms.plugins.faults.EventException;
import org.gcube.application.cms.plugins.faults.InvalidPluginRequestException;
import org.gcube.application.cms.plugins.faults.StepException; import org.gcube.application.cms.plugins.faults.StepException;
import org.gcube.application.cms.plugins.reports.EventExecutionReport; import org.gcube.application.cms.plugins.reports.EventExecutionReport;
import org.gcube.application.cms.plugins.reports.StepExecutionReport; import org.gcube.application.cms.plugins.reports.StepExecutionReport;
@ -14,11 +15,11 @@ public interface LifecycleManager extends InitializablePlugin{
// Lifecycle operations // Lifecycle operations
public StepExecutionReport performStep(StepExecutionRequest request)throws StepException; public StepExecutionReport performStep(StepExecutionRequest request) throws StepException, InvalidPluginRequestException;
public Configuration getCurrentConfiguration() throws ConfigurationException; public Configuration getCurrentConfiguration() throws ConfigurationException;
public EventExecutionReport onEvent(EventExecutionRequest request) throws EventException; public EventExecutionReport onEvent(EventExecutionRequest request) throws EventException, InvalidPluginRequestException;
public void setPluginManager(PluginManagerInterface manager); public void setPluginManager(PluginManagerInterface manager);
} }

View File

@ -1,11 +1,12 @@
package org.gcube.application.cms.plugins; package org.gcube.application.cms.plugins;
import org.gcube.application.cms.plugins.faults.InvalidPluginRequestException;
import org.gcube.application.cms.plugins.faults.MaterializationException; import org.gcube.application.cms.plugins.faults.MaterializationException;
import org.gcube.application.cms.plugins.reports.MaterializationReport; import org.gcube.application.cms.plugins.reports.MaterializationReport;
import org.gcube.application.cms.plugins.requests.MaterializationRequest; import org.gcube.application.cms.plugins.requests.MaterializationRequest;
public interface MaterializationPlugin extends InitializablePlugin{ public interface MaterializationPlugin extends InitializablePlugin{
public MaterializationReport materialize(MaterializationRequest request) throws MaterializationException; public MaterializationReport materialize(MaterializationRequest request) throws MaterializationException, InvalidPluginRequestException;
} }

View File

@ -0,0 +1,22 @@
package org.gcube.application.cms.plugins.faults;
public class IndexingException extends PluginExecutionException{
public IndexingException() {
}
public IndexingException(String message) {
super(message);
}
public IndexingException(String message, Throwable cause) {
super(message, cause);
}
public IndexingException(Throwable cause) {
super(cause);
}
public IndexingException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}

View File

@ -0,0 +1,22 @@
package org.gcube.application.cms.plugins.faults;
public class InvalidPluginRequestException extends PluginExecutionException {
public InvalidPluginRequestException() {
}
public InvalidPluginRequestException(String message) {
super(message);
}
public InvalidPluginRequestException(String message, Throwable cause) {
super(message, cause);
}
public InvalidPluginRequestException(Throwable cause) {
super(cause);
}
public InvalidPluginRequestException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}

View File

@ -6,6 +6,7 @@ import lombok.NonNull;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.bson.Document; import org.bson.Document;
import org.gcube.application.cms.plugins.faults.InvalidPluginRequestException;
import org.gcube.application.cms.plugins.faults.PluginExecutionException; import org.gcube.application.cms.plugins.faults.PluginExecutionException;
import org.gcube.application.cms.plugins.requests.BaseExecutionRequest; import org.gcube.application.cms.plugins.requests.BaseExecutionRequest;
import org.gcube.application.cms.serialization.Serialization; import org.gcube.application.cms.serialization.Serialization;
@ -24,7 +25,8 @@ public class DocumentHandlingReport<T extends BaseExecutionRequest> extends Repo
LifecycleInformation toSetLifecycleInformation; LifecycleInformation toSetLifecycleInformation;
public DocumentHandlingReport(@NonNull T theRequest) { public DocumentHandlingReport(@NonNull T theRequest) throws InvalidPluginRequestException {
theRequest.validate();
this.theRequest = theRequest; this.theRequest = theRequest;
toSetLifecycleInformation=theRequest.getDocument().getLifecycleInformation(); toSetLifecycleInformation=theRequest.getDocument().getLifecycleInformation();
resultingDocument = theRequest.getDocument().getTheDocument(); resultingDocument = theRequest.getDocument().getTheDocument();

View File

@ -2,14 +2,16 @@ package org.gcube.application.cms.plugins.reports;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import lombok.Data; import lombok.Data;
import lombok.ToString;
import org.gcube.application.cms.plugins.faults.InvalidPluginRequestException;
import org.gcube.application.cms.plugins.requests.EventExecutionRequest; import org.gcube.application.cms.plugins.requests.EventExecutionRequest;
import org.gcube.application.geoportal.common.model.document.ProfiledDocument; import org.gcube.application.geoportal.common.model.document.ProfiledDocument;
import org.gcube.application.geoportal.common.model.document.lifecycle.LifecycleInformation; import org.gcube.application.geoportal.common.model.document.lifecycle.LifecycleInformation;
@Data @ToString(callSuper = true)
public class EventExecutionReport extends DocumentHandlingReport<EventExecutionRequest>{ public class EventExecutionReport extends DocumentHandlingReport<EventExecutionRequest>{
public EventExecutionReport(EventExecutionRequest req){ public EventExecutionReport(EventExecutionRequest req) throws InvalidPluginRequestException {
super(req); super(req);
this.setToSetLifecycleInformation(theRequest.getDocument().getLifecycleInformation().cleanState()); this.setToSetLifecycleInformation(theRequest.getDocument().getLifecycleInformation().cleanState());
} }

View File

@ -4,6 +4,7 @@ import com.fasterxml.jackson.core.JsonProcessingException;
import lombok.Getter; import lombok.Getter;
import lombok.NonNull; import lombok.NonNull;
import lombok.Setter; import lombok.Setter;
import org.gcube.application.cms.plugins.faults.InvalidPluginRequestException;
import org.gcube.application.cms.plugins.faults.PluginExecutionException; import org.gcube.application.cms.plugins.faults.PluginExecutionException;
import org.gcube.application.cms.plugins.requests.IndexDocumentRequest; import org.gcube.application.cms.plugins.requests.IndexDocumentRequest;
import org.gcube.application.geoportal.common.model.document.ProfiledDocument; import org.gcube.application.geoportal.common.model.document.ProfiledDocument;
@ -18,7 +19,7 @@ public class IndexDocumentReport extends DocumentHandlingReport<IndexDocumentReq
public SpatialReference toSetSpatialReference; public SpatialReference toSetSpatialReference;
public IndexDocumentReport(@NonNull IndexDocumentRequest theRequest) { public IndexDocumentReport(@NonNull IndexDocumentRequest theRequest) throws InvalidPluginRequestException {
super(theRequest); super(theRequest);
} }

View File

@ -1,6 +1,11 @@
package org.gcube.application.cms.plugins.reports; package org.gcube.application.cms.plugins.reports;
import lombok.NoArgsConstructor;
@NoArgsConstructor
public class InitializationReport extends Report{ public class InitializationReport extends Report{
public InitializationReport(Status status, String... messages) {
super(status, messages);
}
} }

View File

@ -2,13 +2,14 @@ package org.gcube.application.cms.plugins.reports;
import lombok.Data; import lombok.Data;
import lombok.NonNull; import lombok.NonNull;
import org.gcube.application.cms.plugins.faults.InvalidPluginRequestException;
import org.gcube.application.cms.plugins.requests.MaterializationRequest; import org.gcube.application.cms.plugins.requests.MaterializationRequest;
import org.gcube.application.geoportal.common.model.document.ProfiledDocument; import org.gcube.application.geoportal.common.model.document.ProfiledDocument;
public class MaterializationReport extends DocumentHandlingReport<MaterializationRequest>{ public class MaterializationReport extends DocumentHandlingReport<MaterializationRequest>{
public MaterializationReport(@NonNull MaterializationRequest theRequest) { public MaterializationReport(@NonNull MaterializationRequest theRequest) throws InvalidPluginRequestException {
super(theRequest); super(theRequest);
} }
} }

View File

@ -1,12 +1,17 @@
package org.gcube.application.cms.plugins.reports; package org.gcube.application.cms.plugins.reports;
import lombok.Data; import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.gcube.application.cms.plugins.faults.PluginExecutionException; import org.gcube.application.cms.plugins.faults.PluginExecutionException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@Data @Getter
@Setter
@NoArgsConstructor
public class Report { public class Report {
public static enum Status { public static enum Status {
@ -16,6 +21,13 @@ public class Report {
private Status status; private Status status;
private List<String> messages; private List<String> messages;
public Report(Status status,String ... messages) {
this.status = status;
this.messages=new ArrayList<>();
for (String s : messages)
this.messages.add(s);
}
public Report putMessage(String msg){ public Report putMessage(String msg){
if(messages==null)messages=new ArrayList<>(); if(messages==null)messages=new ArrayList<>();
messages.add(msg); messages.add(msg);

View File

@ -1,6 +1,7 @@
package org.gcube.application.cms.plugins.reports; package org.gcube.application.cms.plugins.reports;
import lombok.*; import lombok.*;
import org.gcube.application.cms.plugins.faults.InvalidPluginRequestException;
import org.gcube.application.cms.plugins.requests.EventExecutionRequest; import org.gcube.application.cms.plugins.requests.EventExecutionRequest;
import org.gcube.application.cms.plugins.requests.StepExecutionRequest; import org.gcube.application.cms.plugins.requests.StepExecutionRequest;
import org.gcube.application.geoportal.common.model.document.ProfiledDocument; import org.gcube.application.geoportal.common.model.document.ProfiledDocument;
@ -13,7 +14,7 @@ import java.util.List;
@ToString @ToString
public class StepExecutionReport extends DocumentHandlingReport<StepExecutionRequest>{ public class StepExecutionReport extends DocumentHandlingReport<StepExecutionRequest>{
public StepExecutionReport(@NonNull StepExecutionRequest theRequest) { public StepExecutionReport(@NonNull StepExecutionRequest theRequest) throws InvalidPluginRequestException {
super(theRequest); super(theRequest);
this.getToSetLifecycleInformation().cleanState(); this.getToSetLifecycleInformation().cleanState();

View File

@ -2,6 +2,7 @@ package org.gcube.application.cms.plugins.requests;
import lombok.Data; import lombok.Data;
import org.bson.Document; import org.bson.Document;
import org.gcube.application.cms.plugins.faults.InvalidPluginRequestException;
import org.gcube.application.geoportal.common.faults.InvalidRequestException; import org.gcube.application.geoportal.common.faults.InvalidRequestException;
import org.gcube.application.geoportal.common.model.document.ProfiledDocument; import org.gcube.application.geoportal.common.model.document.ProfiledDocument;
import org.gcube.application.geoportal.common.model.profile.Profile; import org.gcube.application.geoportal.common.model.profile.Profile;
@ -13,12 +14,17 @@ public class BaseExecutionRequest {
ProfiledDocument document; ProfiledDocument document;
Document callParameters; Document callParameters;
public final String getMandatory(String param) throws InvalidRequestException { public final String getMandatory(String param) throws InvalidPluginRequestException {
return getMandatory(param,callParameters); return getMandatory(param,callParameters);
} }
public static final String getMandatory(String param,Document params) throws InvalidRequestException { public static final String getMandatory(String param,Document params) throws InvalidPluginRequestException {
if(!params.containsKey(param)) throw new InvalidRequestException("Missing mandatory parameter "+param); if(!params.containsKey(param)) throw new InvalidPluginRequestException("Missing mandatory parameter "+param);
return params.getString(param); return params.getString(param);
} }
public void validate() throws InvalidPluginRequestException {
if(profile==null)throw new InvalidPluginRequestException("Profile cannot be null ");
if(document==null) throw new InvalidPluginRequestException("Document cannot be null");
}
} }

View File

@ -6,6 +6,7 @@ import org.gcube.application.cms.plugins.InitializablePlugin;
import org.gcube.application.cms.plugins.Plugin; import org.gcube.application.cms.plugins.Plugin;
import org.gcube.application.cms.plugins.PluginsReflections; import org.gcube.application.cms.plugins.PluginsReflections;
import org.gcube.application.cms.plugins.faults.InitializationException; import org.gcube.application.cms.plugins.faults.InitializationException;
import org.gcube.application.cms.plugins.faults.PluginExecutionException;
import org.gcube.application.geoportal.common.utils.tests.GCubeTest; import org.gcube.application.geoportal.common.utils.tests.GCubeTest;
import org.junit.Assert; import org.junit.Assert;
import org.junit.BeforeClass; import org.junit.BeforeClass;
@ -37,13 +38,14 @@ public class BasicPluginTest {
if(p instanceof InitializablePlugin){ if(p instanceof InitializablePlugin){
InitializablePlugin ip=(InitializablePlugin)p; InitializablePlugin ip=(InitializablePlugin)p;
try { try {
ip.init(); ip.init().validate();
if(GCubeTest.isTestInfrastructureEnabled()){ if(GCubeTest.isTestInfrastructureEnabled()){
TokenSetter.set(GCubeTest.getContext()); TokenSetter.set(GCubeTest.getContext());
ip.initInContext(); ip.initInContext().validate();
} }
} catch (InitializationException e) { } catch (Exception e) {
e.printStackTrace(System.err); e.printStackTrace(System.err);
Assert.fail("Unable to Init "+p.getDescriptor().getId()); Assert.fail("Unable to Init "+p.getDescriptor().getId());
} }
@ -54,7 +56,7 @@ public class BasicPluginTest {
System.out.println("Plugin Loading OK"); System.out.println("Plugin Loading OK");
if(GCubeTest.isTestInfrastructureEnabled()){ if(GCubeTest.isTestInfrastructureEnabled()){
ImplementationProvider.get().setEngine(new ISProvider(), ISInterface.class);
} }
} }

View File

@ -19,18 +19,18 @@ public class DummyPlugin implements LifecycleManager, IndexerPluginInterface, Ma
@Override @Override
public IndexDocumentReport index(IndexDocumentRequest request) { public IndexDocumentReport index(IndexDocumentRequest request) throws InvalidPluginRequestException {
return new IndexDocumentReport(request); return new IndexDocumentReport(request);
} }
@Override @Override
public InitializationReport initInContext() throws InitializationException { public InitializationReport initInContext() throws InitializationException {
return new InitializationReport(); return new InitializationReport(Report.Status.WARNING,"DUMB");
} }
@Override @Override
public InitializationReport init() throws InitializationException { public InitializationReport init() throws InitializationException {
return new InitializationReport(); return new InitializationReport(Report.Status.WARNING,"DUMB");
} }
@Override @Override
@ -39,7 +39,8 @@ public class DummyPlugin implements LifecycleManager, IndexerPluginInterface, Ma
} }
@Override @Override
public StepExecutionReport performStep(StepExecutionRequest request) throws StepException { public StepExecutionReport performStep(StepExecutionRequest request) throws StepException, InvalidPluginRequestException {
request.validate();
return new StepExecutionReport(request); return new StepExecutionReport(request);
} }
@ -49,7 +50,7 @@ public class DummyPlugin implements LifecycleManager, IndexerPluginInterface, Ma
} }
@Override @Override
public EventExecutionReport onEvent(EventExecutionRequest request) throws EventException { public EventExecutionReport onEvent(EventExecutionRequest request) throws EventException, InvalidPluginRequestException {
return new EventExecutionReport(request); return new EventExecutionReport(request);
} }
@ -59,7 +60,7 @@ public class DummyPlugin implements LifecycleManager, IndexerPluginInterface, Ma
} }
@Override @Override
public MaterializationReport materialize(MaterializationRequest request) throws MaterializationException { public MaterializationReport materialize(MaterializationRequest request) throws MaterializationException, InvalidPluginRequestException {
return new MaterializationReport(request); return new MaterializationReport(request);
} }

View File

@ -0,0 +1,10 @@
package org.gcube.application.cms.commons.model;
import org.gcube.application.cms.tests.BasicPluginTest;
import org.junit.Test;
public class DummyTest extends BasicPluginTest {
@Test
public void myTest(){}
}

View File

@ -9,7 +9,7 @@ import org.bson.Document;
import org.gcube.application.cms.plugins.IndexerPluginInterface; import org.gcube.application.cms.plugins.IndexerPluginInterface;
import org.gcube.application.cms.plugins.MaterializationPlugin; import org.gcube.application.cms.plugins.MaterializationPlugin;
import org.gcube.application.cms.plugins.PluginManagerInterface; import org.gcube.application.cms.plugins.PluginManagerInterface;
import org.gcube.application.cms.plugins.faults.EventException; import org.gcube.application.cms.plugins.faults.*;
import org.gcube.application.cms.plugins.model.ComparableVersion; import org.gcube.application.cms.plugins.model.ComparableVersion;
import org.gcube.application.cms.plugins.reports.*; import org.gcube.application.cms.plugins.reports.*;
import org.gcube.application.cms.plugins.requests.EventExecutionRequest; import org.gcube.application.cms.plugins.requests.EventExecutionRequest;
@ -18,9 +18,6 @@ import org.gcube.application.cms.plugins.requests.MaterializationRequest;
import org.gcube.application.cms.serialization.Serialization; import org.gcube.application.cms.serialization.Serialization;
import org.gcube.application.cms.custom.gna.concessioni.model.ProfiledConcessione; import org.gcube.application.cms.custom.gna.concessioni.model.ProfiledConcessione;
import org.gcube.application.cms.plugins.LifecycleManager; import org.gcube.application.cms.plugins.LifecycleManager;
import org.gcube.application.cms.plugins.faults.InitializationException;
import org.gcube.application.cms.plugins.faults.ShutDownException;
import org.gcube.application.cms.plugins.faults.StepException;
import org.gcube.application.cms.plugins.model.PluginDescriptor; import org.gcube.application.cms.plugins.model.PluginDescriptor;
import org.gcube.application.cms.plugins.requests.StepExecutionRequest; import org.gcube.application.cms.plugins.requests.StepExecutionRequest;
import org.gcube.application.geoportal.common.model.document.*; import org.gcube.application.geoportal.common.model.document.*;
@ -87,7 +84,7 @@ public class ConcessioniLifeCycleManager implements LifecycleManager {
} }
@Override @Override
public StepExecutionReport performStep(StepExecutionRequest request) throws StepException { public StepExecutionReport performStep(StepExecutionRequest request) throws StepException, InvalidPluginRequestException {
log.info("Serving Request {}",request); log.info("Serving Request {}",request);
StepExecutionReport report=new StepExecutionReport(request); StepExecutionReport report=new StepExecutionReport(request);
report.setStatus(Report.Status.OK); report.setStatus(Report.Status.OK);
@ -210,7 +207,7 @@ public class ConcessioniLifeCycleManager implements LifecycleManager {
@Override @Override
public EventExecutionReport onEvent(EventExecutionRequest request) throws EventException { public EventExecutionReport onEvent(EventExecutionRequest request) throws EventException, InvalidPluginRequestException {
log.info("Executing Event {}",request); log.info("Executing Event {}",request);
EventExecutionReport report=new EventExecutionReport(request); EventExecutionReport report=new EventExecutionReport(request);