From 90d1be3a0505b6e2fb07d62be14df91bac33d47e Mon Sep 17 00:00:00 2001 From: Francesco Mangiacrapa Date: Wed, 28 Mar 2018 16:35:12 +0000 Subject: [PATCH] added lock server-side to ckeck if ws-sync is on-going added message one-shot if a folder is under sync git-svn-id: http://svn.d4science-ii.research-infrastructures.eu/gcube/trunk/portlets/user/workspace-tree-widget@165516 82a268e6-3cf1-43bd-a215-b396298e98cf --- .../client/AppControllerExplorer.java | 43 +++++++++++++++++++ .../workspace/client/ConstantsExplorer.java | 1 + .../event/CheckItemLockedBySyncEvent.java | 36 ++++++++++++++++ .../CheckItemLockedBySyncEventHandler.java | 20 +++++++++ .../workspace/client/resources/Resources.java | 1 - .../client/rpc/GWTWorkspaceService.java | 9 ++++ .../client/rpc/GWTWorkspaceServiceAsync.java | 19 ++++++++ .../client/view/tree/AsyncTreePanel.java | 3 ++ .../server/GWTWorkspaceServiceImpl.java | 34 +++++++++++++++ 9 files changed, 165 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/gcube/portlets/user/workspace/client/event/CheckItemLockedBySyncEvent.java create mode 100644 src/main/java/org/gcube/portlets/user/workspace/client/event/CheckItemLockedBySyncEventHandler.java diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/AppControllerExplorer.java b/src/main/java/org/gcube/portlets/user/workspace/client/AppControllerExplorer.java index 166db6c..d31c8ba 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/client/AppControllerExplorer.java +++ b/src/main/java/org/gcube/portlets/user/workspace/client/AppControllerExplorer.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; +import java.util.Map; import org.gcube.portal.clientcontext.client.GCubeClientContext; import org.gcube.portlets.user.workspace.client.ConstantsExplorer.WS_UPLOAD_TYPE; @@ -18,6 +19,8 @@ import org.gcube.portlets.user.workspace.client.event.AddFolderEvent; import org.gcube.portlets.user.workspace.client.event.AddFolderEventHandler; import org.gcube.portlets.user.workspace.client.event.AddSmartFolderEvent; import org.gcube.portlets.user.workspace.client.event.AddSmartFolderEventHandler; +import org.gcube.portlets.user.workspace.client.event.CheckItemLockedBySyncEvent; +import org.gcube.portlets.user.workspace.client.event.CheckItemLockedBySyncEventHandler; import org.gcube.portlets.user.workspace.client.event.CompletedFileUploadEvent; import org.gcube.portlets.user.workspace.client.event.CompletedFileUploadEventHandler; import org.gcube.portlets.user.workspace.client.event.CopytemEvent; @@ -195,6 +198,8 @@ public class AppControllerExplorer implements EventHandler, TreeAppControllerInt private UserStore userStore = new UserStore(); private static AppControllerExplorer singleton; + private Map msgFolderSynched = new HashMap(); + private WsThreddsWidget wsThreddsWidget = new WsThreddsWidget(); /** @@ -242,6 +247,44 @@ public class AppControllerExplorer implements EventHandler, TreeAppControllerInt */ private void bind() { + eventBus.addHandler(CheckItemLockedBySyncEvent.TYPE, new CheckItemLockedBySyncEventHandler() { + + @Override + public void onCheckItemLockedBySync(final CheckItemLockedBySyncEvent checkItemLockedBySyncEvent) { + + GWT.log("Fired CheckItemLocked..."); + + if(checkItemLockedBySyncEvent.getItem()!=null){ + + rpcWorkspaceService.isItemUnderSync(checkItemLockedBySyncEvent.getItem().getIdentifier(), new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + + // TODO Auto-generated method stub + + } + + @Override + public void onSuccess(Boolean result) { + + GWT.log("CheckItemLocked for folder: "+checkItemLockedBySyncEvent.getItem().getName() +" returned locked: "+result); + + String msgDisplayed = msgFolderSynched.get(checkItemLockedBySyncEvent.getItem().getIdentifier()); + + if(msgDisplayed==null && result){ + String msg= "The folder: "+checkItemLockedBySyncEvent.getItem().getName()+", "+ConstantsExplorer.MSG_FOLDER_LOCKED_BY_SYNC; + MessageBox.info("Warning: folder under synchornization", msg, null); + msgFolderSynched.put(checkItemLockedBySyncEvent.getItem().getIdentifier(), msg); + } + + } + }); + } + } + }); + + eventBus.addHandler(PublishOnDataCatalogueEvent.TYPE, new PublishOnDataCatalogueEventHandler() { @Override diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/ConstantsExplorer.java b/src/main/java/org/gcube/portlets/user/workspace/client/ConstantsExplorer.java index a3a1c3a..da1dd35 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/client/ConstantsExplorer.java +++ b/src/main/java/org/gcube/portlets/user/workspace/client/ConstantsExplorer.java @@ -257,6 +257,7 @@ public static enum WS_UPLOAD_TYPE {File, Archive}; public static final int HEIGHT_DIALOG_SHARE_FOLDER = 445; + public static final String MSG_FOLDER_LOCKED_BY_SYNC= "is under synchronization process.\nPlease be aware that some operations are not currently available and that the content might change during this process."; /** * Log. diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/event/CheckItemLockedBySyncEvent.java b/src/main/java/org/gcube/portlets/user/workspace/client/event/CheckItemLockedBySyncEvent.java new file mode 100644 index 0000000..24f8f45 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspace/client/event/CheckItemLockedBySyncEvent.java @@ -0,0 +1,36 @@ +package org.gcube.portlets.user.workspace.client.event; + +import org.gcube.portlets.user.workspace.client.model.FileModel; + +import com.google.gwt.event.shared.GwtEvent; + + +public class CheckItemLockedBySyncEvent extends GwtEvent{ + public static Type TYPE = new Type(); + + private FileModel item; + + public CheckItemLockedBySyncEvent(FileModel item) { + this.item = item; + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(CheckItemLockedBySyncEventHandler handler) { + handler.onCheckItemLockedBySync(this); + + } + + /** + * @return the itemId + */ + public FileModel getItem() { + + return item; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/event/CheckItemLockedBySyncEventHandler.java b/src/main/java/org/gcube/portlets/user/workspace/client/event/CheckItemLockedBySyncEventHandler.java new file mode 100644 index 0000000..d7f5eb2 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspace/client/event/CheckItemLockedBySyncEventHandler.java @@ -0,0 +1,20 @@ +package org.gcube.portlets.user.workspace.client.event; + +import com.google.gwt.event.shared.EventHandler; + + +/** + * The Interface CheckItemLockedBySyncEventHandler. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Mar 28, 2018 + */ +public interface CheckItemLockedBySyncEventHandler extends EventHandler { + + /** + * On check item locked by sync. + * + * @param checkItemLockedBySyncEvent the check item locked by sync event + */ + void onCheckItemLockedBySync(CheckItemLockedBySyncEvent checkItemLockedBySyncEvent); +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/resources/Resources.java b/src/main/java/org/gcube/portlets/user/workspace/client/resources/Resources.java index 5634615..7d6b7fb 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/client/resources/Resources.java +++ b/src/main/java/org/gcube/portlets/user/workspace/client/resources/Resources.java @@ -4,7 +4,6 @@ import org.gcube.portlets.user.workspace.client.interfaces.GXTFolderItemTypeEnum import com.google.gwt.core.client.GWT; import com.google.gwt.resources.client.ImageResource; -import com.google.gwt.resources.client.ClientBundle.Source; import com.google.gwt.user.client.ui.AbstractImagePrototype; /** diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/rpc/GWTWorkspaceService.java b/src/main/java/org/gcube/portlets/user/workspace/client/rpc/GWTWorkspaceService.java index 07fa397..a16e78d 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/client/rpc/GWTWorkspaceService.java +++ b/src/main/java/org/gcube/portlets/user/workspace/client/rpc/GWTWorkspaceService.java @@ -789,5 +789,14 @@ public interface GWTWorkspaceService extends RemoteService{ */ List getListOfVREsForLoggedUser() throws Exception; + /** + * @param itemId + * @return + * @throws Exception + */ + Boolean isItemUnderSync(String itemId) + throws Exception; + + } diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/rpc/GWTWorkspaceServiceAsync.java b/src/main/java/org/gcube/portlets/user/workspace/client/rpc/GWTWorkspaceServiceAsync.java index 27fb526..62f571f 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/client/rpc/GWTWorkspaceServiceAsync.java +++ b/src/main/java/org/gcube/portlets/user/workspace/client/rpc/GWTWorkspaceServiceAsync.java @@ -214,6 +214,15 @@ public interface GWTWorkspaceServiceAsync { */ void getUrlById(String identifier, boolean isInternalUrl, boolean fullDetails, AsyncCallback callback); + /** + * Creates the external url. + * + * @param parentId the parent id + * @param name the name + * @param description the description + * @param url the url + * @param callback the callback + */ void createExternalUrl( String parentId, String name, String description, String url, AsyncCallback callback); @@ -777,4 +786,14 @@ public interface GWTWorkspaceServiceAsync { * @return the list of vr es for logged user */ void getListOfVREsForLoggedUser(AsyncCallback> callback); + + + /** + * Checks if is item under sync. + * + * @param itemId the item id + * @param callback the callback + */ + void isItemUnderSync(String itemId, AsyncCallback callback); + } diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/view/tree/AsyncTreePanel.java b/src/main/java/org/gcube/portlets/user/workspace/client/view/tree/AsyncTreePanel.java index abcb9cd..399432c 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/client/view/tree/AsyncTreePanel.java +++ b/src/main/java/org/gcube/portlets/user/workspace/client/view/tree/AsyncTreePanel.java @@ -6,6 +6,7 @@ import java.util.List; import org.gcube.portlets.user.workspace.client.AppControllerExplorer; import org.gcube.portlets.user.workspace.client.ConstantsExplorer; import org.gcube.portlets.user.workspace.client.constant.WorkspaceOperation; +import org.gcube.portlets.user.workspace.client.event.CheckItemLockedBySyncEvent; import org.gcube.portlets.user.workspace.client.event.ExpandFolderEvent; import org.gcube.portlets.user.workspace.client.event.MoveItemEvent; import org.gcube.portlets.user.workspace.client.event.SelectedItemEvent; @@ -886,6 +887,8 @@ public class AsyncTreePanel extends LayoutContainer { store.removeAll(folder); addChildrenToFolder(folder, result); GWT.log("End RPC - getFolderChildren"); + + AppControllerExplorer.getEventBus().fireEvent(new CheckItemLockedBySyncEvent(folder)); } }); diff --git a/src/main/java/org/gcube/portlets/user/workspace/server/GWTWorkspaceServiceImpl.java b/src/main/java/org/gcube/portlets/user/workspace/server/GWTWorkspaceServiceImpl.java index 3829f73..24fe651 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/server/GWTWorkspaceServiceImpl.java +++ b/src/main/java/org/gcube/portlets/user/workspace/server/GWTWorkspaceServiceImpl.java @@ -46,6 +46,7 @@ import org.gcube.common.homelibrary.home.workspace.trash.WorkspaceTrashItem; import org.gcube.common.portal.PortalContext; import org.gcube.portal.wssynclibrary.shared.ItemNotSynched; import org.gcube.portal.wssynclibrary.shared.WorkspaceFolderLocked; +import org.gcube.portal.wssynclibrary.shared.thredds.Sync_Status; import org.gcube.portal.wssynclibrary.thredds.WorkspaceThreddsSynchronize; import org.gcube.portlets.user.urlshortener.UrlShortener; import org.gcube.portlets.user.workspace.client.ConstantsExplorer; @@ -661,6 +662,9 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT if(itemId == null) throw new Exception(IDENTIFIER_IS_NULL); + checkItemLocked(itemId); + checkItemLocked(destinationId); + workspaceLogger.trace("moveItem item: "+itemId+" destination: "+destinationId); WorkspaceItem sourceItem = workspace.getItem(itemId); //GET SOURCE ITEM BEFORE OF MOVE @@ -692,6 +696,9 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT return Boolean.TRUE; + }catch (WorkspaceFolderLocked e1){ + throw new Exception(e1.getMessage()); + }catch (InsufficientPrivilegesException e) { workspaceLogger.error("Error in server Item move", e); String error = "An error occurred on moving item. "+e.getMessage(); @@ -4357,4 +4364,31 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT } } + /** + * Checks if is item under sync. + * + * @return true, if is item under sync + * @throws Exception + */ + @Override + public Boolean isItemUnderSync(String itemId) throws Exception{ + + try { + GCubeUser user = PortalContext.getConfiguration().getCurrentUser(this.getThreadLocalRequest()); + try{ + Sync_Status status = WorkspaceThreddsSynchronize.getInstance().getSynchedStatusFromItemProperty(itemId, user.getUsername()); + }catch(Exception e){ + return false; + } + //HERE THE ITEM IS SYNCHED SO CHECK IF IT IS LOCKED + checkItemLocked(itemId); + return false; + + }catch (WorkspaceFolderLocked e1){ + return true; + }catch (Exception e) { + throw new Exception("Error on checking item "+itemId+" is under sync"); + } + } + }