package org.gcube.portlets.user.geoportaldataviewer.server; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.function.Function; import org.bson.Document; import org.gcube.application.geoportal.client.utils.Serialization; import org.gcube.application.geoportal.common.model.document.access.Access; import org.gcube.application.geoportal.common.model.document.access.AccessPolicy; 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; import org.gcube.portlets.user.geoportaldataviewer.server.util.URLParserUtil; import org.gcube.portlets.user.geoportaldataviewer.shared.MetaDataProfileBeanExt; import org.gcube.portlets.user.geoportaldataviewer.shared.ProjectEdit; 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; /** * The Class Geoportal_JSON_Mapper. * * @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it * * Oct 24, 2022 */ public class Geoportal_JSON_Mapper { public static final String _PAYLOADS = "_payloads"; public static final String _MATERIALIZATIONS = "_materializations"; private static final Logger LOG = LoggerFactory.getLogger(Geoportal_JSON_Mapper.class); public static final String FILESET = "fileset"; public static final String _OGC_LINKS = "_ogcLinks"; public static final String _BBOX = "_bbox"; public static final String _TYPE = "_type"; public static final String JSON_$_POINTER = "$"; public static final String _THEDOCUMENT = "_theDocument"; 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> 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 listFiles = new ArrayList(); // Reading Fileset _payloads String filesetJSONPath = String.format("%s.%s", JSON_$_POINTER, FILESET); List 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 listProfilesBean = linkedMap_UCDId_gCubeProfiles .get(theProjectDV.getProfileID()); com.jayway.jsonpath.Configuration configuration = com.jayway.jsonpath.Configuration.builder() .jsonProvider(new JsonOrgJsonProvider()).build(); //LinkedHashMap mapOfProfilesBeanExt = new LinkedHashMap(); ArrayList listOfProfilesBeanExt = new ArrayList(); // 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()); System.out.println("\n\n##### Sto creando la sezione: "+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 listBSONDocument = new ArrayList(); 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 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++) { 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); // } // } 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 //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(); } //List copyOfMetadataFields = new ArrayList(theProfileBean.getMetadataFields()); //int forIndex = 0; List cloneListOfMFW = cloneList(theProfileBean.getMetadataFields()); for (MetadataFieldWrapper metadataField : cloneListOfMFW) { 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()); } } //copyOfMetadataFields.set(forIndex++, metadataField); } LOG.debug("Before assigning it Metadata fields are: "+cloneListOfMFW); theProfileBeanExt.setMetadataFields(new ArrayList(cloneListOfMFW)); LOG.debug("Metadata fields are: "+theProfileBeanExt.getMetadataFields()); // Reading filePaths List filePaths = gcubeProfileDV.getFilePaths(); List listLayers = new ArrayList(); // READING fileset* field ACCORDING TO filePaths OF THE 'gcubeProfiles' CONFIG if (filePaths != null) { String fromSectionDocJSON = fromSectionDoc.toJson(); List listFiles = new ArrayList(); // List listLayers = new ArrayList(); for (FilePathDV filePath : filePaths) { // Reading Fileset _payloads String filesetJSONPath = String.format("%s.%s", JSON_$_POINTER, filePath.getFieldName()); List 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 //listLayers = readGcubeSDILayersForFileset(filesetJSONPath, fromSectionDocJSON); //theProfileBeanExt.set } theProfileBeanExt.setListFileset(listFiles); } 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); } } projectView.setTheProfileBeans(listOfProfilesBeanExt); //Geoportal_JSON_Mapper.prettyPrintProjectEdit(projectView); return projectView; } public static List cloneList(List list) { List listCloned = new ArrayList(list.size()); Function 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; } /** * 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 */ 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> 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 listFiles = new ArrayList(); List listImages = new ArrayList(); List listLayers = new ArrayList(); // Reading Fileset _payloads String filesetJSONPath = String.format("%s.%s", JSON_$_POINTER, FILESET); List 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); // Reading Fileset _materializations / layers listLayers = readGcubeSDILayersForFileset(filesetJSONPath, wholeSectionDoc); subDocumentView.setListLayers(listLayers); sectionView.addSubDocument(subDocumentView); projectView.addSectionView(sectionView); } } List 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 listBSONDocument = new ArrayList(); 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 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 filePaths = gcubeProfileDV.getFilePaths(); // READING fileset* field ACCORDING TO filePaths OF THE 'gcubeProfiles' CONFIG if (filePaths != null) { String fromSectionDocJSON = fromSectionDoc.toJson(); List listFiles = new ArrayList(); List listImages = new ArrayList(); List listLayers = new ArrayList(); for (FilePathDV filePath : filePaths) { // Reading Fileset _payloads String filesetJSONPath = String.format("%s.%s", JSON_$_POINTER, filePath.getFieldName()); List 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); subDocumentView.setListLayers(listLayers); } 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 */ public static List readPayloadsForFileset(String filesetJSONPath, String sectionJSONDocument) { LOG.debug("readPayloadsForFileset called"); List listPayloads = new ArrayList(); String _payloadsJSONPath = String.format("%s.%s", filesetJSONPath, _PAYLOADS); try { com.jayway.jsonpath.Configuration configuration = com.jayway.jsonpath.Configuration.builder() .jsonProvider(new JsonOrgJsonProvider()).build(); LOG.debug("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; } /** * Read images for fileset. * * @param parentJSONPath the parent JSON path * @param sectionJSONDocument the section JSON document * @param limitToFirstOneFound the limit to first one found * @return the list */ public static List readImagesForFileset(String parentJSONPath, String sectionJSONDocument, boolean limitToFirstOneFound) { LOG.info("readImagesForFileset called"); List listImages = new ArrayList(); 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.debug("Reading sectionPath {} into section document {}", filesetJSONPath, sectionJSONDocument); JsonPath theSectionPolycJsonPath = JsonPath.compile(filesetJSONPath); Object _filesets = theSectionPolycJsonPath.read(sectionJSONDocument, config); List payloads = new ArrayList(); List 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); if (limitToFirstOneFound && listImages.size() == 1) return listImages; } } LOG.debug("readImagesForFileset returning listOfImages: " + listImages); return listImages; } /** * Read gcube SDI layers for fileset. * * @param materializationParentJSONPath the materialization parent JSON path * @param sectionJSONDocument the section JSON document * @return the list */ public static List readGcubeSDILayersForFileset(String materializationParentJSONPath, String sectionJSONDocument) { LOG.info("readGcubeSDILayersForFileset called"); List listSDILayers = new ArrayList(); String _materializationsJSONPath = String.format("%s.%s", materializationParentJSONPath, _MATERIALIZATIONS); try { com.jayway.jsonpath.Configuration configurationJSONSmart = com.jayway.jsonpath.Configuration.builder() .jsonProvider(new JsonOrgJsonProvider()).build(); LOG.debug("Reading sectionPath {} into section document {}", _materializationsJSONPath, sectionJSONDocument); JsonPath theSectionPolycJsonPath = JsonPath.compile(_materializationsJSONPath); Object _materializations = theSectionPolycJsonPath.read(sectionJSONDocument, configurationJSONSmart); LOG.trace("_materializations.class(): " + _materializations.getClass()); listSDILayers = recursiveFetchingLayers(configurationJSONSmart, _materializations, listSDILayers); } catch (Exception e) { LOG.warn("Error on reading the JSON Path " + _materializationsJSONPath + " in the doc " + sectionJSONDocument, e); } LOG.info("returning list of layers {}", listSDILayers); return listSDILayers; } /** * Recursive fetching layers. * * @param config the config * @param objectJSON the object JSON * @param listSDILayers the list SDI layers * @return the list */ private static List recursiveFetchingLayers(com.jayway.jsonpath.Configuration config, Object objectJSON, List 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; } /** * Recursive fetching payloads. * * @param config the config * @param objectJSON the object JSON * @param payloads the payloads * @return the list */ public static List recursiveFetchingPayloads(com.jayway.jsonpath.Configuration config, Object objectJSON, List 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++) { payloads = recursiveFetchingPayloads(config, theJsonArray.get(i), payloads); } } 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) { LOG.warn("Error on converting the JSON Boject " + toStringPayloads + "as " + Payload.class.getSimpleName() + e.getMessage()); } } return payloads; } /** * Conver layer. * * @param config the config * @param thJsonObject the th json object * @return the g cube SDI viewer layer DV */ // 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); HashMap bbox = JsonPath.using(config).parse(toSerializeJSONOBJ).read(jsonPath, HashMap.class); BBOXDV bboxDV = new BBOXDV(bbox); gsdiLayer.setBbox(bboxDV); LOG.debug(_BBOX + " is: " + bboxDV); } catch (Exception e) { LOG.warn(jsonPath + " error: ", e); } try { jsonPath = String.format("%s.%s", JSON_$_POINTER, _OGC_LINKS); String jsonString = JsonPath.using(config).parse(toSerializeJSONOBJ).read(jsonPath).toString(); Gson gson = new Gson(); HashMap map = gson.fromJson(jsonString, HashMap.class); gsdiLayer.setOgcLinks(map); LOG.debug(_OGC_LINKS + " are: " + map); } catch (Exception e) { LOG.warn(jsonPath + " error: ", e); } try { String wmsLink = gsdiLayer.getWMSLink(); if (wmsLink != null) { String layerName = URLParserUtil.extractValueOfParameterFromURL("layers", wmsLink); gsdiLayer.setLayerName(layerName); } } catch (Exception e) { LOG.warn(jsonPath + " error: ", e); } LOG.debug("converLayer returning: " + gsdiLayer); return gsdiLayer; } /** * 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.info("checkAccessPolicy called"); // CHECKING THE POLICY //see ticket #24390 //First reading the access policy from the fileset String accessPolicyPath = JSON_$_POINTER + ".fileset._access._policy"; boolean isAccessible = true; try { com.jayway.jsonpath.Configuration configuration = com.jayway.jsonpath.Configuration.builder() .jsonProvider(new JsonOrgJsonProvider()).build(); LOG.debug("Reading access policy at {} into section document {}", accessPolicyPath, sectionDocumentJSON); String _policy = null; try { JsonPath theSectionPolycJsonPath = JsonPath.compile(accessPolicyPath); _policy = theSectionPolycJsonPath.read(sectionDocumentJSON, configuration).toString(); if(_policy==null) throw new Exception("Policy is null"); }catch (Exception e) { LOG.debug("Access policy not found in: "+accessPolicyPath); } //If policy does not exist into fileset, reading from the parent section if(_policy==null) { accessPolicyPath = JSON_$_POINTER + "._access._policy"; LOG.debug("Reading access policy at {} into section document {}", accessPolicyPath, sectionDocumentJSON); try { JsonPath theSectionPolycJsonPath = JsonPath.compile(accessPolicyPath); _policy = theSectionPolycJsonPath.read(sectionDocumentJSON, configuration).toString(); if(_policy==null) throw new Exception("Policy is null"); }catch (Exception e) { LOG.debug("Access policy not found in: "+accessPolicyPath); } } LOG.debug("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); } /** * Pretty print project view. * * @param projectView the project view */ 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); } } } 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); } } i++; } } } /** * 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; for (MetadataFieldWrapper fieldWrapper : mpb.getMetadataFields()) { System.out.println("## " + MetadataFieldWrapper.class.getSimpleName() + " n." + i); System.out.println("***** Metadata"); // System.out.println(mfw); System.out.println("\tfieldId: " + fieldWrapper.getFieldId() + ", fieldName: " + fieldWrapper.getFieldName() + ", CurrentValue: " + fieldWrapper.getCurrentValue()); i++; } i = 1; System.out.println("***** Files"); for (FilesetDV fileSet : mpb.getListFileset()) { System.out.println("## " + FilesetDV.class.getSimpleName() + " n." + i); System.out.println(fileSet); i++; } } } }