//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"; // // public static final String _TYPE_GCUBE_SDI_LAYER = "gcube-sdi-layer"; // // 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.setGcubeProfileFieldName(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.setGcubeProfileFieldName(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.setGcubeProfileFieldName(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); // if(LOG.isDebugEnabled()) { // for (Payload payload : listPayloads) { // LOG.debug("read payload: " + payload); // } // } // // FilesetDV filesetImages = new FilesetDV(); // FilesetDV filesetFiles = new FilesetDV(); // // for (Payload payload : listPayloads) { // PayloadDV payloadDV = ConvertToDataValueObjectModel.toPayloadDV(payload); // //filesetDV.addPayloadDV(payloadDV); // boolean isImage = ImageDetector.isImage(payload.getMimetype()); // // if (isImage) { // filesetImages.setGcubeProfileFieldName(filePath.getGcubeProfileFieldName()); // filesetImages.addPayloadDV(payloadDV); // } else { // filesetFiles.addPayloadDV(payloadDV); // filesetFiles.setGcubeProfileFieldName(filePath.getGcubeProfileFieldName()); // } // } // // //Setting only if one element exists // if(filesetImages.getListPayload()!=null && filesetImages.getListPayload().size()>0) { // listImages.add(filesetImages); // } // if(filesetFiles.getListPayload()!=null && filesetFiles.getListPayload().size()>0) { // listFiles.add(filesetFiles); // } // // // Reading Fileset _materializations // listLayers = readGcubeSDILayersForFileset(filesetJSONPath, fromSectionDocJSON); // // } // subDocumentView.setListFiles(listFiles); // subDocumentView.setListImages(listImages); // subDocumentView.setListLayers(listLayers); // } // // sectionView.addSubDocument(subDocumentView); // // } // // projectView.addSectionView(sectionView); // } // // LOG.debug("returning the projectView: " + projectView); // 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(); // // _materializations AT THE MOMENT ARE ONLY OF TYPE gcube-sdi-layer. I'm adding // // the filtering "_type": "gcube-sdi-layer" to be sure of reading SDI layer // String _materializationsJSONPath = String.format("%s.%s[?(@._type=='%s')]", materializationParentJSONPath, // _MATERIALIZATIONS, _TYPE_GCUBE_SDI_LAYER); // // [?(@._access._policy=='%s')] // // try { // com.jayway.jsonpath.Configuration configurationJSONSmart = com.jayway.jsonpath.Configuration.builder() // .jsonProvider(new JsonOrgJsonProvider()).build(); // // LOG.debug("GcubeSDILayers Reading sectionPath {} into section document {}", _materializationsJSONPath, // sectionJSONDocument); // // JsonPath theSectionMaterializationJsonPath = JsonPath.compile(_materializationsJSONPath); // Object _materializations = theSectionMaterializationJsonPath.read(sectionJSONDocument, // configurationJSONSmart); // // LOG.trace("_materializations.class(): " + _materializations.getClass()); // // listSDILayers = recursiveFetchingLayers(configurationJSONSmart, _materializations, listSDILayers); // // } catch (Exception e) { // LOG.debug("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.debug("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.debug("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 // */ // public 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("It is {} accessible the section {} accessible? {}", isAccessible, sectionDocumentJSON); // 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, toString.trim()); // } 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.getGcubeProfileFieldName()); // 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.getGcubeProfileFieldName()); // 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++; // } // // } // } // //}