2022-02-18 18:11:12 +01:00
|
|
|
|
package org.gcube.application.cms.sdi.plugins;
|
2022-02-14 12:23:13 +01:00
|
|
|
|
|
2022-02-14 15:00:59 +01:00
|
|
|
|
import lombok.Data;
|
2022-02-16 18:29:34 +01:00
|
|
|
|
import lombok.Synchronized;
|
2022-02-14 12:23:13 +01:00
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
import org.bson.Document;
|
2022-02-18 18:11:12 +01:00
|
|
|
|
import org.gcube.application.cms.plugins.AbstractPlugin;
|
2022-03-04 11:30:31 +01:00
|
|
|
|
import org.gcube.application.cms.plugins.faults.InvalidPluginRequestException;
|
2022-02-18 18:11:12 +01:00
|
|
|
|
import org.gcube.application.cms.sdi.engine.SDIManagerWrapper;
|
|
|
|
|
import org.gcube.application.cms.sdi.faults.SDIInteractionException;
|
2022-02-14 12:23:13 +01:00
|
|
|
|
import org.gcube.application.cms.plugins.MaterializationPlugin;
|
|
|
|
|
import org.gcube.application.cms.plugins.faults.InitializationException;
|
|
|
|
|
import org.gcube.application.cms.plugins.faults.MaterializationException;
|
|
|
|
|
import org.gcube.application.cms.plugins.faults.ShutDownException;
|
|
|
|
|
import org.gcube.application.cms.plugins.model.PluginDescriptor;
|
|
|
|
|
import org.gcube.application.cms.plugins.reports.InitializationReport;
|
|
|
|
|
import org.gcube.application.cms.plugins.reports.MaterializationReport;
|
2022-02-14 15:00:59 +01:00
|
|
|
|
import org.gcube.application.cms.plugins.reports.Report;
|
2022-02-14 12:23:13 +01:00
|
|
|
|
import org.gcube.application.cms.plugins.requests.MaterializationRequest;
|
2022-02-14 15:00:59 +01:00
|
|
|
|
import org.gcube.application.cms.serialization.Serialization;
|
|
|
|
|
import org.gcube.application.geoportal.common.model.JSONPathWrapper;
|
2022-02-23 17:13:22 +01:00
|
|
|
|
import org.gcube.application.cms.plugins.model.ComparableVersion;
|
2022-02-14 12:23:13 +01:00
|
|
|
|
import org.gcube.application.geoportal.common.model.document.ProfiledDocument;
|
|
|
|
|
import org.gcube.application.geoportal.common.model.document.filesets.RegisteredFileSet;
|
2022-02-14 15:00:59 +01:00
|
|
|
|
import org.gcube.application.geoportal.common.model.profile.Field;
|
2022-02-14 12:23:13 +01:00
|
|
|
|
import org.gcube.application.geoportal.common.model.profile.Profile;
|
2022-02-16 17:55:41 +01:00
|
|
|
|
import org.gcube.application.geoportal.common.utils.ContextUtils;
|
2022-02-14 12:23:13 +01:00
|
|
|
|
|
2022-02-16 18:29:34 +01:00
|
|
|
|
import java.util.HashMap;
|
2022-02-14 15:00:59 +01:00
|
|
|
|
import java.util.List;
|
2022-02-16 18:29:34 +01:00
|
|
|
|
import java.util.Map;
|
2022-02-14 15:00:59 +01:00
|
|
|
|
|
2022-02-14 12:23:13 +01:00
|
|
|
|
@Slf4j
|
2022-02-18 18:11:12 +01:00
|
|
|
|
public class SDIMaterializerPlugin extends AbstractPlugin implements MaterializationPlugin {
|
2022-02-14 12:23:13 +01:00
|
|
|
|
|
2022-02-14 15:00:59 +01:00
|
|
|
|
@Data
|
|
|
|
|
public static class MaterializationConfig{
|
|
|
|
|
private String schemaField;
|
|
|
|
|
private String documentPath;
|
|
|
|
|
}
|
|
|
|
|
|
2022-02-18 18:11:12 +01:00
|
|
|
|
Map<String, SDIManagerWrapper> sdiManagerMap=null;
|
2022-02-16 18:29:34 +01:00
|
|
|
|
|
|
|
|
|
|
2022-02-18 18:11:12 +01:00
|
|
|
|
private SDIManagerWrapper getSDIManager(){
|
2022-02-16 18:29:34 +01:00
|
|
|
|
return sdiManagerMap.get(ContextUtils.getCurrentScope());
|
|
|
|
|
}
|
2022-02-14 12:23:13 +01:00
|
|
|
|
|
|
|
|
|
@Override
|
2022-02-16 18:29:34 +01:00
|
|
|
|
@Synchronized
|
2022-02-14 12:23:13 +01:00
|
|
|
|
public InitializationReport initInContext() throws InitializationException {
|
2022-02-16 17:55:41 +01:00
|
|
|
|
InitializationReport report = new InitializationReport();
|
|
|
|
|
try{
|
2022-02-16 18:36:42 +01:00
|
|
|
|
String context = ContextUtils.getCurrentScope();
|
2022-02-16 18:29:34 +01:00
|
|
|
|
if(getSDIManager()==null) {
|
|
|
|
|
log.info("Initializing in " + context);
|
2022-02-18 18:11:12 +01:00
|
|
|
|
sdiManagerMap.put(context,new SDIManagerWrapper());
|
2022-02-16 18:29:34 +01:00
|
|
|
|
}
|
2022-02-16 17:55:41 +01:00
|
|
|
|
report.setStatus(Report.Status.OK);
|
2022-02-16 18:36:42 +01:00
|
|
|
|
report.putMessage("Initialized SDI Manager in "+context+" pointing to "+getSDIManager().getGeoserverHostName());
|
2022-02-16 17:55:41 +01:00
|
|
|
|
} catch (SDIInteractionException e) {
|
|
|
|
|
throw new InitializationException("Unable to initialize SDI Manager ",e);
|
|
|
|
|
}
|
|
|
|
|
return report;
|
2022-02-14 12:23:13 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
2022-02-16 18:29:34 +01:00
|
|
|
|
@Synchronized
|
2022-02-14 12:23:13 +01:00
|
|
|
|
public InitializationReport init() throws InitializationException {
|
2022-02-16 17:55:41 +01:00
|
|
|
|
InitializationReport report = new InitializationReport();
|
2022-02-16 18:29:34 +01:00
|
|
|
|
sdiManagerMap=new HashMap<>();
|
2022-02-16 17:55:41 +01:00
|
|
|
|
report.setStatus(Report.Status.OK);
|
|
|
|
|
return report;
|
2022-02-14 12:23:13 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void shutdown() throws ShutDownException {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2022-02-14 15:00:59 +01:00
|
|
|
|
/**
|
|
|
|
|
* Expected params :
|
|
|
|
|
* -workspace MANDATORY
|
|
|
|
|
* -titleField
|
|
|
|
|
*
|
|
|
|
|
* @param request
|
|
|
|
|
* @return
|
|
|
|
|
* @throws MaterializationException
|
|
|
|
|
*/
|
2022-02-14 12:23:13 +01:00
|
|
|
|
@Override
|
2022-03-04 11:30:31 +01:00
|
|
|
|
public MaterializationReport materialize(MaterializationRequest request) throws MaterializationException, InvalidPluginRequestException {
|
2022-02-14 12:23:13 +01:00
|
|
|
|
log.info("Materializer {} : Performing {} ",this.getDescriptor().getId(),request);
|
2022-02-14 15:00:59 +01:00
|
|
|
|
ProfiledDocument profiledDocument=request.getDocument();
|
2022-02-14 12:23:13 +01:00
|
|
|
|
Profile profile = request.getProfile();
|
2022-02-17 11:10:56 +01:00
|
|
|
|
Document requestArguments=request.getCallParameters();
|
2022-02-14 12:23:13 +01:00
|
|
|
|
|
2022-02-23 17:13:22 +01:00
|
|
|
|
MaterializationReport report= new MaterializationReport(request);
|
2022-02-14 15:00:59 +01:00
|
|
|
|
|
2022-02-14 12:23:13 +01:00
|
|
|
|
try{
|
2022-02-24 18:09:30 +01:00
|
|
|
|
Document profileConfiguration =getConfigurationFromProfile(profile).getConfiguration();
|
|
|
|
|
log.debug("Profile Configuration is {} ",profileConfiguration);
|
2022-02-14 15:00:59 +01:00
|
|
|
|
JSONPathWrapper documentNavigator=new JSONPathWrapper(profiledDocument.getTheDocument().toJson());
|
2022-02-16 17:12:23 +01:00
|
|
|
|
JSONPathWrapper schemaNavigator=new JSONPathWrapper(profile.getSchema().toJson());
|
2022-02-14 12:23:13 +01:00
|
|
|
|
|
2022-02-16 17:12:23 +01:00
|
|
|
|
for(Object fsConfigObj : profileConfiguration.get("registeredFileSetPaths", List.class)){
|
2022-02-14 15:00:59 +01:00
|
|
|
|
log.debug("Managing {} ",fsConfigObj);
|
|
|
|
|
MaterializationConfig fsConfig=Serialization.convert(fsConfigObj,MaterializationConfig.class);
|
2022-02-16 17:55:41 +01:00
|
|
|
|
List matchingFieldDefinitions =schemaNavigator.getByPath(fsConfig.getSchemaField());
|
2022-02-16 17:12:23 +01:00
|
|
|
|
if(matchingFieldDefinitions==null || matchingFieldDefinitions.isEmpty())
|
|
|
|
|
throw new MaterializationException("Invalid Field Definition path in configuration [NO MATCH] : "+
|
|
|
|
|
fsConfig.getSchemaField());
|
|
|
|
|
if(matchingFieldDefinitions.size()>1)
|
|
|
|
|
throw new MaterializationException("Invalid Field Definition path in configuration [MATCHES "+matchingFieldDefinitions.size()+"] : "+
|
|
|
|
|
fsConfig.getSchemaField());
|
|
|
|
|
|
2022-02-16 17:55:41 +01:00
|
|
|
|
Field f = Serialization.convert(matchingFieldDefinitions.get(0),Field.class);
|
2022-02-14 12:23:13 +01:00
|
|
|
|
|
2022-02-14 15:00:59 +01:00
|
|
|
|
// TODO Check if schema points to RegisteredFileSet
|
2022-02-14 12:23:13 +01:00
|
|
|
|
|
2022-02-16 17:55:41 +01:00
|
|
|
|
for(Object fsObject : documentNavigator.getByPath(fsConfig.getDocumentPath())){
|
|
|
|
|
RegisteredFileSet fs = Serialization.convert(fsObject,RegisteredFileSet.class);
|
2022-02-14 15:00:59 +01:00
|
|
|
|
log.debug("Found {} ",fs);
|
2022-02-16 17:12:23 +01:00
|
|
|
|
requestArguments.putIfAbsent("basePersistencePath",profile.getId());
|
2022-02-23 17:13:22 +01:00
|
|
|
|
requestArguments.putIfAbsent("documentID",profiledDocument.getId());
|
2022-02-16 17:12:23 +01:00
|
|
|
|
if(requestArguments.containsKey("titleField"))
|
|
|
|
|
requestArguments.putIfAbsent("layerTitle",fs.getString(requestArguments.getString("titleField")));
|
|
|
|
|
else requestArguments.putIfAbsent("layerTitle",fs.getUUID());
|
2022-02-14 17:06:32 +01:00
|
|
|
|
|
2022-02-17 11:10:56 +01:00
|
|
|
|
//Add FS uuid at ws_baseName
|
2022-02-23 17:13:22 +01:00
|
|
|
|
requestArguments.put("workspace",request.getMandatory("workspace")+"_"+ profiledDocument.getId());
|
2022-02-17 11:10:56 +01:00
|
|
|
|
|
|
|
|
|
// Actually materializing
|
2022-02-16 18:29:34 +01:00
|
|
|
|
RegisteredFileSet obtained = getSDIManager().materializeLayer(fs,requestArguments);
|
2022-02-14 15:00:59 +01:00
|
|
|
|
log.debug("Obtained {} ",obtained);
|
2022-02-24 18:09:30 +01:00
|
|
|
|
documentNavigator.setElement("$..[?(@."+ RegisteredFileSet.UUID+" == '"+fs.getUUID()+"')]",obtained);
|
2022-02-14 15:00:59 +01:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-02-18 18:11:12 +01:00
|
|
|
|
String finalDocument = documentNavigator.getValueCTX().jsonString();
|
|
|
|
|
log.debug("Final document after materialization is {} ",finalDocument);
|
|
|
|
|
report.setResultingDocument(Document.parse(finalDocument));
|
2022-02-14 15:00:59 +01:00
|
|
|
|
report.setStatus(Report.Status.OK);
|
|
|
|
|
}catch (SDIInteractionException e){
|
|
|
|
|
log.error("Unable to materialize "+request,e);
|
|
|
|
|
report.setStatus(Report.Status.ERROR);
|
|
|
|
|
report.putMessage(e.getMessage());
|
2022-02-14 12:23:13 +01:00
|
|
|
|
}catch (Throwable t){
|
2022-02-14 15:00:59 +01:00
|
|
|
|
log.error("Unable to materialize "+request,t);
|
|
|
|
|
report.setStatus(Report.Status.ERROR);
|
|
|
|
|
report.putMessage(t.getMessage());
|
2022-02-14 12:23:13 +01:00
|
|
|
|
}finally{
|
2022-02-14 15:00:59 +01:00
|
|
|
|
return report;
|
2022-02-14 12:23:13 +01:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-02-16 17:12:23 +01:00
|
|
|
|
private static final PluginDescriptor DESCRIPTOR=new PluginDescriptor("SDI-Default-Materializer", PluginDescriptor.BaseTypes.MATERIALIZER);
|
|
|
|
|
static {
|
|
|
|
|
DESCRIPTOR.setDescription("SDI Materializer. " +
|
|
|
|
|
"This plugin materialize FileSets in gCube SDI.");
|
|
|
|
|
DESCRIPTOR.setVersion(new ComparableVersion("1.0.0"));
|
|
|
|
|
}
|
|
|
|
|
|
2022-02-14 12:23:13 +01:00
|
|
|
|
@Override
|
|
|
|
|
public PluginDescriptor getDescriptor() {
|
2022-02-16 17:12:23 +01:00
|
|
|
|
return DESCRIPTOR;
|
2022-02-14 12:23:13 +01:00
|
|
|
|
}
|
|
|
|
|
}
|