From 6a3a6cca1790a9c060e6e5c33d281cdf8f21159e Mon Sep 17 00:00:00 2001 From: Lucio Lelii Date: Thu, 23 May 2019 12:58:02 +0000 Subject: [PATCH] git-svn-id: https://svn.d4science-ii.research-infrastructures.eu/gcube/branches/data-access/storagehub-webapp/1.0@179528 82a268e6-3cf1-43bd-a215-b396298e98cf --- .../handlers/Item2NodeConverter.java | 2 +- .../storagehub/handlers/TrashHandler.java | 29 ++++++++++--------- .../storagehub/services/ItemsManager.java | 6 ++-- 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/src/main/java/org/gcube/data/access/storagehub/handlers/Item2NodeConverter.java b/src/main/java/org/gcube/data/access/storagehub/handlers/Item2NodeConverter.java index 9aa6aab..90fea62 100644 --- a/src/main/java/org/gcube/data/access/storagehub/handlers/Item2NodeConverter.java +++ b/src/main/java/org/gcube/data/access/storagehub/handlers/Item2NodeConverter.java @@ -60,7 +60,7 @@ public class Item2NodeConverter { if (values.isMulti()) newNode.setProperty(attribute.value(), values.getValues()); else newNode.setProperty(attribute.value(), values.getValue()); } catch (Exception e ) { - logger.warn("error setting value for attribute "+attribute.value(),e); + logger.warn("error setting value for attribute {}: {}",attribute.value(), e.getMessage()); } } else if (field.isAnnotationPresent(NodeAttribute.class)){ NodeAttribute nodeAttribute = field.getAnnotation(NodeAttribute.class); 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 2bbf705..fc0fb82 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 @@ -10,11 +10,15 @@ import javax.inject.Singleton; import javax.jcr.Node; import javax.jcr.RepositoryException; import javax.jcr.Session; +import javax.jcr.lock.LockException; +import org.gcube.common.authorization.library.AuthorizedTasks; import org.gcube.common.authorization.library.provider.AuthorizationProvider; import org.gcube.common.storagehub.model.Excludes; import org.gcube.common.storagehub.model.Paths; import org.gcube.common.storagehub.model.exceptions.BackendGenericError; +import org.gcube.common.storagehub.model.exceptions.ItemLockedException; +import org.gcube.common.storagehub.model.exceptions.StorageHubException; import org.gcube.common.storagehub.model.exceptions.UserNotAuthorizedException; import org.gcube.common.storagehub.model.items.AbstractFileItem; import org.gcube.common.storagehub.model.items.FolderItem; @@ -47,18 +51,16 @@ public class TrashHandler { Item2NodeConverter item2Node; - public void removeNodes(Session ses, List itemsToDelete) throws RepositoryException, BackendGenericError{ + public void removeNodes(Session ses, List itemsToDelete) throws RepositoryException, StorageHubException{ log.debug("defnitively removing nodes with ids {}",itemsToDelete); for (Item item: itemsToDelete) { removeNodesInternally(ses, item); } } - private void removeNodesInternally(Session ses, Item itemToDelete) throws RepositoryException, BackendGenericError { - final String login = AuthorizationProvider.instance.get().getClient().getId(); - + private void removeNodesInternally(Session ses, Item itemToDelete) throws RepositoryException, StorageHubException { + try { - ses.getWorkspace().getLockManager().lock(itemToDelete.getPath(), true, true, 0,login); Set contentIdsToDelete = new HashSet<>(); Node nodeToDelete = ses.getNodeByIdentifier(itemToDelete.getId()); @@ -74,11 +76,10 @@ public class TrashHandler { log.debug("content ids to remove are {}",contentIdsToDelete); - - //TODO: make it as an authorizableTask String user = AuthorizationProvider.instance.get().getClient().getId(); - new Thread() { - + Runnable deleteFromStorageRunnable = AuthorizedTasks.bind(new Runnable() { + + @Override public void run() { for (String id: contentIdsToDelete) { try { @@ -89,14 +90,16 @@ public class TrashHandler { log.warn("error removing file on storage with id {}",id, t); } } - + } - }.start();; + }); + new Thread(deleteFromStorageRunnable).start(); + ses.save(); + }catch (LockException e) { + throw new ItemLockedException("the node or is parent is locked", e); }catch (Exception e) { throw new BackendGenericError("error permanetly deleting items",e); - }finally { - ses.getWorkspace().getLockManager().unlock(itemToDelete.getPath()); } } diff --git a/src/main/java/org/gcube/data/access/storagehub/services/ItemsManager.java b/src/main/java/org/gcube/data/access/storagehub/services/ItemsManager.java index 09c6020..3bf320a 100644 --- a/src/main/java/org/gcube/data/access/storagehub/services/ItemsManager.java +++ b/src/main/java/org/gcube/data/access/storagehub/services/ItemsManager.java @@ -969,7 +969,7 @@ public class ItemsManager { @DELETE @Path("{id}") public Response deleteItem(@QueryParam("force") boolean force){ - InnerMethodName.instance.set("deleteItem"); + InnerMethodName.instance.set("deleteItem("+force+")"); Session ses = null; try{ @@ -990,11 +990,13 @@ public class ItemsManager { log.debug("item is trashed? {}", itemToDelete.isTrashed()); - if (!force && !itemToDelete.isTrashed() ) + if (!itemToDelete.isTrashed() && !force) trashHandler.moveToTrash(ses, nodeToDelete, itemToDelete); else trashHandler.removeNodes(ses, Collections.singletonList(itemToDelete)); + }catch (LockException e) { + }catch(RepositoryException re ){ log.error("jcr error moving item", re); GXOutboundErrorResponse.throwException(new BackendGenericError(re));