From b07212e356125bb59afac9076b4d59f5ae1abe62 Mon Sep 17 00:00:00 2001 From: Giancarlo Panichi Date: Mon, 1 Oct 2018 16:01:01 +0000 Subject: [PATCH] ref 11720: DataMiner - Update to StorageHUB https://support.d4science.org/issues/11720 Updated to StorageHub git-svn-id: https://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/user/data-miner-manager@171792 82a268e6-3cf1-43bd-a215-b396298e98cf --- .classpath | 6 +- distro/changelog.xml | 39 +++--- pom.xml | 2 +- .../ComputationsExecutedPanel.java | 66 ++++++---- .../client/dataspace/InputDataSetsPanel.java | 70 +++++----- .../client/dataspace/OutputDataSetsPanel.java | 85 ++++++------ .../server/DownloadFileServlet.java | 123 ++++++++++++++++++ .../server/DownloadFolderServlet.java | 2 +- .../server/storage/StorageUtil.java | 35 ++++- .../server/util/TableReader.java | 2 +- .../dataminermanager/shared/Constants.java | 24 ++-- src/main/webapp/WEB-INF/web.xml | 14 ++ 12 files changed, 331 insertions(+), 137 deletions(-) create mode 100644 src/main/java/org/gcube/portlets/user/dataminermanager/server/DownloadFileServlet.java diff --git a/.classpath b/.classpath index c73cdaa..d1d7469 100644 --- a/.classpath +++ b/.classpath @@ -1,12 +1,12 @@ - + - + @@ -34,5 +34,5 @@ - + diff --git a/distro/changelog.xml b/distro/changelog.xml index 1c88ad0..f6c5a2b 100644 --- a/distro/changelog.xml +++ b/distro/changelog.xml @@ -1,52 +1,49 @@ - - Updated to new WorkspaceExplorer widget that support - StorageHUB[ticket #11721] + + Updated download item to support StorageHub[ticket #11720] + - + + Updated to new WorkspaceExplorer widget that support + StorageHUB[ticket #11721] + + + Integrated DataMiner CL for simplify integration with new StorageHub[ticket #11720] Added refresh button in operators panel[ticket #11741] Added hyperlink for log that contains http reference[ticket - #11529] + #11529] + - + Added NetCDF files support Added [TEXTAREA] string support - + Support Java 8 compatibility [ticket #8471] - + Fixed load balancing [ticket #7576] - + Updated PortalContext [ticket #6278] Added encoded parameters in equivalent http request [ticket #7167] - + Updated Output support Added PortalContext - + Updated to Auth 2.0 Added Spatial data support [Ticket #4172] Added Temporal data support [Ticket #4172] - + First release \ No newline at end of file diff --git a/pom.xml b/pom.xml index d876bc6..4d42f80 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ org.gcube.portlets.user data-miner-manager - 1.8.0-SNAPSHOT + 1.9.0-SNAPSHOT war data-miner-manager diff --git a/src/main/java/org/gcube/portlets/user/dataminermanager/client/computations/ComputationsExecutedPanel.java b/src/main/java/org/gcube/portlets/user/dataminermanager/client/computations/ComputationsExecutedPanel.java index c4dc48b..2ccc478 100644 --- a/src/main/java/org/gcube/portlets/user/dataminermanager/client/computations/ComputationsExecutedPanel.java +++ b/src/main/java/org/gcube/portlets/user/dataminermanager/client/computations/ComputationsExecutedPanel.java @@ -5,6 +5,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription; import org.gcube.portal.clientcontext.client.GCubeClientContext; import org.gcube.portlets.user.dataminermanager.client.DataMinerManager; import org.gcube.portlets.user.dataminermanager.client.common.EventBusProvider; @@ -14,14 +15,10 @@ import org.gcube.portlets.user.dataminermanager.client.events.DataMinerWorkAreaE import org.gcube.portlets.user.dataminermanager.client.events.DeleteItemRequestEvent; import org.gcube.portlets.user.dataminermanager.client.events.RefreshDataMinerWorkAreaEvent; import org.gcube.portlets.user.dataminermanager.client.events.ResubmitComputationExecutionRequestEvent; -import org.gcube.portlets.user.dataminermanager.client.events.SessionExpiredEvent; import org.gcube.portlets.user.dataminermanager.client.events.UIStateEvent; -import org.gcube.portlets.user.dataminermanager.client.rpc.DataMinerPortletServiceAsync; import org.gcube.portlets.user.dataminermanager.client.type.DataMinerWorkAreaElementType; import org.gcube.portlets.user.dataminermanager.client.util.UtilsGXT3; import org.gcube.portlets.user.dataminermanager.shared.Constants; -import org.gcube.portlets.user.dataminermanager.shared.exception.SessionExpiredServiceException; -import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription; 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.dragdrop.MultipleDNDUpload; @@ -35,8 +32,8 @@ import com.allen_sauer.gwt.log.client.Log; import com.google.gwt.core.client.GWT; import com.google.gwt.event.logical.shared.ResizeEvent; import com.google.gwt.event.logical.shared.ResizeHandler; +import com.google.gwt.http.client.URL; import com.google.gwt.user.client.Window; -import com.google.gwt.user.client.rpc.AsyncCallback; import com.sencha.gxt.cell.core.client.ButtonCell.ButtonScale; import com.sencha.gxt.cell.core.client.ButtonCell.IconAlign; import com.sencha.gxt.core.client.util.Margins; @@ -59,7 +56,8 @@ public class ComputationsExecutedPanel extends FramedPanel { private Item selectedItem; private MultipleDNDUpload dnd; - //private WorkspaceResourcesExplorerPanelPaginated wsResourcesExplorerPanel; + // private WorkspaceResourcesExplorerPanelPaginated + // wsResourcesExplorerPanel; private WorkspaceResourcesExplorerPanel wsResourcesExplorerPanel; private TextButton btnShow; private TextButton btnDownload; @@ -492,35 +490,47 @@ public class ComputationsExecutedPanel extends FramedPanel { + Constants.CURR_GROUP_ID + "=" + GCubeClientContext.getCurrentContextId()); Log.debug("Retrieved link: " + actionUrl); - Window.open(actionUrl.toString(), selectedItem.getName(), ""); + Window.open(URL.encode(actionUrl.toString()), selectedItem.getName(), ""); } else { - final ItemDescription itemDescription = new ItemDescription(selectedItem.getId(), selectedItem.getName(), selectedItem.getOwner(), selectedItem.getPath(), selectedItem.getType().name()); + Log.debug("ItemDescription: " + itemDescription); + StringBuilder url = new StringBuilder(); + url.append(GWT.getModuleBaseURL()); + url.append(Constants.DOWNLOAD_FILE_SERVLET + "/" + itemDescription.getName() + "?itemId=" + + itemDescription.getId() + "&" + Constants.CURR_GROUP_ID + "=" + + GCubeClientContext.getCurrentContextId()); - DataMinerPortletServiceAsync.INSTANCE.getPublicLink(itemDescription, new AsyncCallback() { + Window.open(URL.encode(url.toString()), "_blank", ""); - @Override - public void onFailure(Throwable caught) { - if (caught instanceof SessionExpiredServiceException) { - EventBusProvider.INSTANCE.fireEvent(new SessionExpiredEvent()); - } else { - Log.error("Error open file: " + caught.getLocalizedMessage()); - UtilsGXT3.alert("Error", caught.getLocalizedMessage()); - } - caught.printStackTrace(); - - } - - @Override - public void onSuccess(String link) { - Log.debug("Retrieved link: " + link); - Window.open(link, itemDescription.getName(), ""); - } - - }); + /* + * final ItemDescription itemDescription = new + * ItemDescription(selectedItem.getId(), selectedItem.getName(), + * selectedItem.getOwner(), selectedItem.getPath(), + * selectedItem.getType().name()); + * + * DataMinerPortletServiceAsync.INSTANCE.getPublicLink( + * itemDescription, new AsyncCallback() { + * + * @Override public void onFailure(Throwable caught) { if + * (caught instanceof SessionExpiredServiceException) { + * EventBusProvider.INSTANCE.fireEvent(new + * SessionExpiredEvent()); } else { + * Log.error("Error open file: " + + * caught.getLocalizedMessage()); UtilsGXT3.alert("Error", + * caught.getLocalizedMessage()); } caught.printStackTrace(); + * + * } + * + * @Override public void onSuccess(String link) { + * Log.debug("Retrieved link: " + link); Window.open(link, + * itemDescription.getName(), ""); } + * + * }); + * + */ } } else { UtilsGXT3.info("Attention", "Select a file!"); diff --git a/src/main/java/org/gcube/portlets/user/dataminermanager/client/dataspace/InputDataSetsPanel.java b/src/main/java/org/gcube/portlets/user/dataminermanager/client/dataspace/InputDataSetsPanel.java index 13c185f..2caae09 100644 --- a/src/main/java/org/gcube/portlets/user/dataminermanager/client/dataspace/InputDataSetsPanel.java +++ b/src/main/java/org/gcube/portlets/user/dataminermanager/client/dataspace/InputDataSetsPanel.java @@ -12,14 +12,11 @@ import org.gcube.portlets.user.dataminermanager.client.common.EventBusProvider; import org.gcube.portlets.user.dataminermanager.client.events.DataMinerWorkAreaEvent; import org.gcube.portlets.user.dataminermanager.client.events.DeleteItemRequestEvent; import org.gcube.portlets.user.dataminermanager.client.events.RefreshDataMinerWorkAreaEvent; -import org.gcube.portlets.user.dataminermanager.client.events.SessionExpiredEvent; import org.gcube.portlets.user.dataminermanager.client.events.SyncRefreshUploadDataSpaceEvent; import org.gcube.portlets.user.dataminermanager.client.events.UIStateEvent; -import org.gcube.portlets.user.dataminermanager.client.rpc.DataMinerPortletServiceAsync; import org.gcube.portlets.user.dataminermanager.client.type.DataMinerWorkAreaElementType; import org.gcube.portlets.user.dataminermanager.client.util.UtilsGXT3; import org.gcube.portlets.user.dataminermanager.shared.Constants; -import org.gcube.portlets.user.dataminermanager.shared.exception.SessionExpiredServiceException; 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.dragdrop.MultipleDNDUpload; @@ -33,8 +30,8 @@ import com.allen_sauer.gwt.log.client.Log; import com.google.gwt.core.client.GWT; import com.google.gwt.event.logical.shared.ResizeEvent; import com.google.gwt.event.logical.shared.ResizeHandler; +import com.google.gwt.http.client.URL; import com.google.gwt.user.client.Window; -import com.google.gwt.user.client.rpc.AsyncCallback; import com.sencha.gxt.cell.core.client.ButtonCell.ButtonScale; import com.sencha.gxt.cell.core.client.ButtonCell.IconAlign; import com.sencha.gxt.core.client.util.Margins; @@ -283,10 +280,10 @@ public class InputDataSetsPanel extends FramedPanel { public void onUploadCompleted(String parentId, String itemId) { Log.debug("InputDataSetsPanel Upload completed: [parentID: " + parentId + ", itemId: " + itemId + "]"); - SyncRefreshUploadDataSpaceEvent ev=new SyncRefreshUploadDataSpaceEvent(); + SyncRefreshUploadDataSpaceEvent ev = new SyncRefreshUploadDataSpaceEvent(); EventBusProvider.INSTANCE.fireEvent(ev); - //wsResourcesExplorerPanel.refreshRootFolderView(); - //forceLayout(); + // wsResourcesExplorerPanel.refreshRootFolderView(); + // forceLayout(); } @@ -306,10 +303,10 @@ public class InputDataSetsPanel extends FramedPanel { public void onOverwriteCompleted(String parentId, String itemId) { Log.debug("InputDataSetsPanel Upload Override Completed: [parentID: " + parentId + ", itemId: " + itemId + "]"); - SyncRefreshUploadDataSpaceEvent ev=new SyncRefreshUploadDataSpaceEvent(); + SyncRefreshUploadDataSpaceEvent ev = new SyncRefreshUploadDataSpaceEvent(); EventBusProvider.INSTANCE.fireEvent(ev); - //wsResourcesExplorerPanel.refreshRootFolderView(); - //forceLayout(); + // wsResourcesExplorerPanel.refreshRootFolderView(); + // forceLayout(); } }; @@ -443,33 +440,44 @@ public class InputDataSetsPanel extends FramedPanel { + Constants.CURR_GROUP_ID + "=" + GCubeClientContext.getCurrentContextId()); Log.debug("Retrieved link: " + actionUrl); - Window.open(actionUrl.toString(), selectedItem.getName(), ""); + Window.open(URL.encode(actionUrl.toString()), selectedItem.getName(), ""); } else { final ItemDescription itemDescription = new ItemDescription(selectedItem.getId(), selectedItem.getName(), selectedItem.getOwner(), selectedItem.getPath(), selectedItem.getType().name()); + Log.debug("ItemDescription: " + itemDescription); + StringBuilder url = new StringBuilder(); + url.append(GWT.getModuleBaseURL()); + url.append(Constants.DOWNLOAD_FILE_SERVLET + "/" + itemDescription.getName() + "?itemId=" + + itemDescription.getId() + "&" + Constants.CURR_GROUP_ID + "=" + GCubeClientContext.getCurrentContextId()); - DataMinerPortletServiceAsync.INSTANCE.getPublicLink(itemDescription, new AsyncCallback() { + Window.open(URL.encode(url.toString()), "_blank", ""); - @Override - public void onFailure(Throwable caught) { - if (caught instanceof SessionExpiredServiceException) { - EventBusProvider.INSTANCE.fireEvent(new SessionExpiredEvent()); - } else { - Log.error("Error open file: " + caught.getLocalizedMessage(), caught); - UtilsGXT3.alert("Error", caught.getLocalizedMessage()); - } - caught.printStackTrace(); - - } - - @Override - public void onSuccess(String link) { - Log.debug("Retrieved link: " + link); - Window.open(link, itemDescription.getName(), ""); - } - - }); + /* + * final ItemDescription itemDescription = new + * ItemDescription(selectedItem.getId(), selectedItem.getName(), + * selectedItem.getOwner(), selectedItem.getPath(), + * selectedItem.getType().name()); + * + * DataMinerPortletServiceAsync.INSTANCE.getPublicLink( + * itemDescription, new AsyncCallback() { + * + * @Override public void onFailure(Throwable caught) { if + * (caught instanceof SessionExpiredServiceException) { + * EventBusProvider.INSTANCE.fireEvent(new + * SessionExpiredEvent()); } else { + * Log.error("Error open file: " + caught.getLocalizedMessage(), + * caught); UtilsGXT3.alert("Error", + * caught.getLocalizedMessage()); } caught.printStackTrace(); + * + * } + * + * @Override public void onSuccess(String link) { + * Log.debug("Retrieved link: " + link); Window.open(link, + * itemDescription.getName(), ""); } + * + * }); + */ } } else { UtilsGXT3.info("Attention", "Select a file!"); diff --git a/src/main/java/org/gcube/portlets/user/dataminermanager/client/dataspace/OutputDataSetsPanel.java b/src/main/java/org/gcube/portlets/user/dataminermanager/client/dataspace/OutputDataSetsPanel.java index c42c820..4b3243f 100644 --- a/src/main/java/org/gcube/portlets/user/dataminermanager/client/dataspace/OutputDataSetsPanel.java +++ b/src/main/java/org/gcube/portlets/user/dataminermanager/client/dataspace/OutputDataSetsPanel.java @@ -12,14 +12,11 @@ import org.gcube.portlets.user.dataminermanager.client.common.EventBusProvider; import org.gcube.portlets.user.dataminermanager.client.events.DataMinerWorkAreaEvent; import org.gcube.portlets.user.dataminermanager.client.events.DeleteItemRequestEvent; import org.gcube.portlets.user.dataminermanager.client.events.RefreshDataMinerWorkAreaEvent; -import org.gcube.portlets.user.dataminermanager.client.events.SessionExpiredEvent; import org.gcube.portlets.user.dataminermanager.client.events.SyncRefreshUploadDataSpaceEvent; import org.gcube.portlets.user.dataminermanager.client.events.UIStateEvent; -import org.gcube.portlets.user.dataminermanager.client.rpc.DataMinerPortletServiceAsync; import org.gcube.portlets.user.dataminermanager.client.type.DataMinerWorkAreaElementType; import org.gcube.portlets.user.dataminermanager.client.util.UtilsGXT3; import org.gcube.portlets.user.dataminermanager.shared.Constants; -import org.gcube.portlets.user.dataminermanager.shared.exception.SessionExpiredServiceException; 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.dragdrop.MultipleDNDUpload; @@ -33,8 +30,8 @@ import com.allen_sauer.gwt.log.client.Log; import com.google.gwt.core.client.GWT; import com.google.gwt.event.logical.shared.ResizeEvent; import com.google.gwt.event.logical.shared.ResizeHandler; +import com.google.gwt.http.client.URL; import com.google.gwt.user.client.Window; -import com.google.gwt.user.client.rpc.AsyncCallback; import com.sencha.gxt.cell.core.client.ButtonCell.ButtonScale; import com.sencha.gxt.cell.core.client.ButtonCell.IconAlign; import com.sencha.gxt.core.client.util.Margins; @@ -201,13 +198,11 @@ public class OutputDataSetsPanel extends FramedPanel { } } - - + private void manageSyncRefreshUploadDataSpaceEvents() { Log.debug("OutputDataSetsPanel received SyncRefreshUploadDataSpaceEvents: "); refreshWSResourceExplorerPanel(); } - private void create(DataMinerWorkAreaEvent event) { Log.debug("Create OutputDataSetsPanel"); @@ -276,24 +271,26 @@ public class OutputDataSetsPanel extends FramedPanel { // DND dnd = new MultipleDNDUpload(); - + dnd.setParameters(event.getDataMinerWorkArea().getOutputDataSets().getFolder().getId(), UPLOAD_TYPE.File); dnd.addUniqueContainer(wsResourcesExplorerPanel); WorskpaceUploadNotificationListener workspaceUploaderListenerOutputDataSetsPanel = new WorskpaceUploadNotificationListener() { @Override public void onUploadCompleted(String parentId, String itemId) { - Log.debug("OutputDataSetsPanel Upload completed: [parentID: " + parentId + ", itemId: " + itemId + "]"); - SyncRefreshUploadDataSpaceEvent ev=new SyncRefreshUploadDataSpaceEvent(); + Log.debug("OutputDataSetsPanel Upload completed: [parentID: " + parentId + ", itemId: " + itemId + + "]"); + SyncRefreshUploadDataSpaceEvent ev = new SyncRefreshUploadDataSpaceEvent(); EventBusProvider.INSTANCE.fireEvent(ev); - //wsResourcesExplorerPanel.refreshRootFolderView(); - //forceLayout(); + // wsResourcesExplorerPanel.refreshRootFolderView(); + // forceLayout(); } @Override public void onUploadAborted(String parentId, String itemId) { - Log.debug("OutputDataSetsPanel Upload Aborted: [parentID: " + parentId + ", itemId: " + itemId + "]"); + Log.debug( + "OutputDataSetsPanel Upload Aborted: [parentID: " + parentId + ", itemId: " + itemId + "]"); } @Override @@ -304,11 +301,12 @@ public class OutputDataSetsPanel extends FramedPanel { @Override public void onOverwriteCompleted(String parentId, String itemId) { - Log.debug("OutputDataSetsPanel Upload Override Completed: [parentID: " + parentId + ", itemId: " + itemId + "]"); - SyncRefreshUploadDataSpaceEvent ev=new SyncRefreshUploadDataSpaceEvent(); + Log.debug("OutputDataSetsPanel Upload Override Completed: [parentID: " + parentId + ", itemId: " + + itemId + "]"); + SyncRefreshUploadDataSpaceEvent ev = new SyncRefreshUploadDataSpaceEvent(); EventBusProvider.INSTANCE.fireEvent(ev); - //wsResourcesExplorerPanel.refreshRootFolderView(); - //forceLayout(); + // wsResourcesExplorerPanel.refreshRootFolderView(); + // forceLayout(); } }; @@ -442,33 +440,46 @@ public class OutputDataSetsPanel extends FramedPanel { + Constants.CURR_GROUP_ID + "=" + GCubeClientContext.getCurrentContextId()); Log.debug("Retrieved link: " + actionUrl); - Window.open(actionUrl.toString(), selectedItem.getName(), ""); + Window.open(URL.encode(actionUrl.toString()), selectedItem.getName(), ""); } else { final ItemDescription itemDescription = new ItemDescription(selectedItem.getId(), selectedItem.getName(), selectedItem.getOwner(), selectedItem.getPath(), selectedItem.getType().name()); + Log.debug("ItemDescription: " + itemDescription); - DataMinerPortletServiceAsync.INSTANCE.getPublicLink(itemDescription, new AsyncCallback() { + StringBuilder url = new StringBuilder(); + url.append(GWT.getModuleBaseURL()); + url.append(Constants.DOWNLOAD_FILE_SERVLET + "/" + itemDescription.getName() + "?itemId=" + + itemDescription.getId() + "&" + Constants.CURR_GROUP_ID + "=" + + GCubeClientContext.getCurrentContextId()); - @Override - public void onFailure(Throwable caught) { - if (caught instanceof SessionExpiredServiceException) { - EventBusProvider.INSTANCE.fireEvent(new SessionExpiredEvent()); - } else { - Log.error("Error open file: " + caught.getLocalizedMessage(), caught); - UtilsGXT3.alert("Error", caught.getLocalizedMessage()); - } - caught.printStackTrace(); + Window.open(URL.encode(url.toString()), "_blank", ""); - } - - @Override - public void onSuccess(String link) { - Log.debug("Retrieved link: " + link); - Window.open(link, itemDescription.getName(), ""); - } - - }); + /* + * final ItemDescription itemDescription = new + * ItemDescription(selectedItem.getId(), selectedItem.getName(), + * selectedItem.getOwner(), selectedItem.getPath(), + * selectedItem.getType().name()); + * + * DataMinerPortletServiceAsync.INSTANCE.getPublicLink( + * itemDescription, new AsyncCallback() { + * + * @Override public void onFailure(Throwable caught) { if + * (caught instanceof SessionExpiredServiceException) { + * EventBusProvider.INSTANCE.fireEvent(new + * SessionExpiredEvent()); } else { + * Log.error("Error open file: " + caught.getLocalizedMessage(), + * caught); UtilsGXT3.alert("Error", + * caught.getLocalizedMessage()); } caught.printStackTrace(); + * + * } + * + * @Override public void onSuccess(String link) { + * Log.debug("Retrieved link: " + link); Window.open(link, + * itemDescription.getName(), ""); } + * + * }); + */ } } else { UtilsGXT3.info("Attention", "Select a file!"); diff --git a/src/main/java/org/gcube/portlets/user/dataminermanager/server/DownloadFileServlet.java b/src/main/java/org/gcube/portlets/user/dataminermanager/server/DownloadFileServlet.java new file mode 100644 index 0000000..4e25282 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminermanager/server/DownloadFileServlet.java @@ -0,0 +1,123 @@ +package org.gcube.portlets.user.dataminermanager.server; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.ByteBuffer; +import java.nio.channels.Channels; +import java.nio.channels.ReadableByteChannel; +import java.nio.channels.WritableByteChannel; + +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.gcube.data.analysis.dataminermanagercl.server.util.ServiceCredentials; +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription; +import org.gcube.portlets.user.dataminermanager.server.storage.StorageUtil; +import org.gcube.portlets.user.dataminermanager.shared.Constants; +import org.gcube.portlets.user.dataminermanager.shared.exception.ServiceException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Download Servlet + * + * @author Giancarlo Panichi + * + * + */ +public class DownloadFileServlet extends HttpServlet { + + private static final long serialVersionUID = 5389118370656932343L; + + private static Logger logger = LoggerFactory.getLogger(DownloadFileServlet.class); + + public DownloadFileServlet() { + super(); + } + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + createResponse(request, response); + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + createResponse(request, response); + } + + private void createResponse(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + + try { + logger.debug("DownloadFileServlet()"); + + HttpSession session = req.getSession(); + + if (session == null) { + logger.error("Error getting the download session, no session valid found: " + session); + resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, + "ERROR-Error getting the user session, no session found" + session); + return; + } + logger.debug("DownloadFileServlet session id: " + session.getId()); + String scopeGroupId = req.getHeader(Constants.CURR_GROUP_ID); + if (scopeGroupId == null || scopeGroupId.isEmpty()) { + scopeGroupId = req.getParameter(Constants.CURR_GROUP_ID); + if (scopeGroupId == null || scopeGroupId.isEmpty()) { + logger.error( + "CURR_GROUP_ID is null, it is a mandatory parameter in custom servlet: " + scopeGroupId); + throw new ServletException( + "CURR_GROUP_ID is null, it is a mandatory parameter in custom servlet: " + scopeGroupId); + } + } + String itemId = req.getParameter("itemId"); + logger.info("DownloadFileServlet(): [scopeGroupId=" + scopeGroupId + ",ItemId=" + itemId + "]"); + ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(req, scopeGroupId); + StorageUtil filesStorage = new StorageUtil(); + ItemDescription itemDescription = filesStorage.getFileInfoOnWorkspace(serviceCredentials.getUserName(), + itemId); + logger.debug("Item retrieved: " + itemDescription); + InputStream inputStream = filesStorage.getFileOnWorkspace(serviceCredentials.getUserName(), itemId); + + resp.setHeader("Content-Disposition:", "attachment;filename=\"" + itemDescription.getName() + "\""); + resp.setHeader("Content-Type", "application/force-download"); + resp.setHeader("Content-Length", String.valueOf(itemDescription.getLenght())); + + stream(inputStream, resp.getOutputStream()); + } catch (ServiceException e) { + logger.error("DownloadFileServlet():"+e.getLocalizedMessage(), e); + throw new ServletException(e.getLocalizedMessage(), e); + } catch (Throwable e) { + logger.error("DownloadFileServlet(): " + e.getLocalizedMessage(), e); + throw new ServletException("Download:" + e.getLocalizedMessage(), e); + } + } + + private long stream(InputStream input, OutputStream output) throws IOException { + try (ReadableByteChannel inputChannel = Channels.newChannel(input); + WritableByteChannel outputChannel = Channels.newChannel(output);) { + ByteBuffer buffer = ByteBuffer.allocateDirect(10240); + long size = 0; + + while (inputChannel.read(buffer) != -1) { + buffer.flip(); + size += outputChannel.write(buffer); + buffer.clear(); + } + + return size; + } + } +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/dataminermanager/server/DownloadFolderServlet.java b/src/main/java/org/gcube/portlets/user/dataminermanager/server/DownloadFolderServlet.java index 2c3f0a2..3d11343 100644 --- a/src/main/java/org/gcube/portlets/user/dataminermanager/server/DownloadFolderServlet.java +++ b/src/main/java/org/gcube/portlets/user/dataminermanager/server/DownloadFolderServlet.java @@ -64,7 +64,7 @@ public class DownloadFolderServlet extends HttpServlet { private void createResponse(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { - logger.debug("DownloadFolderServlet"); + logger.debug("DownloadFolderServlet()"); HttpSession session = request.getSession(); diff --git a/src/main/java/org/gcube/portlets/user/dataminermanager/server/storage/StorageUtil.java b/src/main/java/org/gcube/portlets/user/dataminermanager/server/storage/StorageUtil.java index 0d104cb..b9805ce 100644 --- a/src/main/java/org/gcube/portlets/user/dataminermanager/server/storage/StorageUtil.java +++ b/src/main/java/org/gcube/portlets/user/dataminermanager/server/storage/StorageUtil.java @@ -13,8 +13,10 @@ import org.gcube.common.storagehub.client.dsl.ListResolver; import org.gcube.common.storagehub.client.dsl.OpenResolver; import org.gcube.common.storagehub.client.dsl.StorageHubClient; import org.gcube.common.storagehub.model.Metadata; +import org.gcube.common.storagehub.model.items.AbstractFileItem; import org.gcube.common.storagehub.model.items.FolderItem; import org.gcube.common.storagehub.model.items.Item; +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription; import org.gcube.portlets.user.dataminermanager.shared.exception.ServiceException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -69,7 +71,7 @@ public class StorageUtil { * @throws ServiceException * service exception */ - public InputStream getInputStreamForItemOnWorkspace(String user, String itemId) throws ServiceException { + public InputStream getFileOnWorkspace(String user, String itemId) throws ServiceException { try { logger.debug("getInputStreamForItemOnWorkspace: [user=" + user + ", itemId=" + itemId + "]"); StorageHubClient shc = new StorageHubClient(); @@ -82,6 +84,37 @@ public class StorageUtil { throw new ServiceException(e.getLocalizedMessage(), e); } } + + /** + * + * @param user + * User + * @param itemId + * Item id + * @return Item description + * @throws ServiceException + * Exception + */ + public ItemDescription getFileInfoOnWorkspace(String user, String itemId) + throws ServiceException { + try { + logger.info("Retrieve file info on workspace: [user=" + user + ", itemId=" + itemId + "]"); + StorageHubClient shc = new StorageHubClient(); + OpenResolver openResolver = shc.open(itemId); + + FileContainer fileContainer = openResolver.asFile(); + AbstractFileItem item = fileContainer.get(); + ItemDescription itemDescription = new ItemDescription(item.getId(), item.getName(), item.getOwner(), + item.getPath(), item.getClass().getSimpleName()); + itemDescription.setMimeType(item.getContent().getMimeType()); + itemDescription.setLenght(String.valueOf(item.getContent().getSize())); + return itemDescription; + + } catch (Throwable e) { + logger.error("Retrieve file info on workspace: " + e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage()); + } + } /** * diff --git a/src/main/java/org/gcube/portlets/user/dataminermanager/server/util/TableReader.java b/src/main/java/org/gcube/portlets/user/dataminermanager/server/util/TableReader.java index 1140666..502b21b 100644 --- a/src/main/java/org/gcube/portlets/user/dataminermanager/server/util/TableReader.java +++ b/src/main/java/org/gcube/portlets/user/dataminermanager/server/util/TableReader.java @@ -37,7 +37,7 @@ public class TableReader { public TableItemSimple getTableItemSimple() throws ServiceException { StorageUtil storageUtil=new StorageUtil(); - InputStream is = storageUtil.getInputStreamForItemOnWorkspace( + InputStream is = storageUtil.getFileOnWorkspace( serviceCredentials.getUserName(), item.getId()); Reader fileReader = new InputStreamReader(is); CSVReader csvReader = new CSVReader(fileReader); diff --git a/src/main/java/org/gcube/portlets/user/dataminermanager/shared/Constants.java b/src/main/java/org/gcube/portlets/user/dataminermanager/shared/Constants.java index b844e59..0254a00 100644 --- a/src/main/java/org/gcube/portlets/user/dataminermanager/shared/Constants.java +++ b/src/main/java/org/gcube/portlets/user/dataminermanager/shared/Constants.java @@ -15,23 +15,21 @@ public class Constants { public static final String DATA_MINER_LANG_COOKIE = "DataMinerLangCookie"; public static final String DATA_MINER_LANG = "DataMinerLang"; public static final String DATA_MINER_OPERATOR_ID = "OperatorId"; - + public static final String DEFAULT_USER = "giancarlo.panichi"; public final static String DEFAULT_SCOPE = "/gcube/devNext/NextNext"; public final static String DEFAULT_TOKEN = ""; public static final String DEFAULT_ROLE = "OrganizationMember"; - + public static final String SClientMap = "DataMinerClientMap"; public static final String DATA_MINER_SERVICE_NAME = "DataMiner"; public static final String DATAMINER_SERVICE_CATEGORY = "DataAnalysis"; - public static final String TD_DATASOURCE_FACTORY_ID = "DataMinerManager"; public static final int TIME_UPDATE_COMPUTATION_STATUS_PANEL = 5 * 1000;// 7*1000; - // WPS Data Miner public static final String WPSServiceURL = "http://dataminer-d-d4s.d4science.org:80/wps/"; public static final String WPSWebProcessingService = "WebProcessingService"; @@ -39,17 +37,17 @@ public class Constants { public static final String WPSToken = ""; public static final String WPSUser = "giancarlo.panichi"; public static final String WPSLanguage = "en-US"; + + /* public static final String WPSUser = "gianpaolo.coro"; */ + + // Session + public static final String CURR_GROUP_ID = "CURR_GROUP_ID"; - /*public static final String WPSUser = "gianpaolo.coro";*/ - - - //DownloadFolderServlet - public static final String DOWNLOAD_FOLDER_SERVLET= "DownloadFolderServlet"; + // Download + public static final String DOWNLOAD_FILE_SERVLET = "DownloadFileServlet"; + + public static final String DOWNLOAD_FOLDER_SERVLET = "DownloadFolderServlet"; public static final String DOWNLOAD_FOLDER_SERVLET_ITEM_ID_PARAMETER = "itemId"; public static final String DOWNLOAD_FOLDER_SERVLET_FOLDER_NAME_PARAMETER = "folderName"; - - //Session - public static final String CURR_GROUP_ID="CURR_GROUP_ID"; - public static final String CURR_USER_ID = "CURR_USER_ID"; } diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 4e6ab4a..04245ee 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -12,10 +12,17 @@ jUnitHostImpl com.google.gwt.junit.server.JUnitHostImpl + + + + DownloadFileServlet + org.gcube.portlets.user.dataminermanager.server.DownloadFileServlet + DownloadFolderServlet org.gcube.portlets.user.dataminermanager.server.DownloadFolderServlet + workspaceExplorer org.gcube.portlets.widgets.wsexplorer.server.WorkspaceExplorerServiceImpl @@ -42,10 +49,17 @@ jUnitHostImpl /dataminermanager/junithost/* + + + + DownloadFileServlet + /dataminermanager/DownloadFileServlet/* + DownloadFolderServlet /dataminermanager/DownloadFolderServlet + workspaceExplorer /dataminermanager/WorkspaceExplorerService