diff --git a/CHANGELOG.md b/CHANGELOG.md index 7dac2b2..f8fdad2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm ## [v2.1.1-SNAPSHOT] - 2024-07-29 - [#27898] Updated `uploadFile` and `uploadArchive` methods. They include the `fileSize` parameter +- [#27934] Updated the data structure to handle asynchronous uploading of multiple files ## [v2.1.0] - 2022-05-03 diff --git a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/client/ConstantsWorkspaceUploader.java b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/client/ConstantsWorkspaceUploader.java index 1ccb1ff..78d59b3 100644 --- a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/client/ConstantsWorkspaceUploader.java +++ b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/client/ConstantsWorkspaceUploader.java @@ -32,6 +32,8 @@ public class ConstantsWorkspaceUploader { public static final String UPLOAD_FORM_ELEMENT = "uploadFormElement"; public static final String CLIENT_UPLOAD_KEYS = "client_upload_keys"; + public static final String CLIENT_UPLOAD_FILEOBJ_FILENAME = "filename"; + public static final String CLIENT_UPLOAD_FILEOBJ_FILESIZE= "filesize"; public static final String CANCEL_UPLOAD = "cancel_upload"; public static final String JSON_CLIENT_KEYS = "ClientKeys"; diff --git a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/client/uploader/MultipleDilaogUpload.java b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/client/uploader/MultipleDilaogUpload.java index f9472c4..21c444b 100644 --- a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/client/uploader/MultipleDilaogUpload.java +++ b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/client/uploader/MultipleDilaogUpload.java @@ -15,11 +15,15 @@ import org.gcube.portlets.widgets.workspaceuploader.shared.WorkspaceUploaderItem import org.gcube.portlets.widgets.workspaceuploader.shared.WorkspaceUploaderItem.UPLOAD_STATUS; import com.google.gwt.core.client.GWT; +import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeHandler; import com.google.gwt.json.client.JSONArray; +import com.google.gwt.json.client.JSONNumber; import com.google.gwt.json.client.JSONObject; +import com.google.gwt.json.client.JSONParser; import com.google.gwt.json.client.JSONString; +import com.google.gwt.json.client.JSONValue; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.FormPanel.SubmitCompleteEvent; import com.google.gwt.user.client.ui.FormPanel.SubmitCompleteHandler; @@ -88,37 +92,45 @@ public class MultipleDilaogUpload extends DialogUpload { * @param parentId the parent id * @return the list */ - public void generateFakeUploaders(String filesSelected, String parentId) { + public void generateFakeUploaders(JSONArray filesSelected, String parentId) { - if (filesSelected == null || filesSelected.isEmpty()) + if (filesSelected == null || filesSelected.size() == 0) return; - String[] files = filesSelected.split(FILE_DELEMITER); + // String[] files = filesSelected.split(FILE_DELEMITER); // NORMALIZE FILE NAMES - for (int i = 0; i < files.length; i++) { - String normalizedFileName = files[i]; + for (int i = 0; i < filesSelected.size(); i++) { + JSONObject fileObject = (JSONObject) filesSelected.get(i); + GWT.log("checking filename for: " + fileObject.getJavaScriptObject().toString()); + String normalizedFileName = fileObject.get("filename").isString().stringValue(); if (normalizedFileName.contains("\\")) { - files[i] = normalizedFileName.substring(normalizedFileName.lastIndexOf("\\") + 1); // remove C:\fakepath - // if exists + String sanitizedValue = normalizedFileName.substring(normalizedFileName.lastIndexOf("\\") + 1); // remove + // C:\fakepath + // if exists + JSONValue jsonValue = JSONParser.parseStrict(sanitizedValue); + fileObject.put("filename", jsonValue); + filesSelected.set(i, fileObject); } } - GWT.log("generating fake uploaders on: " + Arrays.asList(files.toString())); - fakeUploaders = new ArrayList(files.length); - for (int i = 0; i < files.length; i++) { + fakeUploaders = new ArrayList(filesSelected.size()); + for (int i = 0; i < filesSelected.size(); i++) { + JSONObject fileObject = (JSONObject) filesSelected.get(i); WorkspaceUploaderItem fakeItem = new WorkspaceUploaderItem(); fakeItem.setClientUploadKey(GenerateUUID.get()); fakeItem.setUploadStatus(UPLOAD_STATUS.WAIT); WorkspaceUploadFile fakeFile = new WorkspaceUploadFile(); - fakeFile.setFileName(files[i]); + String fileName = fileObject.get("filename").isString().stringValue(); + Long fileSize = (long) fileObject.get("size").isNumber().doubleValue(); + fakeFile.setFileName(fileName); + fakeFile.setFileSize(fileSize); fakeFile.setParentId(parentId); fakeItem.setFile(fakeFile); fakeUploaders.add(fakeItem); } GWT.log("fakeUploaders generated: " + fakeUploaders.toString()); -// return fakeUploaders; } /* @@ -198,17 +210,20 @@ public class MultipleDilaogUpload extends DialogUpload { return; } - String[] files = null; GWT.log("Current Uploader has id: " + fileUploadID); - String filesSelected = getFilesSelected(fileUploadID, FILE_DELEMITER); - GWT.log("getFilesSelected: " + filesSelected); - files = filesSelected.split(FILE_DELEMITER); + JavaScriptObject filesSelected = getFilesSelected(fileUploadID); + + JSONArray jsonArray = new JSONArray(filesSelected); + if(jsonArray!=null) + GWT.log("sono array"); + + GWT.log("getFilesSelected: " + jsonArray); - if (isLimitExceeded(files.length)) + if (isLimitExceeded(jsonArray.size())) return; // GENERATE NEW UPLOADERS - generateFakeUploaders(filesSelected, parentIdentifier); + generateFakeUploaders(jsonArray, parentIdentifier); GWT.log(fakeUploaders.toString()); createJsonKeyForFiles(); GWT.log(jsonKeys); @@ -279,7 +294,11 @@ public class MultipleDilaogUpload extends DialogUpload { for (int i = 0; i < fakeUploaders.size(); i++) { WorkspaceUploaderItem file = fakeUploaders.get(i); JSONObject obj = new JSONObject(); - obj.put(file.getClientUploadKey(), new JSONString(file.getFile().getFileName())); + JSONObject fileObject = new JSONObject(); + //Feature #27934 + fileObject.put(ConstantsWorkspaceUploader.CLIENT_UPLOAD_FILEOBJ_FILENAME, new JSONString(file.getFile().getFileName())); + fileObject.put(ConstantsWorkspaceUploader.CLIENT_UPLOAD_FILEOBJ_FILESIZE, new JSONNumber(file.getFile().getFileSize())); + obj.put(file.getClientUploadKey(), fileObject); jsonArray.set(i, obj); } @@ -352,16 +371,20 @@ public class MultipleDilaogUpload extends DialogUpload { * @param fileDelimiter the file delimiter * @return the files selected */ - public static native String getFilesSelected(final String tagId, final String fileDelimiter) /*-{ + public static native JavaScriptObject getFilesSelected(final String tagId) /*-{ var count = $wnd.$("#" + tagId)[0].files.length; - console.log(count); - var out = ""; + console.log("number of files: "+count); + var outputs = []; for (i = 0; i < count; i++) { var file = $wnd.$("#" + tagId)[0].files[i]; - // out += file.name + fileDelimiter + file.size + fileDelimiter; - out += file.name + fileDelimiter; + //out += file.name + fileDelimiter + file.size + fileDelimiter; + var the_file = { "filename": file.name, "size": file.size }; + //var jsonString = JSON.stringify(the_file); + //console.log("the file is: "+jsonString); + outputs.push(the_file); } - return out; + console.log("returning outputs: "+outputs); + return outputs; }-*/; } diff --git a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/client/uploader/WorkspaceFieldsUploadManager.java b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/client/uploader/WorkspaceFieldsUploadManager.java index 33ca521..02d7b4d 100644 --- a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/client/uploader/WorkspaceFieldsUploadManager.java +++ b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/client/uploader/WorkspaceFieldsUploadManager.java @@ -14,24 +14,25 @@ import org.gcube.portlets.widgets.workspaceuploader.shared.WorkspaceUploaderItem import com.google.gwt.core.client.GWT; import com.google.gwt.json.client.JSONArray; +import com.google.gwt.json.client.JSONNumber; import com.google.gwt.json.client.JSONObject; +import com.google.gwt.json.client.JSONParser; import com.google.gwt.json.client.JSONString; +import com.google.gwt.json.client.JSONValue; import com.google.gwt.user.client.Window; /** * The Class WorkspaceFieldsUpload. * - * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it - * Oct 20, 2015 + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it Oct 20, 2015 */ public class WorkspaceFieldsUploadManager { - //FORM FIELD TO UPLOAD INTO WORKSPACE + // FORM FIELD TO UPLOAD INTO WORKSPACE private String jsonKeys; public static final String FILE_DELEMITER = ";"; private List fakeUploaders = new ArrayList(); - public WorkspaceFieldsUploadManager() { } @@ -41,12 +42,10 @@ public class WorkspaceFieldsUploadManager { * @param numbOfFiles the numb of files * @return true, if is limit exceeded */ - public boolean isLimitExceeded(int numbOfFiles){ + public boolean isLimitExceeded(int numbOfFiles) { if (numbOfFiles > ConstantsWorkspaceUploader.LIMIT_UPLOADS) { - Window.alert("Multiple upload limit is " - + ConstantsWorkspaceUploader.LIMIT_UPLOADS - + " files"); + Window.alert("Multiple upload limit is " + ConstantsWorkspaceUploader.LIMIT_UPLOADS + " files"); return true; } @@ -56,18 +55,18 @@ public class WorkspaceFieldsUploadManager { /** * Adds the new submit to monitor. */ - public void addNewSubmitToMonitor(){ + public void addNewSubmitToMonitor() { GWT.log("addNewSubmitToMonitor..."); int queueIndex = UploaderMonitor.getInstance().newQueue(); for (final WorkspaceUploaderItem workspaceUploaderItem : fakeUploaders) { - UploaderMonitor.getInstance().addNewUploaderToMonitorPanel(workspaceUploaderItem, workspaceUploaderItem.getFile().getFileName()); + UploaderMonitor.getInstance().addNewUploaderToMonitorPanel(workspaceUploaderItem, + workspaceUploaderItem.getFile().getFileName()); UploaderMonitor.getInstance().addNewUploaderToQueue(queueIndex, workspaceUploaderItem); // UploaderMonitor.getInstance().pollWorkspaceUploader(workspaceUploaderItem); } UploaderMonitor.getInstance().doStartPollingQueue(queueIndex); } - /** * Creates the json key for files. * @@ -84,12 +83,20 @@ public class WorkspaceFieldsUploadManager { for (int i = 0; i < fakeUploaders.size(); i++) { WorkspaceUploaderItem file = fakeUploaders.get(i); JSONObject obj = new JSONObject(); - obj.put(file.getClientUploadKey(), new JSONString(file.getFile().getFileName())); + JSONObject fileObject = new JSONObject(); + // Feature #27934 + fileObject.put(ConstantsWorkspaceUploader.CLIENT_UPLOAD_FILEOBJ_FILENAME, + new JSONString(file.getFile().getFileName())); + fileObject.put(ConstantsWorkspaceUploader.CLIENT_UPLOAD_FILEOBJ_FILESIZE, + new JSONNumber(file.getFile().getFileSize())); + obj.put(file.getClientUploadKey(), fileObject); + // obj.put(file.getClientUploadKey(), new + // JSONString(file.getFile().getFileName())); jsonArray.set(i, obj); } jsonKeys = productObj.toString(); - GWT.log("updated jsonKeys: "+jsonKeys); + GWT.log("updated jsonKeys: " + jsonKeys); } catch (Exception e) { GWT.log("error " + e.getMessage()); jsonKeys = null; @@ -100,44 +107,48 @@ public class WorkspaceFieldsUploadManager { * Generate new upload client keys. * * @param filesSelected the files selected - * @param parentId the parent id + * @param parentId the parent id * @return the list */ - public void generateFakeUploaders(String filesSelected, String parentId) { + public void generateFakeUploaders(JSONArray filesSelected, String parentId) { - if(filesSelected==null || filesSelected.isEmpty()) + if (filesSelected == null || filesSelected.size() == 0) return; - String[] files = filesSelected.split(FILE_DELEMITER); - // NORMALIZE FILE NAMES - for (int i = 0; i < files.length; i++) { - String normalizedFileName = files[i]; + for (int i = 0; i < filesSelected.size(); i++) { + JSONObject fileObject = (JSONObject) filesSelected.get(i); + GWT.log("checking filename for: " + fileObject.getJavaScriptObject().toString()); + String normalizedFileName = fileObject.get("filename").isString().stringValue(); if (normalizedFileName.contains("\\")) { - files[i] = normalizedFileName.substring(normalizedFileName.lastIndexOf("\\") + 1); // remove - // C:\fakepath\ - // if - // exists + String sanitizedValue = normalizedFileName.substring(normalizedFileName.lastIndexOf("\\") + 1); // remove + // C:\fakepath + // if exists + JSONValue jsonValue = JSONParser.parseStrict(sanitizedValue); + fileObject.put("filename", jsonValue); + filesSelected.set(i, fileObject); } } - GWT.log("generating fake uploaders on: "+Arrays.asList(files).toString()); - fakeUploaders = new ArrayList(files.length); - for (int i = 0; i < files.length; i++) { + fakeUploaders = new ArrayList(filesSelected.size()); + for (int i = 0; i < filesSelected.size(); i++) { + JSONObject fileObject = (JSONObject) filesSelected.get(i); WorkspaceUploaderItem fakeItem = new WorkspaceUploaderItem(); fakeItem.setClientUploadKey(GenerateUUID.get()); fakeItem.setUploadStatus(UPLOAD_STATUS.WAIT); WorkspaceUploadFile fakeFile = new WorkspaceUploadFile(); - fakeFile.setFileName(files[i]); + String fileName = fileObject.get("filename").isString().stringValue(); + Long fileSize = (long) fileObject.get("size").isNumber().doubleValue(); + fakeFile.setFileName(fileName); + fakeFile.setFileSize(fileSize); fakeFile.setParentId(parentId); fakeItem.setFile(fakeFile); fakeUploaders.add(fakeItem); } - GWT.log("fakeUploaders generated: "+fakeUploaders.toString()); + GWT.log("fakeUploaders generated: " + fakeUploaders.toString()); } - /** * @return the jsonKeys */ diff --git a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/client/uploader/dragdrop/MultipleDNDUpload.java b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/client/uploader/dragdrop/MultipleDNDUpload.java index c6fb5df..5741302 100644 --- a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/client/uploader/dragdrop/MultipleDNDUpload.java +++ b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/client/uploader/dragdrop/MultipleDNDUpload.java @@ -14,7 +14,9 @@ import org.gcube.portlets.widgets.workspaceuploader.client.WorkspaceUploaderList import org.gcube.portlets.widgets.workspaceuploader.client.uploader.DialogUpload.UPLOAD_TYPE; import org.gcube.portlets.widgets.workspaceuploader.client.uploader.WorkspaceFieldsUploadManager; +import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.shared.GWT; +import com.google.gwt.json.client.JSONArray; import com.google.gwt.user.client.Random; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.HTML; @@ -252,9 +254,10 @@ public class MultipleDNDUpload extends LayoutPanel implements HasWorskpaceUpload * @param uploadUUID * the upload uuid */ - private void generateFakeUploaders(String filesSelected, String parentId, String uploadUUID) { + private void generateFakeUploaders(JavaScriptObject filesSelected, String parentId, String uploadUUID) { WorkspaceFieldsUploadManager field = getFieldsUploadManager(uploadUUID); - field.generateFakeUploaders(filesSelected, parentId); + JSONArray jsonArray = new JSONArray(filesSelected); + field.generateFakeUploaders(jsonArray, parentId); } @@ -607,14 +610,15 @@ public class MultipleDNDUpload extends LayoutPanel implements HasWorskpaceUpload console.log("# of file/s: " + files.length); - var filesSelected = ""; - + var arrayFileSelected = []; for (i = 0; i < files.length; i++) { - filesSelected += files[i].name + fileDelimiter; + var file = files[i]; + var the_file = { "filename": file.name, "size": file.size }; + arrayFileSelected.push(the_file); } - console.log("filesSelected: " + filesSelected); + console.log("Object arrayFileSelected: " + arrayFileSelected); - instance.@org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload::generateFakeUploaders(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)(filesSelected,idfolder,uploadUUID); + instance.@org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload::generateFakeUploaders(Lcom/google/gwt/core/client/JavaScriptObject;Ljava/lang/String;Ljava/lang/String;)(arrayFileSelected,idfolder,uploadUUID); instance.@org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload::createJsonKeyForFiles(Ljava/lang/String;)(uploadUUID); instance.@org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload::updateJsonKeys(Ljava/lang/String;)(uploadUUID); instance.@org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload::setCurrentJsonKeValue(Ljava/lang/String;)(uploadUUID); @@ -657,10 +661,9 @@ public class MultipleDNDUpload extends LayoutPanel implements HasWorskpaceUpload var numFolder = 0; for (var i = 0; i < files.length; i++) { var file = files[i]; - var fileSelected = files[i].name + fileDelimiter; if (!isFolder(file)) { - console.log("fileSelected: " + fileSelected); - console.log("files: " + files); + console.log("fileSelected: " + file.name); + //console.log("files: " + files); formdata.append("isOverwrite", true); formdata.append('uploadFormElement', file); }else{ @@ -668,6 +671,7 @@ public class MultipleDNDUpload extends LayoutPanel implements HasWorskpaceUpload } } + xhr.send(formdata); instance.@org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload::addNewSubmitToMonitor(Ljava/lang/String;)(uploadUUID); @@ -686,6 +690,8 @@ public class MultipleDNDUpload extends LayoutPanel implements HasWorskpaceUpload instance.@org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload::showAlert(Ljava/lang/String;)(msg); } instance.@org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload::reset()(); + + }); // Tells the browser that we *can* drop on this target // addEventHandler(drop, 'dragover', cancel); diff --git a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/server/WorkspaceUploadServletStream.java b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/server/WorkspaceUploadServletStream.java index 9620be9..171efd3 100644 --- a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/server/WorkspaceUploadServletStream.java +++ b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/server/WorkspaceUploadServletStream.java @@ -9,7 +9,6 @@ import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; -import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -25,7 +24,6 @@ import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.commons.fileupload.FileItemFactory; -import org.apache.commons.fileupload.FileItemHeaders; import org.apache.commons.fileupload.FileItemIterator; import org.apache.commons.fileupload.FileItemStream; import org.apache.commons.fileupload.FileUploadBase; @@ -36,6 +34,7 @@ import org.apache.commons.fileupload.util.Streams; import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.Validate; +import org.gcube.com.fasterxml.jackson.databind.ObjectMapper; import org.gcube.common.portal.PortalContext; import org.gcube.common.storagehub.model.items.FolderItem; import org.gcube.common.storagehub.model.items.Item; @@ -51,6 +50,7 @@ import org.gcube.portlets.widgets.workspaceuploader.client.ConstantsWorkspaceUpl import org.gcube.portlets.widgets.workspaceuploader.server.notification.NotificationsWorkspaceUploader; import org.gcube.portlets.widgets.workspaceuploader.server.notification.NotificationsWorkspaceUploaderProducer; import org.gcube.portlets.widgets.workspaceuploader.server.upload.AbstractUploadProgressListener; +import org.gcube.portlets.widgets.workspaceuploader.server.upload.UploadItemProperties; import org.gcube.portlets.widgets.workspaceuploader.server.upload.MemoryUploadListener; import org.gcube.portlets.widgets.workspaceuploader.server.upload.UploadCanceledException; import org.gcube.portlets.widgets.workspaceuploader.server.upload.UploadProgressInputStream; @@ -122,6 +122,11 @@ public class WorkspaceUploadServletStream extends HttpServlet implements Servlet private static boolean appEngine = false; + /** + * Inits the. + * + * @throws ServletException the servlet exception + */ /* * (non-Javadoc) * @@ -246,16 +251,20 @@ public class WorkspaceUploadServletStream extends HttpServlet implements Servlet if (item.isFormField() && CLIENT_UPLOAD_KEYS.equals(item.getFieldName())) { String jsonClientUploadKey = Streams.asString(item.openStream()); logger.debug("CLIENT_UPLOAD_KEY OK " + jsonClientUploadKey); - LinkedHashMap mapKeys = parseJSONClientUploadKeys(jsonClientUploadKey); - listClientUploadKeys = new ArrayList(mapKeys.keySet()); + + LinkedHashMap theMapOfUploadingFiles = parseJSONClientMapUploadPropertyFiles( + jsonClientUploadKey); + listClientUploadKeys = new ArrayList(theMapOfUploadingFiles.keySet()); removeListenersIfDone(session, listClientUploadKeys); for (String clientUploadKey : listClientUploadKeys) { - String fileName = mapKeys.get(clientUploadKey); + UploadItemProperties uip = theMapOfUploadingFiles.get(clientUploadKey); + String filename = uip.getFilename(); + Long filesize = uip.getFilesize(); WorkspaceUploaderItem workspaceUploader = createNewWorkspaceUploader(clientUploadKey, - destinationId, mapKeys.get(clientUploadKey), isOverwrite); + destinationId, filename, filesize, isOverwrite); logger.debug("created " + workspaceUploader); saveWorkspaceUploaderStatus(workspaceUploader, UPLOAD_STATUS.WAIT, - "Uploading " + fileName + " at 0%", request.getSession()); + "Uploading " + filename + " at 0%", request.getSession()); } } @@ -294,6 +303,14 @@ public class WorkspaceUploadServletStream extends HttpServlet implements Servlet } } + /** + * Coy stream to file. + * + * @param in the in + * @param fileExtension the file extension + * @return the file + * @throws IOException Signals that an I/O exception has occurred. + */ public File coyStreamToFile(InputStream in, String fileExtension) throws IOException { File tempFile = File.createTempFile(UUID.randomUUID().toString(), fileExtension); tempFile.deleteOnExit(); @@ -302,25 +319,6 @@ public class WorkspaceUploadServletStream extends HttpServlet implements Servlet return tempFile; } -// public static InputStream clone(final InputStream inputStream) { -// try { -// inputStream.mark(0); -// ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); -// byte[] buffer = new byte[1024]; -// int readLength = 0; -// while ((readLength = inputStream.read(buffer)) != -1) { -// outputStream.write(buffer, 0, readLength); -// } -// inputStream.reset(); -// outputStream.flush(); -// return new ByteArrayInputStream(outputStream.toByteArray()); -// } -// catch (Exception ex) { -// ex.printStackTrace(); -// } -// return null; -// } - /** * Removes the listener if done. * @@ -381,6 +379,53 @@ public class WorkspaceUploadServletStream extends HttpServlet implements Servlet return keyFiles; } + /** + * Parses the JSON client map upload property files. + * + * @param jsonClientUploadKeys the json client upload keys + * @return the linked hash map + * @throws FileUploadException the file upload exception + */ + @SuppressWarnings("rawtypes") + private static LinkedHashMap parseJSONClientMapUploadPropertyFiles( + final String jsonClientUploadKeys) throws FileUploadException { + JSONTokener tokener = new JSONTokener(jsonClientUploadKeys); + JSONObject root; + LinkedHashMap keyFiles = null; + ObjectMapper objectMapper = new ObjectMapper(); + try { + + root = new JSONObject(tokener); + JSONArray jsonArray = root.getJSONArray(JSON_CLIENT_KEYS); + keyFiles = new LinkedHashMap(jsonArray.length()); + logger.debug("jsonArray :" + jsonArray.toString()); + for (int i = 0; i < jsonArray.length(); i++) { + JSONObject object = jsonArray.getJSONObject(i); + logger.debug("object :" + object); + String key = (String) object.keys().next(); + String value = object.getString(key); + UploadItemProperties uploadRequest; + try { + uploadRequest = objectMapper.readValue(value, UploadItemProperties.class); + logger.debug("key :" + key + ", value: " + uploadRequest); + keyFiles.put(key, uploadRequest); + } catch (IOException e) { + String theError = "Serialization issue on: " + key; + logger.error(theError, e); + throw new JSONException(theError); + } + + } + + } catch (JSONException e) { + logger.error("An error occurred during parsing file names: " + keyFiles, e); + throw new FileUploadException("An error occurred during parsing file names"); + } + + logger.debug("keyFiles: " + keyFiles); + return keyFiles; + } + /** * Upload data. * @@ -536,31 +581,24 @@ public class WorkspaceUploadServletStream extends HttpServlet implements Servlet logger.debug("purged item name is: " + itemName); // HttpServletRequest size long requestContentLenght = getContentLength(request); - logger.info( - "HttpServletRequest " + FileUploadBase.CONTENT_LENGTH + "/size is: " + requestContentLenght); + logger.info("HttpServletRequest " + FileUploadBase.CONTENT_LENGTH + "/size is: " + requestContentLenght); - Long fileSize = null; - FileItemHeaders itemHeaders = uploadItem.getHeaders(); - if (itemHeaders != null) { - Iterator headerNames = uploadItem.getHeaders().getHeaderNames(); - while(headerNames.hasNext()) { - String headerName = headerNames.next(); - logger.info("headerName: "+headerName +" value: "+itemHeaders.getHeader(headerName)); - } - - String contentLength = itemHeaders.getHeader(FileUploadBase.CONTENT_LENGTH); - if (contentLength != null) { - try { - fileSize = Long.parseLong(contentLength); - } catch (Exception e) { - logger.warn("Error on getting fileSize", e); - } - } - } + Long fileSize = workspaceUploader.getFile().getFileSize(); + /* + * FileItemHeaders itemHeaders = uploadItem.getHeaders(); if (itemHeaders != + * null) { Iterator headerNames = + * uploadItem.getHeaders().getHeaderNames(); while(headerNames.hasNext()) { + * String headerName = headerNames.next(); logger.info("headerName: "+headerName + * +" value: "+itemHeaders.getHeader(headerName)); } + * + * String contentLength = itemHeaders.getHeader(FileUploadBase.CONTENT_LENGTH); + * if (contentLength != null) { try { fileSize = Long.parseLong(contentLength); + * } catch (Exception e) { logger.warn("Error on getting fileSize", e); } } } + */ - logger.info("File " + FileUploadBase.CONTENT_LENGTH + "/size is: " + fileSize); - - if(fileSize==null) + logger.info("File size is: " + fileSize); + + if (fileSize == null) fileSize = requestContentLenght; // CONFIRM DESTINATION FOLDER @@ -714,16 +752,19 @@ public class WorkspaceUploadServletStream extends HttpServlet implements Servlet * @param clientUploadKey the client upload key * @param folderParentId the folder parent id * @param fileName the file name + * @param filesize * @param isOverwrite the is overwrite * @return the workspace uploader item */ private WorkspaceUploaderItem createNewWorkspaceUploader(String clientUploadKey, String folderParentId, - String fileName, boolean isOverwrite) { + String fileName, Long filesize, boolean isOverwrite) { // CLIENT UPLOAD IS THE KEY WorkspaceUploaderItem workspaceUploader = new WorkspaceUploaderItem(clientUploadKey); workspaceUploader.setClientUploadKey(clientUploadKey); // Create File WorkspaceUploadFile wsUploadFile = new WorkspaceUploadFile(folderParentId, null, fileName, null); + wsUploadFile.setFileSize(filesize); + workspaceUploader.setFile(wsUploadFile); workspaceUploader.setIsOverwrite(isOverwrite); return workspaceUploader; @@ -795,7 +836,6 @@ public class WorkspaceUploadServletStream extends HttpServlet implements Servlet * @param scopeGroupId the scope group id * @param request the request * @param httpSession the http session - * @param workspace the workspace * @param itemId the item id * @param destinationFolderId the destination folder id * @param isOverwrite the is overwrite diff --git a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/server/upload/UploadItemProperties.java b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/server/upload/UploadItemProperties.java new file mode 100644 index 0000000..7fcedad --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/server/upload/UploadItemProperties.java @@ -0,0 +1,105 @@ +package org.gcube.portlets.widgets.workspaceuploader.server.upload; + +import java.io.Serializable; + +import org.gcube.portlets.widgets.workspaceuploader.client.ConstantsWorkspaceUploader; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * The Class UploadItemProperties. + * + * contains properties sent from client for any file uploaded + * + * @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it + * + * Aug 1, 2024 + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class UploadItemProperties implements Serializable { + + /** + * + */ + private static final long serialVersionUID = -7226677146789586756L; + + @JsonProperty(ConstantsWorkspaceUploader.CLIENT_UPLOAD_FILEOBJ_FILENAME) + private String filename; + @JsonProperty(ConstantsWorkspaceUploader.CLIENT_UPLOAD_FILEOBJ_FILESIZE) + private Long filesize; + + /** + * Instantiates a new upload item properties. + */ + public UploadItemProperties() { + + } + + /** + * Instantiates a new upload item properties. + * + * @param filename the filename + * @param filesize the filesize + */ + public UploadItemProperties(String filename, Long filesize) { + super(); + this.filename = filename; + this.filesize = filesize; + } + + /** + * Gets the filename. + * + * @return the filename + */ + @JsonProperty(ConstantsWorkspaceUploader.CLIENT_UPLOAD_FILEOBJ_FILENAME) + public String getFilename() { + return filename; + } + + /** + * Gets the filesize. + * + * @return the filesize + */ + @JsonProperty(ConstantsWorkspaceUploader.CLIENT_UPLOAD_FILEOBJ_FILESIZE) + public Long getFilesize() { + return filesize; + } + + /** + * Sets the filename. + * + * @param filename the new filename + */ + public void setFilename(String filename) { + this.filename = filename; + } + + /** + * Sets the filesize. + * + * @param filesize the new filesize + */ + public void setFilesize(Long filesize) { + this.filesize = filesize; + } + + /** + * To string. + * + * @return the string + */ + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("UploadItemProperties [filename="); + builder.append(filename); + builder.append(", filesize="); + builder.append(filesize); + builder.append("]"); + return builder.toString(); + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/shared/WorkspaceUploadFile.java b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/shared/WorkspaceUploadFile.java index b21f6a0..ca9bdd0 100644 --- a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/shared/WorkspaceUploadFile.java +++ b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/shared/WorkspaceUploadFile.java @@ -22,6 +22,7 @@ public class WorkspaceUploadFile implements Serializable{ private String fileName; private String itemId; private String versionName; + private Long fileSize; /** * Instantiates a new workspace upload file. @@ -128,6 +129,20 @@ public class WorkspaceUploadFile implements Serializable{ public void setFileName(String fileName) { this.fileName = fileName; } + + + + public Long getFileSize() { + return fileSize; + } + + + + public void setFileSize(Long fileSize) { + this.fileSize = fileSize; + } + + /* * (non-Javadoc) @@ -145,12 +160,8 @@ public class WorkspaceUploadFile implements Serializable{ - /* (non-Javadoc) - * @see java.lang.Object#toString() - */ @Override public String toString() { - StringBuilder builder = new StringBuilder(); builder.append("WorkspaceUploadFile [parentId="); builder.append(parentId); @@ -160,10 +171,10 @@ public class WorkspaceUploadFile implements Serializable{ builder.append(itemId); builder.append(", versionName="); builder.append(versionName); + builder.append(", fileSize="); + builder.append(fileSize); builder.append("]"); return builder.toString(); } - - }