diff --git a/.project b/.project index 6f033c9..6677ce2 100644 --- a/.project +++ b/.project @@ -16,12 +16,12 @@ - org.eclipse.m2e.core.maven2Builder + org.eclipse.wst.validation.validationbuilder - org.eclipse.wst.validation.validationbuilder + org.eclipse.m2e.core.maven2Builder diff --git a/src/main/java/org/gcube/data/access/storagehub/StorageHub.java b/src/main/java/org/gcube/data/access/storagehub/StorageHub.java index 342d99a..da500a3 100644 --- a/src/main/java/org/gcube/data/access/storagehub/StorageHub.java +++ b/src/main/java/org/gcube/data/access/storagehub/StorageHub.java @@ -6,6 +6,7 @@ import java.util.Set; import javax.ws.rs.Path; import javax.ws.rs.core.Application; +import org.gcube.common.gxrest.response.entity.SerializableErrorEntityTextWriter; import org.gcube.data.access.storagehub.services.ACLManager; import org.gcube.data.access.storagehub.services.GroupManager; import org.gcube.data.access.storagehub.services.ItemSharing; @@ -29,8 +30,8 @@ public class StorageHub extends Application { classes.add(ACLManager.class); classes.add(ItemSharing.class); classes.add(UserManager.class); - classes.add(GroupManager.class); - //classes.add(AuthorizationExceptionMapper.class); + classes.add(GroupManager.class); + classes.add(SerializableErrorEntityTextWriter.class); return classes; } diff --git a/src/main/java/org/gcube/data/access/storagehub/Utils.java b/src/main/java/org/gcube/data/access/storagehub/Utils.java index 2ad6643..41178f8 100644 --- a/src/main/java/org/gcube/data/access/storagehub/Utils.java +++ b/src/main/java/org/gcube/data/access/storagehub/Utils.java @@ -19,6 +19,8 @@ import javax.jcr.NodeIterator; import javax.jcr.PathNotFoundException; import javax.jcr.RepositoryException; import javax.jcr.Session; +import javax.jcr.lock.Lock; +import javax.jcr.lock.LockException; import javax.jcr.version.Version; import org.apache.commons.io.FilenameUtils; @@ -27,6 +29,7 @@ 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.items.AbstractFileItem; import org.gcube.common.storagehub.model.items.FolderItem; import org.gcube.common.storagehub.model.items.GCubeItem; @@ -76,13 +79,35 @@ public class Utils { } + public static void acquireLockWithWait(Session ses, String nodePath, boolean isDeep, String login, int maxTries) throws RepositoryException, ItemLockedException { + + Lock lock = null; + int tries = 0; + while(lock==null && tries<=maxTries) { + try { + lock = ses.getWorkspace().getLockManager().lock(nodePath, isDeep, true, 0,login); + logger.info("lock acquired(try n. {})", tries); + }catch (LockException e) { + try { + if (maxTries>=tries) { + int waitTime = (int)(Math.random()*5000); + logger.info("lock NOT acquired, waiting (try n. {}) for {}", tries, waitTime); + Thread.sleep(waitTime); + } + } catch (InterruptedException e1) {} + tries++; + } + } + + if (lock==null) throw new ItemLockedException("the item is locked"); + } public static List getItemList(Node parent, List excludes, Range range, boolean showHidden, Class nodeTypeToInclude) throws RepositoryException, BackendGenericError{ logger.debug("getting children of node {}", parent.getIdentifier()); - + List returnList = new ArrayList(); long start = System.currentTimeMillis(); NodeIterator iterator = parent.getNodes(); @@ -95,12 +120,12 @@ public class Utils { Node current = iterator.nextNode(); logger.debug("current node "+current.getName()); - + if (isToExclude(current, showHidden)) continue; - + logger.debug("current node not excluded "+current.getName()); - + if (range==null || (count>=range.getStart() && returnList.size()