|
|
|
@ -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<String, String> mapKeys = parseJSONClientUploadKeys(jsonClientUploadKey);
|
|
|
|
|
listClientUploadKeys = new ArrayList<String>(mapKeys.keySet());
|
|
|
|
|
|
|
|
|
|
LinkedHashMap<String, UploadItemProperties> theMapOfUploadingFiles = parseJSONClientMapUploadPropertyFiles(
|
|
|
|
|
jsonClientUploadKey);
|
|
|
|
|
listClientUploadKeys = new ArrayList<String>(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<String, UploadItemProperties> parseJSONClientMapUploadPropertyFiles(
|
|
|
|
|
final String jsonClientUploadKeys) throws FileUploadException {
|
|
|
|
|
JSONTokener tokener = new JSONTokener(jsonClientUploadKeys);
|
|
|
|
|
JSONObject root;
|
|
|
|
|
LinkedHashMap<String, UploadItemProperties> keyFiles = null;
|
|
|
|
|
ObjectMapper objectMapper = new ObjectMapper();
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
|
|
root = new JSONObject(tokener);
|
|
|
|
|
JSONArray jsonArray = root.getJSONArray(JSON_CLIENT_KEYS);
|
|
|
|
|
keyFiles = new LinkedHashMap<String, UploadItemProperties>(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<String> 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<String> 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
|
|
|
|
|