Enhancement on file versioning #7006

git-svn-id: http://svn.d4science-ii.research-infrastructures.eu/gcube/trunk/portlets/user/workspace@142775 82a268e6-3cf1-43bd-a215-b396298e98cf
task/19600
Francesco Mangiacrapa 7 years ago
parent 5c46c8d997
commit 33c3c4fa22

@ -30,9 +30,12 @@ import org.gcube.portlets.user.workspace.client.event.DeleteMessageEventHandler;
import org.gcube.portlets.user.workspace.client.event.DoubleClickElementSelectedEvent;
import org.gcube.portlets.user.workspace.client.event.DoubleClickElementSelectedEventHandler;
import org.gcube.portlets.user.workspace.client.event.FileDownloadEvent;
import org.gcube.portlets.user.workspace.client.event.FileDownloadEvent.DownloadType;
import org.gcube.portlets.user.workspace.client.event.FileDownloadEventHandler;
import org.gcube.portlets.user.workspace.client.event.FileUploadEvent;
import org.gcube.portlets.user.workspace.client.event.FileUploadEventHandler;
import org.gcube.portlets.user.workspace.client.event.FileVersioningEvent;
import org.gcube.portlets.user.workspace.client.event.FileVersioningEventHandler;
import org.gcube.portlets.user.workspace.client.event.FilterScopeEvent;
import org.gcube.portlets.user.workspace.client.event.GetFolderLinkEvent;
import org.gcube.portlets.user.workspace.client.event.GetInfoEvent;
@ -105,6 +108,7 @@ import org.gcube.portlets.user.workspace.client.view.panels.GxtBorderLayoutPanel
import org.gcube.portlets.user.workspace.client.view.panels.GxtItemsPanel;
import org.gcube.portlets.user.workspace.client.view.toolbars.GxtBreadcrumbPathPanel;
import org.gcube.portlets.user.workspace.client.view.trash.WindowTrash;
import org.gcube.portlets.user.workspace.client.view.versioning.WindowVersioning;
import org.gcube.portlets.user.workspace.client.view.windows.DialogConfirm;
import org.gcube.portlets.user.workspace.client.view.windows.DialogGetInfo;
import org.gcube.portlets.user.workspace.client.view.windows.InfoDisplay;
@ -116,6 +120,7 @@ import org.gcube.portlets.user.workspace.shared.TrashContent;
import org.gcube.portlets.user.workspace.shared.TrashOperationContent;
import org.gcube.portlets.user.workspace.shared.WorkspaceTrashOperation;
import org.gcube.portlets.user.workspace.shared.WorkspaceUserQuote;
import org.gcube.portlets.user.workspace.shared.WorkspaceVersioningOperation;
import org.gcube.portlets.widgets.sessionchecker.client.CheckSession;
import org.gcube.portlets.widgets.workspaceuploader.client.WorkspaceUploadNotification.WorskpaceUploadNotificationListener;
import org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload;
@ -190,7 +195,8 @@ public class AppController implements SubscriberInterface {
EventsTypeEnum.COPY_EVENT,
EventsTypeEnum.TRASH_EVENT,
EventsTypeEnum.UPDATE_WORKSPACE_SIZE,
EventsTypeEnum.UPDATED_VRE_PERMISSION
EventsTypeEnum.UPDATED_VRE_PERMISSION,
EventsTypeEnum.FILE_VERSIONING_HISTORY_EVENT
});
bind();
}
@ -228,6 +234,15 @@ public class AppController implements SubscriberInterface {
}
});
eventBus.addHandler(FileVersioningEvent.TYPE, new FileVersioningEventHandler() {
@Override
public void onFileVersioning(FileVersioningEvent fileVersioningEvent) {
performVersioningOperation(fileVersioningEvent);
}
});
eventBus.addHandler(UpdateWorkspaceSizeEvent.TYPE, new UpdateWorkspaceSizeEventHandler() {
@ -263,7 +278,7 @@ public class AppController implements SubscriberInterface {
@Override
public void onTrashEvent(TrashEvent trashEvent) {
executeTrashOperation(trashEvent.getTrashOperation(), trashEvent.getTargetFileModels());
performTrashOperation(trashEvent.getTrashOperation(), trashEvent.getTargetFileModels());
}
});
@ -446,7 +461,7 @@ public class AppController implements SubscriberInterface {
public void onFileDownloadEvent(FileDownloadEvent fileDownloadEvent) {
if(fileDownloadEvent!=null && fileDownloadEvent.getItemIdentifier()!=null){
AppControllerExplorer.getEventBus().fireEvent(new FileDownloadEvent(fileDownloadEvent.getItemIdentifier(), fileDownloadEvent.getItemName(), fileDownloadEvent.getDownloadType(), fileDownloadEvent.isFolder()));
AppControllerExplorer.getEventBus().fireEvent(new FileDownloadEvent(fileDownloadEvent.getItemIdentifier(), fileDownloadEvent.getItemName(), fileDownloadEvent.getDownloadType(), fileDownloadEvent.isFolder(), null));
}
}
@ -1361,7 +1376,7 @@ public class AppController implements SubscriberInterface {
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
@Override
public void execute() {
executeTrashOperation(WorkspaceTrashOperation.REFRESH, null);
performTrashOperation(WorkspaceTrashOperation.REFRESH, null);
}
});
@ -1715,7 +1730,7 @@ public class AppController implements SubscriberInterface {
for (String itemIdentifier : ids) {
deleted = wsPortlet.getGridGroupContainer().deleteItem(itemIdentifier);
}
executeTrashOperation(WorkspaceTrashOperation.REFRESH, null);
performTrashOperation(WorkspaceTrashOperation.REFRESH, null);
return deleted;
}
@ -2020,13 +2035,101 @@ public class AppController implements SubscriberInterface {
}
}
/**
* Perform versioning operation.
*
* @param fileVersioningEvent the file versioning event
*/
private void performVersioningOperation(FileVersioningEvent fileVersioningEvent){
final FileModel currentVersion = fileVersioningEvent.getCurrentVersion();
final FileModel olderVersion = fileVersioningEvent.getOlderVersion();
switch (fileVersioningEvent.getVersioningOperation()) {
case SHOW:{
final WindowVersioning wv = new WindowVersioning(currentVersion);
appContrExplorer.getRpcWorkspaceService().getVersionHistory(currentVersion.getIdentifier(), new AsyncCallback<List<FileModel>>() {
@Override
public void onFailure(Throwable caught) {
}
@Override
public void onSuccess(List<FileModel> result) {
wv.updateVersioningContainer(result);
wv.updateItemsNumber(result.size());
}
});
wv.show();
break;
}
case DOWNLOAD:{
AppControllerExplorer.getEventBus().fireEvent(new FileDownloadEvent(olderVersion.getIdentifier(), currentVersion.getName(), DownloadType.DOWNLOAD, false, olderVersion.getIdentifier()));
break;
}
case DELETE_PERMANENTLY: {
final WindowVersioning wv = new WindowVersioning(currentVersion);
appContrExplorer.getRpcWorkspaceService().performOperationOnVersionedFile(currentVersion, olderVersion, WorkspaceVersioningOperation.DELETE_PERMANENTLY, new AsyncCallback<List<FileModel>>() {
@Override
public void onFailure(Throwable caught) {
}
@Override
public void onSuccess(List<FileModel> result) {
wv.updateVersioningContainer(result);
wv.updateItemsNumber(result.size());
}
});
wv.show();
break;
}
case REFRESH: {
final WindowVersioning wv = fileVersioningEvent.getWinVersioning();
appContrExplorer.getRpcWorkspaceService().getVersionHistory(currentVersion.getIdentifier(), new AsyncCallback<List<FileModel>>() {
@Override
public void onFailure(Throwable caught) {
}
@Override
public void onSuccess(List<FileModel> result) {
wv.updateVersioningContainer(result);
wv.updateItemsNumber(result.size());
}
});
wv.show();
}
case EMPTY_OLDER_VERSIONS: {
break;
}
case RESTORE:{
break;
}
}
}
/**
* Execute trash operation.
* Perform trash operation.
*
* @param operation the operation
* @param trashItemIds the trash item ids
*/
private void executeTrashOperation(final WorkspaceTrashOperation operation, List<FileModel> trashItemIds){
private void performTrashOperation(final WorkspaceTrashOperation operation, List<FileModel> trashItemIds){
GWT.log("Executing trash operation: "+operation);
@ -2122,7 +2225,7 @@ public class AppController implements SubscriberInterface {
*/
@Override
public void trashEvent(WorkspaceTrashOperation trashOperation, List<FileModel> targetFileModels) {
executeTrashOperation(trashOperation, targetFileModels);
performTrashOperation(trashOperation, targetFileModels);
}
@ -2193,4 +2296,15 @@ public class AppController implements SubscriberInterface {
else
t.run();
}
/* (non-Javadoc)
* @see org.gcube.portlets.user.workspace.client.interfaces.SubscriberInterface#versioningHistory(org.gcube.portlets.user.workspace.client.model.FileModel)
*/
@Override
public void versioningHistory(FileModel file) {
eventBus.fireEvent(new FileVersioningEvent(WorkspaceVersioningOperation.SHOW, file, null, null));
}
}

@ -0,0 +1,162 @@
/*
*
*/
package org.gcube.portlets.user.workspace.client.event;
import org.gcube.portlets.user.workspace.client.interfaces.EventsTypeEnum;
import org.gcube.portlets.user.workspace.client.interfaces.GuiEventInterface;
import org.gcube.portlets.user.workspace.client.model.FileModel;
import org.gcube.portlets.user.workspace.client.view.versioning.WindowVersioning;
import org.gcube.portlets.user.workspace.shared.WorkspaceVersioningOperation;
import com.google.gwt.event.shared.GwtEvent;
/**
* The Class FileVersioningEvent.
*
* @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it
* Feb 20, 2017
*/
public class FileVersioningEvent extends GwtEvent<FileVersioningEventHandler> implements GuiEventInterface{
public static Type<FileVersioningEventHandler> TYPE = new Type<FileVersioningEventHandler>();
private WorkspaceVersioningOperation workspaceVersioningOperation;
private FileModel currentVersion;
private FileModel olderVersion;
private WindowVersioning winVersioning;
/**
* Instantiates a new file versioning event.
*
* @param workspaceVersioningOperation the workspace versioning operation
* @param currentVersion the current version
* @param olderVersion the older version
* @param winVersioning the win versioning
*/
public FileVersioningEvent(WorkspaceVersioningOperation workspaceVersioningOperation, FileModel currentVersion, FileModel olderVersion, WindowVersioning winVersioning) {
this.workspaceVersioningOperation = workspaceVersioningOperation;
this.currentVersion = currentVersion;
this.olderVersion = olderVersion;
this.winVersioning = winVersioning;
}
/**
* Gets the win versioning.
*
* @return the winVersioning
*/
public WindowVersioning getWinVersioning() {
return winVersioning;
}
/**
* Gets the current version.
*
* @return the currentVersion
*/
public FileModel getCurrentVersion() {
return currentVersion;
}
/**
* Sets the current version.
*
* @param currentVersion the currentVersion to set
*/
public void setCurrentVersion(FileModel currentVersion) {
this.currentVersion = currentVersion;
}
/**
* Gets the older version.
*
* @return the olderVersion
*/
public FileModel getOlderVersion() {
return olderVersion;
}
/**
* Sets the workspace versioning operation.
*
* @param workspaceVersioningOperation the workspaceVersioningOperation to set
*/
public void setWorkspaceVersioningOperation(
WorkspaceVersioningOperation workspaceVersioningOperation) {
this.workspaceVersioningOperation = workspaceVersioningOperation;
}
/**
* Sets the older version.
*
* @param olderVersion the olderVersion to set
*/
public void setOlderVersion(FileModel olderVersion) {
this.olderVersion = olderVersion;
}
/* (non-Javadoc)
* @see com.google.gwt.event.shared.GwtEvent#getAssociatedType()
*/
@Override
public Type<FileVersioningEventHandler> getAssociatedType() {
return TYPE;
}
/* (non-Javadoc)
* @see com.google.gwt.event.shared.GwtEvent#dispatch(com.google.gwt.event.shared.EventHandler)
*/
@Override
protected void dispatch(FileVersioningEventHandler handler) {
handler.onFileVersioning(this);
}
/* (non-Javadoc)
* @see org.gcube.portlets.user.workspace.client.interfaces.GuiEventInterface#getKey()
*/
@Override
public EventsTypeEnum getKey() {
return EventsTypeEnum.FILE_VERSIONING_HISTORY_EVENT;
}
/**
* Sets the versioning operation.
*
* @param workspaceVersioningOperation the new versioning operation
*/
public void setVersioningOperation(WorkspaceVersioningOperation workspaceVersioningOperation) {
this.workspaceVersioningOperation = workspaceVersioningOperation;
}
/**
* Gets the versioning operation.
*
* @return the versioning operation
*/
public WorkspaceVersioningOperation getVersioningOperation() {
return workspaceVersioningOperation;
}
}

@ -0,0 +1,20 @@
package org.gcube.portlets.user.workspace.client.event;
import com.google.gwt.event.shared.EventHandler;
/**
* The Interface FileVersioningEventHandler.
*
* @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it
* Feb 20, 2017
*/
public interface FileVersioningEventHandler extends EventHandler {
/**
* On file versioning.
*
* @param fileVersioningEvent the file versioning event
*/
void onFileVersioning(FileVersioningEvent fileVersioningEvent);
}

@ -5,6 +5,7 @@ import org.gcube.portlets.user.workspace.client.ConstantsExplorer;
import org.gcube.portlets.user.workspace.client.event.AccountingHistoryEvent;
import org.gcube.portlets.user.workspace.client.event.AccountingReadersEvent;
import org.gcube.portlets.user.workspace.client.event.AddAdministratorEvent;
import org.gcube.portlets.user.workspace.client.event.FileVersioningEvent;
import org.gcube.portlets.user.workspace.client.event.GetInfoEvent;
import org.gcube.portlets.user.workspace.client.event.TrashEvent;
import org.gcube.portlets.user.workspace.client.resources.Resources;
@ -13,6 +14,7 @@ import org.gcube.portlets.user.workspace.shared.ExtendedWorkspaceACL;
import org.gcube.portlets.user.workspace.shared.WorkspaceACL;
import org.gcube.portlets.user.workspace.shared.WorkspaceACL.USER_TYPE;
import org.gcube.portlets.user.workspace.shared.WorkspaceTrashOperation;
import org.gcube.portlets.user.workspace.shared.WorkspaceVersioningOperation;
import com.extjs.gxt.ui.client.Style.ButtonScale;
import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
@ -30,11 +32,16 @@ import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.ui.AbstractImagePrototype;
/**
* @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it
* The Class GxtBottomToolBarItem.
*
* @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it
*/
public class GxtBottomToolBarItem extends ToolBar{
/**
*
*/
private static final String VERSIONING = "Versioning";
/**
*
*/
@ -58,11 +65,15 @@ public class GxtBottomToolBarItem extends ToolBar{
private Button bHistory;
private Button bRead;
private Button btnGetTrash;
private Button btnVersioning;
private ACLDivInfo aclDivInfo;
private Label labelItemsNumber = new Label();
private HorizontalPanel hpItemsNumber;
private Button btnAddAdmin;
/**
* Instantiates a new gxt bottom tool bar item.
*/
public GxtBottomToolBarItem(){
super();
initToolbar();
@ -77,6 +88,9 @@ public class GxtBottomToolBarItem extends ToolBar{
setItemsNumberToCenter();
}
/**
* Inits the toolbar.
*/
private void initToolbar(){
btnGetTrash = new Button("Trash");
@ -129,6 +143,19 @@ public class GxtBottomToolBarItem extends ToolBar{
}
});
btnVersioning = new Button(VERSIONING);
btnVersioning.setIcon(Resources.getIconVersioning());
btnVersioning.addSelectionListener(new SelectionListener<ButtonEvent>() {
@Override
public void componentSelected(ButtonEvent ce) {
AppController.getEventBus().fireEvent(new FileVersioningEvent(WorkspaceVersioningOperation.SHOW, null, null, null));
}
});
btnAddAdmin = new Button(EDIT_ADMINISTRATOR);
//TODO CHANGE ICON
btnAddAdmin.setIcon(Resources.getIconManageAdministrator());
@ -149,6 +176,7 @@ public class GxtBottomToolBarItem extends ToolBar{
add(btnGetTrash);
add(btnGetInfo);
add(bHistory);
add(btnVersioning);
hpItemsNumber = new HorizontalPanel();
hpItemsNumber.setId("HP-ItemsNumber");
@ -165,11 +193,19 @@ public class GxtBottomToolBarItem extends ToolBar{
enableInfoHistoryButtons(false);
}
/**
* Sets the visible add administrators.
*
* @param bool the new visible add administrators
*/
private void setVisibleAddAdministrators(boolean bool){
btnAddAdmin.setVisible(bool);
}
/**
* Reset details.
*/
public void resetDetails(){
this.txtDimension.setText("");
@ -178,12 +214,29 @@ public class GxtBottomToolBarItem extends ToolBar{
this.txtOwner.setText("");
}
/**
* Enable info history buttons.
*
* @param enable the enable
*/
public void enableInfoHistoryButtons(boolean enable){
bHistory.setEnabled(enable);
bRead.setEnabled(enable);
btnGetInfo.setEnabled(enable);
btnVersioning.setEnabled(enable);
}
/**
* Sets the details.
*
* @param itemName the item name
* @param description the description
* @param dimension the dimension
* @param creationTime the creation time
* @param owner the owner
*/
public void setDetails(String itemName, String description, String dimension, String creationTime, String owner){
this.resetDetails();
@ -195,6 +248,11 @@ public class GxtBottomToolBarItem extends ToolBar{
}
/**
* Update acl info.
*
* @param acl the acl
*/
public void updateACLInfo(WorkspaceACL acl){
setVisibleAddAdministrators(false);
@ -209,6 +267,12 @@ public class GxtBottomToolBarItem extends ToolBar{
}
/**
* Update add administator info.
*
* @param loginUserLogger the login user logger
* @param acl the acl
*/
public void updateAddAdministatorInfo(String loginUserLogger, ExtendedWorkspaceACL acl){
setVisibleAddAdministrators(false);
@ -225,6 +289,11 @@ public class GxtBottomToolBarItem extends ToolBar{
this.layout();
}
/**
* Update trash icon.
*
* @param trashIsFull the trash is full
*/
public void updateTrashIcon(boolean trashIsFull){
if(trashIsFull)
@ -234,7 +303,9 @@ public class GxtBottomToolBarItem extends ToolBar{
}
/**
* @param size
* Update items number.
*
* @param size the size
*/
public void updateItemsNumber(int size) {
if(size<=0)
@ -247,6 +318,9 @@ public class GxtBottomToolBarItem extends ToolBar{
hpItemsNumber.layout();
}
/**
* Sets the items number to center.
*/
public void setItemsNumberToCenter(){
if(this.isRendered()){

@ -1,4 +1,4 @@
package org.gcube.portlets.user.workspace.client.view.version;
package org.gcube.portlets.user.workspace.client.view.versioning;
import java.util.Arrays;
import java.util.List;
@ -59,19 +59,21 @@ public class VersioningInfoContainer extends LayoutContainer {
private Button buttonRestore;
private Button buttonRestoreAll;
private Button buttonEmptyTrash;
private FileModel fileVersioned;
private FileModel currentVersion;
private WindowVersioning windowVersioning;
/**
* Instantiates a new versioning info container.
*
* @param file the versioning files
*/
public VersioningInfoContainer(FileModel file) {
public VersioningInfoContainer(FileModel file, WindowVersioning windowVersioning) {
initContentPanel();
initGrid();
createToolBar();
this.fileVersioned = file;
this.currentVersion = file;
this.windowVersioning = windowVersioning;
activeButtonOnSelection(false);
//updateVersions(file);
@ -125,7 +127,7 @@ public class VersioningInfoContainer extends LayoutContainer {
public void componentSelected(ButtonEvent ce) {
if(checkSelection())
AppController.getEventBus().fireEvent(new FileVersioningEvent(WorkspaceVersioningOperation.RESTORE, grid.getSelectionModel().getSelectedItems().get(0)));
AppController.getEventBus().fireEvent(new FileVersioningEvent(WorkspaceVersioningOperation.RESTORE, currentVersion, grid.getSelectionModel().getSelectedItems().get(0), windowVersioning));
}
});
@ -142,7 +144,7 @@ public class VersioningInfoContainer extends LayoutContainer {
public void componentSelected(ButtonEvent ce) {
if(checkSelection())
AppController.getEventBus().fireEvent(new FileVersioningEvent(WorkspaceVersioningOperation.DELETE_PERMANENTLY, grid.getSelectionModel().getSelectedItems().get(0)));
AppController.getEventBus().fireEvent(new FileVersioningEvent(WorkspaceVersioningOperation.DELETE_PERMANENTLY,currentVersion, grid.getSelectionModel().getSelectedItems().get(0), windowVersioning));
}
});
@ -162,7 +164,7 @@ public class VersioningInfoContainer extends LayoutContainer {
public void componentSelected(ButtonEvent ce) {
if(checkSelection())
AppController.getEventBus().fireEvent(new FileVersioningEvent(WorkspaceVersioningOperation.DOWNLOAD, grid.getSelectionModel().getSelectedItems().get(0)));
AppController.getEventBus().fireEvent(new FileVersioningEvent(WorkspaceVersioningOperation.DOWNLOAD, currentVersion, grid.getSelectionModel().getSelectedItems().get(0), windowVersioning));
}
});
@ -181,7 +183,7 @@ public class VersioningInfoContainer extends LayoutContainer {
// if(checkSelection())
// AppController.getEventBus().fireEvent(new FileVersioningEvent(WorkspaceVersioningOperation.EMPTY_OLDER_VERSIONS, null));
DialogConfirm box = new DialogConfirm(null, "Confirm Delete?", "Are you sure you want delete older versions of: "+ fileVersioned.getName());
DialogConfirm box = new DialogConfirm(null, "Confirm Delete?", "Are you sure you want delete older versions of: "+ currentVersion.getName());
box.setModal(true);
box.center();
box.getYesButton().addClickHandler(new ClickHandler() {
@ -189,7 +191,7 @@ public class VersioningInfoContainer extends LayoutContainer {
@Override
public void onClick(ClickEvent event) {
AppController.getEventBus().fireEvent(new FileVersioningEvent(WorkspaceVersioningOperation.EMPTY_OLDER_VERSIONS, fileVersioned));
AppController.getEventBus().fireEvent(new FileVersioningEvent(WorkspaceVersioningOperation.EMPTY_OLDER_VERSIONS, currentVersion, null, windowVersioning));
}
});
}
@ -209,7 +211,7 @@ public class VersioningInfoContainer extends LayoutContainer {
@Override
public void componentSelected(ButtonEvent ce) {
AppController.getEventBus().fireEvent(new FileVersioningEvent(WorkspaceVersioningOperation.REFRESH, null));
AppController.getEventBus().fireEvent(new FileVersioningEvent(WorkspaceVersioningOperation.REFRESH, currentVersion, null, windowVersioning));
}
});

@ -1,4 +1,4 @@
package org.gcube.portlets.user.workspace.client.view.version;
package org.gcube.portlets.user.workspace.client.view.versioning;
import java.util.ArrayList;
import java.util.List;
@ -46,7 +46,7 @@ public class WindowVersioning extends Window {
*
* @param fileVersioned the file versioned
*/
private WindowVersioning(FileModel fileVersioned) {
public WindowVersioning(FileModel fileVersioned) {
initAccounting();
this.fileVersioned = fileVersioned;
//setIcon(Resources.getTrashFull()); //TODO
@ -61,7 +61,7 @@ public class WindowVersioning extends Window {
setSize(770, 400);
setResizable(true);
setMaximizable(true);
this.versioningContainer = new VersioningInfoContainer(fileVersioned);
this.versioningContainer = new VersioningInfoContainer(fileVersioned, this);
add(versioningContainer);
ToolBar toolBar = new ToolBar();
Loading…
Cancel
Save