diff --git a/src/main/java/org/gcube/data/access/storagehub/handlers/TrashHandler.java b/src/main/java/org/gcube/data/access/storagehub/handlers/TrashHandler.java index af13e78..bfe73b0 100644 --- a/src/main/java/org/gcube/data/access/storagehub/handlers/TrashHandler.java +++ b/src/main/java/org/gcube/data/access/storagehub/handlers/TrashHandler.java @@ -1,6 +1,7 @@ package org.gcube.data.access.storagehub.handlers; import java.util.Calendar; +import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -38,6 +39,7 @@ import org.gcube.data.access.storagehub.accounting.AccountingHandler; import org.gcube.data.access.storagehub.handlers.items.Item2NodeConverter; import org.gcube.data.access.storagehub.handlers.items.Node2ItemConverter; import org.gcube.data.access.storagehub.handlers.plugins.FolderPluginHandler; +import org.gcube.data.access.storagehub.types.ContentPair; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -53,10 +55,10 @@ public class TrashHandler { @Inject AuthorizationChecker authChecker; - + @Inject AccountingHandler accountingHandler; - + @Inject Item2NodeConverter item2Node; @@ -65,9 +67,9 @@ public class TrashHandler { @Inject PathUtil pathUtil; - + @Inject FolderPluginHandler managerHandler; - + @Inject FolderPluginHandler folderHandler; @@ -84,21 +86,52 @@ public class TrashHandler { removeNodesInternally(ses, item, true); } } - - private void retrieveContentsToDelete(Set itemsToDelete, Item itemToDelete) throws Exception{ + + private void retrieveItemsToDelete(Set itemsToDelete, Item itemToDelete) throws Exception{ if (itemToDelete instanceof AbstractFileItem) { itemsToDelete.add(((AbstractFileItem) itemToDelete)); }else if (itemToDelete instanceof FolderItem) { //only to be sure to not delete shared content if (itemToDelete.isShared()) return; - + List items = Utils.getItemList((Node) itemToDelete.getRelatedNode(), Excludes.GET_ONLY_CONTENT , null, true, null); for (Item item: items) - retrieveContentsToDelete(itemsToDelete, item); + retrieveItemsToDelete(itemsToDelete, item); } } - + private Set retrieveContentToDelete(Collection itemsToDelete) { + Set contentSet = new HashSet(); + for (AbstractFileItem item: itemsToDelete) { + if (item.getContent()== null || item.getContent().getStorageId()==null) { + log.warn("item with id {} contains null content",item.getId()); + continue; + } + + try { + FolderManager manager = folderHandler.getFolderManager(item); + contentSet.add(new ContentPair(item.getContent(), manager.getStorageBackend())); + + List versions = versionHandler.getContentVersionHistory((Node)item.getRelatedNode()); + + for (Version version: versions) { + try { + Content content = node2Item.getContent(version); + if (content!= null && content.getStorageId()!=null) + contentSet.add(new ContentPair(content, manager.getStorageBackend())); + }catch (Throwable t) { + log.warn("error retrieving version {}",version.getName(),t); + } + } + }catch (Exception e) { + log.warn("item with id {} cannot be deleted",item.getId(),e); + } + + } + return contentSet; + } + + private void removeNodesInternally(Session ses, Item itemToDelete, boolean onlyContent) throws RepositoryException, StorageHubException { try { @@ -108,32 +141,27 @@ public class TrashHandler { if (itemToDelete instanceof TrashItem) { List trashChildren = Utils.getItemList(nodeToDelete, Excludes.GET_ONLY_CONTENT, null, true, null); for (Item itemContentToRetrieve: trashChildren) - retrieveContentsToDelete(itemsToDelete, itemContentToRetrieve); + retrieveItemsToDelete(itemsToDelete, itemContentToRetrieve); } else - retrieveContentsToDelete(itemsToDelete, itemToDelete); - + retrieveItemsToDelete(itemsToDelete, itemToDelete); + if (!onlyContent) nodeToDelete.remove(); String ids = itemsToDelete.stream().map((i) -> i.getId()).collect(Collectors.joining(",")); log.debug("content ids to remove are {}",ids); + Set contentToDelete = retrieveContentToDelete(itemsToDelete); + Runnable deleteFromStorageRunnable = AuthorizedTasks.bind(new Runnable() { @Override public void run() { - for (AbstractFileItem item: itemsToDelete ) { + for (ContentPair cp: contentToDelete ) { try { - FolderManager manager = folderHandler.getFolderManager(item); - manager.getStorageBackend().onDelete(item.getContent()); - List versions = versionHandler.getContentVersionHistory((Node)item.getRelatedNode()); - - for (Version version: versions) { - Content content = node2Item.getContent(version); - manager.getStorageBackend().onDelete(content); - } - log.debug("file with id {} correctly removed from storage {}",item.getId(), manager.getClass().getSimpleName()); + cp.getStorageBackend().onDelete(cp.getContent()); + log.debug("file with id {} correctly removed from storage {}",cp.getContent().getStorageId(),cp.getStorageBackend().getClass().getSimpleName()); }catch(Throwable t) { - log.warn("error removing file with id {} from storage",item.getId(), t); + log.warn("error removing file with id {} from storage {}",cp.getContent().getStorageId(), cp.getStorageBackend().getClass().getSimpleName(), t); } } } @@ -148,13 +176,13 @@ public class TrashHandler { } } - + public void moveToTrash(Session ses, Node nodeToDelete, Item item, String login) throws RepositoryException, BackendGenericError{ log.debug("moving node {} to trash ",item.getId()); - + final Node trashFolder = ses.getNode(pathUtil.getTrashPath(login, ses).toPath()); try { - + ses.getWorkspace().getLockManager().lock(trashFolder.getPath(), true, true, 0,login); ses.getWorkspace().getLockManager().lock(nodeToDelete.getPath(), true, true, 0,login); @@ -250,12 +278,12 @@ public class TrashHandler { if (!node2Item.checkNodeType(node, FolderItem.class)) throw new InvalidCallParameters("destination Node is not a folder"); - + destinationNode = node; } - + authChecker.checkWriteAuthorizationControl(ses, login, destinationNode.getIdentifier(), true ); - + ses.getWorkspace().getLockManager().lock(destinationNode.getPath(), true, true, 0,login); String newNodePath = null; try { diff --git a/src/main/java/org/gcube/data/access/storagehub/storage/backend/impl/GCubeStorageBackend.java b/src/main/java/org/gcube/data/access/storagehub/storage/backend/impl/GCubeStorageBackend.java index 5350908..7764309 100644 --- a/src/main/java/org/gcube/data/access/storagehub/storage/backend/impl/GCubeStorageBackend.java +++ b/src/main/java/org/gcube/data/access/storagehub/storage/backend/impl/GCubeStorageBackend.java @@ -64,10 +64,10 @@ public class GCubeStorageBackend implements StorageBackend { } @Override - public void onDelete(String id) { + public void onDelete(Content content) { log.debug("deleting"); IClient storageClient = getStorageClient(AuthorizationProvider.instance.get().getClient().getId()).getClient(); - storageClient.remove().RFileById(id); + storageClient.remove().RFileById(content.getStorageId()); } private static StorageClient getStorageClient(String login){ diff --git a/src/main/java/org/gcube/data/access/storagehub/types/ContentPair.java b/src/main/java/org/gcube/data/access/storagehub/types/ContentPair.java new file mode 100644 index 0000000..57d59f8 --- /dev/null +++ b/src/main/java/org/gcube/data/access/storagehub/types/ContentPair.java @@ -0,0 +1,47 @@ +package org.gcube.data.access.storagehub.types; + +import org.gcube.common.storagehub.model.items.nodes.Content; +import org.gcube.common.storagehub.model.storages.StorageBackend; + +public class ContentPair { + + private Content content; + private StorageBackend storageBackend; + public ContentPair(Content content, StorageBackend storageBackend) { + super(); + this.content = content; + this.storageBackend = storageBackend; + } + public Content getContent() { + return content; + } + public StorageBackend getStorageBackend() { + return storageBackend; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((content.getStorageId() == null) ? 0 : content.getStorageId().hashCode()); + return result; + } + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + ContentPair other = (ContentPair) obj; + if (content.getStorageId() == null) { + if (other.content.getStorageId() != null) + return false; + } else if (!content.getStorageId().equals(other.content.getStorageId())) + return false; + return true; + } + + +}