2022-10-14 15:31:32 +02:00
|
|
|
package org.gcube.portlets.user.geoportaldataviewer.server;
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.HashMap;
|
|
|
|
import java.util.LinkedHashMap;
|
|
|
|
import java.util.List;
|
2022-11-28 09:49:46 +01:00
|
|
|
import java.util.function.Function;
|
2022-10-14 15:31:32 +02:00
|
|
|
|
|
|
|
import org.bson.Document;
|
|
|
|
import org.gcube.application.geoportal.client.utils.Serialization;
|
2022-11-16 16:42:12 +01:00
|
|
|
import org.gcube.application.geoportal.common.model.document.access.Access;
|
|
|
|
import org.gcube.application.geoportal.common.model.document.access.AccessPolicy;
|
2022-10-14 15:31:32 +02:00
|
|
|
import org.gcube.application.geoportalcommon.ConvertToDataValueObjectModel;
|
|
|
|
import org.gcube.application.geoportalcommon.geoportal.access.GeportalCheckAccessPolicy;
|
|
|
|
import org.gcube.application.geoportalcommon.geoportal.serdes.Payload;
|
|
|
|
import org.gcube.application.geoportalcommon.shared.geoportal.config.FilePathDV;
|
|
|
|
import org.gcube.application.geoportalcommon.shared.geoportal.config.GcubeProfileDV;
|
|
|
|
import org.gcube.application.geoportalcommon.shared.geoportal.materialization.GCubeSDIViewerLayerDV;
|
|
|
|
import org.gcube.application.geoportalcommon.shared.geoportal.materialization.innerobject.BBOXDV;
|
|
|
|
import org.gcube.application.geoportalcommon.shared.geoportal.materialization.innerobject.FilesetDV;
|
|
|
|
import org.gcube.application.geoportalcommon.shared.geoportal.materialization.innerobject.PayloadDV;
|
|
|
|
import org.gcube.application.geoportalcommon.shared.geoportal.project.ProjectDV;
|
|
|
|
import org.gcube.application.geoportalcommon.shared.geoportal.ucd.GEOPORTAL_CONFIGURATION_TYPE;
|
|
|
|
import org.gcube.application.geoportalcommon.shared.geoportal.view.ProjectView;
|
|
|
|
import org.gcube.application.geoportalcommon.shared.geoportal.view.SectionView;
|
|
|
|
import org.gcube.application.geoportalcommon.shared.geoportal.view.SubDocumentView;
|
|
|
|
import org.gcube.portlets.user.geoportaldataviewer.server.GeoportalDataViewerServiceImpl.ImageDetector;
|
2022-10-18 14:17:41 +02:00
|
|
|
import org.gcube.portlets.user.geoportaldataviewer.server.util.URLParserUtil;
|
2022-11-16 16:42:12 +01:00
|
|
|
import org.gcube.portlets.user.geoportaldataviewer.shared.MetaDataProfileBeanExt;
|
|
|
|
import org.gcube.portlets.user.geoportaldataviewer.shared.ProjectEdit;
|
2022-10-14 15:31:32 +02:00
|
|
|
import org.gcube.portlets.widgets.mpformbuilder.shared.metadata.MetaDataProfileBean;
|
|
|
|
import org.gcube.portlets.widgets.mpformbuilder.shared.metadata.MetadataFieldWrapper;
|
|
|
|
import org.json.JSONArray;
|
|
|
|
import org.json.JSONObject;
|
|
|
|
import org.slf4j.Logger;
|
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
|
|
|
import com.google.gson.Gson;
|
|
|
|
import com.google.gson.GsonBuilder;
|
|
|
|
import com.google.gson.JsonObject;
|
|
|
|
import com.google.gson.JsonParser;
|
|
|
|
import com.jayway.jsonpath.JsonPath;
|
|
|
|
import com.jayway.jsonpath.spi.json.JsonOrgJsonProvider;
|
|
|
|
|
2022-10-25 11:35:03 +02:00
|
|
|
/**
|
|
|
|
* The Class Geoportal_JSON_Mapper.
|
|
|
|
*
|
|
|
|
* @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it
|
|
|
|
*
|
|
|
|
* Oct 24, 2022
|
|
|
|
*/
|
2022-10-14 15:31:32 +02:00
|
|
|
public class Geoportal_JSON_Mapper {
|
|
|
|
|
2022-10-18 14:17:41 +02:00
|
|
|
public static final String _PAYLOADS = "_payloads";
|
|
|
|
|
|
|
|
public static final String _MATERIALIZATIONS = "_materializations";
|
|
|
|
|
2022-10-14 15:31:32 +02:00
|
|
|
private static final Logger LOG = LoggerFactory.getLogger(Geoportal_JSON_Mapper.class);
|
|
|
|
|
|
|
|
public static final String FILESET = "fileset";
|
|
|
|
|
2022-10-19 17:51:13 +02:00
|
|
|
public static final String _OGC_LINKS = "_ogcLinks";
|
2022-10-14 15:31:32 +02:00
|
|
|
|
|
|
|
public static final String _BBOX = "_bbox";
|
|
|
|
|
|
|
|
public static final String _TYPE = "_type";
|
|
|
|
|
|
|
|
public static final String JSON_$_POINTER = "$";
|
|
|
|
|
2022-10-18 14:17:41 +02:00
|
|
|
public static final String _THEDOCUMENT = "_theDocument";
|
2022-11-28 09:49:46 +01:00
|
|
|
|
2022-11-16 16:42:12 +01:00
|
|
|
public static ProjectEdit loadProjectEdit(ProjectDV theProjectDV, String scope, String username) throws Exception {
|
|
|
|
|
|
|
|
String theWholeProjectAsJSON = theProjectDV.getTheDocument().getDocumentAsJSON();
|
|
|
|
|
|
|
|
LOG.debug("theProjectDV as JSON: " + theWholeProjectAsJSON);
|
|
|
|
LOG.debug("theProjectDV as MAP: " + theProjectDV.getTheDocument().getDocumentAsMap());
|
|
|
|
|
|
|
|
ProjectEdit projectView = new ProjectEdit();
|
|
|
|
projectView.setTheProjectDV(theProjectDV);
|
|
|
|
|
|
|
|
LinkedHashMap<String, List<GcubeProfilesMetadataForUCD>> linkedMap_UCDId_gCubeProfiles = GcubeProfilesPerUCDIdCache
|
|
|
|
.get(scope);
|
|
|
|
|
|
|
|
// NO UCD defined, applying default
|
|
|
|
if (linkedMap_UCDId_gCubeProfiles.size() == 0) {
|
|
|
|
LOG.warn("No " + GEOPORTAL_CONFIGURATION_TYPE.gcube_profiles + " found in the UCD");
|
|
|
|
LOG.info("Applying default business logic to display the project");
|
|
|
|
SectionView sectionView = new SectionView();
|
|
|
|
sectionView.setSectionTitle("Document");
|
|
|
|
Document sectionDoc = Document.parse(theProjectDV.getTheDocument().getDocumentAsJSON());
|
|
|
|
|
|
|
|
// Creating one Project with one SectionView and SubDocumentView
|
|
|
|
String wholeSectionDoc = sectionDoc.toJson();
|
|
|
|
|
|
|
|
List<FilesetDV> listFiles = new ArrayList<FilesetDV>();
|
|
|
|
|
|
|
|
// Reading Fileset _payloads
|
|
|
|
String filesetJSONPath = String.format("%s.%s", JSON_$_POINTER, FILESET);
|
|
|
|
List<Payload> listPayloads = readPayloadsForFileset(filesetJSONPath, wholeSectionDoc);
|
|
|
|
FilesetDV filesetDV = new FilesetDV();
|
|
|
|
filesetDV.setName(FILESET);
|
|
|
|
for (Payload payload : listPayloads) {
|
|
|
|
PayloadDV payloadDV = ConvertToDataValueObjectModel.toPayloadDV(payload);
|
|
|
|
filesetDV.addPayloadDV(payloadDV);
|
|
|
|
listFiles.add(filesetDV);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
List<GcubeProfilesMetadataForUCD> listProfilesBean = linkedMap_UCDId_gCubeProfiles
|
|
|
|
.get(theProjectDV.getProfileID());
|
|
|
|
|
|
|
|
com.jayway.jsonpath.Configuration configuration = com.jayway.jsonpath.Configuration.builder()
|
|
|
|
.jsonProvider(new JsonOrgJsonProvider()).build();
|
|
|
|
|
2022-11-28 09:49:46 +01:00
|
|
|
//LinkedHashMap<Integer, MetaDataProfileBeanExt> mapOfProfilesBeanExt = new LinkedHashMap<Integer, MetaDataProfileBeanExt>();
|
|
|
|
|
|
|
|
ArrayList<MetaDataProfileBeanExt> listOfProfilesBeanExt = new ArrayList<MetaDataProfileBeanExt>();
|
2022-11-16 16:42:12 +01:00
|
|
|
|
|
|
|
// Reading the Project according to list of Profile defined in the UCD
|
|
|
|
for (GcubeProfilesMetadataForUCD gcubeProfileMetaForUCD : listProfilesBean) {
|
2022-11-28 09:49:46 +01:00
|
|
|
|
2022-11-16 16:42:12 +01:00
|
|
|
GcubeProfileDV gcubeProfileDV = gcubeProfileMetaForUCD.getGcubeProfile();
|
2022-11-28 09:49:46 +01:00
|
|
|
// SectionView sectionView = new SectionView();
|
|
|
|
// sectionView.setSectionTitle(gcubeProfileDV.getSectionTitle());
|
|
|
|
|
|
|
|
System.out.println("\n\n##### Sto creando la sezione: "+gcubeProfileDV.getSectionTitle());
|
2022-11-16 16:42:12 +01:00
|
|
|
LOG.debug("\n\nThe profile is: " + gcubeProfileDV);
|
|
|
|
// Building JSON/section full PATH and section name
|
|
|
|
String sectionJSONPath = "";
|
|
|
|
String parentPathFromProfile = gcubeProfileDV.getParentName() == null ? "" : gcubeProfileDV.getParentName();
|
|
|
|
String theSectionName = gcubeProfileDV.getSectionName();
|
|
|
|
|
|
|
|
if (theSectionName.compareTo(JSON_$_POINTER) == 0 || theSectionName.compareTo(JSON_$_POINTER + ".") == 0) {
|
|
|
|
sectionJSONPath = JSON_$_POINTER;
|
|
|
|
theSectionName = "";
|
|
|
|
} else {
|
|
|
|
sectionJSONPath = String.format("%s%s",
|
|
|
|
parentPathFromProfile.endsWith(".") ? parentPathFromProfile : parentPathFromProfile + ".",
|
|
|
|
theSectionName);
|
|
|
|
}
|
|
|
|
|
|
|
|
LOG.debug("The sectionJSONPath is: " + sectionJSONPath);
|
|
|
|
|
|
|
|
JsonPath theSectionJsonPath = null;
|
|
|
|
Object data = null;
|
|
|
|
try {
|
|
|
|
theSectionJsonPath = JsonPath.compile(sectionJSONPath);
|
|
|
|
data = theSectionJsonPath.read(theWholeProjectAsJSON, configuration);
|
|
|
|
} catch (Exception e) {
|
|
|
|
LOG.warn("Error on searching the section " + sectionJSONPath + " in the JSON Project: "
|
|
|
|
+ theWholeProjectAsJSON);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
LOG.debug("Data is instace of: " + data.getClass());
|
|
|
|
LOG.debug("data to string: " + data.toString());
|
|
|
|
|
|
|
|
// Splitting the General Document in bson.Document according to list of
|
|
|
|
// GcubeProfiles
|
|
|
|
List<Document> listBSONDocument = new ArrayList<Document>();
|
|
|
|
if (data instanceof org.json.JSONObject) {
|
|
|
|
String jsonString = data.toString();
|
|
|
|
LOG.debug("the JSON to string: " + jsonString);
|
|
|
|
Document sectionDoc = Document.parse(jsonString);
|
|
|
|
listBSONDocument.add(sectionDoc);
|
|
|
|
|
|
|
|
} else if (data instanceof org.json.JSONArray) {
|
|
|
|
org.json.JSONArray dataArray = (org.json.JSONArray) data;
|
|
|
|
for (int i = 0; i < dataArray.length(); i++) {
|
|
|
|
String jsonString = dataArray.get(i).toString();
|
|
|
|
LOG.debug("the array " + i + " JSON to string: " + jsonString);
|
|
|
|
Document sectionDoc = Document.parse(jsonString);
|
|
|
|
listBSONDocument.add(sectionDoc);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
LOG.debug("Result for " + gcubeProfileDV.getSectionName() + " is: " + listBSONDocument);
|
|
|
|
List<MetaDataProfileBean> theProfileBeans = gcubeProfileMetaForUCD.getListMetadataProfileBean();
|
|
|
|
MetaDataProfileBean theProfileBean = theProfileBeans.get(0);
|
|
|
|
|
|
|
|
|
|
|
|
// For each bson.Document filling the MetaDataProfileBean and its file
|
|
|
|
for (int i = 0; i < listBSONDocument.size(); i++) {
|
|
|
|
|
2022-11-28 09:49:46 +01:00
|
|
|
System.out.println("DOCUMENT number "+i+ " of the section: "+theProfileBean.getTitle());
|
|
|
|
MetaDataProfileBeanExt theProfileBeanExt = new MetaDataProfileBeanExt();
|
|
|
|
theProfileBeanExt.setCategories(theProfileBean.getCategories());
|
|
|
|
theProfileBeanExt.setTitle(theProfileBean.getTitle());
|
|
|
|
theProfileBeanExt.setType(theProfileBean.getType());
|
|
|
|
|
|
|
|
// System.out.println("\nPRINTING PROJECT VIEW ON START: ");
|
|
|
|
// for (int j = 0; j < listOfProfilesBeanExt.size(); j++) {
|
|
|
|
// MetaDataProfileBeanExt metaDataProfileBeanExt = listOfProfilesBeanExt.get(j);
|
|
|
|
// System.out.println("MetaDataProfileBeanExt index: " + j + " "+metaDataProfileBeanExt.getType() +" "+metaDataProfileBeanExt.hashCode());
|
|
|
|
// int z = 0;
|
|
|
|
// for (MetadataFieldWrapper mfw : metaDataProfileBeanExt.getMetadataFields()) {
|
|
|
|
// System.out.println("\t MetadataFieldWrapper index: " + z++ + " " + mfw);
|
|
|
|
// }
|
|
|
|
// }
|
2022-11-16 16:42:12 +01:00
|
|
|
|
2022-11-28 09:49:46 +01:00
|
|
|
|
|
|
|
Document fromSectionDoc = listBSONDocument.get(i);
|
|
|
|
LOG.debug("\n\nNew section DOC for index " + i + " is: " + new JSONObject(fromSectionDoc.toJson()).toString(2));
|
|
|
|
//Creating the corresponding MetaDataProfileBeanExt for each section
|
|
|
|
|
2022-11-16 16:42:12 +01:00
|
|
|
//Reading policy and license statically
|
|
|
|
//eg. "_access":{"_policy":"OPEN","_license":"CC0-1.0"}}
|
|
|
|
Document docAccess = null;
|
|
|
|
Access access = null;
|
|
|
|
try {
|
|
|
|
docAccess = fromSectionDoc.get("_access", Document.class);
|
|
|
|
System.out.println("docAccess is: "+docAccess);
|
|
|
|
access = new Access();
|
|
|
|
access.setPolicy(AccessPolicy.valueOf(docAccess.getString("_policy")));
|
|
|
|
access.setLicense(docAccess.getString("_license"));
|
|
|
|
// Access. access.get("_policy");
|
|
|
|
// access.get("_license");
|
|
|
|
System.out.println("access is: "+access);
|
|
|
|
}catch (Exception e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
|
|
|
|
2022-11-28 09:49:46 +01:00
|
|
|
//List<MetadataFieldWrapper> copyOfMetadataFields = new ArrayList<MetadataFieldWrapper>(theProfileBean.getMetadataFields());
|
|
|
|
//int forIndex = 0;
|
|
|
|
|
|
|
|
List<MetadataFieldWrapper> cloneListOfMFW = cloneList(theProfileBean.getMetadataFields());
|
|
|
|
|
|
|
|
for (MetadataFieldWrapper metadataField : cloneListOfMFW) {
|
2022-11-16 16:42:12 +01:00
|
|
|
|
|
|
|
String theFieldName = metadataField.getFieldId() != null ? metadataField.getFieldId()
|
|
|
|
: metadataField.getFieldName();
|
|
|
|
LOG.debug("reading theFieldName: " + theFieldName);
|
|
|
|
Object theOBJFieldValue = fromSectionDoc.get(theFieldName);
|
|
|
|
metadataField.setCurrentValue(theOBJFieldValue+"");
|
|
|
|
|
|
|
|
if(access!=null) {
|
|
|
|
if(theFieldName.equalsIgnoreCase("policy")) {
|
|
|
|
metadataField.setCurrentValue(access.getPolicy().name());
|
|
|
|
}else if(theFieldName.equalsIgnoreCase("licenseID")) {
|
|
|
|
metadataField.setCurrentValue(access.getLicense());
|
|
|
|
}
|
|
|
|
}
|
2022-11-28 09:49:46 +01:00
|
|
|
//copyOfMetadataFields.set(forIndex++, metadataField);
|
2022-11-16 16:42:12 +01:00
|
|
|
}
|
|
|
|
|
2022-11-28 09:49:46 +01:00
|
|
|
LOG.debug("Before assigning it Metadata fields are: "+cloneListOfMFW);
|
|
|
|
|
|
|
|
theProfileBeanExt.setMetadataFields(new ArrayList<MetadataFieldWrapper>(cloneListOfMFW));
|
|
|
|
LOG.debug("Metadata fields are: "+theProfileBeanExt.getMetadataFields());
|
2022-11-16 16:42:12 +01:00
|
|
|
|
|
|
|
// Reading filePaths
|
|
|
|
List<FilePathDV> filePaths = gcubeProfileDV.getFilePaths();
|
2022-11-28 09:49:46 +01:00
|
|
|
List<GCubeSDIViewerLayerDV> listLayers = new ArrayList<GCubeSDIViewerLayerDV>();
|
2022-11-16 16:42:12 +01:00
|
|
|
|
|
|
|
// READING fileset* field ACCORDING TO filePaths OF THE 'gcubeProfiles' CONFIG
|
|
|
|
if (filePaths != null) {
|
|
|
|
String fromSectionDocJSON = fromSectionDoc.toJson();
|
|
|
|
List<FilesetDV> listFiles = new ArrayList<FilesetDV>();
|
|
|
|
// List<GCubeSDIViewerLayerDV> listLayers = new ArrayList<GCubeSDIViewerLayerDV>();
|
|
|
|
for (FilePathDV filePath : filePaths) {
|
|
|
|
|
|
|
|
// Reading Fileset _payloads
|
|
|
|
String filesetJSONPath = String.format("%s.%s", JSON_$_POINTER, filePath.getFieldName());
|
|
|
|
List<Payload> listPayloads = readPayloadsForFileset(filesetJSONPath, fromSectionDocJSON);
|
|
|
|
FilesetDV filesetDV = new FilesetDV();
|
|
|
|
filesetDV.setName(filePath.getGcubeProfileFieldName());
|
|
|
|
for (Payload payload : listPayloads) {
|
|
|
|
PayloadDV payloadDV = ConvertToDataValueObjectModel.toPayloadDV(payload);
|
|
|
|
filesetDV.addPayloadDV(payloadDV);
|
|
|
|
listFiles.add(filesetDV);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Reading Fileset _materializations
|
2022-11-28 09:49:46 +01:00
|
|
|
//listLayers = readGcubeSDILayersForFileset(filesetJSONPath, fromSectionDocJSON);
|
|
|
|
//theProfileBeanExt.set
|
2022-11-16 16:42:12 +01:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
theProfileBeanExt.setListFileset(listFiles);
|
|
|
|
}
|
2022-11-28 09:49:46 +01:00
|
|
|
|
|
|
|
System.out.println("\nputting theProfileBeanExt: "+theProfileBeanExt);
|
|
|
|
listOfProfilesBeanExt.add(theProfileBeanExt);
|
|
|
|
|
|
|
|
// System.out.println("\nPRINTING PROJECT VIEW ON END: ");
|
|
|
|
// for (int j = 0; j < listOfProfilesBeanExt.size(); j++) {
|
|
|
|
// MetaDataProfileBeanExt metaDataProfileBeanExt = listOfProfilesBeanExt.get(j);
|
|
|
|
// System.out.println("MetaDataProfileBeanExt index: " + j + " "+metaDataProfileBeanExt.getType() +" "+metaDataProfileBeanExt.hashCode());
|
|
|
|
// int z = 0;
|
|
|
|
// for (MetadataFieldWrapper mfw : metaDataProfileBeanExt.getMetadataFields()) {
|
|
|
|
// System.out.println("\t MetadataFieldWrapper index: " + z++ + " " + mfw);
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// System.out.println(listProfileBeansExt.get(listProfileBeansExt.size()-1));
|
|
|
|
//Geoportal_JSON_Mapper.prettyPrintProjectEdit(projectView);
|
2022-11-16 16:42:12 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2022-11-28 09:49:46 +01:00
|
|
|
projectView.setTheProfileBeans(listOfProfilesBeanExt);
|
2022-11-16 16:42:12 +01:00
|
|
|
|
2022-11-28 09:49:46 +01:00
|
|
|
//Geoportal_JSON_Mapper.prettyPrintProjectEdit(projectView);
|
|
|
|
|
2022-11-16 16:42:12 +01:00
|
|
|
return projectView;
|
|
|
|
}
|
|
|
|
|
2022-11-28 09:49:46 +01:00
|
|
|
public static List<MetadataFieldWrapper> cloneList(List<MetadataFieldWrapper> list) {
|
|
|
|
List<MetadataFieldWrapper> listCloned = new ArrayList<MetadataFieldWrapper>(list.size());
|
|
|
|
|
|
|
|
Function<MetadataFieldWrapper, MetadataFieldWrapper> cloneWrapper = (mfw) -> {
|
|
|
|
|
|
|
|
MetadataFieldWrapper newMfw = new MetadataFieldWrapper();
|
|
|
|
newMfw.setAsGroup(mfw.getAsGroup());
|
|
|
|
newMfw.setAsTag(mfw.getAsTag());
|
|
|
|
newMfw.setCurrentValue(mfw.getCurrentValue());
|
|
|
|
newMfw.setDefaultValue(mfw.getDefaultValue());
|
|
|
|
newMfw.setFieldId(mfw.getFieldId());
|
|
|
|
newMfw.setFieldName(mfw.getFieldName());
|
|
|
|
newMfw.setFieldNameFromCategory(mfw.getFieldNameFromCategory());
|
|
|
|
newMfw.setMandatory(mfw.getMandatory());
|
|
|
|
newMfw.setMaxOccurs(mfw.getMaxOccurs());
|
|
|
|
newMfw.setMultiSelection(mfw.isMultiSelection());
|
|
|
|
newMfw.setNote(mfw.getNote());
|
|
|
|
newMfw.setOwnerCategory(mfw.getOwnerCategory());
|
|
|
|
newMfw.setType(mfw.getType());
|
|
|
|
newMfw.setValidator(mfw.getValidator());
|
|
|
|
newMfw.setVocabulary(mfw.getVocabulary());
|
|
|
|
|
|
|
|
return newMfw;
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
for (MetadataFieldWrapper item : list) {
|
|
|
|
MetadataFieldWrapper cloned = cloneWrapper.apply(item);
|
|
|
|
listCloned.add(cloned);
|
|
|
|
}
|
|
|
|
return listCloned;
|
|
|
|
}
|
|
|
|
|
2022-10-25 11:35:03 +02:00
|
|
|
/**
|
|
|
|
* Load project view.
|
|
|
|
*
|
|
|
|
* @param theProjectDV the the project DV
|
|
|
|
* @param scope the scope
|
|
|
|
* @param username the username
|
|
|
|
* @return the project view
|
|
|
|
* @throws Exception the exception
|
|
|
|
*/
|
2022-10-14 15:31:32 +02:00
|
|
|
public static ProjectView loadProjectView(ProjectDV theProjectDV, String scope, String username) throws Exception {
|
|
|
|
|
|
|
|
String theWholeProjectAsJSON = theProjectDV.getTheDocument().getDocumentAsJSON();
|
|
|
|
|
|
|
|
LOG.debug("theProjectDV as JSON: " + theWholeProjectAsJSON);
|
|
|
|
LOG.debug("theProjectDV as MAP: " + theProjectDV.getTheDocument().getDocumentAsMap());
|
|
|
|
|
|
|
|
ProjectView projectView = new ProjectView();
|
|
|
|
projectView.setTheProjectDV(theProjectDV);
|
|
|
|
|
|
|
|
LinkedHashMap<String, List<GcubeProfilesMetadataForUCD>> linkedMap_UCDId_gCubeProfiles = GcubeProfilesPerUCDIdCache
|
|
|
|
.get(scope);
|
|
|
|
|
|
|
|
// NO UCD defined, applying default
|
|
|
|
if (linkedMap_UCDId_gCubeProfiles.size() == 0) {
|
|
|
|
LOG.warn("No " + GEOPORTAL_CONFIGURATION_TYPE.gcube_profiles + " found in the UCD");
|
|
|
|
LOG.info("Applying default business logic to display the project");
|
|
|
|
SectionView sectionView = new SectionView();
|
|
|
|
sectionView.setSectionTitle("Document");
|
|
|
|
SubDocumentView subDocumentView = new SubDocumentView();
|
|
|
|
|
|
|
|
Document sectionDoc = Document.parse(theProjectDV.getTheDocument().getDocumentAsJSON());
|
|
|
|
boolean isAccessibleSection = isAccessibleSectionAccordingToPolicy(sectionDoc, JSON_$_POINTER, username);
|
|
|
|
|
|
|
|
// If is accessible
|
|
|
|
if (isAccessibleSection) {
|
|
|
|
|
|
|
|
// Creating one Project with one SectionView and SubDocumentView
|
|
|
|
String wholeSectionDoc = sectionDoc.toJson();
|
|
|
|
subDocumentView.setMetadataAsJSON(wholeSectionDoc);
|
|
|
|
|
|
|
|
List<FilesetDV> listFiles = new ArrayList<FilesetDV>();
|
|
|
|
List<FilesetDV> listImages = new ArrayList<FilesetDV>();
|
|
|
|
List<GCubeSDIViewerLayerDV> listLayers = new ArrayList<GCubeSDIViewerLayerDV>();
|
|
|
|
|
|
|
|
// Reading Fileset _payloads
|
|
|
|
String filesetJSONPath = String.format("%s.%s", JSON_$_POINTER, FILESET);
|
|
|
|
List<Payload> listPayloads = readPayloadsForFileset(filesetJSONPath, wholeSectionDoc);
|
|
|
|
FilesetDV filesetDV = new FilesetDV();
|
|
|
|
filesetDV.setName(FILESET);
|
|
|
|
for (Payload payload : listPayloads) {
|
|
|
|
PayloadDV payloadDV = ConvertToDataValueObjectModel.toPayloadDV(payload);
|
|
|
|
filesetDV.addPayloadDV(payloadDV);
|
|
|
|
boolean isImage = ImageDetector.isImage(payload.getMimetype());
|
|
|
|
|
|
|
|
if (isImage) {
|
|
|
|
listImages.add(filesetDV);
|
|
|
|
} else {
|
|
|
|
listFiles.add(filesetDV);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
subDocumentView.setListImages(listImages);
|
|
|
|
subDocumentView.setListFiles(listFiles);
|
2022-10-14 17:19:40 +02:00
|
|
|
|
|
|
|
// Reading Fileset _materializations / layers
|
|
|
|
listLayers = readGcubeSDILayersForFileset(filesetJSONPath, wholeSectionDoc);
|
2022-10-18 14:17:41 +02:00
|
|
|
|
2022-10-14 15:31:32 +02:00
|
|
|
subDocumentView.setListLayers(listLayers);
|
|
|
|
sectionView.addSubDocument(subDocumentView);
|
|
|
|
projectView.addSectionView(sectionView);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
List<GcubeProfilesMetadataForUCD> listProfilesBean = linkedMap_UCDId_gCubeProfiles
|
|
|
|
.get(theProjectDV.getProfileID());
|
|
|
|
|
|
|
|
com.jayway.jsonpath.Configuration configuration = com.jayway.jsonpath.Configuration.builder()
|
|
|
|
.jsonProvider(new JsonOrgJsonProvider()).build();
|
|
|
|
|
|
|
|
// Reading the Project according to list of Profile defined in the UCD
|
|
|
|
for (GcubeProfilesMetadataForUCD gcubeProfileMetaForUCD : listProfilesBean) {
|
|
|
|
|
|
|
|
GcubeProfileDV gcubeProfileDV = gcubeProfileMetaForUCD.getGcubeProfile();
|
|
|
|
SectionView sectionView = new SectionView();
|
|
|
|
sectionView.setSectionTitle(gcubeProfileDV.getSectionTitle());
|
|
|
|
LOG.debug("\n\nThe profile is: " + gcubeProfileDV);
|
|
|
|
// Building JSON/section full PATH and section name
|
|
|
|
String sectionJSONPath = "";
|
|
|
|
String parentPathFromProfile = gcubeProfileDV.getParentName() == null ? "" : gcubeProfileDV.getParentName();
|
|
|
|
String theSectionName = gcubeProfileDV.getSectionName();
|
|
|
|
|
|
|
|
if (theSectionName.compareTo(JSON_$_POINTER) == 0 || theSectionName.compareTo(JSON_$_POINTER + ".") == 0) {
|
|
|
|
sectionJSONPath = JSON_$_POINTER;
|
|
|
|
theSectionName = "";
|
|
|
|
} else {
|
|
|
|
sectionJSONPath = String.format("%s%s",
|
|
|
|
parentPathFromProfile.endsWith(".") ? parentPathFromProfile : parentPathFromProfile + ".",
|
|
|
|
theSectionName);
|
|
|
|
}
|
|
|
|
|
|
|
|
LOG.debug("The sectionJSONPath is: " + sectionJSONPath);
|
|
|
|
|
|
|
|
JsonPath theSectionJsonPath = null;
|
|
|
|
Object data = null;
|
|
|
|
try {
|
|
|
|
theSectionJsonPath = JsonPath.compile(sectionJSONPath);
|
|
|
|
data = theSectionJsonPath.read(theWholeProjectAsJSON, configuration);
|
|
|
|
} catch (Exception e) {
|
|
|
|
LOG.warn("Error on searching the section " + sectionJSONPath + " in the JSON Project: "
|
|
|
|
+ theWholeProjectAsJSON);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
LOG.debug("Data is instace of: " + data.getClass());
|
|
|
|
LOG.debug("data to string: " + data.toString());
|
|
|
|
|
|
|
|
// Splitting the General Document in bson.Document according to list of
|
|
|
|
// GcubeProfiles
|
|
|
|
List<Document> listBSONDocument = new ArrayList<Document>();
|
|
|
|
if (data instanceof org.json.JSONObject) {
|
|
|
|
String jsonString = data.toString();
|
|
|
|
LOG.debug("the JSON to string: " + jsonString);
|
|
|
|
Document sectionDoc = Document.parse(jsonString);
|
|
|
|
boolean isAccessibleSection = isAccessibleSectionAccordingToPolicy(sectionDoc, sectionJSONPath,
|
|
|
|
username);
|
|
|
|
if (isAccessibleSection) {
|
|
|
|
listBSONDocument.add(sectionDoc);
|
|
|
|
}
|
|
|
|
|
|
|
|
} else if (data instanceof org.json.JSONArray) {
|
|
|
|
org.json.JSONArray dataArray = (org.json.JSONArray) data;
|
|
|
|
for (int i = 0; i < dataArray.length(); i++) {
|
|
|
|
String jsonString = dataArray.get(i).toString();
|
|
|
|
LOG.debug("the array " + i + " JSON to string: " + jsonString);
|
|
|
|
Document sectionDoc = Document.parse(jsonString);
|
|
|
|
boolean isAccessibleSection = isAccessibleSectionAccordingToPolicy(sectionDoc, sectionJSONPath,
|
|
|
|
username);
|
|
|
|
if (isAccessibleSection) {
|
|
|
|
listBSONDocument.add(sectionDoc);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
LOG.debug("Result for " + gcubeProfileDV.getSectionName() + " is: " + listBSONDocument);
|
|
|
|
List<MetaDataProfileBean> theProfileBeans = gcubeProfileMetaForUCD.getListMetadataProfileBean();
|
|
|
|
MetaDataProfileBean theProfileBean = theProfileBeans.get(0);
|
|
|
|
|
|
|
|
// For each bson.Document creating the SubDocumentView
|
|
|
|
for (int i = 0; i < listBSONDocument.size(); i++) {
|
|
|
|
Document fromSectionDoc = listBSONDocument.get(i);
|
|
|
|
SubDocumentView subDocumentView = new SubDocumentView();
|
|
|
|
Document toSectionDoc = new Document();
|
|
|
|
// Filling the SubDocumentView metadata with the metadataField.getFieldName()
|
|
|
|
// read from the Profile
|
|
|
|
for (MetadataFieldWrapper metadataField : theProfileBean.getMetadataFields()) {
|
|
|
|
|
|
|
|
String theFieldName = metadataField.getFieldId() != null ? metadataField.getFieldId()
|
|
|
|
: metadataField.getFieldName();
|
|
|
|
LOG.debug("reading theFieldName: " + theFieldName);
|
|
|
|
Object theOBJFieldValue = fromSectionDoc.get(theFieldName);
|
|
|
|
|
|
|
|
// NB: Using ALWAYS THE metadataField.getFieldName() as LABEL
|
|
|
|
toSectionDoc = sanitizeDocumentValue(toSectionDoc, metadataField.getFieldName(), theOBJFieldValue);
|
|
|
|
|
|
|
|
}
|
|
|
|
String subToJSON = toSectionDoc.toJson();
|
|
|
|
LOG.debug("theSubSetionDoc is: " + subToJSON);
|
|
|
|
subDocumentView.setMetadataAsJSON(toSectionDoc.toJson());
|
|
|
|
|
|
|
|
// Reading filePaths
|
|
|
|
List<FilePathDV> filePaths = gcubeProfileDV.getFilePaths();
|
|
|
|
|
|
|
|
// READING fileset* field ACCORDING TO filePaths OF THE 'gcubeProfiles' CONFIG
|
|
|
|
if (filePaths != null) {
|
|
|
|
String fromSectionDocJSON = fromSectionDoc.toJson();
|
|
|
|
List<FilesetDV> listFiles = new ArrayList<FilesetDV>();
|
|
|
|
List<FilesetDV> listImages = new ArrayList<FilesetDV>();
|
|
|
|
List<GCubeSDIViewerLayerDV> listLayers = new ArrayList<GCubeSDIViewerLayerDV>();
|
|
|
|
for (FilePathDV filePath : filePaths) {
|
|
|
|
|
|
|
|
// Reading Fileset _payloads
|
|
|
|
String filesetJSONPath = String.format("%s.%s", JSON_$_POINTER, filePath.getFieldName());
|
|
|
|
List<Payload> listPayloads = readPayloadsForFileset(filesetJSONPath, fromSectionDocJSON);
|
|
|
|
FilesetDV filesetDV = new FilesetDV();
|
|
|
|
filesetDV.setName(filePath.getGcubeProfileFieldName());
|
|
|
|
for (Payload payload : listPayloads) {
|
|
|
|
PayloadDV payloadDV = ConvertToDataValueObjectModel.toPayloadDV(payload);
|
|
|
|
filesetDV.addPayloadDV(payloadDV);
|
|
|
|
boolean isImage = ImageDetector.isImage(payload.getMimetype());
|
|
|
|
|
|
|
|
if (isImage) {
|
|
|
|
listImages.add(filesetDV);
|
|
|
|
} else {
|
|
|
|
listFiles.add(filesetDV);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Reading Fileset _materializations
|
|
|
|
listLayers = readGcubeSDILayersForFileset(filesetJSONPath, fromSectionDocJSON);
|
|
|
|
|
|
|
|
}
|
|
|
|
subDocumentView.setListFiles(listFiles);
|
|
|
|
subDocumentView.setListImages(listImages);
|
2022-10-14 17:19:40 +02:00
|
|
|
subDocumentView.setListLayers(listLayers);
|
2022-10-14 15:31:32 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
sectionView.addSubDocument(subDocumentView);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
projectView.addSectionView(sectionView);
|
|
|
|
}
|
|
|
|
|
|
|
|
return projectView;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Read payloads for fileset.
|
|
|
|
*
|
|
|
|
* @param filesetJSONPath the fileset JSON path
|
|
|
|
* @param sectionJSONDocument the section JSON document
|
|
|
|
* @return the list
|
|
|
|
*/
|
2022-10-18 14:17:41 +02:00
|
|
|
public static List<Payload> readPayloadsForFileset(String filesetJSONPath, String sectionJSONDocument) {
|
2022-10-14 15:31:32 +02:00
|
|
|
LOG.debug("readPayloadsForFileset called");
|
|
|
|
|
|
|
|
List<Payload> listPayloads = new ArrayList<Payload>();
|
2022-10-18 14:17:41 +02:00
|
|
|
String _payloadsJSONPath = String.format("%s.%s", filesetJSONPath, _PAYLOADS);
|
2022-10-14 15:31:32 +02:00
|
|
|
try {
|
|
|
|
com.jayway.jsonpath.Configuration configuration = com.jayway.jsonpath.Configuration.builder()
|
|
|
|
.jsonProvider(new JsonOrgJsonProvider()).build();
|
|
|
|
|
|
|
|
LOG.info("Reading sectionPath at {} into section document {}", _payloadsJSONPath, sectionJSONDocument);
|
|
|
|
JsonPath theSectionPolycJsonPath = JsonPath.compile(_payloadsJSONPath);
|
|
|
|
Object _payloads = theSectionPolycJsonPath.read(sectionJSONDocument, configuration).toString();
|
|
|
|
|
|
|
|
if (_payloads instanceof String) {
|
|
|
|
String toStringPayloads = (String) _payloads;
|
|
|
|
LOG.trace("The _payloads is a String {}", toStringPayloads);
|
|
|
|
JSONArray jsonArray = new JSONArray(toStringPayloads);
|
|
|
|
for (int i = 0; i < jsonArray.length(); i++) {
|
|
|
|
Payload payloadDV = Serialization.read(jsonArray.getJSONObject(i).toString(), Payload.class);
|
|
|
|
listPayloads.add(payloadDV);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
LOG.info("returning list of payloads {}", listPayloads);
|
|
|
|
} catch (Exception e) {
|
|
|
|
LOG.warn("Error on reading the JSON Path " + _payloadsJSONPath + " in the doc " + sectionJSONDocument, e);
|
|
|
|
}
|
|
|
|
|
|
|
|
return listPayloads;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2022-10-19 17:51:13 +02:00
|
|
|
/**
|
|
|
|
* Read images for fileset.
|
|
|
|
*
|
2022-10-25 11:35:03 +02:00
|
|
|
* @param parentJSONPath the parent JSON path
|
|
|
|
* @param sectionJSONDocument the section JSON document
|
|
|
|
* @param limitToFirstOneFound the limit to first one found
|
2022-10-19 17:51:13 +02:00
|
|
|
* @return the list
|
|
|
|
*/
|
2022-10-25 11:35:03 +02:00
|
|
|
public static List<PayloadDV> readImagesForFileset(String parentJSONPath, String sectionJSONDocument,
|
|
|
|
boolean limitToFirstOneFound) {
|
2022-10-19 17:51:13 +02:00
|
|
|
LOG.debug("readImagesForFileset called");
|
|
|
|
|
|
|
|
List<PayloadDV> listImages = new ArrayList<PayloadDV>();
|
|
|
|
com.jayway.jsonpath.Configuration config = com.jayway.jsonpath.Configuration.builder()
|
|
|
|
.jsonProvider(new JsonOrgJsonProvider()).build();
|
|
|
|
// Reading Fileset _payloads
|
|
|
|
String filesetJSONPath = String.format("%s.%s", parentJSONPath, _PAYLOADS);
|
|
|
|
LOG.info("Reading sectionPath {} into section document {}", filesetJSONPath, sectionJSONDocument);
|
|
|
|
JsonPath theSectionPolycJsonPath = JsonPath.compile(filesetJSONPath);
|
|
|
|
Object _filesets = theSectionPolycJsonPath.read(sectionJSONDocument, config);
|
|
|
|
|
|
|
|
List<Payload> payloads = new ArrayList<Payload>();
|
|
|
|
List<Payload> listPayloads = recursiveFetchingPayloads(config, _filesets, payloads);
|
|
|
|
for (Payload payload : listPayloads) {
|
|
|
|
boolean isImage = ImageDetector.isImage(payload.getMimetype());
|
|
|
|
if (isImage) {
|
|
|
|
PayloadDV payloadDV = ConvertToDataValueObjectModel.toPayloadDV(payload);
|
|
|
|
listImages.add(payloadDV);
|
2022-10-25 11:35:03 +02:00
|
|
|
if (limitToFirstOneFound && listImages.size() == 1)
|
|
|
|
return listImages;
|
2022-10-19 17:51:13 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-10-25 11:35:03 +02:00
|
|
|
LOG.debug("readImagesForFileset returning listOfImages: " + listImages);
|
2022-10-19 17:51:13 +02:00
|
|
|
return listImages;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2022-10-25 11:35:03 +02:00
|
|
|
/**
|
|
|
|
* Read gcube SDI layers for fileset.
|
|
|
|
*
|
|
|
|
* @param materializationParentJSONPath the materialization parent JSON path
|
|
|
|
* @param sectionJSONDocument the section JSON document
|
|
|
|
* @return the list
|
|
|
|
*/
|
2022-10-18 14:17:41 +02:00
|
|
|
public static List<GCubeSDIViewerLayerDV> readGcubeSDILayersForFileset(String materializationParentJSONPath,
|
2022-10-14 15:31:32 +02:00
|
|
|
String sectionJSONDocument) {
|
|
|
|
LOG.debug("readGcubeSDILayersForFileset called");
|
|
|
|
|
|
|
|
List<GCubeSDIViewerLayerDV> listSDILayers = new ArrayList<GCubeSDIViewerLayerDV>();
|
2022-10-18 14:17:41 +02:00
|
|
|
String _materializationsJSONPath = String.format("%s.%s", materializationParentJSONPath, _MATERIALIZATIONS);
|
|
|
|
|
2022-10-14 15:31:32 +02:00
|
|
|
try {
|
|
|
|
com.jayway.jsonpath.Configuration configurationJSONSmart = com.jayway.jsonpath.Configuration.builder()
|
|
|
|
.jsonProvider(new JsonOrgJsonProvider()).build();
|
|
|
|
|
2022-10-18 14:17:41 +02:00
|
|
|
LOG.info("Reading sectionPath {} into section document {}", _materializationsJSONPath, sectionJSONDocument);
|
2022-10-14 15:31:32 +02:00
|
|
|
JsonPath theSectionPolycJsonPath = JsonPath.compile(_materializationsJSONPath);
|
2022-10-18 14:17:41 +02:00
|
|
|
Object _materializations = theSectionPolycJsonPath.read(sectionJSONDocument, configurationJSONSmart);
|
2022-10-14 15:31:32 +02:00
|
|
|
|
2022-10-18 14:17:41 +02:00
|
|
|
LOG.trace("_materializations.class(): " + _materializations.getClass());
|
2022-10-14 15:31:32 +02:00
|
|
|
|
2022-10-18 14:17:41 +02:00
|
|
|
listSDILayers = recursiveFetchingLayers(configurationJSONSmart, _materializations, listSDILayers);
|
2022-10-14 15:31:32 +02:00
|
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
LOG.warn("Error on reading the JSON Path " + _materializationsJSONPath + " in the doc "
|
|
|
|
+ sectionJSONDocument, e);
|
|
|
|
}
|
2022-10-14 17:19:40 +02:00
|
|
|
LOG.info("returning list of layers {}", listSDILayers);
|
2022-10-14 15:31:32 +02:00
|
|
|
return listSDILayers;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2022-10-25 11:35:03 +02:00
|
|
|
/**
|
|
|
|
* Recursive fetching layers.
|
|
|
|
*
|
|
|
|
* @param config the config
|
|
|
|
* @param objectJSON the object JSON
|
|
|
|
* @param listSDILayers the list SDI layers
|
|
|
|
* @return the list
|
|
|
|
*/
|
2022-10-18 14:17:41 +02:00
|
|
|
private static List<GCubeSDIViewerLayerDV> recursiveFetchingLayers(com.jayway.jsonpath.Configuration config,
|
|
|
|
Object objectJSON, List<GCubeSDIViewerLayerDV> listSDILayers) {
|
|
|
|
|
|
|
|
if (objectJSON == null)
|
|
|
|
return listSDILayers;
|
|
|
|
|
|
|
|
if (objectJSON instanceof JSONArray) {
|
|
|
|
JSONArray theJsonArray = (JSONArray) objectJSON;
|
|
|
|
LOG.trace("jsonArray: " + theJsonArray.toString(3));
|
|
|
|
|
|
|
|
for (int i = 0; i < theJsonArray.length(); i++) {
|
|
|
|
recursiveFetchingLayers(config, theJsonArray.get(i), listSDILayers);
|
|
|
|
}
|
|
|
|
} else if (objectJSON instanceof JSONObject) {
|
|
|
|
JSONObject theJsonObject = (JSONObject) objectJSON;
|
|
|
|
LOG.trace("theJSONObject: " + theJsonObject.toString(3));
|
|
|
|
GCubeSDIViewerLayerDV gsdiLayer = converLayer(config, theJsonObject);
|
|
|
|
listSDILayers.add(gsdiLayer);
|
|
|
|
}
|
|
|
|
|
|
|
|
return listSDILayers;
|
|
|
|
}
|
|
|
|
|
2022-10-19 17:51:13 +02:00
|
|
|
/**
|
2022-10-25 11:35:03 +02:00
|
|
|
* Recursive fetching payloads.
|
2022-10-19 17:51:13 +02:00
|
|
|
*
|
2022-10-25 11:35:03 +02:00
|
|
|
* @param config the config
|
|
|
|
* @param objectJSON the object JSON
|
|
|
|
* @param payloads the payloads
|
2022-10-19 17:51:13 +02:00
|
|
|
* @return the list
|
|
|
|
*/
|
|
|
|
public static List<Payload> recursiveFetchingPayloads(com.jayway.jsonpath.Configuration config, Object objectJSON,
|
|
|
|
List<Payload> payloads) {
|
|
|
|
LOG.debug("recursiveFetchingPayloads called");
|
|
|
|
|
|
|
|
if (objectJSON == null)
|
|
|
|
return payloads;
|
|
|
|
|
|
|
|
if (objectJSON instanceof JSONArray) {
|
|
|
|
JSONArray theJsonArray = (JSONArray) objectJSON;
|
|
|
|
LOG.trace("jsonArray: " + theJsonArray.toString(3));
|
|
|
|
|
|
|
|
for (int i = 0; i < theJsonArray.length(); i++) {
|
2022-10-25 11:35:03 +02:00
|
|
|
payloads = recursiveFetchingPayloads(config, theJsonArray.get(i), payloads);
|
2022-10-19 17:51:13 +02:00
|
|
|
}
|
|
|
|
} else if (objectJSON instanceof JSONObject) {
|
|
|
|
JSONObject toStringPayloads = (JSONObject) objectJSON;
|
|
|
|
LOG.trace("The _payloads is a String {}", toStringPayloads.toString(3));
|
|
|
|
Payload payload;
|
|
|
|
try {
|
|
|
|
payload = Serialization.read(toStringPayloads.toString(), Payload.class);
|
|
|
|
payloads.add(payload);
|
|
|
|
} catch (Exception e) {
|
2022-10-25 11:35:03 +02:00
|
|
|
LOG.warn("Error on converting the JSON Boject " + toStringPayloads + "as "
|
|
|
|
+ Payload.class.getSimpleName() + e.getMessage());
|
2022-10-19 17:51:13 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return payloads;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2022-10-25 11:35:03 +02:00
|
|
|
/**
|
|
|
|
* Conver layer.
|
|
|
|
*
|
|
|
|
* @param config the config
|
|
|
|
* @param thJsonObject the th json object
|
|
|
|
* @return the g cube SDI viewer layer DV
|
|
|
|
*/
|
2022-10-18 14:17:41 +02:00
|
|
|
// TODO THIS PART SHOULD BE REVISITED/OPTIMIZED
|
|
|
|
private static GCubeSDIViewerLayerDV converLayer(com.jayway.jsonpath.Configuration config,
|
|
|
|
JSONObject thJsonObject) {
|
|
|
|
LOG.debug("converLayer called for " + thJsonObject);
|
|
|
|
|
|
|
|
GCubeSDIViewerLayerDV gsdiLayer = new GCubeSDIViewerLayerDV();
|
|
|
|
try {
|
|
|
|
String theType = thJsonObject.getString(_TYPE);
|
|
|
|
gsdiLayer.setType(theType);
|
|
|
|
LOG.debug(_TYPE + " is: " + theType);
|
|
|
|
} catch (Exception e) {
|
|
|
|
LOG.warn("No " + _TYPE + " found", e);
|
|
|
|
}
|
|
|
|
String toSerializeJSONOBJ = thJsonObject.toString();
|
|
|
|
String jsonPath = null;
|
|
|
|
try {
|
|
|
|
jsonPath = String.format("%s.%s", JSON_$_POINTER, _BBOX);
|
2022-11-16 16:42:12 +01:00
|
|
|
HashMap<String, Object> bbox = JsonPath.using(config).parse(toSerializeJSONOBJ).read(jsonPath,
|
|
|
|
HashMap.class);
|
2022-11-11 16:30:20 +01:00
|
|
|
BBOXDV bboxDV = new BBOXDV(bbox);
|
|
|
|
gsdiLayer.setBbox(bboxDV);
|
|
|
|
LOG.debug(_BBOX + " is: " + bboxDV);
|
2022-10-18 14:17:41 +02:00
|
|
|
} catch (Exception e) {
|
|
|
|
LOG.warn(jsonPath + " error: ", e);
|
|
|
|
}
|
|
|
|
try {
|
2022-10-19 17:51:13 +02:00
|
|
|
jsonPath = String.format("%s.%s", JSON_$_POINTER, _OGC_LINKS);
|
2022-10-18 14:17:41 +02:00
|
|
|
String jsonString = JsonPath.using(config).parse(toSerializeJSONOBJ).read(jsonPath).toString();
|
|
|
|
Gson gson = new Gson();
|
2022-11-11 16:30:20 +01:00
|
|
|
HashMap<String, String> map = gson.fromJson(jsonString, HashMap.class);
|
2022-10-18 14:17:41 +02:00
|
|
|
gsdiLayer.setOgcLinks(map);
|
2022-10-19 17:51:13 +02:00
|
|
|
LOG.debug(_OGC_LINKS + " are: " + map);
|
2022-10-18 14:17:41 +02:00
|
|
|
} catch (Exception e) {
|
|
|
|
LOG.warn(jsonPath + " error: ", e);
|
|
|
|
}
|
2022-10-19 17:51:13 +02:00
|
|
|
|
2022-10-18 14:17:41 +02:00
|
|
|
try {
|
|
|
|
String wmsLink = gsdiLayer.getWMSLink();
|
2022-10-19 17:51:13 +02:00
|
|
|
if (wmsLink != null) {
|
2022-10-18 14:17:41 +02:00
|
|
|
String layerName = URLParserUtil.extractValueOfParameterFromURL("layers", wmsLink);
|
|
|
|
gsdiLayer.setLayerName(layerName);
|
|
|
|
}
|
|
|
|
} catch (Exception e) {
|
|
|
|
LOG.warn(jsonPath + " error: ", e);
|
|
|
|
}
|
|
|
|
|
|
|
|
LOG.debug("converLayer returning: " + gsdiLayer);
|
|
|
|
return gsdiLayer;
|
|
|
|
}
|
|
|
|
|
2022-10-14 15:31:32 +02:00
|
|
|
/**
|
|
|
|
* Checks if is accessible section according to policy.
|
|
|
|
*
|
|
|
|
* @param section the section
|
|
|
|
* @param sectionJSONPath the section JSON path
|
|
|
|
* @param myLogin the my login
|
|
|
|
* @return true, if is accessible section according to policy
|
|
|
|
*/
|
|
|
|
private static boolean isAccessibleSectionAccordingToPolicy(Document section, String sectionJSONPath,
|
|
|
|
String myLogin) {
|
|
|
|
LOG.debug("isAccessibleSectionAccordingToPolicy called");
|
|
|
|
boolean isAccessible = true;
|
|
|
|
|
|
|
|
// Skipping the root, going to check the access_policy of subsections
|
|
|
|
if (sectionJSONPath.compareTo(JSON_$_POINTER) != 0) {
|
|
|
|
isAccessible = checkAccessPolicy(section.toJson(), myLogin);
|
|
|
|
}
|
|
|
|
|
|
|
|
return isAccessible;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Check access policy.
|
|
|
|
*
|
|
|
|
* @param sectionDocumentJSON the section document JSON
|
|
|
|
* @param myLogin the my login
|
|
|
|
* @return true, if successful
|
|
|
|
*/
|
|
|
|
private static boolean checkAccessPolicy(String sectionDocumentJSON, String myLogin) {
|
|
|
|
LOG.debug("checkAccessPolicy called");
|
|
|
|
// CHECKING THE POLICY
|
|
|
|
String accessPolicyPath = JSON_$_POINTER + "._access._policy";
|
|
|
|
boolean isAccessible = true;
|
|
|
|
try {
|
|
|
|
com.jayway.jsonpath.Configuration configuration = com.jayway.jsonpath.Configuration.builder()
|
|
|
|
.jsonProvider(new JsonOrgJsonProvider()).build();
|
|
|
|
|
|
|
|
LOG.info("Reading access policy at {} into section document {}", accessPolicyPath, sectionDocumentJSON);
|
|
|
|
JsonPath theSectionPolycJsonPath = JsonPath.compile(accessPolicyPath);
|
|
|
|
String _policy = theSectionPolycJsonPath.read(sectionDocumentJSON, configuration).toString();
|
|
|
|
LOG.info("The section {} has policy {}", accessPolicyPath, _policy);
|
|
|
|
isAccessible = GeportalCheckAccessPolicy.isAccessible(_policy, myLogin);
|
|
|
|
} catch (Exception e) {
|
|
|
|
LOG.error(accessPolicyPath + " not found. Check OK");
|
|
|
|
}
|
|
|
|
LOG.info("Is the section {} accessible? {}", sectionDocumentJSON, isAccessible);
|
|
|
|
return isAccessible;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sanitize document value.
|
|
|
|
*
|
|
|
|
* @param toDoc the to doc
|
|
|
|
* @param fieldLabel the field label
|
|
|
|
* @param theObjectFieldValue the the object field value
|
|
|
|
* @return the document
|
|
|
|
*/
|
|
|
|
private static Document sanitizeDocumentValue(Document toDoc, String fieldLabel, Object theObjectFieldValue) {
|
|
|
|
|
|
|
|
if (theObjectFieldValue != null) {
|
|
|
|
if (theObjectFieldValue instanceof String) {
|
|
|
|
String toString = (String) theObjectFieldValue;
|
|
|
|
if (toString != null && !toString.isEmpty()) {
|
|
|
|
toDoc.append(fieldLabel, theObjectFieldValue);
|
|
|
|
} else {
|
|
|
|
LOG.debug("Skipping String field " + fieldLabel + " its value is null or empty");
|
|
|
|
}
|
|
|
|
|
|
|
|
} else if (theObjectFieldValue instanceof ArrayList) {
|
|
|
|
ArrayList toArrayList = (ArrayList) theObjectFieldValue;
|
|
|
|
if (toArrayList != null && !toArrayList.isEmpty()) {
|
|
|
|
toDoc.append(fieldLabel, theObjectFieldValue);
|
|
|
|
} else {
|
|
|
|
LOG.debug("Skipping ArrayList field " + fieldLabel + " its value is null or empty");
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
toDoc.append(fieldLabel, theObjectFieldValue);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
LOG.debug("Skipping field " + fieldLabel + " its value is null or empty");
|
|
|
|
}
|
|
|
|
|
|
|
|
return toDoc;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Pretty print JSON.
|
|
|
|
*
|
|
|
|
* @param jsonString the json string
|
|
|
|
* @return the string
|
|
|
|
*/
|
|
|
|
private static String prettyPrintJSON(String jsonString) {
|
|
|
|
|
|
|
|
Gson gson = new GsonBuilder().setPrettyPrinting().create();
|
|
|
|
JsonObject jsonObject = new JsonParser().parse(jsonString).getAsJsonObject();
|
|
|
|
return gson.toJson(jsonObject);
|
|
|
|
}
|
|
|
|
|
2022-10-25 11:35:03 +02:00
|
|
|
/**
|
|
|
|
* Pretty print project view.
|
|
|
|
*
|
|
|
|
* @param projectView the project view
|
|
|
|
*/
|
2022-10-14 15:31:32 +02:00
|
|
|
public static void prettyPrintProjectView(ProjectView projectView) {
|
|
|
|
|
|
|
|
for (SectionView section : projectView.getListSections()) {
|
|
|
|
System.out.println("\n\n###### Section Title: " + section.getSectionTitle() + " ######");
|
|
|
|
int i = 1;
|
|
|
|
for (SubDocumentView subDocument : section.getListSubDocuments()) {
|
|
|
|
System.out.println("## " + SubDocumentView.class.getSimpleName() + " n." + i);
|
|
|
|
System.out.println("***** Metadata");
|
|
|
|
System.out.println(prettyPrintJSON(subDocument.getMetadataAsJSON()));
|
|
|
|
System.out.println("***** Files");
|
|
|
|
if (subDocument.getListFiles() != null) {
|
|
|
|
for (FilesetDV filesetDV : subDocument.getListFiles()) {
|
|
|
|
System.out.println("******* File Fileset name: " + filesetDV.getName());
|
|
|
|
for (PayloadDV payload : filesetDV.getListPayload()) {
|
|
|
|
System.out.println("********* Payload: " + payload);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
System.out.println("***** Images");
|
|
|
|
if (subDocument.getListImages() != null) {
|
|
|
|
for (FilesetDV filesetDV : subDocument.getListImages()) {
|
|
|
|
System.out.println("******* Image Fileset name: " + filesetDV.getName());
|
|
|
|
for (PayloadDV payload : filesetDV.getListPayload()) {
|
|
|
|
System.out.println("********* Payload: " + payload);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2022-10-14 17:19:40 +02:00
|
|
|
System.out.println("***** Layers");
|
|
|
|
if (subDocument.getListLayers() != null) {
|
|
|
|
for (GCubeSDIViewerLayerDV layer : subDocument.getListLayers()) {
|
|
|
|
System.out.println("******* Layer type: " + layer.getType());
|
|
|
|
System.out.println("******* Layer: " + layer);
|
|
|
|
}
|
|
|
|
}
|
2022-10-14 15:31:32 +02:00
|
|
|
i++;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-11-16 16:42:12 +01:00
|
|
|
/**
|
|
|
|
* Pretty print project view.
|
|
|
|
*
|
|
|
|
* @param projectView the project view
|
|
|
|
*/
|
|
|
|
public static void prettyPrintProjectEdit(ProjectEdit projectEdit) {
|
|
|
|
|
|
|
|
for (MetaDataProfileBeanExt mpb : projectEdit.getTheProfileBeans()) {
|
|
|
|
System.out.println("\n\n###### Title: " + mpb.getTitle() + " - Type: " + mpb.getType() + " ######");
|
|
|
|
int i = 1;
|
2022-11-28 09:49:46 +01:00
|
|
|
for (MetadataFieldWrapper fieldWrapper : mpb.getMetadataFields()) {
|
2022-11-16 16:42:12 +01:00
|
|
|
System.out.println("## " + MetadataFieldWrapper.class.getSimpleName() + " n." + i);
|
|
|
|
System.out.println("***** Metadata");
|
2022-11-28 09:49:46 +01:00
|
|
|
// System.out.println(mfw);
|
|
|
|
System.out.println("\tfieldId: " + fieldWrapper.getFieldId() + ", fieldName: "
|
|
|
|
+ fieldWrapper.getFieldName() + ", CurrentValue: " + fieldWrapper.getCurrentValue());
|
2022-11-16 16:42:12 +01:00
|
|
|
i++;
|
|
|
|
}
|
|
|
|
i = 1;
|
|
|
|
System.out.println("***** Files");
|
|
|
|
for (FilesetDV fileSet : mpb.getListFileset()) {
|
|
|
|
System.out.println("## " + FilesetDV.class.getSimpleName() + " n." + i);
|
|
|
|
System.out.println(fileSet);
|
2022-11-28 09:49:46 +01:00
|
|
|
i++;
|
2022-11-16 16:42:12 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-10-14 15:31:32 +02:00
|
|
|
}
|