From 6f77cf23e9ce0c606443c2f64a52a9d2bd10ec11 Mon Sep 17 00:00:00 2001 From: "francesco.mangiacrapa" Date: Fri, 3 Feb 2023 11:42:06 +0100 Subject: [PATCH] [#24475] Done --- .classpath | 4 +- .../com.gwtplugins.gdt.eclipse.core.prefs | 2 +- .settings/org.eclipse.wst.common.component | 5 +- .../server/GeoportalDataEntryServiceImpl.java | 88 +++++++++++++++---- .../server/MongoServiceUtil.java | 4 +- 5 files changed, 76 insertions(+), 27 deletions(-) diff --git a/.classpath b/.classpath index acb7f4e..7822be0 100644 --- a/.classpath +++ b/.classpath @@ -1,6 +1,6 @@ - + @@ -31,5 +31,5 @@ - + diff --git a/.settings/com.gwtplugins.gdt.eclipse.core.prefs b/.settings/com.gwtplugins.gdt.eclipse.core.prefs index b4717b0..cddf7a1 100644 --- a/.settings/com.gwtplugins.gdt.eclipse.core.prefs +++ b/.settings/com.gwtplugins.gdt.eclipse.core.prefs @@ -1,5 +1,5 @@ eclipse.preferences.version=1 jarsExcludedFromWebInfLib= -lastWarOutDir=/home/francescomangiacrapa/git/geoportal-data-entry-app/target/geoportal-data-entry-app-3.0.1 +lastWarOutDir=/home/francescomangiacrapa/git/geoportal-data-entry-app/target/geoportal-data-entry-app-3.0.2-SNAPSHOT warSrcDir=src/main/webapp warSrcDirIsOutput=false diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component index 37bfc8d..2ff6bb2 100644 --- a/.settings/org.eclipse.wst.common.component +++ b/.settings/org.eclipse.wst.common.component @@ -79,7 +79,7 @@ - + @@ -356,9 +356,6 @@ - - uses - uses diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataentry/server/GeoportalDataEntryServiceImpl.java b/src/main/java/org/gcube/portlets/user/geoportaldataentry/server/GeoportalDataEntryServiceImpl.java index 2b2fda7..6816c84 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataentry/server/GeoportalDataEntryServiceImpl.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataentry/server/GeoportalDataEntryServiceImpl.java @@ -21,11 +21,14 @@ import org.apache.commons.io.FileUtils; import org.bson.Document; import org.gcube.application.geoportal.client.utils.Serialization; import org.gcube.application.geoportal.common.model.document.Project; +import org.gcube.application.geoportal.common.model.document.access.Access; +import org.gcube.application.geoportal.common.model.document.access.AccessPolicy; import org.gcube.application.geoportal.common.model.document.lifecycle.LifecycleInformation; import org.gcube.application.geoportal.common.model.rest.TempFile; import org.gcube.application.geoportal.common.model.useCaseDescriptor.RelationshipDefinition; import org.gcube.application.geoportal.common.model.useCaseDescriptor.UseCaseDescriptor; import org.gcube.application.geoportal.common.utils.StorageUtils; +import org.gcube.application.geoportalcommon.ConvertToDataServiceModel; import org.gcube.application.geoportalcommon.ConvertToDataValueObjectModel; import org.gcube.application.geoportalcommon.GeoportalCommon; import org.gcube.application.geoportalcommon.ProjectDVBuilder; @@ -76,6 +79,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.gwt.user.server.rpc.RemoteServiceServlet; +import com.jayway.jsonpath.JsonPath; +import com.jayway.jsonpath.spi.json.JsonOrgJsonProvider; /** * The server side implementation of the RPC service. @@ -238,6 +243,8 @@ public class GeoportalDataEntryServiceImpl extends RemoteServiceServlet implemen sectionJSONPathIndexer = new HashMap(); } + String theJSONDocument = theProject.getTheDocument().toJson(); + for (Tree_Node treeNodeChild_GNA_DO : tree_Node.getChildren()) { LOG.debug("Going to upload the files of tree node: " + treeNodeChild_GNA_DO); @@ -330,20 +337,23 @@ public class GeoportalDataEntryServiceImpl extends RemoteServiceServlet implemen File[] fileset = uploadedFileset.getFileset(); FilePathDV filePath = uploadedFileset.getFilePathDV(); + Access access; // If the maxOccurs is not 1 if (profile.getMaxOccurs() == 0 || profile.getMaxOccurs() > 1) { LOG.info("The gCube Profile with the section " + sectionJSONPath + " has maxOccurs > 1 need to manage it as array, going to add the array index"); String arraySectionJSONPAth = String.format("%s[%d]", sectionJSONPath, jpcV); LOG.debug("registering the fileset in the array section: " + sectionJSONPath); + + access = ConvertToDataServiceModel.getAccessFromDocumentSection(theJSONDocument,arraySectionJSONPAth); mongoService.registerFileSet(profileID, theProject, arraySectionJSONPAth, - filePath.getFieldName(), filePath.getFieldDefinition(), fileset); + filePath.getFieldName(), filePath.getFieldDefinition(), access, fileset); } else { LOG.info("The gCube Profile with the section " + sectionJSONPath + " has maxOccurs = 1"); LOG.debug("registering the fileset in the section: " + sectionJSONPath); - + access = ConvertToDataServiceModel.getAccessFromDocumentSection(theJSONDocument,sectionJSONPath); mongoService.registerFileSet(profileID, theProject, sectionJSONPath, filePath.getFieldName(), - filePath.getFieldDefinition(), fileset); + filePath.getFieldDefinition(), access, fileset); } } @@ -358,6 +368,46 @@ public class GeoportalDataEntryServiceImpl extends RemoteServiceServlet implemen } + public Access getAccessFromDocumentSection(String theJSONDocument, String sectionJSONPath) { + String accessPolicyPath = String.format("%s.%s", sectionJSONPath, ConvertToDataValueObjectModel.POLICY); + AccessPolicy accessPolicy = AccessPolicy.OPEN; + com.jayway.jsonpath.Configuration config = com.jayway.jsonpath.Configuration.builder() + .jsonProvider(new JsonOrgJsonProvider()).build(); + + // Reading policy fields + try { + JsonPath theSectionPolycJsonPath = JsonPath.compile(accessPolicyPath); + String policy = theSectionPolycJsonPath.read(theJSONDocument, config).toString(); + LOG.debug("Read " + ConvertToDataValueObjectModel.POLICY + ": " + policy + ", from section: " + + accessPolicyPath); + if (policy != null) { + accessPolicy = AccessPolicy.valueOf(policy.toUpperCase()); + } + } catch (Exception e) { + LOG.info("No " + ConvertToDataValueObjectModel.POLICY + "found in the path: " + accessPolicyPath); + } + + // Reading policy fields + String licenseIDPath = String.format("%s.%s", sectionJSONPath, ConvertToDataValueObjectModel.LICENSE_ID); + String licenseID = null; + try { + JsonPath theSectionLicenseJsonPath = JsonPath.compile(licenseIDPath); + licenseID = theSectionLicenseJsonPath.read(theJSONDocument, config).toString(); + LOG.debug("Read " + ConvertToDataValueObjectModel.LICENSE_ID + ": " + licenseID + ", from section: " + + theSectionLicenseJsonPath); + } catch (Exception e) { + LOG.info("No " + ConvertToDataValueObjectModel.LICENSE_ID + "found in the path: " + licenseIDPath); + } + + Access access = new Access(); + access.setPolicy(accessPolicy); + if (licenseID != null) + access.setLicense(licenseID); + + LOG.info("Access is: " + access); + return access; + } + /** * Creates the temp file on storage. * @@ -521,26 +571,26 @@ public class GeoportalDataEntryServiceImpl extends RemoteServiceServlet implemen searchedData.setTotalItems(totalProjectForProfile); LOG.info("Total Docs read from config: " + totalProjectForProfile); - + // Saving client PROJECTION LinkedHashMap originalProjection = filter.getProjection(); int totalItems = totalProjectForProfile; - //PERFORMING FIRST QUERY FOR IDS IF AND ONLY IF WHERE CONDITIONS IN THE QUERY. - //SEARCHING FACILITY IS ENACTING. - if(filter.getConditions()!=null) { - + // PERFORMING FIRST QUERY FOR IDS IF AND ONLY IF WHERE CONDITIONS IN THE QUERY. + // SEARCHING FACILITY IS ENACTING. + if (filter.getConditions() != null) { + // Setting PROJECTION ONLY FOR PROEJCT ID LinkedHashMap projectionForIDs = new LinkedHashMap(); projectionForIDs.put(Project.ID, 1); filter.setProjection(projectionForIDs); - + // FIRST QUERY TO RETRIEVE IDs // LIMIT IS NULL MEANS THAT IT IS EQUAL TO NUMBER TOTAL OF DOCUMENTS - //Calculating always the size starting from 0 + // Calculating always the size starting from 0 final Iterator projectsIDs = client.queryOnMongo(theProfileID, totalProjectForProfile, 0, null, filter); - - //Getting the Project IDs from the Iterable + + // Getting the Project IDs from the Iterable Iterable itP = () -> projectsIDs; Stream targetStream = StreamSupport.stream(itP.spliterator(), false); List listProjectIDs = targetStream.map(Project::getId).collect(Collectors.toList()); @@ -548,13 +598,12 @@ public class GeoportalDataEntryServiceImpl extends RemoteServiceServlet implemen searchedData.setTotalItems(totalItems); LOG.info("Total Docs read from query per ID: " + totalItems); } - - //NOW PERFORMING THE (REAL) SECOND QUERY FROM CLIENT + + // NOW PERFORMING THE (REAL) SECOND QUERY FROM CLIENT // SETTING ORIGINAL PROJECTION FROM CLIENT filter.setProjection(originalProjection); // LIMIT IS FROM CLIENT - Iterator projects = client.queryOnMongo(theProfileID, totalItems, start, limit, - filter); + Iterator projects = client.queryOnMongo(theProfileID, totalItems, start, limit, filter); searchedData.setClientStartIndex(start); searchedData.setLimit(limit); @@ -562,9 +611,10 @@ public class GeoportalDataEntryServiceImpl extends RemoteServiceServlet implemen List toReturnList = ConvertToDataValueObjectModel.toListResultDocument(projects); searchedData.setData(toReturnList); - - LOG.info("Total Docs page size returned:" + toReturnList.size() + ", start: " + start + ", limit: " + limit); - + + LOG.info( + "Total Docs page size returned:" + toReturnList.size() + ", start: " + start + ", limit: " + limit); + if (totalProjectForProfile == limit || totalProjectForProfile == 0) { LOG.debug("Page completed returning " + totalProjectForProfile + " projects"); int newOffset = start + limit; diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataentry/server/MongoServiceUtil.java b/src/main/java/org/gcube/portlets/user/geoportaldataentry/server/MongoServiceUtil.java index 2ccf937..7494cf8 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataentry/server/MongoServiceUtil.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataentry/server/MongoServiceUtil.java @@ -15,6 +15,7 @@ import org.bson.Document; import org.gcube.application.geoportal.client.utils.Serialization; import org.gcube.application.geoportal.common.faults.InvalidRequestException; import org.gcube.application.geoportal.common.model.document.Project; +import org.gcube.application.geoportal.common.model.document.access.Access; import org.gcube.application.geoportal.common.model.rest.RegisterFileSetRequest; import org.gcube.application.geoportal.common.model.rest.TempFile; import org.gcube.application.geoportal.common.rest.MongoConcessioni; @@ -63,7 +64,7 @@ public class MongoServiceUtil { } public void registerFileSet(String profileID, Project project, String parentPath, String fieldName, - String fieldDefinition, File... files) + String fieldDefinition, Access access, File... files) throws RemoteException, FileNotFoundException, JsonProcessingException, InvalidRequestException { LOG.debug("registerFileSet called for profileID: " + profileID); @@ -71,6 +72,7 @@ public class MongoServiceUtil { // Prepare request RegisterFileSetRequest fsRequest = FileSets.prepareRequest(new StorageUtils(), parentPath, fieldName, fieldDefinition, files); + fsRequest.setToSetAccess(access); project = client.registerFileSet(project.getId(), fsRequest); LOG.trace("Resulting Project : " + project);