From 65643bffc4aa2504b4f531403744e84dcf786f16 Mon Sep 17 00:00:00 2001 From: Francesco Mangiacrapa Date: Wed, 28 Mar 2018 10:42:50 +0000 Subject: [PATCH] Added lock system server-side in order to avoid changes during ws-thredds sync git-svn-id: http://svn.d4science-ii.research-infrastructures.eu/gcube/trunk/portlets/user/workspace-tree-widget@165491 82a268e6-3cf1-43bd-a215-b396298e98cf --- .../server/GWTWorkspaceServiceImpl.java | 162 +++++++++++++----- 1 file changed, 119 insertions(+), 43 deletions(-) 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 65387cc..3829f73 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 @@ -44,6 +44,9 @@ import org.gcube.common.homelibrary.home.workspace.search.SearchItem; import org.gcube.common.homelibrary.home.workspace.trash.WorkspaceTrashFolder; import org.gcube.common.homelibrary.home.workspace.trash.WorkspaceTrashItem; import org.gcube.common.portal.PortalContext; +import org.gcube.portal.wssynclibrary.shared.ItemNotSynched; +import org.gcube.portal.wssynclibrary.shared.WorkspaceFolderLocked; +import org.gcube.portal.wssynclibrary.thredds.WorkspaceThreddsSynchronize; import org.gcube.portlets.user.urlshortener.UrlShortener; import org.gcube.portlets.user.workspace.client.ConstantsExplorer; import org.gcube.portlets.user.workspace.client.interfaces.GXTCategorySmartFolder; @@ -727,6 +730,8 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT try { Workspace workspace = getWorkspace(); + checkItemLocked(destinationId); + for (String itemId : ids) { if(itemId == null) @@ -741,6 +746,8 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT break; } + checkItemLocked(itemId); + String sourceSharedId = null; boolean sourceItemIsShared = sourceItem.isShared(); @@ -771,13 +778,16 @@ 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 error1 = "An error occurred on moving item. "+e.getMessage(); throw new Exception(error1); } catch (Exception e) { - workspaceLogger.error("Error in server Item move", e); + workspaceLogger.error("Item move error.", e); String error2 = ConstantsExplorer.SERVER_ERROR + " moving item. "+e.getMessage(); throw new Exception(error2); } @@ -942,6 +952,8 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT if(itemId == null) throw new Exception(IDENTIFIER_IS_NULL); + checkItemLocked(itemId); + Workspace workspace = getWorkspace(); workspaceLogger.trace("removeItem item for id: "+itemId); //NOTIFICATION @@ -962,6 +974,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 remove", e); String error = "Insufficient Privileges to remove the item"; @@ -972,7 +987,7 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT workspaceLogger.error(error, e); throw new Exception(error); } catch (Exception e) { - workspaceLogger.error("Error in server Item remove", e); + workspaceLogger.error("Remove item error.", e); String error = ConstantsExplorer.SERVER_ERROR +" deleting item. "+e.getMessage(); throw new Exception(error); } @@ -1002,6 +1017,8 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT if(itemId == null) throw new Exception(IDENTIFIER_IS_NULL); + checkItemLocked(itemId); + Workspace workspace = getWorkspace(); workspaceLogger.trace("rename item itemId: "+itemId+" old name "+ previousName +", new name: "+newName); workspace.renameItem(itemId, newName); @@ -1033,6 +1050,9 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT return true; + }catch (WorkspaceFolderLocked e1){ + throw new Exception(e1.getMessage()); + } catch (InsufficientPrivilegesException e) { String error = "Insufficient Privileges to rename the item"; workspaceLogger.error(error, e); @@ -1077,6 +1097,8 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT if(nameFolder == null) throw new Exception("Folder name is null"); + checkItemLocked(parent.getIdentifier()); + Workspace workspace = getWorkspace(); WorkspaceFolder wsFolder = workspace.createFolder(nameFolder, description, parent.getIdentifier()); WorkspaceItem folderDestinationItem = workspace.getItem(parent.getIdentifier()); @@ -1084,6 +1106,9 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT GWTWorkspaceBuilder builder = getGWTWorkspaceBuilder(); return builder.buildGXTFolderModelItem(wsFolder, parent); + }catch (WorkspaceFolderLocked e1){ + throw new Exception(e1.getMessage()); + } catch(InsufficientPrivilegesException e){ String error = "Insufficient Privileges to create the folder"; workspaceLogger.error(error, e); @@ -1550,6 +1575,8 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT throw new Exception("Parent ID is null"); } + checkItemLocked(parentId); + workspaceLogger.trace("create url in parent id: "+parentId); ExternalUrl ext = workspace.createExternalUrl(name, description, url, parentId); WorkspaceItem parent = workspace.getItem(parentId); //get item from workspace @@ -1559,6 +1586,10 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT FolderModel parentFileModel = builder.buildGXTFolderModelItem((WorkspaceFolder) parent, null); return builder.buildGXTFileModelItem(ext, parentFileModel); + + }catch (WorkspaceFolderLocked e1){ + throw new Exception(e1.getMessage()); + } catch (Exception e) { workspaceLogger.error("Error in server create url in parent id ", e); // workspaceLogger.trace("Error in server create url in parent id " + e); @@ -1781,6 +1812,8 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT try { + checkItemLocked(destinationFolderId); + Workspace workspace = getWorkspace(); WorkspaceItem sourceItem = workspace.getItem(itemId); //GET SOURCE ITEM BEFORE COPY String sourceSharedId = sourceItem.getIdSharedFolder(); @@ -1793,6 +1826,10 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT return true; return false; + + }catch (WorkspaceFolderLocked e1){ + throw new Exception(e1.getMessage()); + }catch (InsufficientPrivilegesException e) { String error = "An error occurred on copying item, " +e.getMessage() + ". "+ConstantsExplorer.TRY_AGAIN; throw new Exception(error); @@ -1827,6 +1864,8 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT try { + checkItemLocked(destinationFolderId); + Workspace workspace = getWorkspace(); boolean error = false; @@ -1850,6 +1889,9 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT return true; //copied is true + }catch (WorkspaceFolderLocked e1){ + throw new Exception(e1.getMessage()); + }catch (InsufficientPrivilegesException e) { String error = "An error occurred on copying item, " +e.getMessage() + ". "+ConstantsExplorer.TRY_AGAIN; throw new Exception(error); @@ -1910,6 +1952,8 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT try { + checkItemLocked(folder.getIdentifier()); + Workspace workspace = getWorkspace(); workspaceLogger.info("shareFolder "+ folder.getIdentifier() @@ -1977,6 +2021,9 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT return created; + }catch (WorkspaceFolderLocked e1){ + throw new Exception(e1.getMessage()); + } catch (InsufficientPrivilegesException e) { workspaceLogger.error("Error in shareFolder ", e); String error = "An error occurred on creating shared folder. "+ e.getMessage(); @@ -2017,6 +2064,7 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT try { Workspace workspace = getWorkspace(); + WorkspaceItem wsItem = workspace.getItem(folderSharedId); if(NotificationsUtil.isASharedFolder(wsItem)){ @@ -2042,43 +2090,6 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT } } - - /* (non-Javadoc) - * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService#getListUserSharedBySharedItem(java.lang.String) - */ - - /*@Override - public List getListUserSharedBySharedItem(String sharedItemId) throws Exception{ - workspaceLogger.trace("Get ListUserSharedBySharedItem "+ sharedItemId); - try { - - WorkspaceFolder wsFolder = getSharedWorkspaceFolderForId(sharedItemId); - if(wsFolder!=null){ - if(isASharedFolder(wsFolder, true)){ - GWTWorkspaceBuilder builder = getGWTWorkspaceBuilder(); - - WorkspaceSharedFolder wsSharedFolder = (WorkspaceSharedFolder) wsFolder; - List listPortalLogin = wsSharedFolder.getUsers(); - workspaceLogger.trace("getListUserSharedByFolderSharedId return "+ listPortalLogin.size() + " user/s"); - - if(isTestMode()) - return builder.buildGxtInfoContactFromPortalLoginTestMode(listPortalLogin); - - return builder.buildGxtInfoContactsFromPortalLogins(listPortalLogin); - }else{ - workspaceLogger.warn("wsFolder with id: "+sharedItemId +" is not a: "+WorkspaceItemType.SHARED_FOLDER +", returning null"); - return null; - } - } - workspaceLogger.warn("wsFolder with id: "+sharedItemId +" is null, returning null"); - return null; - - } catch (Exception e) { - workspaceLogger.error("Error in getListUserSharedByItemId ", e); - throw new Exception(e.getMessage()); - } - }*/ - /* (non-Javadoc) * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService#unSharedFolderByFolderSharedId(java.lang.String) */ @@ -2099,7 +2110,9 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT workspaceLogger.trace("unSharedFolderByFolderSharedId "+ folderSharedId); + try { + checkItemLocked(folderSharedId); if(isASharedFolder(folderSharedId, true)){ Workspace workspace = getWorkspace(); @@ -2136,6 +2149,9 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT throw new WorkspaceHandledException(msg); } + }catch (WorkspaceFolderLocked e1){ + throw new Exception(e1.getMessage()); + } catch (InternalErrorException e) { workspaceLogger.error("Error in unSharedFolderByFolderSharedId ", e); String error = "An error occerred on unsharing folder. "+ e.getMessage(); @@ -2725,6 +2741,7 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT for (String itemId : ids) { //NOTIFICATION WorkspaceItem wsItem = workspace.getItem(itemId); + checkItemLocked(itemId); //SAVING ATTRIBUTE FOR NOTIFICATION boolean sourceItemIsShared = wsItem.isShared(); String itemName = wsItem.getName(); @@ -2736,10 +2753,10 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT garbage.put(itemId, new GarbageItem(sourceItemIsShared, itemName, itemId, sourceFolderSharedId)); - // workspace.removeItem(itemId); - // //IF SOURCE SHARED FOLDER IS NOT NULL - // if(sourceFolderSharedId!=null) - // NotificationsUtil.checkSendNotifyRemoveItemToShare(this.getThreadLocalRequest().getSession(), sourceItemIsShared, itemName, itemId, sourceFolderSharedId); + //workspace.removeItem(itemId); + ////IF SOURCE SHARED FOLDER IS NOT NULL + //if(sourceFolderSharedId!=null) + //NotificationsUtil.checkSendNotifyRemoveItemToShare(this.getThreadLocalRequest().getSession(), sourceItemIsShared, itemName, itemId, sourceFolderSharedId); } //ITEM ID - ERROR @@ -2767,6 +2784,9 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT return frontEndError; + }catch (WorkspaceFolderLocked e1){ + throw new Exception(e1.getMessage()); + } catch (InsufficientPrivilegesException e) { workspaceLogger.error("Error in server Item remove", e); String error = "An error occurred on deleting item. "+e.getMessage(); @@ -4281,4 +4301,60 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT } } + + + /** + * Check item locked. + * + * @param itemId the item id + * @return true, if successful + * @throws WorkspaceFolderLocked the workspace folder locked + * @throws Exception the exception + */ + private boolean checkItemLocked(String itemId) throws WorkspaceFolderLocked, Exception{ + + if(itemId==null || itemId.isEmpty()) + throw new Exception(IDENTIFIER_IS_NULL); + + Workspace ws; + WorkspaceItem workItem = null; + + try{ + + ws = getWorkspace(); + workItem = ws.getItem(itemId); + + //IF THE ITEM IS A FOLDER, CHECKING IT + if(workItem.isFolder()) + WorkspaceThreddsSynchronize.getInstance().checkItemSynched(workItem.getId()); + else{ + //IF THE ITEM IS A FILE, CHECKING ITS PARENT + WorkspaceFolder parent = workItem.getParent(); + if(parent!=null){ + WorkspaceThreddsSynchronize.getInstance().checkItemSynched(parent.getId()); + } + } + //in this case the folder is synched but not locked + return false; + + }catch(ItemNotSynched e1){ + + //in this case the folder is not synched; + return false; + + }catch(WorkspaceFolderLocked e2){ + //in this case the folder synching is on-going and the folder is locked; + + String msg = "The folder"; + msg += workItem!=null?": "+workItem.getName():""; + msg += " is locked by a sync. You can not change its content"; + workspaceLogger.warn(msg, e2); + throw new WorkspaceFolderLocked(itemId, msg); + + }catch(InternalErrorException | ItemNotFoundException | HomeNotFoundException | WorkspaceFolderNotFoundException e){ + workspaceLogger.warn(e); + throw new Exception("Sorry an error occurred during checking is folder locked, Refresh and try again"); + } + } + }