From 4a3f31a0d7163b2f387d55ea07ec0a2f300bd20e Mon Sep 17 00:00:00 2001 From: "francesco.mangiacrapa" Date: Fri, 2 Aug 2024 16:45:16 +0200 Subject: [PATCH] Added UploadItemProperties class --- .../server/WorkspaceUploadServletStream.java | 140 ++++++++++++------ .../server/upload/UploadItemProperties.java | 105 +++++++++++++ .../shared/UpladProperties.java | 58 -------- 3 files changed, 196 insertions(+), 107 deletions(-) create mode 100644 src/main/java/org/gcube/portlets/widgets/workspaceuploader/server/upload/UploadItemProperties.java delete mode 100644 src/main/java/org/gcube/portlets/widgets/workspaceuploader/shared/UpladProperties.java 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 728715a..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 @@ -34,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; @@ -49,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; @@ -120,6 +122,11 @@ public class WorkspaceUploadServletStream extends HttpServlet implements Servlet private static boolean appEngine = false; + /** + * Inits the. + * + * @throws ServletException the servlet exception + */ /* * (non-Javadoc) * @@ -244,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()); } } @@ -292,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(); @@ -300,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. * @@ -379,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. * @@ -534,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 size is: " + workspaceUploader.getFile().getFileSize()); - - if(fileSize==null) + logger.info("File size is: " + fileSize); + + if (fileSize == null) fileSize = requestContentLenght; // CONFIRM DESTINATION FOLDER @@ -712,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; @@ -793,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/UpladProperties.java b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/shared/UpladProperties.java deleted file mode 100644 index 31f4704..0000000 --- a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/shared/UpladProperties.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.gcube.portlets.widgets.workspaceuploader.shared; - -import java.io.Serializable; - -import org.gcube.portlets.widgets.workspaceuploader.client.ConstantsWorkspaceUploader; - -import com.fasterxml.jackson.annotation.JsonProperty; - -public class UpladProperties implements Serializable { - - /** - * - */ - private static final long serialVersionUID = -7226677146789586756L; - - @JsonProperty(value = ConstantsWorkspaceUploader.CLIENT_UPLOAD_FILEOBJ_FILENAME) - String filename; - @JsonProperty(value = ConstantsWorkspaceUploader.CLIENT_UPLOAD_FILEOBJ_FILESIZE) - Long filesize; - - public UpladProperties() { - - } - - public UpladProperties(String filename, Long filesize) { - super(); - this.filename = filename; - this.filesize = filesize; - } - - public String getFilename() { - return filename; - } - - public Long getFilesize() { - return filesize; - } - - public void setFilename(String filename) { - this.filename = filename; - } - - public void setFilesize(Long filesize) { - this.filesize = filesize; - } - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("UpladProperties [filename="); - builder.append(filename); - builder.append(", filesize="); - builder.append(filesize); - builder.append("]"); - return builder.toString(); - } - -}