diff --git a/pom.xml b/pom.xml index ea90c2e..105cff1 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ org.gcube.portlets.widgets workspace-uploader jar - 1.4.0-SNAPSHOT + 1.5.0-SNAPSHOT Workspace Uploader Widget Workspace Uploader Widget allows your application to upload file/s in the gCube Workspace @@ -80,7 +80,7 @@ gcube-widgets provided - + org.gcube.resources.discovery @@ -100,7 +100,7 @@ usermanagement-core provided - + com.liferay.portal @@ -126,6 +126,12 @@ provided + + org.gcube.portlets.widgets + session-checker + [0.0.1-SNAPSHOT, 1.0.0-SNAPSHOT) + + org.gcube.common @@ -183,7 +189,7 @@ social-networking-library provided - + org.gcube.applicationsupportlayer aslsocial diff --git a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/WorkspaceUploader.gwt.xml b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/WorkspaceUploader.gwt.xml index c352f6b..9d5e6c7 100644 --- a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/WorkspaceUploader.gwt.xml +++ b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/WorkspaceUploader.gwt.xml @@ -4,12 +4,13 @@ - + + - + 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 fc1f7d2..6bcb3ed 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,112 +1,112 @@ -//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; -//import com.google.gwt.core.shared.GWT; -//import com.google.gwt.event.dom.client.ClickEvent; -//import com.google.gwt.event.dom.client.ClickHandler; -//import com.google.gwt.user.client.Window; -//import com.google.gwt.user.client.rpc.AsyncCallback; -//import com.google.gwt.user.client.ui.Button; -//import com.google.gwt.user.client.ui.RootPanel; -// -///** -// * Entry point classes define onModuleLoad(). -// */ -//public class WorkspaceUploader implements EntryPoint { -// -// String headerTitle = "Upload in your Workspace"; -// String parentId; -// private Button buttonUploader; -// private Button buttonDirect; -// -// public void onModuleLoad() { -// -// boolean jQueryLoaded = isjQueryLoaded(); -// GWT.log("jQueryLoaded: "+jQueryLoaded); -// -// GWT.log("Injected : http://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"); -// -// if (!jQueryLoaded) { +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; +import com.google.gwt.core.shared.GWT; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.Button; +import com.google.gwt.user.client.ui.RootPanel; + +/** + * Entry point classes define onModuleLoad(). + */ +public class WorkspaceUploader implements EntryPoint { + + String headerTitle = "Upload in your Workspace"; + String parentId; + private Button buttonUploader; + private Button buttonDirect; + + public void onModuleLoad() { + + boolean jQueryLoaded = isjQueryLoaded(); + GWT.log("jQueryLoaded: "+jQueryLoaded); + + GWT.log("Injected : http://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"); + + if (!jQueryLoaded) { + ScriptInjector.fromUrl("http://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js") + .setWindow(ScriptInjector.TOP_WINDOW) + .inject(); + } + // ScriptInjector.fromUrl("http://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js") // .setWindow(ScriptInjector.TOP_WINDOW) // .inject(); -// } -// -//// ScriptInjector.fromUrl("http://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js") -//// .setWindow(ScriptInjector.TOP_WINDOW) -//// .inject(); -// -// buttonUploader = new Button("Upload in your Workspace"); -// buttonDirect = new Button("Upload (Stream) in your Workspace"); -// enableUpload(false); -// -// WorkspaceUploaderServiceAsync.Util.getInstance().getWorkspaceId( -// new AsyncCallback() { -// -// @Override -// public void onSuccess(String result) { -// -// if (result != null) { -// parentId = result; -// enableUpload(true); -// } else { -// Window.alert("An error occurred on recovering workspace, try again later"); -// enableUpload(true); -// } -// } -// -// @Override -// public void onFailure(Throwable caught) { -// Window.alert("An error occurred on recovering workspace, try again later"); -// enableUpload(true); -// } -// }); -// -// buttonDirect.addClickHandler(new ClickHandler() { -// -// @Override -// public void onClick(ClickEvent event) { + + buttonUploader = new Button("Upload in your Workspace"); + buttonDirect = new Button("Upload (Stream) in your Workspace"); + enableUpload(false); + + WorkspaceUploaderServiceAsync.Util.getInstance().getWorkspaceId( + new AsyncCallback() { + + @Override + public void onSuccess(String result) { + + if (result != null) { + parentId = result; + enableUpload(true); + } else { + Window.alert("An error occurred on recovering workspace, try again later"); + enableUpload(true); + } + } + + @Override + public void onFailure(Throwable caught) { + Window.alert("An error occurred on recovering workspace, try again later"); + enableUpload(true); + } + }); + + 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(); -// -// } -// }); -// -// 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); -// RootPanel.get("workspace-uploader").add(buttonDirect); -// } -// -// private void enableUpload(boolean bool){ -// buttonUploader.setEnabled(bool); -// buttonDirect.setEnabled(bool); -// } -// -// /** -// * Checks if is j query loaded. -// * -// * @return true, if is j query loaded -// */ -// private native boolean isjQueryLoaded() /*-{ -// return (typeof $wnd['jQuery'] !== 'undefined'); -// }-*/; -//} + dnd.setParameters(parentId, UPLOAD_TYPE.File); + + } + }); + + RootPanel.get("workspace-uploader").add(dnd); + RootPanel.get("workspace-uploader").add(buttonDirect); + } + + private void enableUpload(boolean bool){ + buttonUploader.setEnabled(bool); + buttonDirect.setEnabled(bool); + } + + /** + * Checks if is j query loaded. + * + * @return true, if is j query loaded + */ + private native boolean isjQueryLoaded() /*-{ + return (typeof $wnd['jQuery'] !== 'undefined'); + }-*/; +} 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 eebf674..c1c94e9 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 @@ -4,6 +4,7 @@ package org.gcube.portlets.widgets.workspaceuploader.client.uploader; import java.util.ArrayList; import java.util.List; +import org.gcube.portlets.widgets.sessionchecker.client.CheckSession; import org.gcube.portlets.widgets.workspaceuploader.client.ClosableDialog; import org.gcube.portlets.widgets.workspaceuploader.client.ConstantsWorkspaceUploader; import org.gcube.portlets.widgets.workspaceuploader.client.DialogResult; @@ -216,6 +217,12 @@ public class DialogUpload extends ClosableDialog implements HasWorskpaceUploadNo removeLoading(); break; } + case SESSION_EXPIRED:{ + GWT.log("Upload aborted due to session expired: "+ resultMessage.getMessage()); + CheckSession.showLogoutDialog(); + removeLoading(); + break; + } case OK: { // removeLoading(); // UploaderMonitor.getInstance().pollWorkspaceUploaderId(resultMessage.getMessage()); 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 fc16a8b..13c19ef 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 @@ -6,6 +6,7 @@ package org.gcube.portlets.widgets.workspaceuploader.client.uploader; import java.util.ArrayList; import java.util.Arrays; +import org.gcube.portlets.widgets.sessionchecker.client.CheckSession; import org.gcube.portlets.widgets.workspaceuploader.client.ConstantsWorkspaceUploader; import org.gcube.portlets.widgets.workspaceuploader.client.DialogResult; import org.gcube.portlets.widgets.workspaceuploader.client.WorkspaceUploaderServiceAsync; @@ -161,13 +162,19 @@ public class MultipleDilaogUpload extends DialogUpload { GWT.log("Error during upload " + resultMessage.getMessage()); break; case WARN: { - GWT.log("Upload completed with warnings " - + resultMessage.getMessage()); + GWT.log("Upload completed with warnings "+ resultMessage.getMessage()); + removeLoading(); + break; + } + case SESSION_EXPIRED:{ + GWT.log("Upload aborted due to session expired: "+ resultMessage.getMessage()); + CheckSession.showLogoutDialog(); removeLoading(); break; } case OK: { } + } } 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 index bb3f35c..1c7e443 100644 --- 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 @@ -6,6 +6,7 @@ package org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop; import java.util.HashMap; import java.util.Map; +import org.gcube.portlets.widgets.sessionchecker.client.CheckSession; import org.gcube.portlets.widgets.workspaceuploader.client.ConstantsWorkspaceUploader; import org.gcube.portlets.widgets.workspaceuploader.client.WorkspaceUploadNotification.HasWorskpaceUploadNotificationListener; import org.gcube.portlets.widgets.workspaceuploader.client.WorkspaceUploadNotification.WorskpaceUploadNotificationListener; @@ -543,7 +544,7 @@ public class MultipleDNDUpload extends LayoutPanel implements HasWorskpaceUpload } // stops the browser from redirecting off to the image. var uploadUUID = generateUUID(); - console.log("uploadKey: " + uploadUUID); +// console.log("uploadKey: " + uploadUUID); //NEW WORKSPACE FIELDS instance.@org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload::newWorkspaceFieldsManagerForUUID(Ljava/lang/String;)(uploadUUID); @@ -607,9 +608,29 @@ public class MultipleDNDUpload extends LayoutPanel implements HasWorskpaceUpload var jsonKeys = instance.@org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload::currentJsonKey; // var jsonKeys = instance.@org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload::getJsonKeyForFiles(Ljava/lang/String;) // var jsonKeysMap = instance.@org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload::jsonKeys; - console.log("jsonKeys: " + jsonKeys); +// console.log("jsonKeys: " + jsonKeys); var xhr = new XMLHttpRequest(); + + xhr.onreadystatechange=function() { + if (xhr.readyState === 4){ //if complete + if(xhr.status === 200){ //check if "OK" (200) +// console.log("status is OK"); + //success + } else { + //otherwise, some other code was returned + + if(xhr.status === 401){ //ASL session is expired +// console.log("status is 401"); + instance.@org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload::showLogoutDialog()(); + }else{ + console.log(xhr.status); + instance.@org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload::showAlert(Ljava/lang/String;)("Sorry, an error occurred during file/s upload. Try again"); + } + } + } + } + xhr.open(opts.type, opts.url, true); var formdata = new FormData(); @@ -738,6 +759,14 @@ public class MultipleDNDUpload extends LayoutPanel implements HasWorskpaceUpload controller.addWorkspaceUploadListener(handler); } + + /** + * Show logout dialog. + */ + private void showLogoutDialog(){ + CheckSession.showLogoutDialog(); + } + /* * (non-Javadoc) * 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 f4c989d..0a47ef0 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 @@ -169,6 +169,7 @@ public class WorkspaceUploadServletStream extends HttpServlet implements Servlet if (!ServletFileUpload.isMultipartContent(request)) { logger.error("ERROR: multipart request not found"); sendError(response, "ERROR: multipart request not found"); + return; } try { @@ -177,6 +178,14 @@ public class WorkspaceUploadServletStream extends HttpServlet implements Servlet HttpSession session = request.getSession(); logger.info("UPLOAD-SERVLET session: "+session); logger.debug("UPLOAD-SERVLET (" + session.getId() + ") new upload request received."); + + if(WsUtil.isSessionExpired(session)){ + logger.error("SESSION_EXPIRED: session is expired"); + sendSessionExpired(response, "SESSION_EXPIRED: session is expired"); + return; +// sendError(response, "SESSION_EXPIRED: session is expired"); + } + String destinationId = null; String uploadType = null; boolean isOverwrite = false; @@ -767,6 +776,7 @@ public class WorkspaceUploadServletStream extends HttpServlet implements Servlet /** * Creates the template. * + * @param request the request * @param workspaceUploader the workspace uploader * @param httpSession the http session * @param wa the wa @@ -851,6 +861,32 @@ public class WorkspaceUploadServletStream extends HttpServlet implements Servlet } } + + + /** + * Send session expired. + * + * @param response the response + * @param message the message + * @throws IOException Signals that an I/O exception has occurred. + */ + protected void sendSessionExpired(HttpServletResponse response, String message) throws IOException{ + try { + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + HandlerResultMessage resultMessage = HandlerResultMessage.sessionExpiredResult(message); + response.getWriter().write(resultMessage.toString()); + //5.6 Closure of Response Object: + //When a response is closed, the container must immediately flush all remaining content in the response buffer to the client +// response.flushBuffer(); + } catch (IOException e){ + logger.warn("IOException class name: "+e.getClass().getSimpleName()); + if (e.getClass().getSimpleName().equals("ClientAbortException")) + logger.warn("Skipping ClientAbortException: "+e.getMessage()); + else + throw e; //Sending Exceptions + } + } + /** * Send message. * 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 f71ed1b..b1a9c5e 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 @@ -35,7 +35,7 @@ public class WsUtil { public static final String NOTIFICATION_PORTLET_CLASS_ID = "org.gcube.portlets.user.workspace.server.GWTWorkspaceServiceImpl"; //IN DEV public static final String TEST_SCOPE = "/gcube/devsec"; - public static String TEST_USER = "francesco.mangiacrapa"; + public static String TEST_USER = "test.user"; public static String TEST_USER_FULL_NAME = "Test User"; @@ -78,7 +78,8 @@ public class WsUtil { user=TEST_USER; if (!isWithinPortal()) { //DEV MODE - user = "francesco.mangiacrapa"; +// user = "francesco.mangiacrapa"; + user=TEST_USER; TEST_USER_FULL_NAME = "Francesco Mangiacrapa"; } diff --git a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/shared/HandlerResultMessage.java b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/shared/HandlerResultMessage.java index 549a4ca..fb9c688 100644 --- a/src/main/java/org/gcube/portlets/widgets/workspaceuploader/shared/HandlerResultMessage.java +++ b/src/main/java/org/gcube/portlets/widgets/workspaceuploader/shared/HandlerResultMessage.java @@ -15,6 +15,10 @@ import java.io.Serializable; public class HandlerResultMessage implements Serializable{ + /** + * + */ + private static final String SEPARATOR = ":"; protected Status status; protected String message; @@ -46,12 +50,17 @@ public class HandlerResultMessage implements Serializable{ /** * If the result is unknown. */ - UNKNOWN; + UNKNOWN, + + /** + * If the session is expired. + */ + SESSION_EXPIRED; } /** - * TO SERIALIZATION + * TO SERIALIZATION. */ public HandlerResultMessage() { } @@ -96,6 +105,17 @@ public class HandlerResultMessage implements Serializable{ return new HandlerResultMessage(Status.WARN, message); } + + /** + * Session expired result. + * + * @param message the message + * @return the handler result message + */ + public static HandlerResultMessage sessionExpiredResult(String message){ + return new HandlerResultMessage(Status.SESSION_EXPIRED, message); + } + /** * Parses the result. * expected status:message (e.g. OK:Upload aborted) @@ -158,7 +178,7 @@ public class HandlerResultMessage implements Serializable{ public String toString() { StringBuilder builder = new StringBuilder(); builder.append(status); - builder.append(":"); + builder.append(SEPARATOR); builder.append(message); return builder.toString(); }