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 extends Item> 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()