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@171892 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
parent
b07212e356
commit
c8568a2059
|
@ -6,7 +6,6 @@ import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription;
|
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.DataMinerManager;
|
||||||
import org.gcube.portlets.user.dataminermanager.client.common.EventBusProvider;
|
import org.gcube.portlets.user.dataminermanager.client.common.EventBusProvider;
|
||||||
import org.gcube.portlets.user.dataminermanager.client.events.CancelExecutionFromComputationsRequestEvent;
|
import org.gcube.portlets.user.dataminermanager.client.events.CancelExecutionFromComputationsRequestEvent;
|
||||||
|
@ -18,7 +17,7 @@ import org.gcube.portlets.user.dataminermanager.client.events.ResubmitComputatio
|
||||||
import org.gcube.portlets.user.dataminermanager.client.events.UIStateEvent;
|
import org.gcube.portlets.user.dataminermanager.client.events.UIStateEvent;
|
||||||
import org.gcube.portlets.user.dataminermanager.client.type.DataMinerWorkAreaElementType;
|
import org.gcube.portlets.user.dataminermanager.client.type.DataMinerWorkAreaElementType;
|
||||||
import org.gcube.portlets.user.dataminermanager.client.util.UtilsGXT3;
|
import org.gcube.portlets.user.dataminermanager.client.util.UtilsGXT3;
|
||||||
import org.gcube.portlets.user.dataminermanager.shared.Constants;
|
import org.gcube.portlets.user.dataminermanager.client.workspace.DownloadWidget;
|
||||||
import org.gcube.portlets.widgets.workspaceuploader.client.WorkspaceUploadNotification.WorskpaceUploadNotificationListener;
|
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.DialogUpload.UPLOAD_TYPE;
|
||||||
import org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload;
|
import org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload;
|
||||||
|
@ -29,11 +28,8 @@ import org.gcube.portlets.widgets.wsexplorer.shared.FilterCriteria;
|
||||||
import org.gcube.portlets.widgets.wsexplorer.shared.Item;
|
import org.gcube.portlets.widgets.wsexplorer.shared.Item;
|
||||||
|
|
||||||
import com.allen_sauer.gwt.log.client.Log;
|
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.ResizeEvent;
|
||||||
import com.google.gwt.event.logical.shared.ResizeHandler;
|
import com.google.gwt.event.logical.shared.ResizeHandler;
|
||||||
import com.google.gwt.http.client.URL;
|
|
||||||
import com.google.gwt.user.client.Window;
|
|
||||||
import com.sencha.gxt.cell.core.client.ButtonCell.ButtonScale;
|
import com.sencha.gxt.cell.core.client.ButtonCell.ButtonScale;
|
||||||
import com.sencha.gxt.cell.core.client.ButtonCell.IconAlign;
|
import com.sencha.gxt.cell.core.client.ButtonCell.IconAlign;
|
||||||
import com.sencha.gxt.core.client.util.Margins;
|
import com.sencha.gxt.core.client.util.Margins;
|
||||||
|
@ -333,7 +329,7 @@ public class ComputationsExecutedPanel extends FramedPanel {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onSelect(SelectEvent event) {
|
public void onSelect(SelectEvent event) {
|
||||||
downloadFile();
|
downloadItem();
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
@ -479,63 +475,13 @@ public class ComputationsExecutedPanel extends FramedPanel {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void downloadFile() {
|
private void downloadItem() {
|
||||||
if (selectedItem != null) {
|
if (selectedItem != null) {
|
||||||
if (selectedItem.isFolder()) {
|
DownloadWidget downloadWidget = new DownloadWidget();
|
||||||
StringBuilder actionUrl = new StringBuilder();
|
downloadWidget.download(selectedItem.getId());
|
||||||
actionUrl.append(GWT.getModuleBaseURL());
|
|
||||||
actionUrl.append(Constants.DOWNLOAD_FOLDER_SERVLET + "?"
|
|
||||||
+ Constants.DOWNLOAD_FOLDER_SERVLET_ITEM_ID_PARAMETER + "=" + selectedItem.getId() + "&"
|
|
||||||
+ Constants.DOWNLOAD_FOLDER_SERVLET_FOLDER_NAME_PARAMETER + "=" + selectedItem.getName() + "&"
|
|
||||||
+ Constants.CURR_GROUP_ID + "=" + GCubeClientContext.getCurrentContextId());
|
|
||||||
|
|
||||||
Log.debug("Retrieved link: " + actionUrl);
|
|
||||||
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());
|
|
||||||
|
|
||||||
Window.open(URL.encode(url.toString()), "_blank", "");
|
|
||||||
|
|
||||||
/*
|
|
||||||
* final ItemDescription itemDescription = new
|
|
||||||
* ItemDescription(selectedItem.getId(), selectedItem.getName(),
|
|
||||||
* selectedItem.getOwner(), selectedItem.getPath(),
|
|
||||||
* selectedItem.getType().name());
|
|
||||||
*
|
|
||||||
* DataMinerPortletServiceAsync.INSTANCE.getPublicLink(
|
|
||||||
* itemDescription, new AsyncCallback<String>() {
|
|
||||||
*
|
|
||||||
* @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 {
|
} else {
|
||||||
UtilsGXT3.info("Attention", "Select a file!");
|
UtilsGXT3.info("Attention", "Select a element!");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void cancelComputation() {
|
private void cancelComputation() {
|
||||||
|
|
|
@ -6,7 +6,6 @@ import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription;
|
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.DataMinerManager;
|
||||||
import org.gcube.portlets.user.dataminermanager.client.common.EventBusProvider;
|
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.DataMinerWorkAreaEvent;
|
||||||
|
@ -16,7 +15,7 @@ import org.gcube.portlets.user.dataminermanager.client.events.SyncRefreshUploadD
|
||||||
import org.gcube.portlets.user.dataminermanager.client.events.UIStateEvent;
|
import org.gcube.portlets.user.dataminermanager.client.events.UIStateEvent;
|
||||||
import org.gcube.portlets.user.dataminermanager.client.type.DataMinerWorkAreaElementType;
|
import org.gcube.portlets.user.dataminermanager.client.type.DataMinerWorkAreaElementType;
|
||||||
import org.gcube.portlets.user.dataminermanager.client.util.UtilsGXT3;
|
import org.gcube.portlets.user.dataminermanager.client.util.UtilsGXT3;
|
||||||
import org.gcube.portlets.user.dataminermanager.shared.Constants;
|
import org.gcube.portlets.user.dataminermanager.client.workspace.DownloadWidget;
|
||||||
import org.gcube.portlets.widgets.workspaceuploader.client.WorkspaceUploadNotification.WorskpaceUploadNotificationListener;
|
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.DialogUpload.UPLOAD_TYPE;
|
||||||
import org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload;
|
import org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload;
|
||||||
|
@ -27,11 +26,8 @@ import org.gcube.portlets.widgets.wsexplorer.shared.FilterCriteria;
|
||||||
import org.gcube.portlets.widgets.wsexplorer.shared.Item;
|
import org.gcube.portlets.widgets.wsexplorer.shared.Item;
|
||||||
|
|
||||||
import com.allen_sauer.gwt.log.client.Log;
|
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.ResizeEvent;
|
||||||
import com.google.gwt.event.logical.shared.ResizeHandler;
|
import com.google.gwt.event.logical.shared.ResizeHandler;
|
||||||
import com.google.gwt.http.client.URL;
|
|
||||||
import com.google.gwt.user.client.Window;
|
|
||||||
import com.sencha.gxt.cell.core.client.ButtonCell.ButtonScale;
|
import com.sencha.gxt.cell.core.client.ButtonCell.ButtonScale;
|
||||||
import com.sencha.gxt.cell.core.client.ButtonCell.IconAlign;
|
import com.sencha.gxt.cell.core.client.ButtonCell.IconAlign;
|
||||||
import com.sencha.gxt.core.client.util.Margins;
|
import com.sencha.gxt.core.client.util.Margins;
|
||||||
|
@ -323,7 +319,7 @@ public class InputDataSetsPanel extends FramedPanel {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onSelect(SelectEvent event) {
|
public void onSelect(SelectEvent event) {
|
||||||
downloadFile();
|
downloadItem();
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
@ -429,60 +425,13 @@ public class InputDataSetsPanel extends FramedPanel {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void downloadFile() {
|
private void downloadItem() {
|
||||||
if (selectedItem != null) {
|
if (selectedItem != null) {
|
||||||
if (selectedItem.isFolder()) {
|
DownloadWidget downloadWidget = new DownloadWidget();
|
||||||
StringBuilder actionUrl = new StringBuilder();
|
downloadWidget.download(selectedItem.getId());
|
||||||
actionUrl.append(GWT.getModuleBaseURL());
|
|
||||||
actionUrl.append(Constants.DOWNLOAD_FOLDER_SERVLET + "?"
|
|
||||||
+ Constants.DOWNLOAD_FOLDER_SERVLET_ITEM_ID_PARAMETER + "=" + selectedItem.getId() + "&"
|
|
||||||
+ Constants.DOWNLOAD_FOLDER_SERVLET_FOLDER_NAME_PARAMETER + "=" + selectedItem.getName() + "&"
|
|
||||||
+ Constants.CURR_GROUP_ID + "=" + GCubeClientContext.getCurrentContextId());
|
|
||||||
|
|
||||||
Log.debug("Retrieved link: " + actionUrl);
|
|
||||||
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());
|
|
||||||
|
|
||||||
Window.open(URL.encode(url.toString()), "_blank", "");
|
|
||||||
|
|
||||||
/*
|
|
||||||
* final ItemDescription itemDescription = new
|
|
||||||
* ItemDescription(selectedItem.getId(), selectedItem.getName(),
|
|
||||||
* selectedItem.getOwner(), selectedItem.getPath(),
|
|
||||||
* selectedItem.getType().name());
|
|
||||||
*
|
|
||||||
* DataMinerPortletServiceAsync.INSTANCE.getPublicLink(
|
|
||||||
* itemDescription, new AsyncCallback<String>() {
|
|
||||||
*
|
|
||||||
* @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 {
|
} else {
|
||||||
UtilsGXT3.info("Attention", "Select a file!");
|
UtilsGXT3.info("Attention", "Select a element!");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,6 @@ import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription;
|
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.DataMinerManager;
|
||||||
import org.gcube.portlets.user.dataminermanager.client.common.EventBusProvider;
|
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.DataMinerWorkAreaEvent;
|
||||||
|
@ -16,7 +15,7 @@ import org.gcube.portlets.user.dataminermanager.client.events.SyncRefreshUploadD
|
||||||
import org.gcube.portlets.user.dataminermanager.client.events.UIStateEvent;
|
import org.gcube.portlets.user.dataminermanager.client.events.UIStateEvent;
|
||||||
import org.gcube.portlets.user.dataminermanager.client.type.DataMinerWorkAreaElementType;
|
import org.gcube.portlets.user.dataminermanager.client.type.DataMinerWorkAreaElementType;
|
||||||
import org.gcube.portlets.user.dataminermanager.client.util.UtilsGXT3;
|
import org.gcube.portlets.user.dataminermanager.client.util.UtilsGXT3;
|
||||||
import org.gcube.portlets.user.dataminermanager.shared.Constants;
|
import org.gcube.portlets.user.dataminermanager.client.workspace.DownloadWidget;
|
||||||
import org.gcube.portlets.widgets.workspaceuploader.client.WorkspaceUploadNotification.WorskpaceUploadNotificationListener;
|
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.DialogUpload.UPLOAD_TYPE;
|
||||||
import org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload;
|
import org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload;
|
||||||
|
@ -27,11 +26,8 @@ import org.gcube.portlets.widgets.wsexplorer.shared.FilterCriteria;
|
||||||
import org.gcube.portlets.widgets.wsexplorer.shared.Item;
|
import org.gcube.portlets.widgets.wsexplorer.shared.Item;
|
||||||
|
|
||||||
import com.allen_sauer.gwt.log.client.Log;
|
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.ResizeEvent;
|
||||||
import com.google.gwt.event.logical.shared.ResizeHandler;
|
import com.google.gwt.event.logical.shared.ResizeHandler;
|
||||||
import com.google.gwt.http.client.URL;
|
|
||||||
import com.google.gwt.user.client.Window;
|
|
||||||
import com.sencha.gxt.cell.core.client.ButtonCell.ButtonScale;
|
import com.sencha.gxt.cell.core.client.ButtonCell.ButtonScale;
|
||||||
import com.sencha.gxt.cell.core.client.ButtonCell.IconAlign;
|
import com.sencha.gxt.cell.core.client.ButtonCell.IconAlign;
|
||||||
import com.sencha.gxt.core.client.util.Margins;
|
import com.sencha.gxt.core.client.util.Margins;
|
||||||
|
@ -323,7 +319,7 @@ public class OutputDataSetsPanel extends FramedPanel {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onSelect(SelectEvent event) {
|
public void onSelect(SelectEvent event) {
|
||||||
downloadFile();
|
downloadItem();
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
@ -429,62 +425,13 @@ public class OutputDataSetsPanel extends FramedPanel {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void downloadFile() {
|
private void downloadItem() {
|
||||||
if (selectedItem != null) {
|
if (selectedItem != null) {
|
||||||
if (selectedItem.isFolder()) {
|
DownloadWidget downloadWidget = new DownloadWidget();
|
||||||
StringBuilder actionUrl = new StringBuilder();
|
downloadWidget.download(selectedItem.getId());
|
||||||
actionUrl.append(GWT.getModuleBaseURL());
|
|
||||||
actionUrl.append(Constants.DOWNLOAD_FOLDER_SERVLET + "?"
|
|
||||||
+ Constants.DOWNLOAD_FOLDER_SERVLET_ITEM_ID_PARAMETER + "=" + selectedItem.getId() + "&"
|
|
||||||
+ Constants.DOWNLOAD_FOLDER_SERVLET_FOLDER_NAME_PARAMETER + "=" + selectedItem.getName() + "&"
|
|
||||||
+ Constants.CURR_GROUP_ID + "=" + GCubeClientContext.getCurrentContextId());
|
|
||||||
|
|
||||||
Log.debug("Retrieved link: " + actionUrl);
|
|
||||||
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());
|
|
||||||
|
|
||||||
Window.open(URL.encode(url.toString()), "_blank", "");
|
|
||||||
|
|
||||||
/*
|
|
||||||
* final ItemDescription itemDescription = new
|
|
||||||
* ItemDescription(selectedItem.getId(), selectedItem.getName(),
|
|
||||||
* selectedItem.getOwner(), selectedItem.getPath(),
|
|
||||||
* selectedItem.getType().name());
|
|
||||||
*
|
|
||||||
* DataMinerPortletServiceAsync.INSTANCE.getPublicLink(
|
|
||||||
* itemDescription, new AsyncCallback<String>() {
|
|
||||||
*
|
|
||||||
* @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 {
|
} else {
|
||||||
UtilsGXT3.info("Attention", "Select a file!");
|
UtilsGXT3.info("Attention", "Select a element!");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,10 +7,9 @@ import org.gcube.data.analysis.dataminermanagercl.shared.parameters.FileParamete
|
||||||
import org.gcube.data.analysis.dataminermanagercl.shared.parameters.Parameter;
|
import org.gcube.data.analysis.dataminermanagercl.shared.parameters.Parameter;
|
||||||
import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription;
|
import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription;
|
||||||
import org.gcube.portlets.user.dataminermanager.client.DataMinerManager;
|
import org.gcube.portlets.user.dataminermanager.client.DataMinerManager;
|
||||||
import org.gcube.portlets.user.dataminermanager.client.common.EventBusProvider;
|
|
||||||
import org.gcube.portlets.user.dataminermanager.client.events.SessionExpiredEvent;
|
|
||||||
import org.gcube.portlets.user.dataminermanager.client.rpc.DataMinerPortletServiceAsync;
|
import org.gcube.portlets.user.dataminermanager.client.rpc.DataMinerPortletServiceAsync;
|
||||||
import org.gcube.portlets.user.dataminermanager.client.util.UtilsGXT3;
|
import org.gcube.portlets.user.dataminermanager.client.util.UtilsGXT3;
|
||||||
|
import org.gcube.portlets.user.dataminermanager.client.workspace.DownloadWidget;
|
||||||
import org.gcube.portlets.user.dataminermanager.shared.exception.SessionExpiredServiceException;
|
import org.gcube.portlets.user.dataminermanager.shared.exception.SessionExpiredServiceException;
|
||||||
import org.gcube.portlets.widgets.netcdfbasicwidgets.client.event.SelectVariableEvent;
|
import org.gcube.portlets.widgets.netcdfbasicwidgets.client.event.SelectVariableEvent;
|
||||||
import org.gcube.portlets.widgets.netcdfbasicwidgets.client.event.SelectVariableEvent.SelectVariableEventHandler;
|
import org.gcube.portlets.widgets.netcdfbasicwidgets.client.event.SelectVariableEvent.SelectVariableEventHandler;
|
||||||
|
@ -22,7 +21,6 @@ import org.gcube.portlets.widgets.wsexplorer.shared.ItemType;
|
||||||
|
|
||||||
import com.allen_sauer.gwt.log.client.Log;
|
import com.allen_sauer.gwt.log.client.Log;
|
||||||
import com.google.gwt.core.shared.GWT;
|
import com.google.gwt.core.shared.GWT;
|
||||||
import com.google.gwt.user.client.Window;
|
|
||||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||||
import com.google.gwt.user.client.ui.Widget;
|
import com.google.gwt.user.client.ui.Widget;
|
||||||
import com.sencha.gxt.core.client.dom.XDOM;
|
import com.sencha.gxt.core.client.dom.XDOM;
|
||||||
|
@ -238,32 +236,12 @@ public class FileFld extends AbstractFld {
|
||||||
|
|
||||||
private void downloadFile() {
|
private void downloadFile() {
|
||||||
if (selectedFileItem != null) {
|
if (selectedFileItem != null) {
|
||||||
DataMinerPortletServiceAsync.INSTANCE.getPublicLink(selectedFileItem, new AsyncCallback<String>() {
|
DownloadWidget downloadWidget = new DownloadWidget();
|
||||||
|
downloadWidget.download(selectedFileItem.getId());
|
||||||
@Override
|
|
||||||
public void onFailure(Throwable caught) {
|
|
||||||
if (caught instanceof SessionExpiredServiceException) {
|
|
||||||
EventBusProvider.INSTANCE.fireEvent(new SessionExpiredEvent());
|
|
||||||
} else {
|
|
||||||
Log.error("Error downloading file: " + caught.getLocalizedMessage());
|
|
||||||
UtilsGXT3.alert("Error", caught.getLocalizedMessage());
|
|
||||||
}
|
|
||||||
caught.printStackTrace();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onSuccess(String link) {
|
|
||||||
Log.debug("Retrieved link: " + link);
|
|
||||||
Window.open(link, selectedFileItem.getName(), "");
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
UtilsGXT3.info("Attention", "Select a file!");
|
UtilsGXT3.info("Attention", "Select a file!");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void showNetCDFFile() {
|
private void showNetCDFFile() {
|
||||||
|
|
|
@ -4,10 +4,9 @@ import org.gcube.data.analysis.dataminermanagercl.shared.data.TableItemSimple;
|
||||||
import org.gcube.data.analysis.dataminermanagercl.shared.parameters.TabularParameter;
|
import org.gcube.data.analysis.dataminermanagercl.shared.parameters.TabularParameter;
|
||||||
import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription;
|
import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription;
|
||||||
import org.gcube.portlets.user.dataminermanager.client.DataMinerManager;
|
import org.gcube.portlets.user.dataminermanager.client.DataMinerManager;
|
||||||
import org.gcube.portlets.user.dataminermanager.client.common.EventBusProvider;
|
|
||||||
import org.gcube.portlets.user.dataminermanager.client.events.SessionExpiredEvent;
|
|
||||||
import org.gcube.portlets.user.dataminermanager.client.rpc.DataMinerPortletServiceAsync;
|
import org.gcube.portlets.user.dataminermanager.client.rpc.DataMinerPortletServiceAsync;
|
||||||
import org.gcube.portlets.user.dataminermanager.client.util.UtilsGXT3;
|
import org.gcube.portlets.user.dataminermanager.client.util.UtilsGXT3;
|
||||||
|
import org.gcube.portlets.user.dataminermanager.client.workspace.DownloadWidget;
|
||||||
import org.gcube.portlets.user.dataminermanager.shared.exception.SessionExpiredServiceException;
|
import org.gcube.portlets.user.dataminermanager.shared.exception.SessionExpiredServiceException;
|
||||||
import org.gcube.portlets.widgets.wsexplorer.client.notification.WorkspaceExplorerSelectNotification.WorskpaceExplorerSelectNotificationListener;
|
import org.gcube.portlets.widgets.wsexplorer.client.notification.WorkspaceExplorerSelectNotification.WorskpaceExplorerSelectNotificationListener;
|
||||||
import org.gcube.portlets.widgets.wsexplorer.client.select.WorkspaceExplorerSelectDialog;
|
import org.gcube.portlets.widgets.wsexplorer.client.select.WorkspaceExplorerSelectDialog;
|
||||||
|
@ -15,7 +14,6 @@ import org.gcube.portlets.widgets.wsexplorer.shared.Item;
|
||||||
import org.gcube.portlets.widgets.wsexplorer.shared.ItemType;
|
import org.gcube.portlets.widgets.wsexplorer.shared.ItemType;
|
||||||
|
|
||||||
import com.allen_sauer.gwt.log.client.Log;
|
import com.allen_sauer.gwt.log.client.Log;
|
||||||
import com.google.gwt.user.client.Window;
|
|
||||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||||
import com.sencha.gxt.core.client.dom.XDOM;
|
import com.sencha.gxt.core.client.dom.XDOM;
|
||||||
import com.sencha.gxt.core.client.util.Margins;
|
import com.sencha.gxt.core.client.util.Margins;
|
||||||
|
@ -215,32 +213,11 @@ public class TabItem extends HBoxLayoutContainer {
|
||||||
|
|
||||||
private void downloadFile() {
|
private void downloadFile() {
|
||||||
if (itemDescriptionSelected != null) {
|
if (itemDescriptionSelected != null) {
|
||||||
DataMinerPortletServiceAsync.INSTANCE.getPublicLink(itemDescriptionSelected, new AsyncCallback<String>() {
|
DownloadWidget downloadWidget = new DownloadWidget();
|
||||||
|
downloadWidget.download(itemDescriptionSelected.getId());
|
||||||
@Override
|
|
||||||
public void onFailure(Throwable caught) {
|
|
||||||
if (caught instanceof SessionExpiredServiceException) {
|
|
||||||
EventBusProvider.INSTANCE.fireEvent(new SessionExpiredEvent());
|
|
||||||
} else {
|
|
||||||
Log.error("Error downloading table: " + caught.getLocalizedMessage());
|
|
||||||
UtilsGXT3.alert("Error", caught.getLocalizedMessage());
|
|
||||||
}
|
|
||||||
caught.printStackTrace();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onSuccess(String link) {
|
|
||||||
Log.debug("Retrieved link: " + link);
|
|
||||||
Window.open(link, itemDescriptionSelected.getName(), "");
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
UtilsGXT3.info("Attention", "Select a Table!");
|
UtilsGXT3.info("Attention", "Select a table!");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -10,13 +10,12 @@ import org.gcube.data.analysis.dataminermanagercl.shared.parameters.Parameter;
|
||||||
import org.gcube.data.analysis.dataminermanagercl.shared.parameters.TabularParameter;
|
import org.gcube.data.analysis.dataminermanagercl.shared.parameters.TabularParameter;
|
||||||
import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription;
|
import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription;
|
||||||
import org.gcube.portlets.user.dataminermanager.client.DataMinerManager;
|
import org.gcube.portlets.user.dataminermanager.client.DataMinerManager;
|
||||||
import org.gcube.portlets.user.dataminermanager.client.common.EventBusProvider;
|
|
||||||
import org.gcube.portlets.user.dataminermanager.client.events.SessionExpiredEvent;
|
|
||||||
import org.gcube.portlets.user.dataminermanager.client.events.TabularFldChangeEvent;
|
import org.gcube.portlets.user.dataminermanager.client.events.TabularFldChangeEvent;
|
||||||
import org.gcube.portlets.user.dataminermanager.client.events.TabularFldChangeEvent.HasTabularFldChangeEventHandler;
|
import org.gcube.portlets.user.dataminermanager.client.events.TabularFldChangeEvent.HasTabularFldChangeEventHandler;
|
||||||
import org.gcube.portlets.user.dataminermanager.client.events.TabularFldChangeEvent.TabularFldChangeEventHandler;
|
import org.gcube.portlets.user.dataminermanager.client.events.TabularFldChangeEvent.TabularFldChangeEventHandler;
|
||||||
import org.gcube.portlets.user.dataminermanager.client.rpc.DataMinerPortletServiceAsync;
|
import org.gcube.portlets.user.dataminermanager.client.rpc.DataMinerPortletServiceAsync;
|
||||||
import org.gcube.portlets.user.dataminermanager.client.util.UtilsGXT3;
|
import org.gcube.portlets.user.dataminermanager.client.util.UtilsGXT3;
|
||||||
|
import org.gcube.portlets.user.dataminermanager.client.workspace.DownloadWidget;
|
||||||
import org.gcube.portlets.user.dataminermanager.shared.exception.SessionExpiredServiceException;
|
import org.gcube.portlets.user.dataminermanager.shared.exception.SessionExpiredServiceException;
|
||||||
import org.gcube.portlets.widgets.wsexplorer.client.notification.WorkspaceExplorerSelectNotification.WorskpaceExplorerSelectNotificationListener;
|
import org.gcube.portlets.widgets.wsexplorer.client.notification.WorkspaceExplorerSelectNotification.WorskpaceExplorerSelectNotificationListener;
|
||||||
import org.gcube.portlets.widgets.wsexplorer.client.select.WorkspaceExplorerSelectDialog;
|
import org.gcube.portlets.widgets.wsexplorer.client.select.WorkspaceExplorerSelectDialog;
|
||||||
|
@ -26,7 +25,6 @@ import org.gcube.portlets.widgets.wsexplorer.shared.ItemType;
|
||||||
import com.allen_sauer.gwt.log.client.Log;
|
import com.allen_sauer.gwt.log.client.Log;
|
||||||
import com.google.gwt.event.shared.GwtEvent;
|
import com.google.gwt.event.shared.GwtEvent;
|
||||||
import com.google.gwt.event.shared.HandlerRegistration;
|
import com.google.gwt.event.shared.HandlerRegistration;
|
||||||
import com.google.gwt.user.client.Window;
|
|
||||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||||
import com.google.gwt.user.client.ui.Widget;
|
import com.google.gwt.user.client.ui.Widget;
|
||||||
import com.sencha.gxt.core.client.dom.XDOM;
|
import com.sencha.gxt.core.client.dom.XDOM;
|
||||||
|
@ -265,32 +263,11 @@ public class TabularFld extends AbstractFld implements HasTabularFldChangeEventH
|
||||||
|
|
||||||
private void downloadFile() {
|
private void downloadFile() {
|
||||||
if (itemDescriptionSelected != null) {
|
if (itemDescriptionSelected != null) {
|
||||||
DataMinerPortletServiceAsync.INSTANCE.getPublicLink(itemDescriptionSelected, new AsyncCallback<String>() {
|
DownloadWidget downloadWidget = new DownloadWidget();
|
||||||
|
downloadWidget.download(itemDescriptionSelected.getId());
|
||||||
@Override
|
|
||||||
public void onFailure(Throwable caught) {
|
|
||||||
if (caught instanceof SessionExpiredServiceException) {
|
|
||||||
EventBusProvider.INSTANCE.fireEvent(new SessionExpiredEvent());
|
|
||||||
} else {
|
|
||||||
Log.error("Error downloading table: " + caught.getLocalizedMessage());
|
|
||||||
UtilsGXT3.alert("Error", caught.getLocalizedMessage());
|
|
||||||
}
|
|
||||||
caught.printStackTrace();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onSuccess(String link) {
|
|
||||||
Log.debug("Retrieved link: " + link);
|
|
||||||
Window.open(link, itemDescriptionSelected.getName(), "");
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
UtilsGXT3.info("Attention", "Select a Table!");
|
UtilsGXT3.info("Attention", "Select a table!");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -26,36 +26,32 @@ public interface DataMinerPortletService extends RemoteService {
|
||||||
|
|
||||||
public UserInfo hello() throws ServiceException;
|
public UserInfo hello() throws ServiceException;
|
||||||
|
|
||||||
public List<OperatorsClassification> getOperatorsClassifications(boolean refresh)
|
public List<OperatorsClassification> getOperatorsClassifications(boolean refresh) throws ServiceException;
|
||||||
throws ServiceException;
|
|
||||||
|
|
||||||
public List<Parameter> getParameters(Operator operator) throws ServiceException;
|
public List<Parameter> getParameters(Operator operator) throws ServiceException;
|
||||||
|
|
||||||
public ComputationId startComputation(Operator op) throws ServiceException;
|
public ComputationId startComputation(Operator op) throws ServiceException;
|
||||||
|
|
||||||
public ComputationStatus getComputationStatus(ComputationId computationId)
|
public ComputationStatus getComputationStatus(ComputationId computationId) throws ServiceException;
|
||||||
throws ServiceException;
|
|
||||||
|
|
||||||
public ComputationId resubmit(ItemDescription itemDescription) throws ServiceException;
|
public ComputationId resubmit(ItemDescription itemDescription) throws ServiceException;
|
||||||
|
|
||||||
|
public TableItemSimple retrieveTableInformation(ItemDescription item) throws ServiceException;
|
||||||
public TableItemSimple retrieveTableInformation(ItemDescription item)
|
|
||||||
throws ServiceException;
|
|
||||||
|
|
||||||
public DataMinerWorkArea getDataMinerWorkArea() throws ServiceException;
|
public DataMinerWorkArea getDataMinerWorkArea() throws ServiceException;
|
||||||
|
|
||||||
public String getPublicLink(ItemDescription itemDescription)
|
public String getPublicLink(ItemDescription itemDescription) throws ServiceException;
|
||||||
throws ServiceException;
|
|
||||||
|
|
||||||
public String cancelComputation(ComputationId computationId) throws ServiceException;
|
public String cancelComputation(ComputationId computationId) throws ServiceException;
|
||||||
|
|
||||||
public void deleteItem(ItemDescription itemDescription)
|
public void deleteItem(ItemDescription itemDescription) throws ServiceException;
|
||||||
throws ServiceException;
|
|
||||||
|
|
||||||
public OutputData getOutputDataByComputationId(ComputationId computationId) throws ServiceException;
|
public OutputData getOutputDataByComputationId(ComputationId computationId) throws ServiceException;
|
||||||
|
|
||||||
public ComputationData getComputationData(ItemDescription itemDescription) throws ServiceException;
|
public ComputationData getComputationData(ItemDescription itemDescription) throws ServiceException;
|
||||||
|
|
||||||
public String cancelComputation(ItemDescription itemDescription) throws ServiceException;
|
public String cancelComputation(ItemDescription itemDescription) throws ServiceException;
|
||||||
|
|
||||||
|
public ItemDescription getItemDescription(String itemId) throws ServiceException;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,4 +56,6 @@ public interface DataMinerPortletServiceAsync {
|
||||||
|
|
||||||
void cancelComputation(ItemDescription itemDescription, AsyncCallback<String> asyncCallback);
|
void cancelComputation(ItemDescription itemDescription, AsyncCallback<String> asyncCallback);
|
||||||
|
|
||||||
|
void getItemDescription(String itemId, AsyncCallback<ItemDescription> asyncCallback);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,77 @@
|
||||||
|
package org.gcube.portlets.user.dataminermanager.client.workspace;
|
||||||
|
|
||||||
|
import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription;
|
||||||
|
import org.gcube.portal.clientcontext.client.GCubeClientContext;
|
||||||
|
import org.gcube.portlets.user.dataminermanager.client.common.EventBusProvider;
|
||||||
|
import org.gcube.portlets.user.dataminermanager.client.events.SessionExpiredEvent;
|
||||||
|
import org.gcube.portlets.user.dataminermanager.client.rpc.DataMinerPortletServiceAsync;
|
||||||
|
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 com.allen_sauer.gwt.log.client.Log;
|
||||||
|
import com.google.gwt.core.client.GWT;
|
||||||
|
import com.google.gwt.http.client.URL;
|
||||||
|
import com.google.gwt.user.client.Window;
|
||||||
|
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Giancarlo Panichi
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class DownloadWidget {
|
||||||
|
|
||||||
|
public DownloadWidget() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void download(String itemId) {
|
||||||
|
DataMinerPortletServiceAsync.INSTANCE.getItemDescription(itemId, new AsyncCallback<ItemDescription>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFailure(Throwable caught) {
|
||||||
|
if (caught instanceof SessionExpiredServiceException) {
|
||||||
|
EventBusProvider.INSTANCE.fireEvent(new SessionExpiredEvent());
|
||||||
|
} else {
|
||||||
|
Log.error("Error open item: " + caught.getLocalizedMessage(), caught);
|
||||||
|
UtilsGXT3.alert("Error", caught.getLocalizedMessage());
|
||||||
|
}
|
||||||
|
caught.printStackTrace();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSuccess(ItemDescription itemDownloadInfo) {
|
||||||
|
Log.debug("Retrieved item download info: " + itemDownloadInfo);
|
||||||
|
requestDownload(itemDownloadInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void requestDownload(ItemDescription itemDescription) {
|
||||||
|
switch (itemDescription.getType()) {
|
||||||
|
case "AbstractFileItem":
|
||||||
|
case "FolderItem":
|
||||||
|
executeDownload(itemDescription);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
UtilsGXT3.info("Attention", "This item does not support download operation!");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void executeDownload(ItemDescription itemDescription) {
|
||||||
|
StringBuilder url = new StringBuilder();
|
||||||
|
url.append(GWT.getModuleBaseURL());
|
||||||
|
url.append(Constants.DOWNLOAD_SERVLET + "/" + itemDescription.getName() + "?itemId=" + itemDescription.getId()
|
||||||
|
+ "&" + Constants.CURR_GROUP_ID + "=" + GCubeClientContext.getCurrentContextId());
|
||||||
|
|
||||||
|
Window.open(URL.encode(url.toString()), "_blank", "");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -24,9 +24,7 @@ import org.gcube.data.analysis.dataminermanagercl.shared.process.OperatorsClassi
|
||||||
import org.gcube.portlets.user.dataminermanager.shared.session.UserInfo;
|
import org.gcube.portlets.user.dataminermanager.shared.session.UserInfo;
|
||||||
import org.gcube.data.analysis.dataminermanagercl.shared.workspace.DataMinerWorkArea;
|
import org.gcube.data.analysis.dataminermanagercl.shared.workspace.DataMinerWorkArea;
|
||||||
import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription;
|
import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription;
|
||||||
//import org.gcube.portlets.user.tdw.server.datasource.DataSourceFactoryRegistry;
|
|
||||||
//import org.gcube.portlets.widgets.file_dw_import_wizard.server.file.TargetRegistry;
|
|
||||||
//import org.gcube.portlets.widgets.wsexplorer.shared.Item;
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
@ -139,7 +137,7 @@ public class DataMinerManagerServiceImpl extends RemoteServiceServlet implements
|
||||||
@Override
|
@Override
|
||||||
public ComputationId resubmit(ItemDescription itemDescription) throws ServiceException {
|
public ComputationId resubmit(ItemDescription itemDescription) throws ServiceException {
|
||||||
try {
|
try {
|
||||||
StorageUtil storageUtil=new StorageUtil();
|
StorageUtil storageUtil = new StorageUtil();
|
||||||
HttpServletRequest httpRequest = this.getThreadLocalRequest();
|
HttpServletRequest httpRequest = this.getThreadLocalRequest();
|
||||||
ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(httpRequest);
|
ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(httpRequest);
|
||||||
Map<String, String> properties = storageUtil.getProperties(serviceCredentials.getUserName(),
|
Map<String, String> properties = storageUtil.getProperties(serviceCredentials.getUserName(),
|
||||||
|
@ -183,7 +181,7 @@ public class DataMinerManagerServiceImpl extends RemoteServiceServlet implements
|
||||||
HttpServletRequest httpRequest = this.getThreadLocalRequest();
|
HttpServletRequest httpRequest = this.getThreadLocalRequest();
|
||||||
ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(httpRequest);
|
ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(httpRequest);
|
||||||
logger.debug("DeleteItem(): " + itemDescription);
|
logger.debug("DeleteItem(): " + itemDescription);
|
||||||
StorageUtil storageUtil=new StorageUtil();
|
StorageUtil storageUtil = new StorageUtil();
|
||||||
storageUtil.deleteItem(serviceCredentials.getUserName(), itemDescription.getId());
|
storageUtil.deleteItem(serviceCredentials.getUserName(), itemDescription.getId());
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -238,7 +236,7 @@ public class DataMinerManagerServiceImpl extends RemoteServiceServlet implements
|
||||||
HttpServletRequest httpRequest = this.getThreadLocalRequest();
|
HttpServletRequest httpRequest = this.getThreadLocalRequest();
|
||||||
ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(httpRequest);
|
ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(httpRequest);
|
||||||
logger.debug("GetPublicLink(): " + itemDescription);
|
logger.debug("GetPublicLink(): " + itemDescription);
|
||||||
StorageUtil storageUtil=new StorageUtil();
|
StorageUtil storageUtil = new StorageUtil();
|
||||||
String link = storageUtil.getPublicLink(serviceCredentials.getUserName(), itemDescription.getId());
|
String link = storageUtil.getPublicLink(serviceCredentials.getUserName(), itemDescription.getId());
|
||||||
|
|
||||||
return link;
|
return link;
|
||||||
|
@ -296,7 +294,7 @@ public class DataMinerManagerServiceImpl extends RemoteServiceServlet implements
|
||||||
HttpServletRequest httpRequest = this.getThreadLocalRequest();
|
HttpServletRequest httpRequest = this.getThreadLocalRequest();
|
||||||
ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(httpRequest);
|
ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(httpRequest);
|
||||||
logger.debug("OutputDataByComputationItemt(): " + itemDescription);
|
logger.debug("OutputDataByComputationItemt(): " + itemDescription);
|
||||||
StorageUtil storageUtil=new StorageUtil();
|
StorageUtil storageUtil = new StorageUtil();
|
||||||
Map<String, String> properties = storageUtil.getProperties(serviceCredentials.getUserName(),
|
Map<String, String> properties = storageUtil.getProperties(serviceCredentials.getUserName(),
|
||||||
itemDescription.getId());
|
itemDescription.getId());
|
||||||
|
|
||||||
|
@ -346,4 +344,23 @@ public class DataMinerManagerServiceImpl extends RemoteServiceServlet implements
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemDescription getItemDescription(String itemId) throws ServiceException {
|
||||||
|
try {
|
||||||
|
HttpServletRequest httpRequest = this.getThreadLocalRequest();
|
||||||
|
ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(httpRequest);
|
||||||
|
logger.debug("getItemDescription(): [itemId=" + itemId + "]");
|
||||||
|
StorageUtil storageUtil = new StorageUtil();
|
||||||
|
ItemDescription itemDownloadInfo = storageUtil.getItemDescription(serviceCredentials.getUserName(), itemId);
|
||||||
|
logger.debug("ItemDescription info: " + itemDownloadInfo);
|
||||||
|
return itemDownloadInfo;
|
||||||
|
} catch (ServiceException e) {
|
||||||
|
logger.error(e.getLocalizedMessage(), e);
|
||||||
|
throw e;
|
||||||
|
} catch (Throwable e) {
|
||||||
|
logger.error("Error retrieving item description: " + e.getLocalizedMessage(), e);
|
||||||
|
throw new ServiceException("Error retrieving item description: " + e.getLocalizedMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,146 +0,0 @@
|
||||||
package org.gcube.portlets.user.dataminermanager.server;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileInputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.OutputStream;
|
|
||||||
import java.nio.file.Files;
|
|
||||||
import java.nio.file.Path;
|
|
||||||
import java.nio.file.StandardCopyOption;
|
|
||||||
|
|
||||||
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.gcube.portlets.user.dataminermanager.server.storage.StorageUtil;
|
|
||||||
import org.gcube.data.analysis.dataminermanagercl.server.util.ServiceCredentials;
|
|
||||||
import org.gcube.portlets.user.dataminermanager.shared.Constants;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author Giancarlo Panichi
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* Download Folder Servlet
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class DownloadFolderServlet extends HttpServlet {
|
|
||||||
private static final long serialVersionUID = -1838255772767180518L;
|
|
||||||
private static Logger logger = LoggerFactory
|
|
||||||
.getLogger(DownloadFolderServlet.class);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see HttpServlet#HttpServlet()
|
|
||||||
*/
|
|
||||||
public DownloadFolderServlet() {
|
|
||||||
super();
|
|
||||||
// TODO Auto-generated constructor stub
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @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 request,
|
|
||||||
HttpServletResponse response) throws ServletException, IOException {
|
|
||||||
try {
|
|
||||||
logger.debug("DownloadFolderServlet()");
|
|
||||||
|
|
||||||
HttpSession session = request.getSession();
|
|
||||||
|
|
||||||
if (session == null) {
|
|
||||||
logger.error("Error getting the session, no session valid found: "
|
|
||||||
+ session);
|
|
||||||
response.sendError(
|
|
||||||
HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
|
|
||||||
"ERROR-Error getting the user session, no session found "
|
|
||||||
+ session);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
logger.debug("DownloadFolderServlet session id: " + session.getId());
|
|
||||||
|
|
||||||
ServiceCredentials serviceCredentials;
|
|
||||||
|
|
||||||
String scopeGroupId = request.getHeader(Constants.CURR_GROUP_ID);
|
|
||||||
if (scopeGroupId == null || scopeGroupId.isEmpty()) {
|
|
||||||
scopeGroupId = request.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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
serviceCredentials = SessionUtil.getServiceCredentials(request,
|
|
||||||
scopeGroupId);
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
|
||||||
logger.error(
|
|
||||||
"Error retrieving credentials:"
|
|
||||||
+ e.getLocalizedMessage(), e);
|
|
||||||
throw new ServletException(e.getLocalizedMessage());
|
|
||||||
}
|
|
||||||
|
|
||||||
String itemId = request
|
|
||||||
.getParameter(Constants.DOWNLOAD_FOLDER_SERVLET_ITEM_ID_PARAMETER);
|
|
||||||
String folderName = request
|
|
||||||
.getParameter(Constants.DOWNLOAD_FOLDER_SERVLET_FOLDER_NAME_PARAMETER);
|
|
||||||
logger.debug("Request: [itemId=" + itemId + ", folderName="
|
|
||||||
+ folderName + "]");
|
|
||||||
StorageUtil storageUtil=new StorageUtil();
|
|
||||||
InputStream is = storageUtil.zipFolder(
|
|
||||||
serviceCredentials.getUserName(), itemId);
|
|
||||||
Path tempFile = Files.createTempFile("dataMinerDownload", ".zip");
|
|
||||||
Files.copy(is, tempFile, StandardCopyOption.REPLACE_EXISTING);
|
|
||||||
File tmpZip= tempFile.toFile();
|
|
||||||
|
|
||||||
response.setHeader("Content-Disposition", "attachment; filename=\""
|
|
||||||
+ folderName + ".zip\"");
|
|
||||||
response.setContentType("application/zip");
|
|
||||||
response.setHeader("Content-Length",
|
|
||||||
String.valueOf(tmpZip.length()));
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
OutputStream out = response.getOutputStream();
|
|
||||||
|
|
||||||
FileInputStream fileTmpZip = new FileInputStream(tmpZip);
|
|
||||||
IOUtils.copy(fileTmpZip, response.getOutputStream());
|
|
||||||
out.flush();
|
|
||||||
out.close();
|
|
||||||
fileTmpZip.close();
|
|
||||||
Files.delete(tempFile);
|
|
||||||
return;
|
|
||||||
|
|
||||||
} catch (Throwable e) {
|
|
||||||
logger.error("Error in DownloadFolderServlet: "
|
|
||||||
+ e.getLocalizedMessage(),e);
|
|
||||||
throw new ServletException("Error:" + e.getLocalizedMessage(), e);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -14,8 +14,9 @@ import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import javax.servlet.http.HttpSession;
|
import javax.servlet.http.HttpSession;
|
||||||
|
|
||||||
|
import org.gcube.common.storagehub.model.items.FolderItem;
|
||||||
import org.gcube.data.analysis.dataminermanagercl.server.util.ServiceCredentials;
|
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.ItemDownload;
|
||||||
import org.gcube.portlets.user.dataminermanager.server.storage.StorageUtil;
|
import org.gcube.portlets.user.dataminermanager.server.storage.StorageUtil;
|
||||||
import org.gcube.portlets.user.dataminermanager.shared.Constants;
|
import org.gcube.portlets.user.dataminermanager.shared.Constants;
|
||||||
import org.gcube.portlets.user.dataminermanager.shared.exception.ServiceException;
|
import org.gcube.portlets.user.dataminermanager.shared.exception.ServiceException;
|
||||||
|
@ -29,16 +30,16 @@ import org.slf4j.LoggerFactory;
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class DownloadFileServlet extends HttpServlet {
|
public class DownloadServlet extends HttpServlet {
|
||||||
|
|
||||||
private static final long serialVersionUID = 5389118370656932343L;
|
private static final long serialVersionUID = 5389118370656932343L;
|
||||||
|
|
||||||
private static Logger logger = LoggerFactory.getLogger(DownloadFileServlet.class);
|
private static Logger logger = LoggerFactory.getLogger(DownloadServlet.class);
|
||||||
|
|
||||||
public DownloadFileServlet() {
|
public DownloadServlet() {
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
|
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
|
||||||
* response)
|
* response)
|
||||||
|
@ -57,11 +58,10 @@ public class DownloadFileServlet extends HttpServlet {
|
||||||
createResponse(request, response);
|
createResponse(request, response);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createResponse(HttpServletRequest req, HttpServletResponse resp)
|
private void createResponse(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
|
||||||
throws ServletException, IOException {
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
logger.debug("DownloadFileServlet()");
|
logger.debug("DownloadServlet()");
|
||||||
|
|
||||||
HttpSession session = req.getSession();
|
HttpSession session = req.getSession();
|
||||||
|
|
||||||
|
@ -71,7 +71,7 @@ public class DownloadFileServlet extends HttpServlet {
|
||||||
"ERROR-Error getting the user session, no session found" + session);
|
"ERROR-Error getting the user session, no session found" + session);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
logger.debug("DownloadFileServlet session id: " + session.getId());
|
logger.debug("DownloadServlet() session id: " + session.getId());
|
||||||
String scopeGroupId = req.getHeader(Constants.CURR_GROUP_ID);
|
String scopeGroupId = req.getHeader(Constants.CURR_GROUP_ID);
|
||||||
if (scopeGroupId == null || scopeGroupId.isEmpty()) {
|
if (scopeGroupId == null || scopeGroupId.isEmpty()) {
|
||||||
scopeGroupId = req.getParameter(Constants.CURR_GROUP_ID);
|
scopeGroupId = req.getParameter(Constants.CURR_GROUP_ID);
|
||||||
|
@ -82,26 +82,55 @@ public class DownloadFileServlet extends HttpServlet {
|
||||||
"CURR_GROUP_ID is null, it is a mandatory parameter in custom servlet: " + scopeGroupId);
|
"CURR_GROUP_ID is null, it is a mandatory parameter in custom servlet: " + scopeGroupId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String itemId = req.getParameter("itemId");
|
String itemId = req.getParameter("itemId");
|
||||||
logger.info("DownloadFileServlet(): [scopeGroupId=" + scopeGroupId + ",ItemId=" + itemId + "]");
|
logger.info("DownloadServlet(): [scopeGroupId=" + scopeGroupId + ",ItemId=" + itemId + "]");
|
||||||
ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(req, scopeGroupId);
|
ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(req, scopeGroupId);
|
||||||
StorageUtil filesStorage = new StorageUtil();
|
StorageUtil filesStorage = new StorageUtil();
|
||||||
ItemDescription itemDescription = filesStorage.getFileInfoOnWorkspace(serviceCredentials.getUserName(),
|
ItemDownload itemDownload = filesStorage.getItemDownload(serviceCredentials.getUserName(), itemId);
|
||||||
itemId);
|
if (itemDownload == null) {
|
||||||
logger.debug("Item retrieved: " + itemDescription);
|
logger.error("This type of item does not support download operation");
|
||||||
InputStream inputStream = filesStorage.getFileOnWorkspace(serviceCredentials.getUserName(), itemId);
|
throw new ServletException("This type of item does not support download operation");
|
||||||
|
|
||||||
resp.setHeader("Content-Disposition:", "attachment;filename=\"" + itemDescription.getName() + "\"");
|
} else {
|
||||||
resp.setHeader("Content-Type", "application/force-download");
|
if (itemDownload.getInputStream() == null) {
|
||||||
resp.setHeader("Content-Length", String.valueOf(itemDescription.getLenght()));
|
logger.error("This type of item does not support download operation");
|
||||||
|
throw new ServletException("This type of item does not support download operation");
|
||||||
|
} else {
|
||||||
|
String fileName;
|
||||||
|
if (itemDownload.getItemDescription() == null) {
|
||||||
|
fileName = "filename";
|
||||||
|
} else {
|
||||||
|
if (itemDownload.getItemDescription().getName() == null
|
||||||
|
|| itemDownload.getItemDescription().getName().isEmpty()) {
|
||||||
|
if (itemDownload.getItemDescription().getType() != null && itemDownload.getItemDescription()
|
||||||
|
.getType().compareTo(FolderItem.class.getSimpleName()) == 0) {
|
||||||
|
fileName = "folder.zip";
|
||||||
|
} else {
|
||||||
|
fileName = itemDownload.getItemDescription().getName();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (itemDownload.getItemDescription().getType() != null && itemDownload.getItemDescription()
|
||||||
|
.getType().compareTo(FolderItem.class.getSimpleName()) == 0) {
|
||||||
|
fileName = itemDownload.getItemDescription().getName() + ".zip";
|
||||||
|
} else {
|
||||||
|
fileName = itemDownload.getItemDescription().getName();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resp.setHeader("Content-Disposition:", "attachment;filename=\"" + fileName + "\"");
|
||||||
|
resp.setHeader("Content-Type", "application/force-download");
|
||||||
|
stream(itemDownload.getInputStream(), resp.getOutputStream());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
stream(inputStream, resp.getOutputStream());
|
|
||||||
} catch (ServiceException e) {
|
} catch (ServiceException e) {
|
||||||
logger.error("DownloadFileServlet():"+e.getLocalizedMessage(), e);
|
logger.error("DownloadServlet():" + e.getLocalizedMessage(), e);
|
||||||
throw new ServletException(e.getLocalizedMessage(), e);
|
throw new ServletException(e.getLocalizedMessage(), e);
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
logger.error("DownloadFileServlet(): " + e.getLocalizedMessage(), e);
|
logger.error("DownloadServlet(): " + e.getLocalizedMessage(), e);
|
||||||
throw new ServletException("Download:" + e.getLocalizedMessage(), e);
|
throw new ServletException("Download item error: " + e.getLocalizedMessage(), e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
package org.gcube.portlets.user.dataminermanager.server.storage;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
|
||||||
|
import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Giancarlo Panichi
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class ItemDownload {
|
||||||
|
private ItemDescription itemDescription;
|
||||||
|
private InputStream inputStream;
|
||||||
|
|
||||||
|
public ItemDownload(ItemDescription itemDescription, InputStream inputStream) {
|
||||||
|
super();
|
||||||
|
this.itemDescription = itemDescription;
|
||||||
|
this.inputStream = inputStream;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemDescription getItemDescription() {
|
||||||
|
return itemDescription;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setItemDescription(ItemDescription itemDescription) {
|
||||||
|
this.itemDescription = itemDescription;
|
||||||
|
}
|
||||||
|
|
||||||
|
public InputStream getInputStream() {
|
||||||
|
return inputStream;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setInputStream(InputStream inputStream) {
|
||||||
|
this.inputStream = inputStream;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "ItemDownload [itemDescription=" + itemDescription + ", inputStream=" + inputStream + "]";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -8,6 +8,7 @@ import java.util.Map;
|
||||||
|
|
||||||
import org.gcube.common.storagehub.client.StreamDescriptor;
|
import org.gcube.common.storagehub.client.StreamDescriptor;
|
||||||
import org.gcube.common.storagehub.client.dsl.FileContainer;
|
import org.gcube.common.storagehub.client.dsl.FileContainer;
|
||||||
|
import org.gcube.common.storagehub.client.dsl.FolderContainer;
|
||||||
import org.gcube.common.storagehub.client.dsl.ItemContainer;
|
import org.gcube.common.storagehub.client.dsl.ItemContainer;
|
||||||
import org.gcube.common.storagehub.client.dsl.ListResolver;
|
import org.gcube.common.storagehub.client.dsl.ListResolver;
|
||||||
import org.gcube.common.storagehub.client.dsl.OpenResolver;
|
import org.gcube.common.storagehub.client.dsl.OpenResolver;
|
||||||
|
@ -15,7 +16,9 @@ import org.gcube.common.storagehub.client.dsl.StorageHubClient;
|
||||||
import org.gcube.common.storagehub.model.Metadata;
|
import org.gcube.common.storagehub.model.Metadata;
|
||||||
import org.gcube.common.storagehub.model.items.AbstractFileItem;
|
import org.gcube.common.storagehub.model.items.AbstractFileItem;
|
||||||
import org.gcube.common.storagehub.model.items.FolderItem;
|
import org.gcube.common.storagehub.model.items.FolderItem;
|
||||||
|
import org.gcube.common.storagehub.model.items.GCubeItem;
|
||||||
import org.gcube.common.storagehub.model.items.Item;
|
import org.gcube.common.storagehub.model.items.Item;
|
||||||
|
import org.gcube.common.storagehub.model.items.TrashItem;
|
||||||
import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription;
|
import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription;
|
||||||
import org.gcube.portlets.user.dataminermanager.shared.exception.ServiceException;
|
import org.gcube.portlets.user.dataminermanager.shared.exception.ServiceException;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
|
@ -84,7 +87,42 @@ public class StorageUtil {
|
||||||
throw new ServiceException(e.getLocalizedMessage(), e);
|
throw new ServiceException(e.getLocalizedMessage(), e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ItemDownload getItemDownload(String user, String itemId) throws ServiceException {
|
||||||
|
try {
|
||||||
|
logger.debug("getInputStreamForItemOnWorkspace: [user=" + user + ", itemId=" + itemId + "]");
|
||||||
|
StorageHubClient shc = new StorageHubClient();
|
||||||
|
OpenResolver openResolver = shc.open(itemId);
|
||||||
|
ItemContainer<Item> itemContainer = openResolver.asItem();
|
||||||
|
Item item = itemContainer.get();
|
||||||
|
|
||||||
|
StreamDescriptor streamDescriptor = null;
|
||||||
|
if (item instanceof AbstractFileItem) {
|
||||||
|
FileContainer fileContainer = openResolver.asFile();
|
||||||
|
streamDescriptor = fileContainer.download();
|
||||||
|
} else {
|
||||||
|
if (item instanceof FolderItem) {
|
||||||
|
FolderContainer folderContainer = openResolver.asFolder();
|
||||||
|
streamDescriptor = folderContainer.download();
|
||||||
|
} else {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (streamDescriptor == null) {
|
||||||
|
logger.error("This type of item does not support download: " + itemId);
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
ItemDescription itemDescription = new ItemDescription(item.getId(), item.getName(), item.getOwner(),
|
||||||
|
item.getPath(), getItemType(item));
|
||||||
|
ItemDownload itemDownload = new ItemDownload(itemDescription, streamDescriptor.getStream());
|
||||||
|
return itemDownload;
|
||||||
|
}
|
||||||
|
} catch (Throwable e) {
|
||||||
|
logger.error("Error retrieving InputStream for item: " + e.getLocalizedMessage(), e);
|
||||||
|
throw new ServiceException(e.getLocalizedMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param user
|
* @param user
|
||||||
|
@ -93,23 +131,18 @@ public class StorageUtil {
|
||||||
* Item id
|
* Item id
|
||||||
* @return Item description
|
* @return Item description
|
||||||
* @throws ServiceException
|
* @throws ServiceException
|
||||||
* Exception
|
* Error
|
||||||
*/
|
*/
|
||||||
public ItemDescription getFileInfoOnWorkspace(String user, String itemId)
|
public ItemDescription getItemDescription(String user, String itemId) throws ServiceException {
|
||||||
throws ServiceException {
|
|
||||||
try {
|
try {
|
||||||
logger.info("Retrieve file info on workspace: [user=" + user + ", itemId=" + itemId + "]");
|
logger.info("Retrieve file info on workspace: [user=" + user + ", itemId=" + itemId + "]");
|
||||||
StorageHubClient shc = new StorageHubClient();
|
StorageHubClient shc = new StorageHubClient();
|
||||||
OpenResolver openResolver = shc.open(itemId);
|
OpenResolver openResolver = shc.open(itemId);
|
||||||
|
ItemContainer<Item> itemContainer = openResolver.asItem();
|
||||||
FileContainer fileContainer = openResolver.asFile();
|
Item item = itemContainer.get();
|
||||||
AbstractFileItem item = fileContainer.get();
|
|
||||||
ItemDescription itemDescription = new ItemDescription(item.getId(), item.getName(), item.getOwner(),
|
ItemDescription itemDescription = new ItemDescription(item.getId(), item.getName(), item.getOwner(),
|
||||||
item.getPath(), item.getClass().getSimpleName());
|
item.getPath(), getItemType(item));
|
||||||
itemDescription.setMimeType(item.getContent().getMimeType());
|
|
||||||
itemDescription.setLenght(String.valueOf(item.getContent().getSize()));
|
|
||||||
return itemDescription;
|
return itemDescription;
|
||||||
|
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
logger.error("Retrieve file info on workspace: " + e.getLocalizedMessage(), e);
|
logger.error("Retrieve file info on workspace: " + e.getLocalizedMessage(), e);
|
||||||
throw new ServiceException(e.getLocalizedMessage());
|
throw new ServiceException(e.getLocalizedMessage());
|
||||||
|
@ -147,30 +180,26 @@ public class StorageUtil {
|
||||||
* folder id
|
* folder id
|
||||||
* @return input stream
|
* @return input stream
|
||||||
* @throws ServiceException
|
* @throws ServiceException
|
||||||
* service exception
|
* service exception public InputStream zipFolder(String user,
|
||||||
|
* String folderId) throws ServiceException { try {
|
||||||
|
* logger.debug("zipFolder: [user=" + user + ", folderId=" +
|
||||||
|
* folderId + "]"); StorageHubClient shc = new
|
||||||
|
* StorageHubClient(); OpenResolver openResolver =
|
||||||
|
* shc.open(folderId);
|
||||||
|
*
|
||||||
|
* ItemContainer<Item> itemContainer = openResolver.asItem();
|
||||||
|
* Item item = itemContainer.get(); if (item instanceof
|
||||||
|
* FolderItem) { StreamDescriptor streamDescriptor =
|
||||||
|
* openResolver.asFolder().download(); InputStream is =
|
||||||
|
* streamDescriptor.getStream(); return is; } else { throw new
|
||||||
|
* ServiceException("Is not a valid folder!"); }
|
||||||
|
*
|
||||||
|
* } catch (Throwable e) { logger.error("Error in zip Folder: "
|
||||||
|
* + e.getLocalizedMessage(), e); throw new
|
||||||
|
* ServiceException(e.getLocalizedMessage(), e); }
|
||||||
|
*
|
||||||
|
* }
|
||||||
*/
|
*/
|
||||||
public InputStream zipFolder(String user, String folderId) throws ServiceException {
|
|
||||||
try {
|
|
||||||
logger.debug("zipFolder: [user=" + user + ", folderId=" + folderId + "]");
|
|
||||||
StorageHubClient shc = new StorageHubClient();
|
|
||||||
OpenResolver openResolver = shc.open(folderId);
|
|
||||||
|
|
||||||
ItemContainer<Item> itemContainer = openResolver.asItem();
|
|
||||||
Item item = itemContainer.get();
|
|
||||||
if (item instanceof FolderItem) {
|
|
||||||
StreamDescriptor streamDescriptor = openResolver.asFolder().download();
|
|
||||||
InputStream is = streamDescriptor.getStream();
|
|
||||||
return is;
|
|
||||||
} else {
|
|
||||||
throw new ServiceException("Is not a valid folder!");
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (Throwable e) {
|
|
||||||
logger.error("Error in zip Folder: " + e.getLocalizedMessage(), e);
|
|
||||||
throw new ServiceException(e.getLocalizedMessage(), e);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -182,17 +211,27 @@ public class StorageUtil {
|
||||||
* @throws ServiceException
|
* @throws ServiceException
|
||||||
* service exception
|
* service exception
|
||||||
*/
|
*/
|
||||||
public Item getItemInRootFolderOnWorkspace(String user, String itemName) throws ServiceException {
|
public ItemDescription getItemInRootFolderOnWorkspace(String user, String itemName) throws ServiceException {
|
||||||
try {
|
try {
|
||||||
logger.debug("GetItemInRootFolder: [user=" + user + ", itemName=" + itemName + "]");
|
logger.debug("GetItemInRootFolder: [user=" + user + ", itemName=" + itemName + "]");
|
||||||
StorageHubClient shc = new StorageHubClient();
|
StorageHubClient shc = new StorageHubClient();
|
||||||
ListResolver listResolver = shc.getWSRoot().findByName(itemName);
|
ListResolver listResolver = shc.getWSRoot().findByName(itemName);
|
||||||
List<? extends Item> items = listResolver.getItems();
|
List<? extends Item> items = listResolver.getItems();
|
||||||
|
|
||||||
if (items != null && !items.isEmpty()) {
|
if (items == null || items.isEmpty()) {
|
||||||
return items.get(0);
|
logger.debug("No item found");
|
||||||
} else {
|
|
||||||
return null;
|
return null;
|
||||||
|
} else {
|
||||||
|
Item item = items.get(0);
|
||||||
|
logger.debug("Item: " + item);
|
||||||
|
if (item != null) {
|
||||||
|
logger.debug("Item Id=" + item.getId());
|
||||||
|
ItemDescription itemDescription = new ItemDescription(item.getId(), item.getName(), item.getOwner(),
|
||||||
|
item.getPath(), getItemType(item));
|
||||||
|
return itemDescription;
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
|
@ -213,17 +252,28 @@ public class StorageUtil {
|
||||||
* @throws ServiceException
|
* @throws ServiceException
|
||||||
* service exception
|
* service exception
|
||||||
*/
|
*/
|
||||||
public Item getItemInFolderOnWorkspace(String user, String folderId, String itemName) throws ServiceException {
|
public ItemDescription getItemInFolderOnWorkspace(String user, String folderId, String itemName)
|
||||||
|
throws ServiceException {
|
||||||
try {
|
try {
|
||||||
logger.debug("GetItemInFolder: [user=" + user + ", folderId=" + folderId + ", itemName=" + itemName + "]");
|
logger.debug("GetItemInFolder: [user=" + user + ", folderId=" + folderId + ", itemName=" + itemName + "]");
|
||||||
StorageHubClient shc = new StorageHubClient();
|
StorageHubClient shc = new StorageHubClient();
|
||||||
ListResolver listResolver = shc.open(folderId).asFolder().findByName(itemName);
|
ListResolver listResolver = shc.open(folderId).asFolder().findByName(itemName);
|
||||||
List<? extends Item> items = listResolver.getItems();
|
List<? extends Item> items = listResolver.getItems();
|
||||||
|
|
||||||
if (items != null && !items.isEmpty()) {
|
if (items == null || items.isEmpty()) {
|
||||||
return items.get(0);
|
logger.debug("No item found");
|
||||||
} else {
|
|
||||||
return null;
|
return null;
|
||||||
|
} else {
|
||||||
|
Item item = items.get(0);
|
||||||
|
logger.debug("Item: " + item);
|
||||||
|
if (item != null) {
|
||||||
|
logger.debug("Item Id=" + item.getId());
|
||||||
|
ItemDescription itemDescription = new ItemDescription(item.getId(), item.getName(), item.getOwner(),
|
||||||
|
item.getPath(), getItemType(item));
|
||||||
|
return itemDescription;
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
|
@ -243,7 +293,7 @@ public class StorageUtil {
|
||||||
*/
|
*/
|
||||||
public void deleteItem(String user, String itemId) throws ServiceException {
|
public void deleteItem(String user, String itemId) throws ServiceException {
|
||||||
try {
|
try {
|
||||||
logger.debug("Delete Item: [User=" + user + ", ItemId=" + itemId+"]");
|
logger.debug("Delete Item: [User=" + user + ", ItemId=" + itemId + "]");
|
||||||
StorageHubClient shc = new StorageHubClient();
|
StorageHubClient shc = new StorageHubClient();
|
||||||
OpenResolver openResolver = shc.open(itemId);
|
OpenResolver openResolver = shc.open(itemId);
|
||||||
|
|
||||||
|
@ -259,4 +309,24 @@ public class StorageUtil {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String getItemType(Item item) {
|
||||||
|
if (item instanceof AbstractFileItem) {
|
||||||
|
return AbstractFileItem.class.getSimpleName();
|
||||||
|
} else {
|
||||||
|
if (item instanceof FolderItem) {
|
||||||
|
return FolderItem.class.getSimpleName();
|
||||||
|
} else {
|
||||||
|
if (item instanceof GCubeItem) {
|
||||||
|
return GCubeItem.class.getSimpleName();
|
||||||
|
} else {
|
||||||
|
if (item instanceof TrashItem) {
|
||||||
|
return TrashItem.class.getSimpleName();
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
package org.gcube.portlets.user.dataminermanager.server.util;
|
package org.gcube.portlets.user.dataminermanager.server.util;
|
||||||
|
|
||||||
import org.gcube.common.storagehub.model.items.Item;
|
|
||||||
import org.gcube.data.analysis.dataminermanagercl.server.util.ServiceCredentials;
|
import org.gcube.data.analysis.dataminermanagercl.server.util.ServiceCredentials;
|
||||||
import org.gcube.data.analysis.dataminermanagercl.shared.workspace.Computations;
|
import org.gcube.data.analysis.dataminermanagercl.shared.workspace.Computations;
|
||||||
import org.gcube.data.analysis.dataminermanagercl.shared.workspace.DataMinerWorkArea;
|
import org.gcube.data.analysis.dataminermanagercl.shared.workspace.DataMinerWorkArea;
|
||||||
|
@ -37,20 +36,13 @@ public class DataMinerWorkAreaManager {
|
||||||
StorageUtil storageUtil = new StorageUtil();
|
StorageUtil storageUtil = new StorageUtil();
|
||||||
try {
|
try {
|
||||||
|
|
||||||
Item wiDataMinerFolder = storageUtil.getItemInRootFolderOnWorkspace(serviceCredentials.getUserName(),
|
ItemDescription dataMinerWorkAreaFolder = storageUtil.getItemInRootFolderOnWorkspace(serviceCredentials.getUserName(),
|
||||||
DATA_MINER_FOLDER);
|
DATA_MINER_FOLDER);
|
||||||
|
if (dataMinerWorkAreaFolder == null) {
|
||||||
if (wiDataMinerFolder == null) {
|
|
||||||
dataMinerWorkArea = new DataMinerWorkArea(null);
|
dataMinerWorkArea = new DataMinerWorkArea(null);
|
||||||
return dataMinerWorkArea;
|
return dataMinerWorkArea;
|
||||||
} else {
|
} else {
|
||||||
ItemDescription dataMinerWorkAreaFolder = null;
|
|
||||||
|
|
||||||
dataMinerWorkAreaFolder = new ItemDescription(wiDataMinerFolder.getId(), wiDataMinerFolder.getName(),
|
|
||||||
wiDataMinerFolder.getOwner(), wiDataMinerFolder.getPath(),
|
|
||||||
null);
|
|
||||||
dataMinerWorkArea = new DataMinerWorkArea(dataMinerWorkAreaFolder);
|
dataMinerWorkArea = new DataMinerWorkArea(dataMinerWorkAreaFolder);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
|
@ -62,14 +54,8 @@ public class DataMinerWorkAreaManager {
|
||||||
|
|
||||||
InputDataSets inputDataSets = null;
|
InputDataSets inputDataSets = null;
|
||||||
try {
|
try {
|
||||||
Item wiImportedDataFolder = storageUtil.getItemInFolderOnWorkspace(serviceCredentials.getUserName(),
|
ItemDescription importedDataFolder = storageUtil.getItemInFolderOnWorkspace(serviceCredentials.getUserName(),
|
||||||
dataMinerWorkArea.getDataMinerWorkAreaFolder().getId(), IMPORTED_DATA_FOLDER);
|
dataMinerWorkArea.getDataMinerWorkAreaFolder().getId(), IMPORTED_DATA_FOLDER);
|
||||||
ItemDescription importedDataFolder = null;
|
|
||||||
|
|
||||||
importedDataFolder = new ItemDescription(wiImportedDataFolder.getId(), wiImportedDataFolder.getName(),
|
|
||||||
wiImportedDataFolder.getOwner(), wiImportedDataFolder.getPath(),
|
|
||||||
null);
|
|
||||||
|
|
||||||
inputDataSets = new InputDataSets(importedDataFolder);
|
inputDataSets = new InputDataSets(importedDataFolder);
|
||||||
|
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
|
@ -79,14 +65,9 @@ public class DataMinerWorkAreaManager {
|
||||||
|
|
||||||
OutputDataSets outputDataSets = null;
|
OutputDataSets outputDataSets = null;
|
||||||
try {
|
try {
|
||||||
Item wiComputedDataFolder = storageUtil.getItemInFolderOnWorkspace(serviceCredentials.getUserName(),
|
ItemDescription computedDataFolder = storageUtil.getItemInFolderOnWorkspace(serviceCredentials.getUserName(),
|
||||||
dataMinerWorkArea.getDataMinerWorkAreaFolder().getId(), COMPUTED_DATA_FOLDER);
|
dataMinerWorkArea.getDataMinerWorkAreaFolder().getId(), COMPUTED_DATA_FOLDER);
|
||||||
ItemDescription computedDataFolder = null;
|
outputDataSets = new OutputDataSets(computedDataFolder);
|
||||||
|
|
||||||
computedDataFolder = new ItemDescription(wiComputedDataFolder.getId(), wiComputedDataFolder.getName(),
|
|
||||||
wiComputedDataFolder.getOwner(), wiComputedDataFolder.getPath(),
|
|
||||||
null);
|
|
||||||
outputDataSets = new OutputDataSets(computedDataFolder);
|
|
||||||
|
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
logger.debug("ComputedData Folder is set to null");
|
logger.debug("ComputedData Folder is set to null");
|
||||||
|
@ -95,13 +76,8 @@ public class DataMinerWorkAreaManager {
|
||||||
|
|
||||||
Computations computations = null;
|
Computations computations = null;
|
||||||
try {
|
try {
|
||||||
Item wiComputationsDataFolder = storageUtil.getItemInFolderOnWorkspace(serviceCredentials.getUserName(),
|
ItemDescription computationsDataFolder = storageUtil.getItemInFolderOnWorkspace(serviceCredentials.getUserName(),
|
||||||
dataMinerWorkArea.getDataMinerWorkAreaFolder().getId(), COMPUTATIONS_FOLDER);
|
dataMinerWorkArea.getDataMinerWorkAreaFolder().getId(), COMPUTATIONS_FOLDER);
|
||||||
ItemDescription computationsDataFolder = null;
|
|
||||||
|
|
||||||
computationsDataFolder = new ItemDescription(wiComputationsDataFolder.getId(),
|
|
||||||
wiComputationsDataFolder.getName(), wiComputationsDataFolder.getOwner(),
|
|
||||||
wiComputationsDataFolder.getPath(), null);
|
|
||||||
computations = new Computations(computationsDataFolder);
|
computations = new Computations(computationsDataFolder);
|
||||||
|
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
|
|
|
@ -44,10 +44,5 @@ public class Constants {
|
||||||
public static final String CURR_GROUP_ID = "CURR_GROUP_ID";
|
public static final String CURR_GROUP_ID = "CURR_GROUP_ID";
|
||||||
|
|
||||||
// Download
|
// Download
|
||||||
public static final String DOWNLOAD_FILE_SERVLET = "DownloadFileServlet";
|
public static final String DOWNLOAD_SERVLET = "DownloadServlet";
|
||||||
|
|
||||||
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";
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,12 +15,8 @@
|
||||||
|
|
||||||
<!-- Download -->
|
<!-- Download -->
|
||||||
<servlet>
|
<servlet>
|
||||||
<servlet-name>DownloadFileServlet</servlet-name>
|
<servlet-name>DownloadServlet</servlet-name>
|
||||||
<servlet-class>org.gcube.portlets.user.dataminermanager.server.DownloadFileServlet</servlet-class>
|
<servlet-class>org.gcube.portlets.user.dataminermanager.server.DownloadServlet</servlet-class>
|
||||||
</servlet>
|
|
||||||
<servlet>
|
|
||||||
<servlet-name>DownloadFolderServlet</servlet-name>
|
|
||||||
<servlet-class>org.gcube.portlets.user.dataminermanager.server.DownloadFolderServlet</servlet-class>
|
|
||||||
</servlet>
|
</servlet>
|
||||||
|
|
||||||
<servlet>
|
<servlet>
|
||||||
|
@ -52,14 +48,11 @@
|
||||||
|
|
||||||
<!-- Download -->
|
<!-- Download -->
|
||||||
<servlet-mapping>
|
<servlet-mapping>
|
||||||
<servlet-name>DownloadFileServlet</servlet-name>
|
<servlet-name>DownloadServlet</servlet-name>
|
||||||
<url-pattern>/dataminermanager/DownloadFileServlet/*</url-pattern>
|
<url-pattern>/dataminermanager/DownloadServlet/*</url-pattern>
|
||||||
</servlet-mapping>
|
|
||||||
<servlet-mapping>
|
|
||||||
<servlet-name>DownloadFolderServlet</servlet-name>
|
|
||||||
<url-pattern>/dataminermanager/DownloadFolderServlet</url-pattern>
|
|
||||||
</servlet-mapping>
|
</servlet-mapping>
|
||||||
|
|
||||||
|
|
||||||
<servlet-mapping>
|
<servlet-mapping>
|
||||||
<servlet-name>workspaceExplorer</servlet-name>
|
<servlet-name>workspaceExplorer</servlet-name>
|
||||||
<url-pattern>/dataminermanager/WorkspaceExplorerService</url-pattern>
|
<url-pattern>/dataminermanager/WorkspaceExplorerService</url-pattern>
|
||||||
|
|
Loading…
Reference in New Issue