Project publication with fileset implemented

This commit is contained in:
Francesco Mangiacrapa 2022-08-05 12:44:33 +02:00
parent 3ab1f5c89c
commit a0f3bc915c
4 changed files with 165 additions and 78 deletions

View File

@ -0,0 +1,49 @@
package org.gcube.portlets.user.geoportaldataentry.server;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.gcube.application.geoportalcommon.shared.geoportal.config.FilePathDV;
public class FileSetDataObject {
private FilePathDV filePathDV;
private List<File> files = new ArrayList<File>();
public FileSetDataObject() {
}
public void setFilePathDV(FilePathDV filePath) {
this.filePathDV = filePath;
}
public void addFile(File file) {
files.add(file);
}
public File[] getFileset() {
File[] arr = new File[files.size()];
arr = files.toArray(arr);
return arr;
}
public FilePathDV getFilePathDV() {
return filePathDV;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("FileSetDataObject [filePathDV.getFieldName()=");
builder.append(filePathDV.getFieldName());
builder.append(", files size=");
builder.append(files.size());
builder.append("]");
return builder.toString();
}
}

View File

@ -2,7 +2,6 @@ package org.gcube.portlets.user.geoportaldataentry.server;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
@ -29,7 +28,7 @@ import com.jayway.jsonpath.spi.json.JsonOrgJsonProvider;
*/
public class FormDataObjectToJSON {
private static final String JSON_$_POINTER = "$";
public static final String JSON_$_POINTER = "$";
private static final Logger LOG = LoggerFactory.getLogger(FormDataObjectToJSON.class);
/**
@ -63,23 +62,23 @@ public class FormDataObjectToJSON {
LOG.debug("The profile is: " + profile);
// Building JSON/section full PATH and section name
String fullJSONPath = "";
String parentFullName = profile.getParentName() == null ? "" : profile.getParentName();
String sectionJSONPath = "";
String parentPathFromProfile = profile.getParentName() == null ? "" : profile.getParentName();
String theSectionName = profile.getSectionName();
if (theSectionName.compareTo(JSON_$_POINTER) == 0 || theSectionName.compareTo(JSON_$_POINTER + ".") == 0) {
fullJSONPath = JSON_$_POINTER;
sectionJSONPath = JSON_$_POINTER;
theSectionName = "";
} else {
fullJSONPath = String.format("%s%s",
parentFullName.endsWith(".") ? parentFullName : parentFullName + ".", theSectionName);
sectionJSONPath = String.format("%s%s",
parentPathFromProfile.endsWith(".") ? parentPathFromProfile : parentPathFromProfile + ".", theSectionName);
}
LOG.debug("The json path to build: " + fullJSONPath);
LOG.debug("The sectionJSONPath is: " + sectionJSONPath);
LOG.info("Current document is: " + theRootDocument);
// Building Parent PATH
String parentPath = fullJSONPath.compareTo(JSON_$_POINTER) == 0 ? JSON_$_POINTER
: fullJSONPath.substring(0, fullJSONPath.lastIndexOf("."));
String parentPath = sectionJSONPath.compareTo(JSON_$_POINTER) == 0 ? JSON_$_POINTER
: sectionJSONPath.substring(0, sectionJSONPath.lastIndexOf("."));
JsonPath parentJSONPath = JsonPath.compile(parentPath);
LOG.info("Putting into parentJSONPath: " + parentJSONPath);
@ -90,10 +89,10 @@ public class FormDataObjectToJSON {
if (profile.getMaxOccurs() == 0 || profile.getMaxOccurs() > 1) {
LOG.debug("maxOccurs is NOT 1");
// Must be an array
boolean pathExists = pathExists(theRootDocument, fullJSONPath + "[*]");
LOG.debug(fullJSONPath+ "exists? "+pathExists);
boolean pathExists = pathExists(theRootDocument, sectionJSONPath + "[*]");
LOG.debug(sectionJSONPath+ "exists? "+pathExists);
if (pathExists) {
theRootDocument = JsonPath.parse(theRootDocument, configuration).add(fullJSONPath, jsonObject)
theRootDocument = JsonPath.parse(theRootDocument, configuration).add(sectionJSONPath, jsonObject)
.json();
} else {
// Adding as array of object

View File

@ -42,7 +42,6 @@ import org.gcube.application.geoportalcommon.shared.products.content.WorkspaceCo
import org.gcube.application.geoportalcommon.shared.products.paths.FileSetPathsDV;
import org.gcube.common.portal.PortalContext;
import org.gcube.portlets.user.geoportaldataentry.client.ConstantsGeoPortalDataEntryApp.RECORD_TYPE;
import org.gcube.portlets.user.geoportaldataentry.server.FormDataObjectToJSON.JSONObjecOrdered;
import org.gcube.portlets.user.geoportaldataentry.client.GeoportalDataEntryService;
import org.gcube.portlets.user.geoportaldataentry.client.ProjectFormCard;
import org.gcube.portlets.user.geoportaldataentry.shared.CommitReport;
@ -59,8 +58,6 @@ import org.gcube.vomanagement.usermanagement.exception.UserRetrievalFault;
import org.gcube.vomanagement.usermanagement.impl.LiferayRoleManager;
import org.gcube.vomanagement.usermanagement.model.GCubeRole;
import org.gcube.vomanagement.usermanagement.model.GCubeUser;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -148,81 +145,87 @@ public class GeoportalDataEntryServiceImpl extends RemoteServiceServlet implemen
// Uploading files
LOG.debug("Going to upload the files");
uploadFileset(tree_Node);
/*for (Tree_Node<GeoNaFormDataObject> geoNaFormDataObject : tree_Node.getChildren()) {
List<GenericDatasetBean> listGDB = geoNaFormDataObject.getListGDB();
GcubeProfileDV profile = geoNaFormDataObject.getGcubeProfileDV();
String parentPath = String.format("%s%s", profile.getParentName(), profile.getSectionName());
LOG.info("The profile is: " + profile);
for (GenericDatasetBean gdb : listGDB) {
List<FileUploaded> files = gdb.getFilesUploaded();
if (files.size() > 0) {
LOG.info("Uploading file/s in the parentPath: " + parentPath);
for (int i = 0; i < files.size(); i++) {
FileUploaded file = files.get(i);
String formFieldName = file.getFilePath().getFormFieldLabel();
LOG.debug(
"Uploading file: " + file.getFileName() + ", from formFieldName: " + formFieldName);
FilePathDV filePath = retrieveFilePathForGcubeProfileFieldName(formFieldName, profile);
LOG.info("Found {} for the form fieldName {}", filePath, formFieldName);
if (filePath == null) {
String error = "It is not possible to register the file " + formFieldName
+ ", missing configuration in the filePaths config of: " + profile;
throw new Exception(error);
}
mongoService.registerFileSet(profileID, theProject, new File(file.getTempSystemPath()),
parentPath, filePath.getFieldName(), filePath.getFieldDefinition());
}
}
}
}
LifecycleInformation lifecycleInfo = theProject.getLifecycleInformation();
LifecycleInformationDV liDV = ConvertToDataValueObjectModel.toLifecycleInformationDV(lifecycleInfo);
return new CommitReport(theProject.getId(), liDV);
*/
throw new Exception("Must be implemented!!!!");
recursiveUploadFileset(mongoService, profileID, theProject, tree_Node, null);
} catch (Exception e) {
LOG.error("Error on uploading files: ", e);
throw new Exception(
"Error occurred on uploading files, try again or contact the support. Error: " + e.getMessage());
}
try {
LifecycleInformation lifecycleInfo = theProject.getLifecycleInformation();
LifecycleInformationDV liDV = ConvertToDataValueObjectModel.toLifecycleInformationDV(lifecycleInfo);
return new CommitReport(theProject.getId(), liDV);
} catch (Exception e) {
throw new Exception("Error occurred on loading LifecycleInformation for the project: " + theProject.getId()
+ ". Error: " + e.getMessage());
}
}
/**
* Upload fileset.
* Recursive upload fileset.
*
* @param tree_Node the tree node
* @param mongoService the mongo service
* @param profileID the profile ID
* @param theProject the the project
* @param tree_Node the tree node
* @param sectionJSONPathIndexer the json path indexer
* @throws Exception the exception
*/
public void uploadFileset(Tree_Node<GeoNaFormDataObject> tree_Node) throws Exception {
public void recursiveUploadFileset(MongoServiceUtil mongoService, String profileID, Project theProject,
Tree_Node<GeoNaFormDataObject> tree_Node, Map<String, Integer> sectionJSONPathIndexer) throws Exception {
LOG.debug("recursiveUploadFileset called [tree_Node: " + tree_Node + "], [jsonPathIndexer: "
+ sectionJSONPathIndexer + "]");
// Uploading files
LOG.debug("Going to upload the files");
for (Tree_Node<GeoNaFormDataObject> treeNodeChild_GNAFormDataObject : tree_Node.getChildren()) {
List<GenericDatasetBean> listGDB = treeNodeChild_GNAFormDataObject.getData().getListGDB();
GcubeProfileDV profile = treeNodeChild_GNAFormDataObject.getData().getGcubeProfileDV();
if (tree_Node == null)
return;
String parentPath = profile.getParentName().endsWith(".") ? profile.getParentName()
: profile.getParentName() + ".";
String jsonPathExp = String.format("%s%s", parentPath, profile.getSectionName());
LOG.debug("The json path to build: " + jsonPathExp);
if (sectionJSONPathIndexer == null) {
sectionJSONPathIndexer = new HashMap<String, Integer>();
}
for (Tree_Node<GeoNaFormDataObject> treeNodeChild_GNA_DO : tree_Node.getChildren()) {
LOG.debug("Going to upload the files of tree node: " + treeNodeChild_GNA_DO);
// list GDB has always one element in the current implementation. One GDB per
// web-form/profile
List<GenericDatasetBean> listGDB = treeNodeChild_GNA_DO.getData().getListGDB();
GcubeProfileDV profile = treeNodeChild_GNA_DO.getData().getGcubeProfileDV();
// Building JSON/section full PATH and section name
String sectionJSONPath = "";
String parentPathIntoProfile = profile.getParentName() == null ? "" : profile.getParentName();
String theSectionName = profile.getSectionName();
if (theSectionName.compareTo(FormDataObjectToJSON.JSON_$_POINTER) == 0
|| theSectionName.compareTo(FormDataObjectToJSON.JSON_$_POINTER + ".") == 0) {
sectionJSONPath = FormDataObjectToJSON.JSON_$_POINTER;
theSectionName = "";
} else {
sectionJSONPath = String.format("%s%s",
parentPathIntoProfile.endsWith(".") ? parentPathIntoProfile : parentPathIntoProfile + ".",
theSectionName);
}
LOG.debug("The sectionJSONPath is: " + sectionJSONPath);
Integer jpcV = sectionJSONPathIndexer.get(sectionJSONPath);
if (jpcV == null) {
jpcV = 0;
sectionJSONPathIndexer.put(sectionJSONPath, jpcV);
} else {
jpcV = jpcV + 1;
sectionJSONPathIndexer.put(sectionJSONPath, jpcV);
}
LOG.debug("sectionJSONPathIndexer is: " + sectionJSONPathIndexer);
LOG.info("The profile is: " + profile);
for (GenericDatasetBean gdb : listGDB) {
Map<String, FileSetDataObject> collectFilesetPerFieldDef = new HashMap<String, FileSetDataObject>();
List<FileUploaded> files = gdb.getFilesUploaded();
if (files.size() > 0) {
LOG.info("Uploading file/s in the parentPath: " + jsonPathExp);
// Iterating on the files upload for the section
for (int i = 0; i < files.size(); i++) {
FileUploaded file = files.get(i);
String formFieldName = file.getFilePath().getFormFieldLabel();
@ -235,13 +238,49 @@ public class GeoportalDataEntryServiceImpl extends RemoteServiceServlet implemen
throw new Exception(error);
}
// mongoService.registerFileSet(profileID, theProject, new File(file.getTempSystemPath()),
// parentPath, filePath.getFieldName(), filePath.getFieldDefinition());
// Collecting Fileset per Field Definition
FileSetDataObject collFieldDef = collectFilesetPerFieldDef.get(filePath.getFieldDefinition());
if (collFieldDef == null) {
collFieldDef = new FileSetDataObject();
collFieldDef.setFilePathDV(filePath);
}
collFieldDef.addFile(new File(file.getTempSystemPath()));
collectFilesetPerFieldDef.put(filePath.getFieldDefinition(), collFieldDef);
}
}
uploadFileset(treeNodeChild_GNAFormDataObject);
LOG.info("Cluster of fileset per fieldDefinition is: " + collectFilesetPerFieldDef);
for (String fieldDefinition : collectFilesetPerFieldDef.keySet()) {
FileSetDataObject uploadedFileset = collectFilesetPerFieldDef.get(fieldDefinition);
LOG.info("Uploading fileset: " + uploadedFileset);
File[] fileset = uploadedFileset.getFileset();
FilePathDV filePath = uploadedFileset.getFilePathDV();
// 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);
mongoService.registerFileSet(profileID, theProject, arraySectionJSONPAth,
filePath.getFieldName(), filePath.getFieldDefinition(), fileset);
} else {
LOG.info("The gCube Profile with the section " + sectionJSONPath + " has maxOccurs = 1");
LOG.debug("registering the fileset in the section: " + sectionJSONPath);
mongoService.registerFileSet(profileID, theProject, sectionJSONPath, filePath.getFieldName(),
filePath.getFieldDefinition(), fileset);
}
}
recursiveUploadFileset(mongoService, profileID, theProject, treeNodeChild_GNA_DO,
sectionJSONPathIndexer);
}
}

View File

@ -68,14 +68,14 @@ public class MongoServiceUtil {
return project;
}
public void registerFileSet(String profileID, Project project, File theFile, String parentPath, String fieldName,
String fieldDefinition) throws RemoteException, FileNotFoundException, JsonProcessingException, InvalidRequestException {
public void registerFileSet(String profileID, Project project, String parentPath, String fieldName,
String fieldDefinition, File... files) throws RemoteException, FileNotFoundException, JsonProcessingException, InvalidRequestException {
LOG.debug("registerFileSet called for profileID: " + profileID);
Projects<Project> client = getProjectsClient(profileID);
// Prepare request
RegisterFileSetRequest fsRequest = FileSets.prepareRequest(new StorageUtils(), parentPath, fieldName,
fieldDefinition, theFile);
fieldDefinition, files);
project = client.registerFileSet(project.getId(), fsRequest);
LOG.trace("Resulting Project : " + project);
LOG.debug("Resulting Project as JSON: " + Serialization.write(project));