4055: Workspace Uploder enhancement: work with multiple-instances of DnD Workspace Uploader in the DOM
Task-Url: https://support.d4science.org/issues/4055 TODO Commented upload canceling because must be managed abort for multiple files client-side git-svn-id: https://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/widgets/workspace-uploader@128754 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
parent
9a277a0d79
commit
471ac76beb
|
@ -4,6 +4,7 @@
|
||||||
package org.gcube.portlets.widgets.workspaceuploader.client.uploader;
|
package org.gcube.portlets.widgets.workspaceuploader.client.uploader;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
import org.gcube.portlets.widgets.workspaceuploader.client.ConstantsWorkspaceUploader;
|
import org.gcube.portlets.widgets.workspaceuploader.client.ConstantsWorkspaceUploader;
|
||||||
import org.gcube.portlets.widgets.workspaceuploader.client.DialogResult;
|
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<WorkspaceUploaderItem>(files.length);
|
fakeUploaders = new ArrayList<WorkspaceUploaderItem>(files.length);
|
||||||
for (int i = 0; i < files.length; i++) {
|
for (int i = 0; i < files.length; i++) {
|
||||||
WorkspaceUploaderItem fakeItem = new WorkspaceUploaderItem();
|
WorkspaceUploaderItem fakeItem = new WorkspaceUploaderItem();
|
||||||
|
@ -169,6 +170,7 @@ public class MultipleDilaogUpload extends DialogUpload {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
formPanel.addSubmitHandler(new SubmitHandler() {
|
formPanel.addSubmitHandler(new SubmitHandler() {
|
||||||
|
@ -195,11 +197,11 @@ public class MultipleDilaogUpload extends DialogUpload {
|
||||||
}
|
}
|
||||||
|
|
||||||
String[] files = null;
|
String[] files = null;
|
||||||
|
GWT.log("Current Uploader has id: "+fileUploadID);
|
||||||
String filesSelected = getFilesSelected(fileUploadID, FILE_DELEMITER);
|
String filesSelected = getFilesSelected(fileUploadID, FILE_DELEMITER);
|
||||||
// GWT.log("getFilesSelected: " + filesSelected);
|
GWT.log("getFilesSelected: " + filesSelected);
|
||||||
files = filesSelected.split(FILE_DELEMITER);
|
files = filesSelected.split(FILE_DELEMITER);
|
||||||
|
|
||||||
|
|
||||||
if(isLimitExceeded(files.length))
|
if(isLimitExceeded(files.length))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -261,6 +263,8 @@ public class MultipleDilaogUpload extends DialogUpload {
|
||||||
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -129,6 +129,8 @@ public class UploaderProgressView {
|
||||||
html.setHTML(text);
|
html.setHTML(text);
|
||||||
html.setTitle(uploader.getStatusDescription());
|
html.setTitle(uploader.getStatusDescription());
|
||||||
|
|
||||||
|
//TODO CANCEL OPERATION MUST BE ENHANCED IN ORDER TO CANCELL ALL UPLOADS
|
||||||
|
/*
|
||||||
if(uploader.getUploadProgress().getLastEvent().getReadPercentage()!=100 && !cancel){
|
if(uploader.getUploadProgress().getLastEvent().getReadPercentage()!=100 && !cancel){
|
||||||
cancel = true;
|
cancel = true;
|
||||||
handleCancelUpload(uploader);
|
handleCancelUpload(uploader);
|
||||||
|
@ -138,7 +140,7 @@ public class UploaderProgressView {
|
||||||
setVisibleCancel(false);
|
setVisibleCancel(false);
|
||||||
// hp.remove(cancelImg);
|
// hp.remove(cancelImg);
|
||||||
}catch (Exception e) {}
|
}catch (Exception e) {}
|
||||||
}
|
}*/
|
||||||
|
|
||||||
bar.update(uploader.getUploadProgress().getLastEvent().getReadPercentage());
|
bar.update(uploader.getUploadProgress().getLastEvent().getReadPercentage());
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -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());
|
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");
|
sendError(response, "Internal error: An item with that name already exists");
|
||||||
return;
|
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) {
|
}catch (Exception e) {
|
||||||
logger.error("Error creating elements", e);
|
logger.error("Error creating elements", e);
|
||||||
saveWorkspaceUploaderStatus(workspaceUploader, UPLOAD_STATUS.FAILED, "An error occurred in the upload. "+e.getMessage(), request.getSession());
|
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");
|
// sendError(response, "Internal error: An error occurred on uploading the file, try again later");
|
||||||
return;
|
// return;
|
||||||
}finally{
|
}finally{
|
||||||
removeCurrentListener(request.getSession(), clientUploadKey);
|
removeCurrentListener(request.getSession(), clientUploadKey);
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,7 +33,7 @@ public abstract class AbstractUploadProgressListener implements ProgressListener
|
||||||
private int percentageOffset = 0;
|
private int percentageOffset = 0;
|
||||||
private double completePercentage = COMPLETE_PERECENTAGE;
|
private double completePercentage = COMPLETE_PERECENTAGE;
|
||||||
private static Logger logger = LoggerFactory.getLogger(AbstractUploadProgressListener.class);
|
private static Logger logger = LoggerFactory.getLogger(AbstractUploadProgressListener.class);
|
||||||
protected RuntimeException exception = null;
|
protected UploadCanceledException exception = null;
|
||||||
protected boolean exceptionTrhown = false;
|
protected boolean exceptionTrhown = false;
|
||||||
protected String sessionId;
|
protected String sessionId;
|
||||||
|
|
||||||
|
@ -44,8 +44,7 @@ public abstract class AbstractUploadProgressListener implements ProgressListener
|
||||||
* @return the abstract upload progress listener
|
* @return the abstract upload progress listener
|
||||||
*/
|
*/
|
||||||
public static AbstractUploadProgressListener current(String sessionId) {
|
public static AbstractUploadProgressListener current(String sessionId) {
|
||||||
throw new RuntimeException(
|
throw new RuntimeException("Implement the static method 'current' in your customized class");
|
||||||
"Implement the static method 'current' in your customized class");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Long bytesRead = 0L, contentLength = 0L;
|
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) {
|
public void update(final long bytesRead, final long totalBytes, final int items) {
|
||||||
|
|
||||||
if (exceptionTrhown) {
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -165,7 +164,7 @@ public abstract class AbstractUploadProgressListener implements ProgressListener
|
||||||
*
|
*
|
||||||
* @return the exception
|
* @return the exception
|
||||||
*/
|
*/
|
||||||
public RuntimeException getException() {
|
public UploadCanceledException getException() {
|
||||||
return exception;
|
return exception;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -184,8 +183,8 @@ public abstract class AbstractUploadProgressListener implements ProgressListener
|
||||||
*
|
*
|
||||||
* @param e the new exception
|
* @param e the new exception
|
||||||
*/
|
*/
|
||||||
public void setException(RuntimeException e) {
|
public void setException(UploadCanceledException e) {
|
||||||
logger.info("Set RuntimeException to cancel upload");
|
logger.info("Set exception to UploadCanceledException to cancel upload");
|
||||||
exception = e;
|
exception = e;
|
||||||
save();
|
save();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
package org.gcube.portlets.widgets.workspaceuploader.server.upload;
|
||||||
|
|
||||||
|
|
||||||
|
@ -9,9 +25,5 @@ package org.gcube.portlets.widgets.workspaceuploader.server.upload;
|
||||||
* Sep 8, 2015
|
* Sep 8, 2015
|
||||||
*/
|
*/
|
||||||
public class UploadCanceledException extends RuntimeException {
|
public class UploadCanceledException extends RuntimeException {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
private static final long serialVersionUID = 4311434519628111824L;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,8 @@ import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.apache.commons.fileupload.ProgressListener;
|
import org.apache.commons.fileupload.ProgressListener;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Class UploadProgressInputStream.
|
* The Class UploadProgressInputStream.
|
||||||
|
@ -19,6 +21,7 @@ public final class UploadProgressInputStream extends FilterInputStream {
|
||||||
private List<ProgressListener> listeners;
|
private List<ProgressListener> listeners;
|
||||||
private long bytesRead = 0;
|
private long bytesRead = 0;
|
||||||
private long totalBytes = 0;
|
private long totalBytes = 0;
|
||||||
|
private static Logger logger = LoggerFactory.getLogger(UploadProgressInputStream.class);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a new upload progress input stream.
|
* Instantiates a new upload progress input stream.
|
||||||
|
@ -69,7 +72,7 @@ public final class UploadProgressInputStream extends FilterInputStream {
|
||||||
int bytesRead = in.read(b, off, len);
|
int bytesRead = in.read(b, off, len);
|
||||||
this.bytesRead = this.bytesRead + bytesRead;
|
this.bytesRead = this.bytesRead + bytesRead;
|
||||||
updateListeners(this.bytesRead, totalBytes);
|
updateListeners(this.bytesRead, totalBytes);
|
||||||
|
|
||||||
return bytesRead;
|
return bytesRead;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -88,9 +91,34 @@ public final class UploadProgressInputStream extends FilterInputStream {
|
||||||
* @param bytesRead the bytes read
|
* @param bytesRead the bytes read
|
||||||
* @param totalBytes the total bytes
|
* @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)
|
for (ProgressListener listener : listeners)
|
||||||
listener.update(bytesRead, totalBytes, listeners.size());
|
listener.update(bytesRead, totalBytes, listeners.size());
|
||||||
|
|
||||||
|
//UploadCanceledException IS PROPAGATED HERE
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -107,6 +107,7 @@ public class WorkspaceUploaderMng {
|
||||||
} catch (Exception e1) {
|
} catch (Exception e1) {
|
||||||
logger.error("Error during WorkspaceUploaderItem session update: ",e1);
|
logger.error("Error during WorkspaceUploaderItem session update: ",e1);
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (ItemNotFoundException | WrongItemTypeException | WorkspaceFolderNotFoundException | WrongDestinationException e) {
|
} catch (ItemNotFoundException | WrongItemTypeException | WorkspaceFolderNotFoundException | WrongDestinationException e) {
|
||||||
logger.error("Error during overwrite: ",e);
|
logger.error("Error during overwrite: ",e);
|
||||||
workspaceUploader.setStatusDescription("An error occurred during upload: "+itemName+". "+e.getMessage());
|
workspaceUploader.setStatusDescription("An error occurred during upload: "+itemName+". "+e.getMessage());
|
||||||
|
@ -116,12 +117,15 @@ public class WorkspaceUploaderMng {
|
||||||
} catch (Exception e1) {
|
} catch (Exception e1) {
|
||||||
logger.error("Error during WorkspaceUploaderItem session update: ",e1);
|
logger.error("Error during WorkspaceUploaderItem session update: ",e1);
|
||||||
}
|
}
|
||||||
|
//IS unreachable
|
||||||
}catch(UploadCanceledException e){
|
}catch(UploadCanceledException e){
|
||||||
logger.info("UploadCanceledException thrown by client..");
|
logger.info("UploadCanceledException thrown by client..");
|
||||||
workspaceUploader.setStatusDescription("Aborted upload: "+itemName);
|
workspaceUploader.setStatusDescription("Aborted upload: "+itemName);
|
||||||
workspaceUploader.setUploadStatus(UPLOAD_STATUS.ABORTED);
|
workspaceUploader.setUploadStatus(UPLOAD_STATUS.ABORTED);
|
||||||
try {
|
try {
|
||||||
WsUtil.putWorkspaceUploaderInSession(httpSession, workspaceUploader);
|
// WsUtil.putWorkspaceUploaderInSession(httpSession, workspaceUploader);
|
||||||
|
// workspaceUploader.setErasable(true);
|
||||||
|
WsUtil.forceEraseWorkspaceUploaderInSession(httpSession, workspaceUploader);
|
||||||
} catch (Exception e1) {
|
} catch (Exception e1) {
|
||||||
logger.error("Error during WorkspaceUploaderItem session update: ",e1);
|
logger.error("Error during WorkspaceUploaderItem session update: ",e1);
|
||||||
}
|
}
|
||||||
|
@ -130,6 +134,7 @@ public class WorkspaceUploaderMng {
|
||||||
// StreamUtils.deleteTempFile(uploadFile);
|
// StreamUtils.deleteTempFile(uploadFile);
|
||||||
WsUtil.setErasableWorkspaceUploaderInSession(httpSession, workspaceUploader.getIdentifier());
|
WsUtil.setErasableWorkspaceUploaderInSession(httpSession, workspaceUploader.getIdentifier());
|
||||||
} catch (Exception e2) {
|
} catch (Exception e2) {
|
||||||
|
logger.error("Error during setErasableWorkspaceUploaderInSession session update: ",e2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -222,6 +222,27 @@ public class WsUtil {
|
||||||
logger.debug("Added uploader: "+uploader.getIdentifier() +" in session");
|
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.
|
* Erase workspace uploader in session.
|
||||||
*
|
*
|
||||||
|
@ -238,8 +259,9 @@ public class WsUtil {
|
||||||
throw new Exception("Invalid uploader");
|
throw new Exception("Invalid uploader");
|
||||||
|
|
||||||
if(uploader.isErasable()){
|
if(uploader.isErasable()){
|
||||||
session.setAttribute(uploader.getIdentifier(), null);
|
// session.setAttribute(uploader.getIdentifier(), null);
|
||||||
logger.info("Erased uploader: "+uploader.getIdentifier() +" with null value");
|
session.removeAttribute(uploader.getIdentifier());
|
||||||
|
logger.info("Erased uploader: "+uploader.getIdentifier());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue