124 lines
5.1 KiB
Java
124 lines
5.1 KiB
Java
package org.gcube.application.cms.concessioni.plugins;
|
||
|
||
import lombok.Data;
|
||
import lombok.extern.slf4j.Slf4j;
|
||
import org.bson.Document;
|
||
import org.gcube.application.cms.concessioni.sdi.SDIManager;
|
||
import org.gcube.application.cms.concessioni.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.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 java.util.List;
|
||
|
||
@Slf4j
|
||
public class SDIMaterializerPlugin implements MaterializationPlugin {
|
||
|
||
@Data
|
||
public static class MaterializationConfig{
|
||
private String schemaField;
|
||
private String documentPath;
|
||
}
|
||
|
||
SDIManager sdiManager;
|
||
|
||
@Override
|
||
public InitializationReport initInContext() throws InitializationException {
|
||
return null;
|
||
}
|
||
|
||
@Override
|
||
public InitializationReport init() throws InitializationException {
|
||
return null;
|
||
}
|
||
|
||
@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 configuration=request.getParameters();
|
||
Document profileConfiguration =null;
|
||
for (HandlerDeclaration h : profile.getHandlers()) {
|
||
if (h.getId().equals("SDI-Default-Materializer")) {
|
||
profileConfiguration = h.getConfiguration();
|
||
}
|
||
}
|
||
|
||
MaterializationReport report= new MaterializationReport();
|
||
|
||
log.debug("Profile Configuration is {} ",profileConfiguration);
|
||
try{
|
||
JSONPathWrapper documentNavigator=new JSONPathWrapper(profiledDocument.getTheDocument().toJson());
|
||
JSONPathWrapper profileNavigator=new JSONPathWrapper(profile.getSchema().toJson());
|
||
|
||
for(Object fsConfigObj : configuration.get("registeredFileSetPaths", List.class)){
|
||
log.debug("Managing {} ",fsConfigObj);
|
||
MaterializationConfig fsConfig=Serialization.convert(fsConfigObj,MaterializationConfig.class);
|
||
Field f = profileNavigator.getByPath(fsConfig.getSchemaField(), Field.class).get(0);
|
||
|
||
// TODO Check if schema points to RegisteredFileSet
|
||
|
||
for(RegisteredFileSet fs : documentNavigator.getByPath(fsConfig.getDocumentPath(),RegisteredFileSet.class)){
|
||
log.debug("Found {} ",fs);
|
||
configuration.putIfAbsent("basePersistencePath",profile.getId());
|
||
configuration.putIfAbsent("documentID",profiledDocument.get_id());
|
||
if(configuration.containsKey("titleField"))
|
||
configuration.putIfAbsent("layerTitle",fs.getString(configuration.getString("titleField")));
|
||
else configuration.putIfAbsent("layerTitle",fs.getUUID());
|
||
|
||
RegisteredFileSet obtained = sdiManager.materializeLayer(fs,configuration);
|
||
log.debug("Obtained {} ",obtained);
|
||
documentNavigator.set("$..[?(@.uuid == "+fs.getUUID()+")]",obtained);
|
||
}
|
||
}
|
||
|
||
profiledDocument.setTheDocument(Document.parse(documentNavigator.getValueCTX().json()));
|
||
report.setResultDocument(profiledDocument);
|
||
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;
|
||
}
|
||
}
|
||
|
||
@Override
|
||
public PluginDescriptor getDescriptor() {
|
||
return null;
|
||
}
|
||
}
|