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 3cd29ec..2ff6bb2 100644
--- a/.settings/org.eclipse.wst.common.component
+++ b/.settings/org.eclipse.wst.common.component
@@ -1,5 +1,5 @@
-
+
@@ -78,8 +78,10 @@
-
-
+
+
+
+
@@ -159,7 +161,8 @@
-
+
+
@@ -239,7 +242,8 @@
-
+
+
@@ -319,7 +323,8 @@
-
+
+
@@ -351,7 +356,11 @@
-
+
+ uses
+
+
+
@@ -431,7 +440,8 @@
-
+
+
@@ -511,7 +521,8 @@
-
+
+
@@ -591,7 +602,8 @@
-
+
+
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 701ee99..62c6031 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,13 @@
All notable changes to this project will be documented in this file.
This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## [v3.0.2-SNAPSHOT] - 2023-02-02
+
+#### Fixes
+
+- [#24520] Added parameter "force=true" to Delete Project
+- [#24475] Propagated the Access Policy in the fileset
+
## [v3.0.1] - 2023-01-19
#### Fixes
diff --git a/pom.xml b/pom.xml
index 5a0491e..c8fa3fd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -14,7 +14,7 @@
org.gcube.portlets.user
geoportal-data-entry-app
war
- 3.0.1
+ 3.0.2-SNAPSHOT
GeoPortal Data Entry App
The GeoPortal Data Entry App is an application to build the web forms for data entries needed to create projects/documents (based on UCD) in the D4Science Geoportal service
@@ -25,7 +25,7 @@
- 2.9.0
+ 2.10.0
${project.build.directory}/${project.build.finalName}
UTF-8
diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataentry/client/ui/relation/ViewRelationshipPanel.java b/src/main/java/org/gcube/portlets/user/geoportaldataentry/client/ui/relation/ViewRelationshipPanel.java
index ce9d4cc..7b878ed 100644
--- a/src/main/java/org/gcube/portlets/user/geoportaldataentry/client/ui/relation/ViewRelationshipPanel.java
+++ b/src/main/java/org/gcube/portlets/user/geoportaldataentry/client/ui/relation/ViewRelationshipPanel.java
@@ -140,7 +140,7 @@ public class ViewRelationshipPanel extends Composite {
secondProjectPanelContainer.clear();
this.fromTheProject = project;
- Entry firstEntrySet = project.getFirstEntryOfMap();
+ Entry firstEntrySet = project.getFirstEntryOfMap();
String htmlMsg = firstEntrySet.getKey() + ": " + firstEntrySet.getValue() + " (id: " + project.getId()
+ ")";
@@ -203,7 +203,7 @@ public class ViewRelationshipPanel extends Composite {
@Override
public void onSuccess(ResultDocumentDV result) {
mapOfTargetProjectForId.put(relationDV.getTargetUCD(), result);
- Entry firstEntrySet = result.getFirstEntryOfMap();
+ Entry firstEntrySet = result.getFirstEntryOfMap();
String htmlMsg = firstEntrySet.getKey() + ": " + firstEntrySet.getValue()
+ " (id: " + result.getId() + ")";
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 7246dfd..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;
@@ -610,7 +660,7 @@ public class GeoportalDataEntryServiceImpl extends RemoteServiceServlet implemen
ProjectsCaller client = GeoportalClientCaller.projects();
SessionUtil.getCurrentContext(getThreadLocalRequest(), true);
- client.deleteProject(profileID, projectID, false);
+ client.deleteProject(profileID, projectID, true);
// Updating count of Documents in session per profileID
Integer totalProjectForProfile = client.getTotalDocument(profileID);
SessionUtil.setTotalDocumentForProfileID(getThreadLocalRequest(), profileID, totalProjectForProfile);
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);