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.lang.reflect.Field;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
@ -29,7 +28,7 @@ import com.jayway.jsonpath.spi.json.JsonOrgJsonProvider;
*/ */
public class FormDataObjectToJSON { public class FormDataObjectToJSON {
private static final String JSON_$_POINTER = "$"; public static final String JSON_$_POINTER = "$";
private static final Logger LOG = LoggerFactory.getLogger(FormDataObjectToJSON.class); private static final Logger LOG = LoggerFactory.getLogger(FormDataObjectToJSON.class);
/** /**
@ -63,23 +62,23 @@ public class FormDataObjectToJSON {
LOG.debug("The profile is: " + profile); LOG.debug("The profile is: " + profile);
// Building JSON/section full PATH and section name // Building JSON/section full PATH and section name
String fullJSONPath = ""; String sectionJSONPath = "";
String parentFullName = profile.getParentName() == null ? "" : profile.getParentName(); String parentPathFromProfile = profile.getParentName() == null ? "" : profile.getParentName();
String theSectionName = profile.getSectionName(); String theSectionName = profile.getSectionName();
if (theSectionName.compareTo(JSON_$_POINTER) == 0 || theSectionName.compareTo(JSON_$_POINTER + ".") == 0) { if (theSectionName.compareTo(JSON_$_POINTER) == 0 || theSectionName.compareTo(JSON_$_POINTER + ".") == 0) {
fullJSONPath = JSON_$_POINTER; sectionJSONPath = JSON_$_POINTER;
theSectionName = ""; theSectionName = "";
} else { } else {
fullJSONPath = String.format("%s%s", sectionJSONPath = String.format("%s%s",
parentFullName.endsWith(".") ? parentFullName : parentFullName + ".", theSectionName); 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); LOG.info("Current document is: " + theRootDocument);
// Building Parent PATH // Building Parent PATH
String parentPath = fullJSONPath.compareTo(JSON_$_POINTER) == 0 ? JSON_$_POINTER String parentPath = sectionJSONPath.compareTo(JSON_$_POINTER) == 0 ? JSON_$_POINTER
: fullJSONPath.substring(0, fullJSONPath.lastIndexOf(".")); : sectionJSONPath.substring(0, sectionJSONPath.lastIndexOf("."));
JsonPath parentJSONPath = JsonPath.compile(parentPath); JsonPath parentJSONPath = JsonPath.compile(parentPath);
LOG.info("Putting into parentJSONPath: " + parentJSONPath); LOG.info("Putting into parentJSONPath: " + parentJSONPath);
@ -90,10 +89,10 @@ public class FormDataObjectToJSON {
if (profile.getMaxOccurs() == 0 || profile.getMaxOccurs() > 1) { if (profile.getMaxOccurs() == 0 || profile.getMaxOccurs() > 1) {
LOG.debug("maxOccurs is NOT 1"); LOG.debug("maxOccurs is NOT 1");
// Must be an array // Must be an array
boolean pathExists = pathExists(theRootDocument, fullJSONPath + "[*]"); boolean pathExists = pathExists(theRootDocument, sectionJSONPath + "[*]");
LOG.debug(fullJSONPath+ "exists? "+pathExists); LOG.debug(sectionJSONPath+ "exists? "+pathExists);
if (pathExists) { if (pathExists) {
theRootDocument = JsonPath.parse(theRootDocument, configuration).add(fullJSONPath, jsonObject) theRootDocument = JsonPath.parse(theRootDocument, configuration).add(sectionJSONPath, jsonObject)
.json(); .json();
} else { } else {
// Adding as array of object // 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.application.geoportalcommon.shared.products.paths.FileSetPathsDV;
import org.gcube.common.portal.PortalContext; import org.gcube.common.portal.PortalContext;
import org.gcube.portlets.user.geoportaldataentry.client.ConstantsGeoPortalDataEntryApp.RECORD_TYPE; 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.GeoportalDataEntryService;
import org.gcube.portlets.user.geoportaldataentry.client.ProjectFormCard; import org.gcube.portlets.user.geoportaldataentry.client.ProjectFormCard;
import org.gcube.portlets.user.geoportaldataentry.shared.CommitReport; 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.impl.LiferayRoleManager;
import org.gcube.vomanagement.usermanagement.model.GCubeRole; import org.gcube.vomanagement.usermanagement.model.GCubeRole;
import org.gcube.vomanagement.usermanagement.model.GCubeUser; import org.gcube.vomanagement.usermanagement.model.GCubeUser;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -148,81 +145,87 @@ public class GeoportalDataEntryServiceImpl extends RemoteServiceServlet implemen
// Uploading files // Uploading files
LOG.debug("Going to upload the files"); LOG.debug("Going to upload the files");
uploadFileset(tree_Node); recursiveUploadFileset(mongoService, profileID, theProject, tree_Node, null);
/*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!!!!");
} catch (Exception e) { } catch (Exception e) {
LOG.error("Error on uploading files: ", e); LOG.error("Error on uploading files: ", e);
throw new Exception( throw new Exception(
"Error occurred on uploading files, try again or contact the support. Error: " + e.getMessage()); "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 * @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 if (tree_Node == null)
LOG.debug("Going to upload the files"); return;
for (Tree_Node<GeoNaFormDataObject> treeNodeChild_GNAFormDataObject : tree_Node.getChildren()) {
List<GenericDatasetBean> listGDB = treeNodeChild_GNAFormDataObject.getData().getListGDB();
GcubeProfileDV profile = treeNodeChild_GNAFormDataObject.getData().getGcubeProfileDV();
String parentPath = profile.getParentName().endsWith(".") ? profile.getParentName() if (sectionJSONPathIndexer == null) {
: profile.getParentName() + "."; sectionJSONPathIndexer = new HashMap<String, Integer>();
String jsonPathExp = String.format("%s%s", parentPath, profile.getSectionName()); }
LOG.debug("The json path to build: " + jsonPathExp);
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); LOG.info("The profile is: " + profile);
for (GenericDatasetBean gdb : listGDB) { for (GenericDatasetBean gdb : listGDB) {
Map<String, FileSetDataObject> collectFilesetPerFieldDef = new HashMap<String, FileSetDataObject>();
List<FileUploaded> files = gdb.getFilesUploaded(); List<FileUploaded> files = gdb.getFilesUploaded();
if (files.size() > 0) { 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++) { for (int i = 0; i < files.size(); i++) {
FileUploaded file = files.get(i); FileUploaded file = files.get(i);
String formFieldName = file.getFilePath().getFormFieldLabel(); String formFieldName = file.getFilePath().getFormFieldLabel();
@ -235,13 +238,49 @@ public class GeoportalDataEntryServiceImpl extends RemoteServiceServlet implemen
throw new Exception(error); throw new Exception(error);
} }
// mongoService.registerFileSet(profileID, theProject, new File(file.getTempSystemPath()), // Collecting Fileset per Field Definition
// parentPath, filePath.getFieldName(), filePath.getFieldDefinition()); 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; return project;
} }
public void registerFileSet(String profileID, Project project, File theFile, String parentPath, String fieldName, public void registerFileSet(String profileID, Project project, String parentPath, String fieldName,
String fieldDefinition) throws RemoteException, FileNotFoundException, JsonProcessingException, InvalidRequestException { String fieldDefinition, File... files) throws RemoteException, FileNotFoundException, JsonProcessingException, InvalidRequestException {
LOG.debug("registerFileSet called for profileID: " + profileID); LOG.debug("registerFileSet called for profileID: " + profileID);
Projects<Project> client = getProjectsClient(profileID); Projects<Project> client = getProjectsClient(profileID);
// Prepare request // Prepare request
RegisterFileSetRequest fsRequest = FileSets.prepareRequest(new StorageUtils(), parentPath, fieldName, RegisterFileSetRequest fsRequest = FileSets.prepareRequest(new StorageUtils(), parentPath, fieldName,
fieldDefinition, theFile); fieldDefinition, files);
project = client.registerFileSet(project.getId(), fsRequest); project = client.registerFileSet(project.getId(), fsRequest);
LOG.trace("Resulting Project : " + project); LOG.trace("Resulting Project : " + project);
LOG.debug("Resulting Project as JSON: " + Serialization.write(project)); LOG.debug("Resulting Project as JSON: " + Serialization.write(project));