diff --git a/pom.xml b/pom.xml
index 033c929..c889ec0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -76,13 +76,20 @@
${gwtVersion}
compile
+
+
+ org.realityforge.gwt.websockets
+ gwt-websockets
+ 1.1.2
+ provided
+
org.gcube.common.portal
portal-manager
-
+
org.gcube.resources.discovery
diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/AppControllerExplorer.java b/src/main/java/org/gcube/portlets/user/workspace/client/AppControllerExplorer.java
index e2a5e2c..860ef46 100644
--- a/src/main/java/org/gcube/portlets/user/workspace/client/AppControllerExplorer.java
+++ b/src/main/java/org/gcube/portlets/user/workspace/client/AppControllerExplorer.java
@@ -104,6 +104,7 @@ import org.gcube.portlets.user.workspace.client.model.SmartFolderModel;
import org.gcube.portlets.user.workspace.client.model.SubTree;
import org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService;
import org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceServiceAsync;
+import org.gcube.portlets.user.workspace.client.util.FolderDownloadDialog;
import org.gcube.portlets.user.workspace.client.util.RequestBuilderWorkspaceValidateItem;
import org.gcube.portlets.user.workspace.client.util.WindowOpenParameter;
import org.gcube.portlets.user.workspace.client.view.ExplorerPanel;
@@ -948,13 +949,6 @@ public class AppControllerExplorer implements EventHandler, TreeAppControllerInt
public void onFileDownloadEvent(FileDownloadEvent fileDownloadEvent) {
if(fileDownloadEvent.getItemIdentifier()!=null){
- // if(fileDownloadEvent.getDownloadType().equals(DownloadType.SHOW)){
- // if(fileDownloadEvent.getItemName()!= null)
- // com.google.gwt.user.client.Window.open(ConstantsExplorer.DOWNLOAD_WORKSPACE_SERVICE+"?id="+fileDownloadEvent.getItemIdentifier()+"&viewContent=true", fileDownloadEvent.getItemName(), "");
- // }
- // else
- // com.google.gwt.user.client.Window.open(ConstantsExplorer.DOWNLOAD_WORKSPACE_SERVICE+"?id="+fileDownloadEvent.getItemIdentifier(), "_self", "");
- //
if(fileDownloadEvent.getDownloadType().equals(DownloadType.SHOW)){
if(fileDownloadEvent.getItemName()!= null){
@@ -971,13 +965,20 @@ public class AppControllerExplorer implements EventHandler, TreeAppControllerInt
}
// com.google.gwt.user.client.Window.open(ConstantsExplorer.DOWNLOAD_WORKSPACE_SERVICE+"?id="+fileDownloadEvent.getItemIdentifier()+"&viewContent=true", fileDownloadEvent.getItemName(), "");
} else{
-
- try {
- new RequestBuilderWorkspaceValidateItem(RequestBuilder.GET,ConstantsExplorer.DOWNLOAD_WORKSPACE_SERVICE, "id="+fileDownloadEvent.getItemIdentifier(), "_self", downloadHandlerCallback);
- } catch (Exception e) {
- explorerPanel.getAsycTreePanel().unmask();
- new MessageBoxAlert("Error", e.getMessage(), null);
- explorerPanel.getAsycTreePanel().removeAllAndRecoveryRoot();
+ if (fileDownloadEvent.isFolder()) {
+ FolderDownloadDialog dlg = new FolderDownloadDialog(fileDownloadEvent, myLogin);
+ dlg.setPopupPosition(Window.getClientWidth() - (FolderDownloadDialog.WIDTH + 50), Window.getClientHeight() - (FolderDownloadDialog.HEIGHT + 120));
+ dlg.show();
+ }
+
+ else {
+ try {
+ new RequestBuilderWorkspaceValidateItem(RequestBuilder.GET,ConstantsExplorer.DOWNLOAD_WORKSPACE_SERVICE, "id="+fileDownloadEvent.getItemIdentifier(), "_self", downloadHandlerCallback);
+ } catch (Exception e) {
+ explorerPanel.getAsycTreePanel().unmask();
+ new MessageBoxAlert("Error", e.getMessage(), null);
+ explorerPanel.getAsycTreePanel().removeAllAndRecoveryRoot();
+ }
}
}
notifySubscriber(fileDownloadEvent);
@@ -1469,7 +1470,7 @@ public class AppControllerExplorer implements EventHandler, TreeAppControllerInt
//ADDED 24/07/2013
if(imagePreviewEvent.getSourceFileModel()!=null){ //FILE CAN NOT LOADED IN TREE
- notifySubscriber(new FileDownloadEvent(imagePreviewEvent.getSourceFileModel().getIdentifier(), imagePreviewEvent.getSourceFileModel().getName(), FileDownloadEvent.DownloadType.SHOW));
+ notifySubscriber(new FileDownloadEvent(imagePreviewEvent.getSourceFileModel().getIdentifier(), imagePreviewEvent.getSourceFileModel().getName(), FileDownloadEvent.DownloadType.SHOW, false));
}
}
diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/ConstantsExplorer.java b/src/main/java/org/gcube/portlets/user/workspace/client/ConstantsExplorer.java
index 5adb8df..796271e 100644
--- a/src/main/java/org/gcube/portlets/user/workspace/client/ConstantsExplorer.java
+++ b/src/main/java/org/gcube/portlets/user/workspace/client/ConstantsExplorer.java
@@ -20,6 +20,15 @@ public class ConstantsExplorer {
public static final String UPLOAD_WORKSPACE_SERVICE = GWT.getModuleBaseURL() + "UploadService";
public static final String LOCAL_UPLOAD_WORKSPACE_SERVICE = GWT.getModuleBaseURL() + "LocalUploadService";
public static final String DOWNLOAD_WORKSPACE_SERVICE = GWT.getModuleBaseURL() + "DownloadService";
+ public static final String DOWNLOAD_WORKSPACE_FOLDER_SERVLET = GWT.getModuleBaseURL() + "DownloadFolderServlet";
+ public static final String DOWNLOAD_WORKSPACE_FOLDER_SERVICE = "downloadfolder";
+ public static final String DOWNLOAD_WORKSPACE_FOLDER_PROTOCOL_DO_ZIP = "ZIP";
+ public static final String DOWNLOAD_WORKSPACE_FOLDER_PROTOCOL_ZIPPING = "ZIPPING";
+ public static final String DOWNLOAD_WORKSPACE_FOLDER_PROTOCOL_ERROR_NOT_FOUND = "ERROR_NOT_FOUND";
+ public static final String DOWNLOAD_WORKSPACE_FOLDER_PROTOCOL_ERROR_DURING_COMPRESSION = "ERROR_DURING_COMPRESSION";
+ public static final String DOWNLOAD_WORKSPACE_FOLDER_PROTOCOL_ERROR_NOT_A_FOLDER = "ERROR_NOT_A_FOLDER";
+ public static final String DOWNLOAD_WORKSPACE_FOLDER_PROTOCOL_ERROR_SESSION_EXPIRED = "ERROR_SESSION_EXPIRED";
+
public static final String SERVER_ERROR = "Sorry, an error has occurred on the server when";
public static final String TRY_AGAIN = "Try again";
diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/event/FileDownloadEvent.java b/src/main/java/org/gcube/portlets/user/workspace/client/event/FileDownloadEvent.java
index 94dc237..4a58e35 100644
--- a/src/main/java/org/gcube/portlets/user/workspace/client/event/FileDownloadEvent.java
+++ b/src/main/java/org/gcube/portlets/user/workspace/client/event/FileDownloadEvent.java
@@ -12,13 +12,15 @@ public class FileDownloadEvent extends GwtEvent implem
private String itemIdentifier = null;
private DownloadType downloadType;
private String itemName;
+ private boolean isFolder;
// private FileType fileType;
// public enum FileType {TREE, ATTACH};
- public FileDownloadEvent(String itemIdentifier, String name, DownloadType downloadType) {
+ public FileDownloadEvent(String itemIdentifier, String name, DownloadType downloadType, boolean isFolder) {
this.itemIdentifier = itemIdentifier;
this.downloadType = downloadType;
this.itemName = name;
+ this.isFolder = isFolder;
// this.fileType = fileType;
}
@@ -49,6 +51,10 @@ public class FileDownloadEvent extends GwtEvent implem
return itemName;
}
+ public boolean isFolder() {
+ return isFolder;
+ }
+
/* (non-Javadoc)
* @see org.gcube.portlets.user.workspace.client.interfaces.GuiEventInterface#getKey()
*/
diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/rpc/GWTWorkspaceService.java b/src/main/java/org/gcube/portlets/user/workspace/client/rpc/GWTWorkspaceService.java
index 9ef1601..82d5d46 100644
--- a/src/main/java/org/gcube/portlets/user/workspace/client/rpc/GWTWorkspaceService.java
+++ b/src/main/java/org/gcube/portlets/user/workspace/client/rpc/GWTWorkspaceService.java
@@ -40,7 +40,7 @@ import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
*/
@RemoteServiceRelativePath("WorkspaceService")
public interface GWTWorkspaceService extends RemoteService{
-
+ String getServletContextPath(String protocol);
/**
* Gets the user workspace size.
*
diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/rpc/GWTWorkspaceServiceAsync.java b/src/main/java/org/gcube/portlets/user/workspace/client/rpc/GWTWorkspaceServiceAsync.java
index bc85f3a..cb7821d 100644
--- a/src/main/java/org/gcube/portlets/user/workspace/client/rpc/GWTWorkspaceServiceAsync.java
+++ b/src/main/java/org/gcube/portlets/user/workspace/client/rpc/GWTWorkspaceServiceAsync.java
@@ -720,4 +720,6 @@ public interface GWTWorkspaceServiceAsync {
void markFolderAsPublicForFolderItemId(
String itemId, boolean setPublic, AsyncCallback callback);
+ void getServletContextPath(String protocol, AsyncCallback callback);
+
}
diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/util/FolderDownloadDialog.java b/src/main/java/org/gcube/portlets/user/workspace/client/util/FolderDownloadDialog.java
new file mode 100644
index 0000000..142cfc7
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/user/workspace/client/util/FolderDownloadDialog.java
@@ -0,0 +1,201 @@
+package org.gcube.portlets.user.workspace.client.util;
+
+import javax.annotation.Nonnull;
+
+import org.gcube.portlets.user.gcubewidgets.client.popup.GCubeDialog;
+import org.gcube.portlets.user.workspace.client.ConstantsExplorer;
+import org.gcube.portlets.user.workspace.client.event.FileDownloadEvent;
+import org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService;
+import org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceServiceAsync;
+import org.gcube.portlets.user.workspace.client.view.windows.MessageBoxAlert;
+import org.realityforge.gwt.websockets.client.WebSocket;
+import org.realityforge.gwt.websockets.client.WebSocketListener;
+
+import com.github.gwtbootstrap.client.ui.Button;
+import com.github.gwtbootstrap.client.ui.Icon;
+import com.github.gwtbootstrap.client.ui.Paragraph;
+import com.github.gwtbootstrap.client.ui.constants.IconType;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.event.dom.client.ClickEvent;
+import com.google.gwt.event.dom.client.ClickHandler;
+import com.google.gwt.http.client.RequestBuilder;
+import com.google.gwt.typedarrays.shared.ArrayBuffer;
+import com.google.gwt.user.client.Timer;
+import com.google.gwt.user.client.Window;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.google.gwt.user.client.ui.HasAlignment;
+import com.google.gwt.user.client.ui.VerticalPanel;
+
+public class FolderDownloadDialog extends GCubeDialog implements WebSocketListener {
+ private final GWTWorkspaceServiceAsync rpcWorkspaceService = (GWTWorkspaceServiceAsync) GWT.create(GWTWorkspaceService.class);
+
+ public static final int WIDTH = 300;
+ public static final int HEIGHT = 50;
+
+ private final WebSocket webSocket = WebSocket.newWebSocketIfSupported();
+ private final String username;
+ private VerticalPanel topPanel = new VerticalPanel();
+ private Icon loading = new Icon();
+ Button close = new Button("Cancel Download");
+ private Paragraph toShow = new Paragraph("Locating folder, please wait ...");
+ private String webSocketURL;
+ public FolderDownloadDialog(final FileDownloadEvent folder2Download, String username) {
+ this.webSocket.setListener( this );
+ this.username = username;
+ setText("Preparing folder download");
+
+
+ loading.setSpin(true);
+ loading.setType(IconType.ROTATE_RIGHT);
+
+ topPanel.add(toShow);
+ topPanel.add(loading);
+ topPanel.setPixelSize(WIDTH, HEIGHT);
+
+
+ VerticalPanel bPanel = new VerticalPanel();
+ bPanel.setWidth(WIDTH+"px");
+ bPanel.setHorizontalAlignment(HasAlignment.ALIGN_RIGHT);
+ bPanel.add(close);
+ close.addClickHandler(new ClickHandler() {
+ @Override
+ public void onClick(ClickEvent event) {
+ hide();
+ }
+ });
+ topPanel.add(bPanel);
+ add(topPanel);
+
+ rpcWorkspaceService.getServletContextPath(Window.Location.getProtocol(), new AsyncCallback() {
+
+ @Override
+ public void onSuccess(String servletContextPath) {
+ webSocketURL = getWebSocketURL(servletContextPath);
+ startZipping(webSocketURL, folder2Download.getItemIdentifier());
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+ loading.setIcon(IconType.EXCLAMATION_SIGN);
+ loading.setSpin(false);
+ toShow.setText("Error trying contact the server, please refresh this page and retry");
+ }
+ });
+ }
+
+ private boolean startZipping(String webSocketURL, final String folderIdToZip) {
+ if ( null == webSocket ) {
+ Window.alert( "WebSocket not available!" );
+ }
+
+ webSocket.connect( webSocketURL );
+ //allow some timet to connect
+ Timer t = new Timer() {
+ @Override
+ public void run() {
+ webSocket.send(ConstantsExplorer.DOWNLOAD_WORKSPACE_FOLDER_PROTOCOL_DO_ZIP+":"+folderIdToZip+":"+username);
+ }
+ };
+ t.schedule(2000);
+ return true;
+
+ }
+
+ private String getWebSocketURL(String servletContextPath) {
+ String moduleBaseURL = servletContextPath;
+ return moduleBaseURL.replaceFirst( "http", "ws" ) + "/" + ConstantsExplorer.DOWNLOAD_WORKSPACE_FOLDER_SERVICE;
+ }
+
+ @Override
+ public void onOpen(WebSocket webSocket) { }
+
+ @Override
+ public void onClose(WebSocket webSocket, boolean wasClean, int code, String reason) { }
+
+ @Override
+ public void onMessage( @Nonnull final WebSocket webSocket, @Nonnull final String textData ) {
+ switch (textData) {
+ case ConstantsExplorer.DOWNLOAD_WORKSPACE_FOLDER_PROTOCOL_ZIPPING:
+ toShow.setText("Compressing folder, this could take some time ...");
+ break;
+ case ConstantsExplorer.DOWNLOAD_WORKSPACE_FOLDER_PROTOCOL_ERROR_NOT_FOUND:
+ toShow.setText("Could not locate the folder on server, please report this issue");
+ loading.setIcon(IconType.EXCLAMATION_SIGN);
+ loading.setSpin(false);
+ webSocket.close();
+ break;
+ case ConstantsExplorer.DOWNLOAD_WORKSPACE_FOLDER_PROTOCOL_ERROR_DURING_COMPRESSION:
+ toShow.setText("An error occurred while compressing this folder, please report this issue");
+ loading.setIcon(IconType.EXCLAMATION_SIGN);
+ loading.setSpin(false);
+ webSocket.close();
+ break;
+ case ConstantsExplorer.DOWNLOAD_WORKSPACE_FOLDER_PROTOCOL_ERROR_NOT_A_FOLDER:
+ toShow.setText("An error occurred, the folderId is not a valid folder, please report this issue");
+ loading.setIcon(IconType.EXCLAMATION_SIGN);
+ loading.setSpin(false);
+ webSocket.close();
+ break;
+ case ConstantsExplorer.DOWNLOAD_WORKSPACE_FOLDER_PROTOCOL_ERROR_SESSION_EXPIRED:
+ toShow.setText("It seems your session expired, please refresh the page and try again");
+ loading.setIcon(IconType.EXCLAMATION_SIGN);
+ loading.setSpin(false);
+ webSocket.close();
+ break;
+ default:
+ //the thread zipping has finished, is sending the zipped filepath on the server
+ toShow.setText("Compressing folder success, starting download");
+ triggerDownloadFile(textData);
+ loading.setIcon(IconType.OK_SIGN);
+ loading.setSpin(false);
+ close.setText("Hide");
+ this.setModal(false);
+ webSocket.close();
+ Timer t = new Timer() {
+ @Override
+ public void run() {
+ hide();
+ }
+ };
+ t.schedule(1000);
+ break;
+ }
+ }
+
+ @Override
+ public void onMessage( @Nonnull final WebSocket webSocket, @Nonnull final ArrayBuffer data ) {}
+
+
+ @Override
+ public void onError(WebSocket webSocket) {
+ toShow.setText("Error contacting the server socket, please refresh this page and retry");
+ }
+
+ private void triggerDownloadFile(String filePathOnServer) {
+ try {
+ new RequestBuilderWorkspaceValidateItem(RequestBuilder.GET,ConstantsExplorer.DOWNLOAD_WORKSPACE_FOLDER_SERVLET, "filepath="+filePathOnServer, "_self", downloadHandlerCallback);
+ } catch (Exception e) {
+ new MessageBoxAlert("Error", e.getMessage(), null);
+ }
+ }
+
+ public AsyncCallback downloadHandlerCallback = new AsyncCallback() {
+
+ @Override
+ public void onFailure(Throwable caught) {
+ new MessageBoxAlert("Error", caught.getMessage(), null);
+ }
+
+ @Override
+ public void onSuccess(WindowOpenParameter windowOpenParam) {
+ String params = "?"+windowOpenParam.getParameters();
+
+ if(params.length()>1)
+ params+="&";
+
+ params+=ConstantsExplorer.REDIRECTONERROR+"="+windowOpenParam.isRedirectOnError();
+
+ windowOpenParam.getBrowserWindow().setUrl(ConstantsExplorer.DOWNLOAD_WORKSPACE_FOLDER_SERVLET+params);
+ }
+ };
+}
diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/view/tree/ContextMenuTree.java b/src/main/java/org/gcube/portlets/user/workspace/client/view/tree/ContextMenuTree.java
index 3d613d7..9172036 100644
--- a/src/main/java/org/gcube/portlets/user/workspace/client/view/tree/ContextMenuTree.java
+++ b/src/main/java/org/gcube/portlets/user/workspace/client/view/tree/ContextMenuTree.java
@@ -539,7 +539,7 @@ public class ContextMenuTree {
for (final FileModel sel : listSelectedItems) {
- eventBus.fireEvent(new FileDownloadEvent(sel.getIdentifier(), sel.getName(), DownloadType.SHOW));
+ eventBus.fireEvent(new FileDownloadEvent(sel.getIdentifier(), sel.getName(), DownloadType.SHOW, (sel.isDirectory() || sel.isVreFolder())));
}
}
});
@@ -637,7 +637,7 @@ public class ContextMenuTree {
public void componentSelected(MenuEvent ce) {
for (FileModel sel : listSelectedItems) {
- eventBus.fireEvent(new FileDownloadEvent(sel.getIdentifier(), sel.getName(), DownloadType.DOWNLOAD));
+ eventBus.fireEvent(new FileDownloadEvent(sel.getIdentifier(), sel.getName(), DownloadType.DOWNLOAD, (sel.isDirectory() || sel.isVreFolder())));
}
}
});
diff --git a/src/main/java/org/gcube/portlets/user/workspace/server/DownloadFolderServlet.java b/src/main/java/org/gcube/portlets/user/workspace/server/DownloadFolderServlet.java
new file mode 100644
index 0000000..dbb9ae1
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/user/workspace/server/DownloadFolderServlet.java
@@ -0,0 +1,215 @@
+/**
+ *
+ */
+package org.gcube.portlets.user.workspace.server;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.StringReader;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.log4j.Logger;
+import org.gcube.common.homelibrary.home.workspace.Workspace;
+import org.gcube.portlets.user.workspace.client.ConstantsExplorer;
+import org.gcube.portlets.user.workspace.server.property.PortalUrlGroupGatewayProperty;
+import org.gcube.portlets.user.workspace.server.util.WsUtil;
+import org.gcube.portlets.user.workspace.shared.HandlerResultMessage;
+import org.gcube.portlets.user.workspace.shared.SessionExpiredException;
+
+/**
+ * @author M. Assante, CNR-ISTI
+ */
+@SuppressWarnings("serial")
+public class DownloadFolderServlet extends HttpServlet{
+
+
+ protected static Logger logger = Logger.getLogger(DownloadFolderServlet.class);
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void init() throws ServletException {
+ super.init();
+ logger.trace("Workspace DownloadFolderServlet ready.");
+ }
+
+ public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ boolean urlRedirectOnError = req.getParameter(ConstantsExplorer.REDIRECTONERROR)==null?false:req.getParameter(ConstantsExplorer.REDIRECTONERROR).equals("true");
+
+ try {
+ HttpSession session = req.getSession();
+ if(WsUtil.isSessionExpired(session))
+ throw new SessionExpiredException();
+ } catch (Exception e) {
+
+ if (e instanceof SessionExpiredException){
+ sendErrorForStatus(resp, HttpServletResponse.SC_UNAUTHORIZED +": Session expired", HttpServletResponse.SC_UNAUTHORIZED);
+ return;
+ }
+ }
+
+ String fileAbsolutePath = req.getParameter("filepath");
+ logger.debug("Trigger file download of " + fileAbsolutePath);
+ try {
+ File tmpZip = new File(fileAbsolutePath);
+ logger.debug("File instanciated " + fileAbsolutePath);
+
+ resp.setHeader( "Content-Disposition", "attachment; filename=\"" + tmpZip.getName() + ".zip\"" );
+ resp.setContentType("application/zip");
+ resp = setContentLength(resp, tmpZip.length());
+ OutputStream out = resp.getOutputStream();
+
+ FileInputStream fileTmpZip = new FileInputStream(tmpZip);
+ IOUtils.copy(fileTmpZip, resp.getOutputStream());
+ fileTmpZip.close();
+
+ out.close();
+ tmpZip.deleteOnExit();
+ return;
+
+ } catch (Exception e) {
+ logger.error("Error during folder compression "+fileAbsolutePath,e);
+ handleError(urlRedirectOnError, req, resp, fileAbsolutePath, HttpServletResponse.SC_INTERNAL_SERVER_ERROR +": Error during folder compression: "+e.getMessage());
+ return;
+ }
+
+
+ }
+
+ /**
+ * Method to manage HttpServletResponse content length also to big data
+ * @param resp
+ * @param length
+ * @return
+ */
+ protected HttpServletResponse setContentLength(HttpServletResponse resp, long length){
+ try{
+ if (length <= Integer.MAX_VALUE)
+ resp.setContentLength((int)length);
+ else
+ resp.addHeader("Content-Length", Long.toString(length));
+ }catch(Exception e){
+ //silent
+ }
+ return resp;
+ }
+
+ protected void handleError(boolean urlRedirectOnError, HttpServletRequest req, HttpServletResponse resp, String itemId, String message) throws IOException{
+
+ logger.warn("Handle error occurred: "+message);
+ logger.trace("urlRedirectOnError is active: "+urlRedirectOnError);
+ if(urlRedirectOnError){
+ urlRedirect(req, resp, itemId);
+ }else
+ sendError(resp,message);
+
+ }
+
+ protected void sendError(HttpServletResponse response, String message) throws IOException
+ {
+ response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ HandlerResultMessage resultMessage = HandlerResultMessage.errorResult(message);
+ logger.trace("error message: "+resultMessage);
+ logger.trace("writing response...");
+ StringReader sr = new StringReader(resultMessage.toString());
+ IOUtils.copy(sr, response.getOutputStream());
+
+ logger.trace("response writed");
+ response.flushBuffer();
+ }
+
+
+ protected void sendErrorForStatus(HttpServletResponse response, String message, int status) throws IOException
+ {
+ response.setStatus(status);
+ HandlerResultMessage resultMessage = HandlerResultMessage.errorResult(message);
+ logger.trace("error message: "+resultMessage);
+ logger.trace("writing response...");
+ StringReader sr = new StringReader(resultMessage.toString());
+ IOUtils.copy(sr, response.getOutputStream());
+
+ logger.trace("response written");
+ response.flushBuffer();
+ }
+
+ protected void sendMessage(HttpServletResponse response, String message) throws IOException
+ {
+ response.setStatus(HttpServletResponse.SC_ACCEPTED);
+ HandlerResultMessage resultMessage = HandlerResultMessage.okResult(message);
+ response.getWriter().write(resultMessage.toString());
+ response.flushBuffer();
+ }
+
+ protected void sendMessageResourceAvailable(HttpServletResponse response, String message) throws IOException
+ {
+ response.setStatus(HttpServletResponse.SC_ACCEPTED);
+ HandlerResultMessage resultMessage = HandlerResultMessage.okResult(message);
+ response.getWriter().write(resultMessage.toString());
+ response.flushBuffer();
+ }
+
+ protected void sendWarnMessage(HttpServletResponse response, String message) throws IOException
+ {
+ response.setStatus(HttpServletResponse.SC_ACCEPTED);
+ HandlerResultMessage resultMessage = HandlerResultMessage.warnResult(message);
+ response.getWriter().write(resultMessage.toString());
+ response.flushBuffer();
+ }
+
+ protected void urlRedirect(HttpServletRequest req, HttpServletResponse response, String fakePath) throws IOException {
+
+ String requestUrl = getRequestURL(req) +fakePath;
+ logger.trace("Url redirect on: "+requestUrl);
+ // System.out.println("Url redirect on: "+requestUrl);
+ response.sendRedirect(response.encodeRedirectURL(requestUrl));
+ return;
+ }
+
+ public static String getRequestURL(HttpServletRequest req) {
+
+ String scheme = req.getScheme(); // http
+ String serverName = req.getServerName(); // hostname.com
+ int serverPort = req.getServerPort(); // 80
+ String contextPath = req.getContextPath(); // /mywebapp
+
+
+ // Reconstruct original requesting URL
+ StringBuffer url = new StringBuffer();
+ url.append(scheme).append("://").append(serverName);
+
+ if (serverPort != 80 && serverPort != 443) {
+ url.append(":").append(serverPort);
+ }
+
+ logger.trace("server: "+url);
+ logger.trace("omitted contextPath: "+contextPath);
+
+
+ PortalUrlGroupGatewayProperty p = new PortalUrlGroupGatewayProperty();
+
+ int lenght = p.getPath().length();
+
+ String groupgatewaypath = "/";
+
+ if(lenght>1){
+
+ String lastChar = p.getPath().substring(lenght-1, lenght-1);
+
+ groupgatewaypath+= lastChar.compareTo("/")!=0?p.getPath()+"/":p.getPath();
+ }
+
+ url.append(groupgatewaypath);
+
+ return url.toString();
+ }
+
+}
diff --git a/src/main/java/org/gcube/portlets/user/workspace/server/GWTWorkspaceServiceImpl.java b/src/main/java/org/gcube/portlets/user/workspace/server/GWTWorkspaceServiceImpl.java
index 1e17ed5..8ec47cd 100644
--- a/src/main/java/org/gcube/portlets/user/workspace/server/GWTWorkspaceServiceImpl.java
+++ b/src/main/java/org/gcube/portlets/user/workspace/server/GWTWorkspaceServiceImpl.java
@@ -12,6 +12,7 @@ import java.util.Map;
import java.util.concurrent.TimeUnit;
import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.log4j.Logger;
@@ -41,6 +42,7 @@ import org.gcube.common.homelibrary.home.workspace.folder.items.GCubeItem;
import org.gcube.common.homelibrary.home.workspace.search.SearchItem;
import org.gcube.common.homelibrary.home.workspace.trash.WorkspaceTrashFolder;
import org.gcube.common.homelibrary.home.workspace.trash.WorkspaceTrashItem;
+import org.gcube.common.portal.PortalContext;
import org.gcube.common.scope.api.ScopeProvider;
import org.gcube.datacatalogue.ckanutillibrary.ApplicationProfileScopePerUrlReader;
import org.gcube.datacatalogue.ckanutillibrary.CKanUtils;
@@ -64,6 +66,7 @@ import org.gcube.portlets.user.workspace.client.workspace.GWTWorkspaceItem;
import org.gcube.portlets.user.workspace.client.workspace.folder.item.gcube.WorkspaceHandledException;
import org.gcube.portlets.user.workspace.server.notifications.NotificationsProducer;
import org.gcube.portlets.user.workspace.server.notifications.NotificationsUtil;
+import org.gcube.portlets.user.workspace.server.property.PortalUrlGroupGatewayProperty;
import org.gcube.portlets.user.workspace.server.reader.ApplicationProfile;
import org.gcube.portlets.user.workspace.server.reader.ApplicationProfileReader;
import org.gcube.portlets.user.workspace.server.resolver.UriResolverReaderParameterForResolverIndex;
@@ -1704,10 +1707,10 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT
Workspace workspace = getWorkspace();
workspaceLogger.info("shareFolder "+ folder.getIdentifier()
- + " name: "+ folder.getName()
- + " parent is: " + folder.getParentFileModel()
- + " listContacts size: " + listContacts.size()
- +" ACL: "+acl);
+ + " name: "+ folder.getName()
+ + " parent is: " + folder.getParentFileModel()
+ + " listContacts size: " + listContacts.size()
+ +" ACL: "+acl);
//DEBUG
printContacts(listContacts);
@@ -3599,4 +3602,32 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT
throw new Exception(error);
}
}
+
+ @Override
+ public String getServletContextPath(String protocol) {
+ HttpServletRequest req = getThreadLocalRequest();
+
+ String scheme = protocol;
+
+ String serverName = req.getServerName(); // hostname.com
+ int serverPort = req.getServerPort(); // 80
+ String contextPath = req.getServletContext().getContextPath(); // /mywebapp
+
+
+ // Reconstruct original requesting URL
+ StringBuffer url = new StringBuffer();
+ url.append(scheme).append("//").append(serverName);
+
+ if (serverPort != 80 && serverPort != 443) {
+ url.append(":").append(serverPort);
+ }
+
+ workspaceLogger.debug("server: "+url);
+ workspaceLogger.debug("omitted contextPath: "+contextPath);
+
+
+ url.append(contextPath);
+ workspaceLogger.debug("getServletContextPath=" + url.toString());
+ return url.toString();
+ }
}