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 59fc3ff..fc16a8b 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 @@ -4,6 +4,7 @@ package org.gcube.portlets.widgets.workspaceuploader.client.uploader; import java.util.ArrayList; +import java.util.Arrays; import org.gcube.portlets.widgets.workspaceuploader.client.ConstantsWorkspaceUploader; import org.gcube.portlets.widgets.workspaceuploader.client.DialogResult; @@ -104,7 +105,7 @@ public class MultipleDilaogUpload extends DialogUpload { } } - GWT.log("generating fake uploaders on: "+files.toString()); + GWT.log("generating fake uploaders on: "+Arrays.asList(files.toString())); fakeUploaders = new ArrayList(files.length); for (int i = 0; i < files.length; i++) { WorkspaceUploaderItem fakeItem = new WorkspaceUploaderItem(); @@ -169,6 +170,7 @@ public class MultipleDilaogUpload extends DialogUpload { } } } + }); formPanel.addSubmitHandler(new SubmitHandler() { @@ -195,11 +197,11 @@ public class MultipleDilaogUpload extends DialogUpload { } String[] files = null; + GWT.log("Current Uploader has id: "+fileUploadID); String filesSelected = getFilesSelected(fileUploadID, FILE_DELEMITER); -// GWT.log("getFilesSelected: " + filesSelected); + GWT.log("getFilesSelected: " + filesSelected); files = filesSelected.split(FILE_DELEMITER); - if(isLimitExceeded(files.length)) return; @@ -261,6 +263,8 @@ public class MultipleDilaogUpload extends DialogUpload { } }); + + } diff --git a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/client/uploader/UploaderProgressView.java b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/client/uploader/UploaderProgressView.java index 867488c..8cfcb2b 100644 --- a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/client/uploader/UploaderProgressView.java +++ b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/client/uploader/UploaderProgressView.java @@ -129,6 +129,8 @@ public class UploaderProgressView { html.setHTML(text); html.setTitle(uploader.getStatusDescription()); + //TODO CANCEL OPERATION MUST BE ENHANCED IN ORDER TO CANCELL ALL UPLOADS + /* if(uploader.getUploadProgress().getLastEvent().getReadPercentage()!=100 && !cancel){ cancel = true; handleCancelUpload(uploader); @@ -138,7 +140,7 @@ public class UploaderProgressView { setVisibleCancel(false); // hp.remove(cancelImg); }catch (Exception e) {} - } + }*/ bar.update(uploader.getUploadProgress().getLastEvent().getReadPercentage()); break; 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 c3c677b..038be37 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 @@ -514,11 +514,18 @@ public class WorkspaceUploadServletStream extends HttpServlet implements Servlet saveWorkspaceUploaderStatus(workspaceUploader, UPLOAD_STATUS.FAILED, "An error occurred in the upload. An item with that name already exists", request.getSession()); sendError(response, "Internal error: An item with that name already exists"); return; + } catch (IOException e){ + logger.error("Error creating elements, is it cancel?", e); + saveWorkspaceUploaderStatus(workspaceUploader, UPLOAD_STATUS.FAILED, "An error occurred in the upload", request.getSession()); + sendError(response, "Internal error: An item with that name already exists"); + return; +// sendError(response, "Internal error: An item with that name already exists"); +// return; }catch (Exception e) { logger.error("Error creating elements", e); saveWorkspaceUploaderStatus(workspaceUploader, UPLOAD_STATUS.FAILED, "An error occurred in the upload. "+e.getMessage(), request.getSession()); // sendError(response, "Internal error: An error occurred on uploading the file, try again later"); - return; +// return; }finally{ removeCurrentListener(request.getSession(), clientUploadKey); } diff --git a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/server/upload/AbstractUploadProgressListener.java b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/server/upload/AbstractUploadProgressListener.java index f7818b8..db1be59 100644 --- a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/server/upload/AbstractUploadProgressListener.java +++ b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/server/upload/AbstractUploadProgressListener.java @@ -33,7 +33,7 @@ public abstract class AbstractUploadProgressListener implements ProgressListener private int percentageOffset = 0; private double completePercentage = COMPLETE_PERECENTAGE; private static Logger logger = LoggerFactory.getLogger(AbstractUploadProgressListener.class); - protected RuntimeException exception = null; + protected UploadCanceledException exception = null; protected boolean exceptionTrhown = false; protected String sessionId; @@ -44,8 +44,7 @@ public abstract class AbstractUploadProgressListener implements ProgressListener * @return the abstract upload progress listener */ public static AbstractUploadProgressListener current(String sessionId) { - throw new RuntimeException( - "Implement the static method 'current' in your customized class"); + throw new RuntimeException("Implement the static method 'current' in your customized class"); } protected Long bytesRead = 0L, contentLength = 0L; @@ -97,7 +96,7 @@ public abstract class AbstractUploadProgressListener implements ProgressListener public void update(final long bytesRead, final long totalBytes, final int items) { if (exceptionTrhown) { - logger.warn("An exception thrown is already true. Is upload already cancelled?, returning"); + logger.warn("An exception thrown is already true. Is upload cancelled?, returning"); return; } @@ -165,7 +164,7 @@ public abstract class AbstractUploadProgressListener implements ProgressListener * * @return the exception */ - public RuntimeException getException() { + public UploadCanceledException getException() { return exception; } @@ -184,8 +183,8 @@ public abstract class AbstractUploadProgressListener implements ProgressListener * * @param e the new exception */ - public void setException(RuntimeException e) { - logger.info("Set RuntimeException to cancel upload"); + public void setException(UploadCanceledException e) { + logger.info("Set exception to UploadCanceledException to cancel upload"); exception = e; save(); } diff --git a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/server/upload/UploadCanceledException.java b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/server/upload/UploadCanceledException.java index 5f27043..b633e2c 100644 --- a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/server/upload/UploadCanceledException.java +++ b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/server/upload/UploadCanceledException.java @@ -1,3 +1,19 @@ +/* + * Copyright 2010 Manuel Carrasco MoƱino. (manolo at apache/org) + * http://code.google.com/p/gwtupload + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ package org.gcube.portlets.widgets.workspaceuploader.server.upload; @@ -9,9 +25,5 @@ package org.gcube.portlets.widgets.workspaceuploader.server.upload; * Sep 8, 2015 */ public class UploadCanceledException extends RuntimeException { - - /** - * - */ - private static final long serialVersionUID = 4311434519628111824L; + private static final long serialVersionUID = 1L; } diff --git a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/server/upload/UploadProgressInputStream.java b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/server/upload/UploadProgressInputStream.java index c39794f..92db636 100644 --- a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/server/upload/UploadProgressInputStream.java +++ b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/server/upload/UploadProgressInputStream.java @@ -7,6 +7,8 @@ import java.util.ArrayList; import java.util.List; import org.apache.commons.fileupload.ProgressListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * The Class UploadProgressInputStream. @@ -19,6 +21,7 @@ public final class UploadProgressInputStream extends FilterInputStream { private List listeners; private long bytesRead = 0; private long totalBytes = 0; + private static Logger logger = LoggerFactory.getLogger(UploadProgressInputStream.class); /** * Instantiates a new upload progress input stream. @@ -69,7 +72,7 @@ public final class UploadProgressInputStream extends FilterInputStream { int bytesRead = in.read(b, off, len); this.bytesRead = this.bytesRead + bytesRead; updateListeners(this.bytesRead, totalBytes); - + return bytesRead; } @@ -88,9 +91,34 @@ public final class UploadProgressInputStream extends FilterInputStream { * @param bytesRead the bytes read * @param totalBytes the total bytes */ - private void updateListeners(final long bytesRead, final long totalBytes) { + /*private void updateListeners(final long bytesRead, final long totalBytes) throws IOException{ + + try{ + for (ProgressListener listener : listeners) + listener.update(bytesRead, totalBytes, listeners.size()); + }catch(UploadCanceledException e){ + logger.warn("Update Listener thrown UploadCanceledException: closing stream.."); + try { + close(); + }catch (IOException e1) { + logger.warn("Close stream thrown this Exception, silent catch"); + } + throw new IOException("Upload cancelled from Client"); + } + }*/ + + /** + * Update listeners. + * + * @param bytesRead the bytes read + * @param totalBytes the total bytes + */ + private void updateListeners(final long bytesRead, final long totalBytes){ for (ProgressListener listener : listeners) listener.update(bytesRead, totalBytes, listeners.size()); + + //UploadCanceledException IS PROPAGATED HERE + } } diff --git a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/server/upload/WorkspaceUploaderMng.java b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/server/upload/WorkspaceUploaderMng.java index 196247e..ac6f151 100644 --- a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/server/upload/WorkspaceUploaderMng.java +++ b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/server/upload/WorkspaceUploaderMng.java @@ -107,6 +107,7 @@ public class WorkspaceUploaderMng { } catch (Exception e1) { logger.error("Error during WorkspaceUploaderItem session update: ",e1); } + } catch (ItemNotFoundException | WrongItemTypeException | WorkspaceFolderNotFoundException | WrongDestinationException e) { logger.error("Error during overwrite: ",e); workspaceUploader.setStatusDescription("An error occurred during upload: "+itemName+". "+e.getMessage()); @@ -116,12 +117,15 @@ public class WorkspaceUploaderMng { } catch (Exception e1) { logger.error("Error during WorkspaceUploaderItem session update: ",e1); } + //IS unreachable }catch(UploadCanceledException e){ logger.info("UploadCanceledException thrown by client.."); workspaceUploader.setStatusDescription("Aborted upload: "+itemName); workspaceUploader.setUploadStatus(UPLOAD_STATUS.ABORTED); try { - WsUtil.putWorkspaceUploaderInSession(httpSession, workspaceUploader); +// WsUtil.putWorkspaceUploaderInSession(httpSession, workspaceUploader); +// workspaceUploader.setErasable(true); + WsUtil.forceEraseWorkspaceUploaderInSession(httpSession, workspaceUploader); } catch (Exception e1) { logger.error("Error during WorkspaceUploaderItem session update: ",e1); } @@ -130,6 +134,7 @@ public class WorkspaceUploaderMng { // StreamUtils.deleteTempFile(uploadFile); WsUtil.setErasableWorkspaceUploaderInSession(httpSession, workspaceUploader.getIdentifier()); } catch (Exception e2) { + logger.error("Error during setErasableWorkspaceUploaderInSession session update: ",e2); } } diff --git a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/server/util/WsUtil.java b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/server/util/WsUtil.java index 453aa4f..0b6b094 100644 --- a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/server/util/WsUtil.java +++ b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/server/util/WsUtil.java @@ -222,6 +222,27 @@ public class WsUtil { logger.debug("Added uploader: "+uploader.getIdentifier() +" in session"); } + /** + * Erase workspace uploader in session. + * + * @param httpSession the http session + * @param uploader the uploader + * @throws Exception the exception + */ + public static void forceEraseWorkspaceUploaderInSession(final HttpSession httpSession, WorkspaceUploaderItem uploader) throws Exception + { + logger.trace("Force Erase WorkspaceUploader workspace uploader in session: "+uploader.getIdentifier()); + final ASLSession session = getAslSession(httpSession); + + if(uploader==null || uploader.getIdentifier()==null || uploader.getIdentifier().isEmpty()) + throw new Exception("Invalid uploader"); + + session.removeAttribute(uploader.getIdentifier()); + logger.info("Erased uploader: "+uploader.getIdentifier()); + + } + + /** * Erase workspace uploader in session. * @@ -238,8 +259,9 @@ public class WsUtil { throw new Exception("Invalid uploader"); if(uploader.isErasable()){ - session.setAttribute(uploader.getIdentifier(), null); - logger.info("Erased uploader: "+uploader.getIdentifier() +" with null value"); +// session.setAttribute(uploader.getIdentifier(), null); + session.removeAttribute(uploader.getIdentifier()); + logger.info("Erased uploader: "+uploader.getIdentifier()); } }