gcube-cms-suite/concessioni-lifecycle/src/main/java/org/gcube/application/cms/sdi/plugins/SDIMaterializerPlugin.java

169 lines
7.6 KiB
Java
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package org.gcube.application.cms.sdi.plugins;
import lombok.Data;
import lombok.Synchronized;
import lombok.extern.slf4j.Slf4j;
import org.bson.Document;
import org.gcube.application.cms.plugins.AbstractPlugin;
import org.gcube.application.cms.sdi.engine.SDIManager;
import org.gcube.application.cms.sdi.engine.SDIManagerWrapper;
import org.gcube.application.cms.sdi.faults.SDIInteractionException;
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;
import org.gcube.application.cms.plugins.reports.Report;
import org.gcube.application.cms.plugins.requests.MaterializationRequest;
import org.gcube.application.cms.serialization.Serialization;
import org.gcube.application.geoportal.common.model.JSONPathWrapper;
import org.gcube.application.geoportal.common.model.document.ComparableVersion;
import org.gcube.application.geoportal.common.model.document.ProfiledDocument;
import org.gcube.application.geoportal.common.model.document.filesets.RegisteredFileSet;
import org.gcube.application.geoportal.common.model.profile.Field;
import org.gcube.application.geoportal.common.model.profile.HandlerDeclaration;
import org.gcube.application.geoportal.common.model.profile.Profile;
import org.gcube.application.geoportal.common.utils.ContextUtils;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
public class SDIMaterializerPlugin extends AbstractPlugin implements MaterializationPlugin {
@Data
public static class MaterializationConfig{
private String schemaField;
private String documentPath;
}
Map<String, SDIManagerWrapper> sdiManagerMap=null;
private SDIManagerWrapper getSDIManager(){
return sdiManagerMap.get(ContextUtils.getCurrentScope());
}
@Override
@Synchronized
public InitializationReport initInContext() throws InitializationException {
InitializationReport report = new InitializationReport();
try{
String context = ContextUtils.getCurrentScope();
if(getSDIManager()==null) {
log.info("Initializing in " + context);
sdiManagerMap.put(context,new SDIManagerWrapper());
}
report.setStatus(Report.Status.OK);
report.putMessage("Initialized SDI Manager in "+context+" pointing to "+getSDIManager().getGeoserverHostName());
} catch (SDIInteractionException e) {
throw new InitializationException("Unable to initialize SDI Manager ",e);
}
return report;
}
@Override
@Synchronized
public InitializationReport init() throws InitializationException {
InitializationReport report = new InitializationReport();
sdiManagerMap=new HashMap<>();
report.setStatus(Report.Status.OK);
return report;
}
@Override
public void shutdown() throws ShutDownException {
}
/**
* Expected params :
* -workspace MANDATORY
* -titleField
*
* @param request
* @return
* @throws MaterializationException
*/
@Override
public MaterializationReport materialize(MaterializationRequest request) throws MaterializationException {
log.info("Materializer {} : Performing {} ",this.getDescriptor().getId(),request);
ProfiledDocument profiledDocument=request.getDocument();
Profile profile = request.getProfile();
Document requestArguments=request.getCallParameters();
Document profileConfiguration =getConfigurationFromProfile(profile).getConfiguration();
MaterializationReport report= new MaterializationReport();
log.debug("Profile Configuration is {} ",profileConfiguration);
try{
JSONPathWrapper documentNavigator=new JSONPathWrapper(profiledDocument.getTheDocument().toJson());
JSONPathWrapper schemaNavigator=new JSONPathWrapper(profile.getSchema().toJson());
for(Object fsConfigObj : profileConfiguration.get("registeredFileSetPaths", List.class)){
log.debug("Managing {} ",fsConfigObj);
MaterializationConfig fsConfig=Serialization.convert(fsConfigObj,MaterializationConfig.class);
List matchingFieldDefinitions =schemaNavigator.getByPath(fsConfig.getSchemaField());
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());
Field f = Serialization.convert(matchingFieldDefinitions.get(0),Field.class);
// TODO Check if schema points to RegisteredFileSet
for(Object fsObject : documentNavigator.getByPath(fsConfig.getDocumentPath())){
RegisteredFileSet fs = Serialization.convert(fsObject,RegisteredFileSet.class);
log.debug("Found {} ",fs);
requestArguments.putIfAbsent("basePersistencePath",profile.getId());
requestArguments.putIfAbsent("documentID",profiledDocument.get_id());
if(requestArguments.containsKey("titleField"))
requestArguments.putIfAbsent("layerTitle",fs.getString(requestArguments.getString("titleField")));
else requestArguments.putIfAbsent("layerTitle",fs.getUUID());
//Add FS uuid at ws_baseName
requestArguments.put("workspace",request.getMandatory("workspace")+"_"+ profiledDocument.get_id());
// Actually materializing
RegisteredFileSet obtained = getSDIManager().materializeLayer(fs,requestArguments);
log.debug("Obtained {} ",obtained);
documentNavigator.setElement("$..[?(@.uuid == '"+fs.getUUID()+"')]",obtained);
}
}
String finalDocument = documentNavigator.getValueCTX().jsonString();
log.debug("Final document after materialization is {} ",finalDocument);
report.setResultingDocument(Document.parse(finalDocument));
report.setStatus(Report.Status.OK);
}catch (SDIInteractionException e){
log.error("Unable to materialize "+request,e);
report.setStatus(Report.Status.ERROR);
report.putMessage(e.getMessage());
}catch (Throwable t){
log.error("Unable to materialize "+request,t);
report.setStatus(Report.Status.ERROR);
report.putMessage(t.getMessage());
}finally{
return report;
}
}
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"));
}
@Override
public PluginDescriptor getDescriptor() {
return DESCRIPTOR;
}
}