From 1e396f21a5a1b71260fe8134ed5e222e698c4766 Mon Sep 17 00:00:00 2001 From: Francesco Mangiacrapa Date: Thu, 29 Oct 2015 14:12:37 +0000 Subject: [PATCH] 553: Workspace: Drag Files Into the Workspace from the Desktop Task-Url: https://support.d4science.org/issues/553 Merged with private version git-svn-id: https://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/widgets/workspace-uploader@120096 82a268e6-3cf1-43bd-a215-b396298e98cf --- .../client/WorkspaceUploader.java | 39 +- .../resource/WorkspaceUploaderResources.java | 38 +- .../client/uploader/DialogUpload.java | 9 + .../client/uploader/MonitorPanel.java | 2 +- .../client/uploader/MultipleDilaogUpload.java | 700 ++++++++++++------ .../WorkspaceFieldsUploadManager.java | 144 ++++ .../uploader/dragdrop/MultipleDNDUpload.java | 615 +++++++++++++++ .../workspaceuploader/public/dropfilehere.png | Bin 0 -> 9123 bytes .../workspaceuploader/public/status-error.png | Bin 0 -> 7870 bytes .../public/workspaceuploader.css | 71 +- .../server/WorkspaceUploadServletStream.java | 32 +- .../workspaceuploader/server/util/WsUtil.java | 1 - 12 files changed, 1397 insertions(+), 254 deletions(-) create mode 100644 src/main/java/org/gcube/portlets/widgets/workspaceuploader/client/uploader/WorkspaceFieldsUploadManager.java create mode 100644 src/main/java/org/gcube/portlets/widgets/workspaceuploader/client/uploader/dragdrop/MultipleDNDUpload.java create mode 100644 src/main/java/org/gcube/portlets/widgets/workspaceuploader/public/dropfilehere.png create mode 100644 src/main/java/org/gcube/portlets/widgets/workspaceuploader/public/status-error.png diff --git a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/client/WorkspaceUploader.java b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/client/WorkspaceUploader.java index 0362db7..cc1b2e0 100644 --- a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/client/WorkspaceUploader.java +++ b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/client/WorkspaceUploader.java @@ -1,6 +1,8 @@ package org.gcube.portlets.widgets.workspaceuploader.client; +import org.gcube.portlets.widgets.workspaceuploader.client.uploader.DialogUpload.UPLOAD_TYPE; import org.gcube.portlets.widgets.workspaceuploader.client.uploader.MultipleDilaogUpload; +import org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload; import com.google.gwt.core.client.EntryPoint; import com.google.gwt.core.client.ScriptInjector; @@ -35,6 +37,8 @@ public class WorkspaceUploader implements EntryPoint { .inject(); } + + // ScriptInjector.fromUrl("http://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js") // .setWindow(ScriptInjector.TOP_WINDOW) // .inject(); @@ -54,14 +58,14 @@ public class WorkspaceUploader implements EntryPoint { enableUpload(true); } else { Window.alert("An error occurred on recovering workspace, try again later"); - enableUpload(false); + enableUpload(true); } } @Override public void onFailure(Throwable caught) { Window.alert("An error occurred on recovering workspace, try again later"); - enableUpload(false); + enableUpload(true); } }); @@ -75,14 +79,45 @@ public class WorkspaceUploader implements EntryPoint { // } // }); + + buttonDirect.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { MultipleDilaogUpload uploadStream = new MultipleDilaogUpload(headerTitle, parentId, org.gcube.portlets.widgets.workspaceuploader.client.uploader.DialogUpload.UPLOAD_TYPE.File); + uploadStream.initFileReader(); uploadStream.center(); + } }); + + final MultipleDNDUpload dnd = new MultipleDNDUpload(); + + buttonDirect.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { +// MultipleDilaogUpload uploadStream = new MultipleDilaogUpload(headerTitle, parentId, org.gcube.portlets.widgets.workspaceuploader.client.uploader.DialogUpload.UPLOAD_TYPE.File); +// uploadStream.initFileReader(); +// uploadStream.center(); + dnd.setParameters(parentId, UPLOAD_TYPE.File); + + } + }); + + RootPanel.get("workspace-uploader").add(dnd); + + +// Scheduler.get().scheduleDeferred(new ScheduledCommand() { +// +// @Override +// public void execute() { +// dnd.initFileReader(); +// +// } +// }); + // RootPanel.get("workspace-uploader").add(buttonUploader); RootPanel.get("workspace-uploader").add(buttonDirect); diff --git a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/client/resource/WorkspaceUploaderResources.java b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/client/resource/WorkspaceUploaderResources.java index be0644b..eb61f80 100644 --- a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/client/resource/WorkspaceUploaderResources.java +++ b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/client/resource/WorkspaceUploaderResources.java @@ -6,88 +6,84 @@ package org.gcube.portlets.widgets.workspaceuploader.client.resource; import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.ui.Image; - /** * The Class WorkspaceUploaderResources. * - * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it - * Sep 24, 2015 + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it Sep 24, 2015 */ public class WorkspaceUploaderResources { public static final WorkspaceUploaderIcons ICONS = GWT.create(WorkspaceUploaderIcons.class); - - + /** * Gets the image loading. * * @return the image loading */ - public static Image getImageLoading(){ + public static Image getImageLoading() { return new Image(ICONS.loading()); } - + /** * Gets the image failed. * * @return the image failed */ - public static Image getImageFailed(){ + public static Image getImageFailed() { return new Image(ICONS.failed()); } - + /** * Gets the image completed. * * @return the image completed */ - public static Image getImageCompleted(){ + public static Image getImageCompleted() { return new Image(ICONS.completed()); } - + /** * Gets the image cancel. * * @return the image cancel */ - public static Image getImageCancel(){ + public static Image getImageCancel() { return new Image(ICONS.cancel()); } - + /** * Gets the image cancel red. * * @return the image cancel red */ - public static Image getImageCancelRed(){ + public static Image getImageCancelRed() { return new Image(ICONS.cancelRed()); } - + /** * Gets the image close win. * * @return the image close win */ - public static Image getImageCloseWin(){ + public static Image getImageCloseWin() { return new Image(ICONS.closeWin()); } - + /** * Gets the image wait. * * @return the image wait */ - public static Image getImageWait(){ + public static Image getImageWait() { return new Image(ICONS.waitIcon()); } - - + /** * Gets the image upload. * * @return the image upload */ - public static Image getImageUpload(){ + public static Image getImageUpload() { return new Image(ICONS.uploadIcon()); } } diff --git a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/client/uploader/DialogUpload.java b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/client/uploader/DialogUpload.java index cadda6c..6fe01d4 100644 --- a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/client/uploader/DialogUpload.java +++ b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/client/uploader/DialogUpload.java @@ -68,6 +68,7 @@ public class DialogUpload extends ClosableDialog implements HasWorskpaceUploadNo // private MonitorPanel monitorPanel; protected String clientUploadKey; private Anchor anchorMyUploads; + protected UPLOAD_TYPE uploadType; /** * Instantiates a new dialog upload stream. @@ -86,6 +87,7 @@ public class DialogUpload extends ClosableDialog implements HasWorskpaceUploadNo fileUpload.getElement().setAttribute("multiple", "multiple"); this.parentIdentifier = parentId; + this.uploadType = uploadType; this.addStyleName("fileInputUploader"); formPanel.setAction(ConstantsWorkspaceUploader.WORKSPACE_UPLOADER_SERVLET_STREAM); formPanel.setEncoding(FormPanel.ENCODING_MULTIPART); @@ -158,6 +160,13 @@ public class DialogUpload extends ClosableDialog implements HasWorskpaceUploadNo add(formPanel); } + /** + * @return the panel + */ + public VerticalPanel getPanel() { + return panel; + } + protected void initJsonClientKeys(){ jsonClientKeys = new Hidden(ConstantsWorkspaceUploader.CLIENT_UPLOAD_KEYS,""); } diff --git a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/client/uploader/MonitorPanel.java b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/client/uploader/MonitorPanel.java index 53aae29..f843f28 100644 --- a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/client/uploader/MonitorPanel.java +++ b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/client/uploader/MonitorPanel.java @@ -167,7 +167,7 @@ public class MonitorPanel extends ScrollPanel{ mapPanels.put(uploader.getClientUploadKey(), upv); VerticalPanel upvPanel = upv.getPanel(); upvPanel.addStyleName("upladerMargin"); - vpListUpload.add(upvPanel); + vpListUpload.insert(upvPanel, 0); updateNumberUpload(); } 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 c2a24af..ede2cfa 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,11 +4,11 @@ package org.gcube.portlets.widgets.workspaceuploader.client.uploader; import java.util.ArrayList; -import java.util.List; import org.gcube.portlets.widgets.workspaceuploader.client.ConstantsWorkspaceUploader; import org.gcube.portlets.widgets.workspaceuploader.client.DialogResult; import org.gcube.portlets.widgets.workspaceuploader.client.WorkspaceUploaderServiceAsync; +import org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload; import org.gcube.portlets.widgets.workspaceuploader.shared.HandlerResultMessage; import org.gcube.portlets.widgets.workspaceuploader.shared.WorkspaceUploadFile; import org.gcube.portlets.widgets.workspaceuploader.shared.WorkspaceUploaderItem; @@ -28,43 +28,75 @@ import com.google.gwt.user.client.ui.FormPanel.SubmitEvent; import com.google.gwt.user.client.ui.FormPanel.SubmitHandler; import com.google.gwt.user.client.ui.HTML; - /** * The Class MultipleDilaogUploadStream. * - * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it - * Oct 2, 2015 + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it Oct 2, 2015 */ public class MultipleDilaogUpload extends DialogUpload { - - private static final String FILE_DELEMITER = ";"; + public static final String FILE_DELEMITER = ";"; private String fileUploadID; + private MultipleDNDUpload dnd; + public MultipleDilaogUpload instance = this; + private String jsonKeys; + + private String idFolder; + private UPLOAD_TYPE type; + private String servlet = ConstantsWorkspaceUploader.WORKSPACE_UPLOADER_SERVLET_STREAM; /** * Instantiates a new multiple dilaog upload stream. * - * @param headerTitle the header title - * @param parentId the parent id - * @param uploadType the upload type + * @param headerTitle + * the header title + * @param parentId + * the parent id + * @param uploadType + * the upload type */ public MultipleDilaogUpload(String headerTitle, String parentId, UPLOAD_TYPE uploadType) { super(headerTitle, parentId, uploadType); - fileUploadID = GenerateUUID.get(10, 16); //is tagID + + this.type =uploadType; + this.idFolder = parentId; + + fileUploadID = GenerateUUID.get(10, 16); // is tagID fileUpload.getElement().setId(fileUploadID); this.addHandlers(); +// exportGenerateFakeUploaders(); +// exportCreateJsonKeyForFiles(); +// exportAddNewSubmitToMonitor(); } - + /** * Generate new upload client keys. * - * @param files the files - * @param parentId the parent id + * @param files the files + * @param parentId the parent id + * @return the list */ - private void generateFakeUploaders(String[] files, String parentId){ + public void generateFakeUploaders(String filesSelected, String parentId) { + if(filesSelected==null || filesSelected.isEmpty()) + return; + + String[] files = filesSelected.split(FILE_DELEMITER); + + // NORMALIZE FILE NAMES + for (int i = 0; i < files.length; i++) { + String normalizedFileName = files[i]; + if (normalizedFileName.contains("\\")) { + files[i] = normalizedFileName.substring(normalizedFileName.lastIndexOf("\\") + 1); // remove + // C:\fakepath\ + // if + // exists + } + } + + GWT.log("generating fake uploaders on: "+files.toString()); fakeUploaders = new ArrayList(files.length); - for (int i = 0; i ConstantsWorkspaceUploader.LIMIT_UPLOADS){ - Window.alert("Multiple upload limit is "+ConstantsWorkspaceUploader.LIMIT_UPLOADS + " files"); + GWT.log("browse return..."); + if (fileUpload.getFilename() == null + || fileUpload.getFilename().isEmpty()) { + GWT.log("No file specified "); MultipleDilaogUpload.this.hide(); return; } + + String[] files = null; + String filesSelected = getFilesSelected(fileUploadID, FILE_DELEMITER); +// GWT.log("getFilesSelected: " + filesSelected); + files = filesSelected.split(FILE_DELEMITER); + - //NORMALIZE FILE NAMES - for (int i=0; i ConstantsWorkspaceUploader.LIMIT_UPLOADS) { +// Window.alert("Multiple upload limit is " +// + ConstantsWorkspaceUploader.LIMIT_UPLOADS +// + " files"); +// MultipleDilaogUpload.this.hide(); +// return; +// } + + + + // GENERATE NEW UPLOADERS + generateFakeUploaders(filesSelected, parentIdentifier); GWT.log(fakeUploaders.toString()); - String jsonKeys = createJsonKeyForFiles(fakeUploaders); + createJsonKeyForFiles(); GWT.log(jsonKeys); - - if(jsonKeys==null){ + + if (jsonKeys == null) { Window.alert("Sorry an error occurred during file/s submit. Try again"); return; } - - //ADD TO FORM PANEL -// initJsonClientKeys(); + + // ADD TO FORM PANEL + // initJsonClientKeys(); jsonClientKeys.setValue(jsonKeys); - - //CASE 1 FILE - if(files.length==1){ - - //recall: Some browser would write in fileUploadField.getValue() C:\fakepath\$fileName + + // CASE 1 FILE + if (files.length == 1) { + + // recall: Some browser would write in + // fileUploadField.getValue() C:\fakepath\$fileName final String label = files[0]; - WorkspaceUploaderServiceAsync.Util.getInstance().itemExistsInWorkpaceFolder(parentIdentifier, label, new AsyncCallback() { - - @Override - public void onSuccess(final String itemId) { - GWT.log("itemExistsInWorkpaceFolder: "+itemId); - if(itemId!=null){ - // HANDLE OWERWRITE - if(Window.confirm(label + " exists in folder. Overwrite?")){ - removeItemAndSubmitForm(itemId); - updateItemSubmitForm(itemId); - } - }else - submitForm(); //ITEM does NOT EXIST SO SUBMIT FORM; - } - - @Override - public void onFailure(Throwable caught) { - GWT.log("Sorry an error occurred on the server "+caught.getLocalizedMessage() + ". Please try again later"); - Window.alert(caught.getMessage()); - } - - }); - }else + WorkspaceUploaderServiceAsync.Util.getInstance() + .itemExistsInWorkpaceFolder(parentIdentifier, + label, new AsyncCallback() { + + @Override + public void onSuccess( + final String itemId) { + GWT.log("itemExistsInWorkpaceFolder: " + + itemId); + if (itemId != null) { + // HANDLE OWERWRITE + if (Window + .confirm(label + + " exists in folder. Overwrite?")) { + removeItemAndSubmitForm(itemId); + updateItemSubmitForm(itemId); + } + } else + submitForm(); // ITEM does NOT + // EXIST SO + // SUBMIT FORM; + } + + @Override + public void onFailure(Throwable caught) { + GWT.log("Sorry an error occurred on the server " + + caught.getLocalizedMessage() + + ". Please try again later"); + Window.alert(caught.getMessage()); + } + + }); + } else submitForm(); - + } }); } + + + /** + * Checks if is limit exceeded. + * + * @param numbOfFiles the numb of files + * @return true, if is limit exceeded + */ + public boolean isLimitExceeded(int numbOfFiles){ + + if (numbOfFiles > ConstantsWorkspaceUploader.LIMIT_UPLOADS) { + Window.alert("Multiple upload limit is " + + ConstantsWorkspaceUploader.LIMIT_UPLOADS + + " files"); + MultipleDilaogUpload.this.hide(); + return true; + } + + return false; + } + + /** + * Adds the new submit to monitor. + */ + public void addNewSubmitToMonitor(){ + GWT.log("addNewSubmitToMonitor..."); + for (final WorkspaceUploaderItem workspaceUploaderItem : fakeUploaders) { + UploaderMonitor.getInstance().addNewSubmit(workspaceUploaderItem, workspaceUploaderItem.getFile().getFileName()); + setVisible(false); + removeLoading(); + UploaderMonitor.getInstance().pollWorkspaceUploader(workspaceUploaderItem); + } + } + + /** * Creates the json key for files. * - * @param fakeFiles the fake files * @return the string */ - protected String createJsonKeyForFiles(List fakeFiles){ - - try { - JSONObject productObj = new JSONObject(); - JSONArray jsonArray = new JSONArray(); - productObj.put(ConstantsWorkspaceUploader.JSON_CLIENT_KEYS, jsonArray); - - for (int i=0; i fakeUploaders = new ArrayList(); + + + public WorkspaceFieldsUploadManager() { + } + + /** + * Checks if is limit exceeded. + * + * @param numbOfFiles the numb of files + * @return true, if is limit exceeded + */ + public boolean isLimitExceeded(int numbOfFiles){ + + if (numbOfFiles > ConstantsWorkspaceUploader.LIMIT_UPLOADS) { + Window.alert("Multiple upload limit is " + + ConstantsWorkspaceUploader.LIMIT_UPLOADS + + " files"); + return true; + } + + return false; + } + + /** + * Adds the new submit to monitor. + */ + public void addNewSubmitToMonitor(){ + GWT.log("addNewSubmitToMonitor..."); + for (final WorkspaceUploaderItem workspaceUploaderItem : fakeUploaders) { + UploaderMonitor.getInstance().addNewSubmit(workspaceUploaderItem, workspaceUploaderItem.getFile().getFileName()); + UploaderMonitor.getInstance().pollWorkspaceUploader(workspaceUploaderItem); + } + } + + + /** + * Creates the json key for files. + * + * @return the string + */ + public void createJsonKeyForFiles() { + + try { + JSONObject productObj = new JSONObject(); + JSONArray jsonArray = new JSONArray(); + productObj.put(ConstantsWorkspaceUploader.JSON_CLIENT_KEYS, jsonArray); +// GWT.log("Creating json keys on fakeUploaders: "+fakeUploaders.toString()); + + 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())); + jsonArray.set(i, obj); + } + + jsonKeys = productObj.toString(); + GWT.log("updated jsonKeys: "+jsonKeys); + } catch (Exception e) { + GWT.log("error " + e.getMessage()); + jsonKeys = null; + } + } + + /** + * Generate new upload client keys. + * + * @param filesSelected the files selected + * @param parentId the parent id + * @return the list + */ + public void generateFakeUploaders(String filesSelected, String parentId) { + + if(filesSelected==null || filesSelected.isEmpty()) + return; + + String[] files = filesSelected.split(FILE_DELEMITER); + + // NORMALIZE FILE NAMES + for (int i = 0; i < files.length; i++) { + String normalizedFileName = files[i]; + if (normalizedFileName.contains("\\")) { + files[i] = normalizedFileName.substring(normalizedFileName.lastIndexOf("\\") + 1); // remove + // C:\fakepath\ + // if + // exists + } + } + + GWT.log("generating fake uploaders on: "+files.toString()); + fakeUploaders = new ArrayList(files.length); + for (int i = 0; i < files.length; i++) { + WorkspaceUploaderItem fakeItem = new WorkspaceUploaderItem(); + fakeItem.setClientUploadKey(GenerateUUID.get()); + fakeItem.setUploadStatus(UPLOAD_STATUS.WAIT); + WorkspaceUploadFile fakeFile = new WorkspaceUploadFile(); + fakeFile.setFileName(files[i]); + fakeFile.setParentId(parentId); + fakeItem.setFile(fakeFile); + fakeUploaders.add(fakeItem); + } + + GWT.log("fakeUploaders generated: "+fakeUploaders.toString()); + } + + + /** + * @return the jsonKeys + */ + public String getJsonKeys() { + return 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 new file mode 100644 index 0000000..39fcbcf --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/client/uploader/dragdrop/MultipleDNDUpload.java @@ -0,0 +1,615 @@ +/** + * + */ +package org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop; + +import java.util.HashMap; +import java.util.Map; + +import org.gcube.portlets.widgets.workspaceuploader.client.ConstantsWorkspaceUploader; +import org.gcube.portlets.widgets.workspaceuploader.client.WorkspaceExplorerListenerController; +import org.gcube.portlets.widgets.workspaceuploader.client.WorkspaceUploadNotification.HasWorskpaceUploadNotificationListener; +import org.gcube.portlets.widgets.workspaceuploader.client.WorkspaceUploadNotification.WorskpaceUploadNotificationListener; +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.shared.GWT; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.LayoutPanel; +import com.google.gwt.user.client.ui.Widget; + + +/** + * The Class MultipleDNDUpload. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Oct 28, 2015 + */ +public class MultipleDNDUpload extends LayoutPanel implements + HasWorskpaceUploadNotificationListener { + + // private WorkspaceFieldsUploadManager fields; + private String idFolder; + private UPLOAD_TYPE type; + + // private String jsonKeys; + private String servlet = ConstantsWorkspaceUploader.WORKSPACE_UPLOADER_SERVLET_STREAM; + public static final String FILE_DELEMITER = ";"; + private Widget onlyChild; + + private Map fields = new HashMap(); + private Map jsonKeys = new HashMap(); + protected WorkspaceExplorerListenerController controller = new WorkspaceExplorerListenerController(); + + private String currentJsonKey; + private boolean isLimitExceeded; + + /** + * Instantiates a new DND file reader. + */ + public MultipleDNDUpload() { + this.getElement().setId("drop_target"); + HTML html = new HTML( + "
"); + html.getElement().setClassName("container-drop_target"); + this.add(html); + + // ScriptInjector.fromUrl("workspaceuploader/dndhtmlfileupload.js") + // .setWindow(ScriptInjector.TOP_WINDOW).inject(); + } + + /** + * Adds the unique container. You must add a unique panel in order to DND + * works fine. + * + * @param w + * the w + */ + public void addUniqueContainer(Widget w) { + + if (onlyChild != null) { + try { + remove(onlyChild); + } catch (Exception e) { + } + } + onlyChild = w; + onlyChild.getElement().setId("drop_target_only_child"); + super.add(onlyChild); + } + + /** + * Sets the parameters. + * + * @param parentId + * the parent id + * @param uploadType + * the upload type + */ + public void setParameters(String parentId, UPLOAD_TYPE uploadType) { + this.idFolder = parentId; + this.type = uploadType; + } + + /** + * Sets the visible child. + * + * @param bool + * the new visible child + */ + public void setVisibleOnlyChild(boolean bool) { + if (onlyChild != null) { + onlyChild.setVisible(bool); + } + } + + /* + * (non-Javadoc) + * + * @see com.google.gwt.user.client.ui.Widget#onLoad() + */ + @Override + protected void onLoad() { + super.onLoad(); + initW3CFileReader(this, FILE_DELEMITER); + } + + /** + * Inits the workspace fields. + * + * @param uploadUUID + * the upload uuid + */ + private void initWorkspaceFields(String uploadUUID) { + fields.put(uploadUUID, new WorkspaceFieldsUploadManager()); + } + + + /** + * Limit is exceeded. + * + * @param numbOfFiles the numb of files + * @return true, if successful + */ + private boolean limitIsExceeded(int numbOfFiles) { + GWT.log("# of items dropped: " + numbOfFiles); + if (numbOfFiles > ConstantsWorkspaceUploader.LIMIT_UPLOADS) { + Window.alert("Multiple upload limit is " + + ConstantsWorkspaceUploader.LIMIT_UPLOADS + " files"); + return isLimitExceeded = true; + + } + + return isLimitExceeded = false; + } + + /** + * Sets the limit exceeded. + * + * @param isLimitExceeded the isLimitExceeded to set + */ + private void setLimitExceeded(boolean isLimitExceeded) { + this.isLimitExceeded = isLimitExceeded; + } + + /** + * Adds the new submit to monitor. + * + * @param uploadUUID + * the upload uuid + */ + private void addNewSubmitToMonitor(String uploadUUID) { + WorkspaceFieldsUploadManager field = getField(uploadUUID); + field.addNewSubmitToMonitor(); + } + + /** + * Creates the json key for files. + * + * @param uploadUUID + * the upload uuid + */ + private void createJsonKeyForFiles(String uploadUUID) { + WorkspaceFieldsUploadManager field = getField(uploadUUID); + field.createJsonKeyForFiles(); + } + + /** + * Generate fake uploaders. + * + * @param filesSelected + * the files selected + * @param parentId + * the parent id + * @param uploadUUID + * the upload uuid + */ + private void generateFakeUploaders(String filesSelected, String parentId, + String uploadUUID) { + WorkspaceFieldsUploadManager field = getField(uploadUUID); + field.generateFakeUploaders(filesSelected, parentId); + } + + /** + * Gets the fields. + * + * @param uploadUUID + * the upload uuid + * @return the fields + */ + private WorkspaceFieldsUploadManager getField(String uploadUUID) { + return fields.get(uploadUUID); + } + + /** + * Update json keys. + * + * @param uploadUUID + * the upload uuid + */ + private void updateJsonKeys(String uploadUUID) { + WorkspaceFieldsUploadManager field = getField(uploadUUID); + jsonKeys.put(uploadUUID, field.getJsonKeys()); + // this.jsonKeys = field.getJsonKeys(); + } + + /** + * Sets the current json ke value. + * + * @param uploadUUID + * the new current json ke value + */ + public void setCurrentJsonKeValue(String uploadUUID) { + currentJsonKey = jsonKeys.get(uploadUUID); + } + + /** + * Fire error. + * + * @param msg + * the msg + */ + private void showAlert(String msg) { + Window.alert(msg); + resetPanel(this); + } + + /** + * Reset. + */ + private void reset() { + resetPanel(this); + } + + /** + * Gets the upload type. + * + * @return the upload type + */ + public UPLOAD_TYPE getUploadType() { + return type; + } + + /** + * Reset panel. + * + * @param instance + * the instance + */ + private static native void resetPanel(MultipleDNDUpload instance) /*-{ + var drop = $wnd.$('#drop_target')[0]; + + if (drop === null || drop === undefined) { + return; + } + + drop.className = "over-false"; + $wnd.$('#drop_target_inner')[0].className = ""; + $wnd.$('#drop_target_outer')[0].style.display = "none"; + instance.@org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload::setVisibleOnlyChild(Z)(true); + }-*/; + + /** + * Gets the files selected. + * + * @param instance + * the instance + * @param fileDelimiter + * the file delimiter + * @return the files selected + */ + public static native void initW3CFileReader(MultipleDNDUpload instance, + String fileDelimiter) /*-{ + + console.log("initW3CFileReader"); + + function generateUUID() { + var d = new Date().getTime(); + var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, + function(c) { + var r = (d + Math.random() * 16) % 16 | 0; + d = Math.floor(d / 16); + return (c == 'x' ? r : (r & 0x3 | 0x8)).toString(16); + }); + return uuid; + } + + //DROP CHECK IF CONTAINS FILES + function containsFiles(items) { + // if (dataTransfer.types) { + // for (var i = 0; i < dataTransfer.types.length; i++) { + // console.log("dataTransfer.types[i] "+dataTransfer.types[i]); + // if (dataTransfer.types[i] != "Files") { + // return false; + // } + // } + // } + // return true; + + if (items) { + + for (i = 0; i < items.length; i++) { + entry = items[i] + if (entry.getAsEntry) { //Standard HTML5 API + entry = entry.getAsEntry(); + } else if (entry.webkitGetAsEntry) { //WebKit implementation of HTML5 API. + entry = entry.webkitGetAsEntry(); + } + if (entry.isFile) { + console.log("entry is file"); + //Handle FileEntry + // readFile(entry, uploadFile); + } else if (entry.isDirectory) { + console.log("entry is directory"); + return false; + //Handle DirectoryEntry + // readFileTree(entry, uploadFile); + } + } + return true; + } + return false; + } + + if (window.FileReader) { + console.log("before load"); + var drop = $wnd.$('#drop_target')[0]; + $wnd.$('#drop_target_outer')[0].style.display = "none"; + console.log("drop is " + drop); + + function cancel(e) { + if (e.preventDefault) { + e.preventDefault(); + } + return false; + } + + function addEventHandler(obj, evt, handler) { + if (obj.addEventListener) { + // W3C method + obj.addEventListener(evt, handler, false); + } else if (obj.attachEvent) { + // IE method. + obj.attachEvent('on' + evt, handler); + } else { + // Old school method. + obj['on' + evt] = handler; + } + } + + function containsFiles(event) { + if (event.dataTransfer.types) { + for (var i = 0; i < event.dataTransfer.types.length; i++) { + if (event.dataTransfer.types[i] == "Files") { + return true; + } + } + } + return false; + } + + function isFolder(file) { + + if (file != null && !file.type && file.size % 4096 == 0) { + return true; + } + return false; + } + + addEventHandler( + drop, + 'dragenter', + function(e) { + console.log('dragenter'); + drop.className = "over-true"; + $wnd.$('#drop_target_inner')[0].className = ""; + instance.@org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload::setVisibleOnlyChild(Z)(false); + e.preventDefault(); + if (containsFiles(e)) { + console.log("The drag event contains files"); + // The drag event contains files + // Do something + } else { + console.log("The drag event doesn't contain files"); + // The drag event doesn't contain files + // Do something else + } + }); + + // Event Listener for when the dragged file leaves the drop zone. + addEventHandler( + drop, + 'dragleave', + function(e) { + console.log('dragleave'); + drop.className = "over-false"; + $wnd.$('#drop_target_inner')[0].className = ""; + $wnd.$('#drop_target_outer')[0].style.display = "none"; + instance.@org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload::setVisibleOnlyChild(Z)(true); + instance.@org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload::setLimitExceeded(Z)(false); + }); + + addEventHandler(drop, 'dragover', function(e) { + e = e || window.event; // get window.event if e argument missing (in IE) + if (e.preventDefault) { + e.preventDefault(); + } // + console.log('dragover'); + drop.className = "over-true"; + $wnd.$('#drop_target_outer')[0].style.display = "inline"; + }); + + addEventHandler( + drop, + 'drop', + function(e) { + e = e || window.event; // get window.event if e argument missing (in IE) + if (e.preventDefault) { + e.preventDefault(); + } // stops the browser from redirecting off to the image. + + var uploadUUID = generateUUID(); + console.log("uploadKey: " + uploadUUID); + //NEW WORKSPACE FIELDS + instance.@org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload::initWorkspaceFields(Ljava/lang/String;)(uploadUUID); + + var servlet = instance.@org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload::servlet; + + var opts = { + url : servlet, + type : "POST", + processData : false + }; + + var idfolder = instance.@org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload::idFolder; + console.log("idfolder: " + idfolder); + + var uploadType = instance.@org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload::type; + console.log("uploadType: " + uploadType); + + if (idfolder === null || idfolder === undefined + || uploadType === null + || uploadType === undefined) { + + $wnd.$('#drop_target_inner')[0].className = "drop_target_inner_error"; + var error = "Folder destionation or upload type not specified"; + instance.@org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload::showAlert(Ljava/lang/String;)(error); + return; + } + + var dt = e.dataTransfer; + //dt.dropEffect = 'copy'; + var files = dt.files; + + instance.@org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload::limitIsExceeded(I)(files.length); + + var limitExceeded = instance.@org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload::isLimitExceeded; + + if(limitExceeded){ + console.log("limitExceeded, return"); + instance.@org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload::reset()(); + return; + } + + if (files.length == 0) { + console.log("No file dragged, return"); + instance.@org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload::reset()(); + return; + } + + console.log("# of file/s: " + files.length); + + var numFolder = 0; + for (var i = 0; i < files.length; i++) { + var file = files[i]; + var filesSelected = files[i].name + fileDelimiter; + if (!isFolder(file)) { + + + console.log("filesSelected: " + filesSelected); + + // var files = filese + // var files = filesSelected.split(fileDelimiter); + console.log("files: " + files); + + 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::createJsonKeyForFiles(Ljava/lang/String;)(uploadUUID); + + instance.@org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload::updateJsonKeys(Ljava/lang/String;)(uploadUUID); + + var jsonKeysMap = instance.@org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload::jsonKeys; + + console.log("jsonKeysMap: " + jsonKeysMap); + + instance.@org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload::setCurrentJsonKeValue(Ljava/lang/String;)(uploadUUID); + + var keyVal = instance.@org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload::currentJsonKey; + + console.log("keyVal: " + keyVal); + + var xhr = new XMLHttpRequest(); + // var upload = xhr.upload; + + // upload.fileIndex = i; + // upload.fileObj = file; + // upload.downloadStartTime = new Date().getTime(); + // upload.currentStart = upload.downloadStartTime; + // upload.currentProgress = 0; + // upload.startData = 0; + + // console.log("upload: " + upload.toString()); + // add listeners + + // upload.addEventListener("progress", progress, false); + // upload.addEventListener("load", load, false); + + xhr.open(opts.type, opts.url, true); + // var boundary = "AJAX--------------" + (new Date).getTime(); + // var contentType = "multipart/form-data; boundary=" + boundary; + // xhr.setRequestHeader("Content-Type", contentType); + // Use native function(Chrome 5+ ,Safari 5+ and Firefox 4+), for dealing + // with multipart/form-data and boundray generation + + var formdata = new FormData(); // see + // https://developer.mozilla.org/En/XMLHttpRequest/Using_XMLHttpRequest#Using_FormData_objects + // 'file' can be any string which you would like to associte with + // uploaded file even for example file.type eg: + // formdata.append(file.type, file); + // formdata.append(file.fileName, file); + + formdata.append("isOverwrite", "false"); + + // $wnd.exportCreateJsonKeyForFiles(); + // + // $wnd.exportAddNewSubmitToMonitor(); + + formdata.append("client_upload_keys", keyVal); + formdata.append("uploadType", uploadType); + formdata.append("idFolder", idfolder); + formdata.append('uploadFormElement', file); + + xhr.send(formdata); + instance.@org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload::addNewSubmitToMonitor(Ljava/lang/String;)(uploadUUID); + + // reader.readAsText(file); + }else{ + numFolder++; + } + } + + if(numFolder>0){ + var msg; + if(numFolder==files.length){ + msg = "Is not possible to upload a folder"; + instance.@org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload::showAlert(Ljava/lang/String;)(msg); + return; + } + + var msg = "Ignored "; + msg += numFolder > 1? numFolder+" folders": numFolder+" folder"; + msg+= " during upload"; + console.log(msg); + 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); + // addEventHandler(drop, 'dragenter', cancel); + } else { + $wnd.$('#drop_target')[0].innerHTML = 'Your browser does not support the HTML5 FileReader.'; + } + }-*/; + + /* + * (non-Javadoc) + * + * @see org.gcube.portlets.widgets.workspaceuploader.client. + * WorkspaceUploadNotification.HasWorskpaceUploadNotificationListener# + * addWorkspaceUploadNotificationListener + * (org.gcube.portlets.widgets.workspaceuploader + * .client.WorkspaceUploadNotification.WorskpaceUploadNotificationListener) + */ + @Override + public void addWorkspaceUploadNotificationListener( + WorskpaceUploadNotificationListener handler) { + controller.addWorkspaceUploadListener(handler); + } + + /* + * (non-Javadoc) + * + * @see org.gcube.portlets.widgets.workspaceuploader.client. + * WorkspaceUploadNotification.HasWorskpaceUploadNotificationListener# + * removeWorkspaceUploadNotificationListener + * (org.gcube.portlets.widgets.workspaceuploader + * .client.WorkspaceUploadNotification.WorskpaceUploadNotificationListener) + */ + @Override + public void removeWorkspaceUploadNotificationListener( + WorskpaceUploadNotificationListener handler) { + controller.removeWorkspaceUploadListener(handler); + } +} diff --git a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/public/dropfilehere.png b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/public/dropfilehere.png new file mode 100644 index 0000000000000000000000000000000000000000..818bdc9943d529097c0246d52b08ab2953072d83 GIT binary patch literal 9123 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 literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/public/status-error.png b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/public/status-error.png new file mode 100644 index 0000000000000000000000000000000000000000..d89c69c62bcf5eb3d7e3501aef701abde768a4ce GIT binary patch literal 7870 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 literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/public/workspaceuploader.css b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/public/workspaceuploader.css index be3e55c..6929017 100644 --- a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/public/workspaceuploader.css +++ b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/public/workspaceuploader.css @@ -117,4 +117,73 @@ h1 { /* .baloonGoTop :HOVER { */ /* cursor: pointer; */ /* color: #FFF; */ -/* } */ \ No newline at end of file +/* } */ +.container-drop_target { +/* position: relative; */ +} + +.textbox:hover { + opacity: 1; +} + +.text { + padding-top: 50px; +} + +#drop_target_outer { +/* position: fixed; */ + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +#drop_target_inner { + width: 50%; + height: 50%; +/* text-align: center; */ +/* vertical-align: middle; */ + top: 25%; + background-image: url("dropfilehere.png"); + background-repeat: no-repeat; + background-position: center; + margin: 0 auto; + position: relative; + /* background: orange; */ +} + +/* Demo One */ +#drop_target { + /* border: 5px dashed #D9D9D9; */ /* border-radius: 10px; */ + /* padding: 50%; */ /* text-align: center; */ /* display: none; */ + width: 100%; + height: 100%; + /* height: 20px; */ +} + +.over-true { +/* border: 3px dashed #D9D9D9; */ + border-radius: 5px; + /* padding: 50%; */ + text-align: center; + background-color: #FFF !important; +} + +.over-false { + background: none; +} + +/* .display-true { + display: inline-flex; + +} + +.display-false { + display: none; + +} */ + +/* Demo One */ +.drop_target_inner_error { + background-image: url("status-error.png") !important; +} 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 4df20cb..c3ace34 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 @@ -159,21 +159,23 @@ public class WorkspaceUploadServletStream extends HttpServlet implements Servlet logger.error("ERROR: multipart request not found"); sendError(response, "ERROR: multipart request not found"); } - - HttpSession session = request.getSession(); - logger.debug("UPLOAD-SERVLET (" + session.getId() + ") new upload request received."); - String destinationId = null; - String uploadType = null; - boolean isOverwrite = false; -// String clientUploadKey = null; - FileItemStream uploadItem = null; - ArrayList listClientUploadKeys = null; - FileItemFactory factory = new DiskFileItemFactory(); - ServletFileUpload servletFileUpload = new ServletFileUpload(factory); - try { - + + logger.info("UPLOAD-SERVLET starting"); + HttpSession session = request.getSession(); + logger.info("UPLOAD-SERVLET session: "+session); + logger.debug("UPLOAD-SERVLET (" + session.getId() + ") new upload request received."); + String destinationId = null; + String uploadType = null; + boolean isOverwrite = false; + // String clientUploadKey = null; + FileItemStream uploadItem = null; + ArrayList listClientUploadKeys = null; + + FileItemFactory factory = new DiskFileItemFactory(); + ServletFileUpload servletFileUpload = new ServletFileUpload(factory); + /** * An iterator to instances of FileItemStream * parsed from the request, in the order that they were @@ -230,6 +232,10 @@ public class WorkspaceUploadServletStream extends HttpServlet implements Servlet logger.error("Error processing request in upload servlet", e); sendError(response, "Internal error: Error during request processing"); return; + } catch (Exception e) { + logger.error("Error processing request in upload servlet", e); + sendError(response, "Internal error: Error during request processing"); + return; } } 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 de26d6f..78d86b9 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 @@ -17,7 +17,6 @@ import org.gcube.common.homelibrary.home.workspace.Workspace; import org.gcube.common.homelibrary.home.workspace.exceptions.WorkspaceFolderNotFoundException; import org.gcube.common.scope.api.ScopeProvider; import org.gcube.portal.custom.scopemanager.scopehelper.ScopeHelper; -import org.gcube.portlets.widgets.workspaceuploader.server.WorkspaceUploadServletStream; import org.gcube.portlets.widgets.workspaceuploader.server.notification.NotificationsWorkspaceUploaderProducer; import org.gcube.portlets.widgets.workspaceuploader.shared.WorkspaceUploaderItem;