From a481378eb0b2d39b4530f546a038c36dc54a511c Mon Sep 17 00:00:00 2001 From: Francesco Mangiacrapa Date: Thu, 29 Oct 2015 14:36:27 +0000 Subject: [PATCH] merged with branch version for gcube 3.9 git-svn-id: http://svn.d4science-ii.research-infrastructures.eu/gcube/trunk/portlets/user/workspace-tree-widget@120097 82a268e6-3cf1-43bd-a215-b396298e98cf --- .../client/event/DeleteItemEvent.java | 9 +- .../client/rpc/GWTWorkspaceService.java | 24 +- .../client/rpc/GWTWorkspaceServiceAsync.java | 10 +- .../workspace/server/GWTWorkspaceBuilder.java | 2 +- .../server/GWTWorkspaceServiceImpl.java | 46 +++- .../user/workspace/shared/GarbageItem.java | 149 ++++++++++++ .../portlets/user/workspace/DeleteTest.java | 229 ++++++++++++++++++ 7 files changed, 452 insertions(+), 17 deletions(-) create mode 100644 src/main/java/org/gcube/portlets/user/workspace/shared/GarbageItem.java create mode 100644 src/test/java/org/gcube/portlets/user/workspace/DeleteTest.java diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/event/DeleteItemEvent.java b/src/main/java/org/gcube/portlets/user/workspace/client/event/DeleteItemEvent.java index 4c75465..6c915a1 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/client/event/DeleteItemEvent.java +++ b/src/main/java/org/gcube/portlets/user/workspace/client/event/DeleteItemEvent.java @@ -13,7 +13,7 @@ public class DeleteItemEvent extends GwtEvent implements private FileModel fileTarget = null; - private List listTarget; + private List listTarget; private boolean isMultiSelection; @@ -22,7 +22,7 @@ public class DeleteItemEvent extends GwtEvent implements this.isMultiSelection = false; } - public DeleteItemEvent(List listTarget) { + public DeleteItemEvent(List listTarget) { this.listTarget = listTarget; this.isMultiSelection = true; } @@ -33,6 +33,9 @@ public class DeleteItemEvent extends GwtEvent implements return TYPE; } + /* (non-Javadoc) + * @see com.google.gwt.event.shared.GwtEvent#dispatch(com.google.gwt.event.shared.EventHandler) + */ @Override protected void dispatch(DeleteItemEventHandler handler) { handler.onDeleteItem(this); @@ -49,7 +52,7 @@ public class DeleteItemEvent extends GwtEvent implements return fileTarget; } - public List getListTarget() { + public List getListTarget() { return listTarget; } 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 d2a3d1f..c45c454 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 @@ -17,6 +17,7 @@ import org.gcube.portlets.user.workspace.client.model.SmartFolderModel; import org.gcube.portlets.user.workspace.client.model.SubTree; import org.gcube.portlets.user.workspace.client.workspace.GWTWorkspaceItem; import org.gcube.portlets.user.workspace.shared.ExtendedWorkspaceACL; +import org.gcube.portlets.user.workspace.shared.GarbageItem; import org.gcube.portlets.user.workspace.shared.PublicLink; import org.gcube.portlets.user.workspace.shared.ReportAssignmentACL; import org.gcube.portlets.user.workspace.shared.SessionExpiredException; @@ -132,6 +133,16 @@ public interface GWTWorkspaceService extends RemoteService{ */ public List getSmartFolderResultsByCategory(String category) throws Exception; + /** + * Creates the smart folder. + * + * @param name the name + * @param description the description + * @param query the query + * @param parentId the parent id + * @return the smart folder model + * @throws Exception the exception + */ SmartFolderModel createSmartFolder(String name, String description, String query, String parentId) throws Exception; @@ -195,6 +206,14 @@ public interface GWTWorkspaceService extends RemoteService{ */ public void setValueInSession(String name, String value) throws Exception; + /** + * Gets the items by search name. + * + * @param text the text + * @param folderId the folder id + * @return the items by search name + * @throws Exception the exception + */ List getItemsBySearchName(String text, String folderId) throws Exception; /** @@ -559,13 +578,16 @@ public interface GWTWorkspaceService extends RemoteService{ boolean isSessionExpired() throws Exception; + + /** * Delete list items for ids. * * @param ids the ids + * @return the list * @throws Exception the exception */ - void deleteListItemsForIds(List ids) throws Exception; + List deleteListItemsForIds(List ids) throws Exception; /** * Copy items. 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 19283a3..ac3fe1c 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 @@ -17,6 +17,7 @@ import org.gcube.portlets.user.workspace.client.model.SmartFolderModel; import org.gcube.portlets.user.workspace.client.model.SubTree; import org.gcube.portlets.user.workspace.client.workspace.GWTWorkspaceItem; import org.gcube.portlets.user.workspace.shared.ExtendedWorkspaceACL; +import org.gcube.portlets.user.workspace.shared.GarbageItem; import org.gcube.portlets.user.workspace.shared.PublicLink; import org.gcube.portlets.user.workspace.shared.ReportAssignmentACL; import org.gcube.portlets.user.workspace.shared.TrashContent; @@ -572,13 +573,8 @@ public interface GWTWorkspaceServiceAsync { */ void isSessionExpired(AsyncCallback callback); - /** - * Delete list items for ids. - * - * @param ids the ids - * @param callback the callback - */ - void deleteListItemsForIds(List ids, AsyncCallback callback); + void deleteListItemsForIds(List ids, + AsyncCallback> callback); /** * Copy items. diff --git a/src/main/java/org/gcube/portlets/user/workspace/server/GWTWorkspaceBuilder.java b/src/main/java/org/gcube/portlets/user/workspace/server/GWTWorkspaceBuilder.java index 8572a97..385a817 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/server/GWTWorkspaceBuilder.java +++ b/src/main/java/org/gcube/portlets/user/workspace/server/GWTWorkspaceBuilder.java @@ -813,7 +813,7 @@ public class GWTWorkspaceBuilder { * @return the list * @throws InternalErrorException the internal error exception */ - protected List buildGXTListFileGridModelItem(List listWorkspaceItems, FileModel parentFileModel) throws InternalErrorException{ + public List buildGXTListFileGridModelItem(List listWorkspaceItems, FileModel parentFileModel) throws InternalErrorException{ Long startTime = System.currentTimeMillis(); List listFileGridModel = new ArrayList(); 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 2b63aba..4396f42 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 @@ -70,6 +70,7 @@ import org.gcube.portlets.user.workspace.server.util.WsUtil; import org.gcube.portlets.user.workspace.server.util.resource.PropertySpecialFolderReader; import org.gcube.portlets.user.workspace.server.util.scope.ScopeUtilFilter; import org.gcube.portlets.user.workspace.shared.ExtendedWorkspaceACL; +import org.gcube.portlets.user.workspace.shared.GarbageItem; import org.gcube.portlets.user.workspace.shared.PublicLink; import org.gcube.portlets.user.workspace.shared.ReportAssignmentACL; import org.gcube.portlets.user.workspace.shared.SessionExpiredException; @@ -2597,7 +2598,7 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService#deleteListItemsForIds(java.util.List) */ @Override - public void deleteListItemsForIds(List ids) throws Exception { + public List deleteListItemsForIds(List ids) throws Exception { try { @@ -2607,6 +2608,12 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT Workspace workspace = getWorkspace(); workspaceLogger.trace("removeItem item for list size: "+ids.size()); + String[] items = new String[ids.size()]; + items = ids.toArray(items); + + Map garbage = new HashMap(items.length); + + //SAVE DATE FOR NOTIFICATIONS for (String itemId : ids) { //NOTIFICATION WorkspaceItem wsItem = workspace.getItem(itemId); @@ -2618,11 +2625,40 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT sourceFolderSharedId = wsItem.getIdSharedFolder(); } //REMOVE ITEM - workspace.removeItem(itemId); - //IF SOURCE SHARED FOLDER IS NOT NULL - if(sourceFolderSharedId!=null) - NotificationsUtil.checkSendNotifyRemoveItemToShare(this.getThreadLocalRequest().getSession(), sourceItemIsShared, itemName, itemId, sourceFolderSharedId); + + 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); } + + //ITEM ID - ERROR + Map backendError = workspace.removeItems(items); + + //GARBAGE ITEM ERROR + List frontEndError = new ArrayList(backendError.size()); + + //REMOVING IDS WHICH HAVE GENERATED AN ERROR + for (String idError : backendError.keySet()) { + GarbageItem gbi = garbage.get(idError); + if(gbi!=null){ + frontEndError.add(gbi); + garbage.remove(idError); + } + } + + for (String idItem : garbage.keySet()) { + GarbageItem item = garbage.get(idItem); + workspaceLogger.trace("Check notification for "+item); + //IF SOURCE SHARED FOLDER IS NOT NULL + if(item.getSourceFolderSharedId()!=null) + NotificationsUtil.checkSendNotifyRemoveItemToShare(this.getThreadLocalRequest().getSession(), item.isSourceItemIsShared(), item.getOldItemName(), item.getOldItemName(), item.getSourceFolderSharedId()); + } + + return frontEndError; + } catch (InsufficientPrivilegesException e) { workspaceLogger.error("Error in server Item remove", e); String error = "An error occurred on deleting item. "+e.getMessage(); diff --git a/src/main/java/org/gcube/portlets/user/workspace/shared/GarbageItem.java b/src/main/java/org/gcube/portlets/user/workspace/shared/GarbageItem.java new file mode 100644 index 0000000..ba96073 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspace/shared/GarbageItem.java @@ -0,0 +1,149 @@ +/** + * + */ +package org.gcube.portlets.user.workspace.shared; + +import java.io.Serializable; + +/** + * The Class GarbageItem. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it Oct 23, 2015 + * + * USED TO SEND NOTIFICATION AFTER DELETE + */ +public class GarbageItem implements Serializable{ + + /** + * + */ + private static final long serialVersionUID = -1532030116595698658L; + + private boolean sourceItemIsShared; + private String oldItemName; + private String oldItemId; + private String sourceFolderSharedId; + + private String error; + + public GarbageItem(){ + + } + /** + * Instantiates a new garbage item. + * + * @param sourceItemIsShared the source item is shared + * @param oldItemName the old item name + * @param oldItemId the old item id + * @param sourceFolderSharedId the source folder shared id + */ + public GarbageItem(boolean sourceItemIsShared, String oldItemName, + String oldItemId, final String sourceFolderSharedId) { + this.sourceItemIsShared = sourceItemIsShared; + this.oldItemName = oldItemName; + this.oldItemId = oldItemId; + this.sourceFolderSharedId = sourceFolderSharedId; + } + + /** + * Checks if is source item is shared. + * + * @return the sourceItemIsShared + */ + public boolean isSourceItemIsShared() { + return sourceItemIsShared; + } + + /** + * Gets the old item name. + * + * @return the oldItemName + */ + public String getOldItemName() { + return oldItemName; + } + + /** + * Gets the old item id. + * + * @return the oldItemId + */ + public String getOldItemId() { + return oldItemId; + } + + /** + * Gets the source folder shared id. + * + * @return the sourceFolderSharedId + */ + public String getSourceFolderSharedId() { + return sourceFolderSharedId; + } + + /** + * Sets the source item is shared. + * + * @param sourceItemIsShared the sourceItemIsShared to set + */ + public void setSourceItemIsShared(boolean sourceItemIsShared) { + this.sourceItemIsShared = sourceItemIsShared; + } + + /** + * Sets the old item name. + * + * @param oldItemName the oldItemName to set + */ + public void setOldItemName(String oldItemName) { + this.oldItemName = oldItemName; + } + + /** + * Sets the old item id. + * + * @param oldItemId the oldItemId to set + */ + public void setOldItemId(String oldItemId) { + this.oldItemId = oldItemId; + } + + /** + * Sets the source folder shared id. + * + * @param sourceFolderSharedId the sourceFolderSharedId to set + */ + public void setSourceFolderSharedId(String sourceFolderSharedId) { + this.sourceFolderSharedId = sourceFolderSharedId; + } + + public void setError(String error){ + this.error = error; + } + + /** + * @return the error + */ + public String getError() { + return error; + } + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("GarbageItem [sourceItemIsShared="); + builder.append(sourceItemIsShared); + builder.append(", oldItemName="); + builder.append(oldItemName); + builder.append(", oldItemId="); + builder.append(oldItemId); + builder.append(", sourceFolderSharedId="); + builder.append(sourceFolderSharedId); + builder.append(", error="); + builder.append(error); + builder.append("]"); + return builder.toString(); + } +} diff --git a/src/test/java/org/gcube/portlets/user/workspace/DeleteTest.java b/src/test/java/org/gcube/portlets/user/workspace/DeleteTest.java new file mode 100644 index 0000000..08816b2 --- /dev/null +++ b/src/test/java/org/gcube/portlets/user/workspace/DeleteTest.java @@ -0,0 +1,229 @@ +/** + * + */ +package org.gcube.portlets.user.workspace; + +import java.util.ArrayList; +import java.util.List; + +import org.gcube.common.homelibary.model.items.type.WorkspaceItemType; +import org.gcube.common.homelibrary.home.HomeLibrary; +import org.gcube.common.homelibrary.home.exceptions.InternalErrorException; +import org.gcube.common.homelibrary.home.workspace.Workspace; +import org.gcube.common.homelibrary.home.workspace.WorkspaceFolder; +import org.gcube.common.homelibrary.home.workspace.WorkspaceItem; +import org.gcube.common.homelibrary.home.workspace.exceptions.InsufficientPrivilegesException; +import org.gcube.common.homelibrary.home.workspace.exceptions.ItemNotFoundException; +import org.gcube.common.homelibrary.home.workspace.folder.FolderItem; +import org.gcube.common.scope.api.ScopeProvider; +import org.gcube.common.scope.impl.ScopeBean; +import org.gcube.portlets.user.workspace.client.model.FileGridModel; +import org.gcube.portlets.user.workspace.server.GWTWorkspaceBuilder; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Oct 28, 2015 + */ +public class DeleteTest { + + + public static String DEFAULT_SCOPE = "/gcube/devsec"; //DEV +// public static String DEFAULT_SCOPE = "/d4science.research-infrastructures.eu/gCubeApps/DESCRAMBLE"; + public static String TEST_USER = "francesco.mangiacrapa"; + + public static String PARENT_ID = "a9ead58c-d645-4699-addd-5c6e5f1aff06"; + private static Workspace ws; + + private static GWTWorkspaceBuilder builder = new GWTWorkspaceBuilder(); + + public static void main(String[] args) { + + try { + + ScopeBean scope = new ScopeBean(DEFAULT_SCOPE); + ScopeProvider.instance.set(scope.toString()); + + ws = HomeLibrary + .getHomeManagerFactory() + .getHomeManager() + .getHome(TEST_USER) + .getWorkspace(); + // + + final List children = getIdsOnlyFolderForID(PARENT_ID); + + + if(children.size()<2){ + System.err.println("children size < 2, add others children"); + return; + } + + final int medium = children.size()/2; + + Thread t1 = new Thread("T1"){ + public void run() { + System.out.println("T1 start..."); + removeRange(children, 0, medium); + System.out.println("T1 end"); + + }; + }; + + t1.start(); + t1.join(); + + List childrenNEW = getChildrenForID(PARENT_ID); + + print(childrenNEW); + + + Thread t2 = new Thread("T2"){ + public void run() { + System.out.println("T2 start..."); + removeRange(children, medium, children.size()); + System.out.println("T2 end"); + }; + }; + + t2.start(); + t2.join(); + + childrenNEW = getChildrenForID(PARENT_ID); + print(childrenNEW); + + + System.out.println("\n\nDONE!"); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + private static void print(final List children){ + int i=0; + System.out.println("\n\n"); + for (WorkspaceItem workspaceItem : children) { + + if(workspaceItem.getType().equals(WorkspaceItemType.FOLDER) || workspaceItem.getType().equals(WorkspaceItemType.SHARED_FOLDER)){ + + WorkspaceFolder folder = (WorkspaceFolder) workspaceItem; + + try { + System.err.println(++i+") folder id: "+folder.getId() +", folder name: "+folder.getName()); + } catch (InternalErrorException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + }else{ + + + if(workspaceItem.getType().equals(WorkspaceItemType.FOLDER_ITEM)){ + + FolderItem folderItem = (FolderItem) workspaceItem; + + try { + System.err.println(++i+") folderItem id: "+folderItem.getId() +", name: "+folderItem.getName() + ", size: "+folderItem.getLength()); + } catch (InternalErrorException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + } + + System.out.println("\n\n"); + } + + private static List getChildrenForID(String id){ + + WorkspaceFolder folder; + try { + System.out.println("start getItem on id "+id); + folder = (WorkspaceFolder) ws.getItem(id); + System.out.println("start get children on folder "+folder.getName()); + final List children = folder.getChildren(); + + builder.buildGXTListFileGridModelItem(folder.getChildren(), null); + +// builder.buildGXTFileGridModelItem(folder, null); + + System.out.println("children size: "+children.size()); + return children; + } catch (ItemNotFoundException | InternalErrorException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + return null; + } + } + + private static List getIdsForID(String id){ + + + try { + List children = getChildrenForID(id); + List ids = new ArrayList(children.size()); + for (WorkspaceItem workspaceItem : children) { + ids.add(workspaceItem.getId()); + } + return ids; + } catch (InternalErrorException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + return null; + } + } + + private static List getIdsOnlyFolderForID(String id){ + + + try { + List children = getChildrenForID(id); + List ids = new ArrayList(children.size()); + for (WorkspaceItem workspaceItem : children) { + if(workspaceItem.isFolder()) + ids.add(workspaceItem.getId()); + } + return ids; + } catch (InternalErrorException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + return null; + } + } + + + + private static void removeRange(List children, int start, int end) { + + System.out.println("start "+start); + System.out.println("end "+end); +// System.out.println("(end - start)"+(end - start)); + + List sub = children.subList(start, end); + String[] array = new String[sub.size()]; + array = sub.toArray(array); + + System.out.println("array lenght: "+array.length); + + for (String id : array) + System.out.println("Removing "+id); + + try { + ws.removeItems(array); + + System.out.println("Remove OK "); + } catch (ItemNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (InsufficientPrivilegesException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (InternalErrorException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + +}