diff --git a/src/main/java/org/gcube/data/access/storagehub/handlers/UnshareHandler.java b/src/main/java/org/gcube/data/access/storagehub/handlers/UnshareHandler.java index e6e8d3b..dffb7fd 100644 --- a/src/main/java/org/gcube/data/access/storagehub/handlers/UnshareHandler.java +++ b/src/main/java/org/gcube/data/access/storagehub/handlers/UnshareHandler.java @@ -10,6 +10,7 @@ import javax.inject.Singleton; import javax.jcr.Node; import javax.jcr.RepositoryException; import javax.jcr.Session; +import javax.jcr.lock.LockException; import javax.jcr.security.AccessControlEntry; import javax.jcr.security.AccessControlManager; @@ -19,6 +20,7 @@ import org.gcube.common.storagehub.model.Excludes; import org.gcube.common.storagehub.model.NodeConstants; import org.gcube.common.storagehub.model.exceptions.BackendGenericError; import org.gcube.common.storagehub.model.exceptions.InvalidCallParameters; +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.FolderItem; @@ -36,19 +38,19 @@ import org.slf4j.LoggerFactory; public class UnshareHandler { private static final Logger log = LoggerFactory.getLogger(UnshareHandler.class); - + @Inject AccountingHandler accountingHandler; - + @Inject Node2ItemConverter node2Item; - + @Inject AuthorizationChecker authChecker; - + @Inject Item2NodeConverter item2Node; - + public String unshare(Session ses, Set users, Node sharedNode, String login) throws RepositoryException, StorageHubException{ Item item = node2Item.getItem(sharedNode, Excludes.ALL); if (!(item instanceof FolderItem) || !((FolderItem) item).isShared() || ((SharedFolder) item).isVreFolder()) @@ -61,7 +63,12 @@ public class UnshareHandler { if (users==null || users.size()==0 || usersInSharedFolder.size()<=1) return unshareAll(login, ses, sharedItem); - ses.getWorkspace().getLockManager().lock(sharedNode.getPath(), true, true, 0,login); + try { + ses.getWorkspace().getLockManager().lock(sharedNode.getPath(), true, true, 0,login); + }catch (LockException e) { + throw new ItemLockedException(e); + } + try { if (users.size()==1 && users.contains(login)) return unshareCaller(login, ses, sharedItem); @@ -79,8 +86,13 @@ public class UnshareHandler { throw new UserNotAuthorizedException("user "+login+" not authorized to unshare all"); Node sharedItemNode = ses.getNodeByIdentifier(item.getId()); - - ses.getWorkspace().getLockManager().lock(sharedItemNode.getPath(), true, true, 0,login); + + try { + ses.getWorkspace().getLockManager().lock(sharedItemNode.getPath(), true, true, 0,login); + }catch (LockException e) { + throw new ItemLockedException(e); + } + Node unsharedNode; try { log.debug("user list is empty, I'm going to remove also the shared dir"); @@ -96,7 +108,7 @@ public class UnshareHandler { adminNode.removeShare(); unsharedNode = createUnsharedFolder(ses, parentNode, directoryName, item.getDescription(), login); - + List itemsToCopy = Utils.getItemList(sharedItemNode, Excludes.ALL, null, true, null); for (Item itemCopy: itemsToCopy) { @@ -116,8 +128,8 @@ public class UnshareHandler { } - - + + private String unshareCaller(String login, Session ses, SharedFolder item) throws StorageHubException, RepositoryException{ @@ -128,7 +140,7 @@ public class UnshareHandler { throw new InvalidCallParameters("the folder is not shared with user "+login); Node sharedFolderNode =ses.getNodeByIdentifier(item.getId()); - + String parentId = removeSharingForUser(login, ses, item); AccessControlManager acm = ses.getAccessControlManager(); @@ -165,16 +177,16 @@ public class UnshareHandler { } - - - + + + private String unsharePartial(Set usersToUnshare, String login, Session ses, SharedFolder item) throws StorageHubException, RepositoryException { authChecker.checkAdministratorControl(ses, (SharedFolder)item); if (usersToUnshare.contains(item.getOwner())) throw new UserNotAuthorizedException("user "+login+" not authorized to unshare owner"); Node sharedFolderNode =ses.getNodeByIdentifier(item.getId()); - + AccessControlManager acm = ses.getAccessControlManager(); JackrabbitAccessControlList acls = AccessControlUtils.getAccessControlList(acm, sharedFolderNode.getPath()); diff --git a/src/main/java/org/gcube/data/access/storagehub/services/ItemSharing.java b/src/main/java/org/gcube/data/access/storagehub/services/ItemSharing.java index 0dbdd35..e39b39b 100644 --- a/src/main/java/org/gcube/data/access/storagehub/services/ItemSharing.java +++ b/src/main/java/org/gcube/data/access/storagehub/services/ItemSharing.java @@ -7,6 +7,7 @@ import javax.inject.Inject; import javax.jcr.Node; import javax.jcr.RepositoryException; import javax.jcr.Session; +import javax.jcr.lock.LockException; import javax.jcr.security.AccessControlManager; import javax.jcr.security.Privilege; import javax.servlet.ServletContext; @@ -29,6 +30,7 @@ import org.gcube.common.storagehub.model.acls.AccessType; import org.gcube.common.storagehub.model.exceptions.BackendGenericError; import org.gcube.common.storagehub.model.exceptions.InvalidCallParameters; import org.gcube.common.storagehub.model.exceptions.InvalidItemException; +import org.gcube.common.storagehub.model.exceptions.ItemLockedException; import org.gcube.common.storagehub.model.exceptions.StorageHubException; import org.gcube.common.storagehub.model.items.FolderItem; import org.gcube.common.storagehub.model.items.Item; @@ -96,9 +98,9 @@ public class ItemSharing { throw new InvalidCallParameters("users is empty"); Node nodeToShare = ses.getNodeByIdentifier(id); - + boolean alreadyShared = false; - + Node sharedFolderNode; if (!node2Item.checkNodeType(nodeToShare, SharedFolder.class)) sharedFolderNode= shareFolder(nodeToShare, ses); @@ -108,8 +110,11 @@ public class ItemSharing { } ses.save(); - ses.getWorkspace().getLockManager().lock(sharedFolderNode.getPath(), true, true, 0,login); - + try { + ses.getWorkspace().getLockManager().lock(sharedFolderNode.getPath(), true, true, 0,login); + }catch (LockException e) { + throw new ItemLockedException(e); + } try { AccessControlManager acm = ses.getAccessControlManager(); @@ -152,12 +157,12 @@ public class ItemSharing { if (ses!=null) ses.logout(); } - + return toReturn; } - - + + private Node shareFolder(Node node, Session ses) throws RepositoryException, BackendGenericError, StorageHubException{ String login = AuthorizationProvider.instance.get().getClient().getId(); @@ -189,10 +194,10 @@ public class ItemSharing { userPath = itemToShare.getPath(); userRootWSId = itemToShare.getParentId(); } - - + + log.info("cloning directory to {} ",userPath); - + ses.getWorkspace().clone(ses.getWorkspace().getName(), sharedFolderNode.getPath(), userPath , false); acls.addAccessControlEntry(AccessControlUtils.getPrincipal(ses, user), userPrivileges ); @@ -232,8 +237,8 @@ public class ItemSharing { return toReturn; } - - + + } diff --git a/src/main/java/org/gcube/data/access/storagehub/services/ItemsCreator.java b/src/main/java/org/gcube/data/access/storagehub/services/ItemsCreator.java index ee121e5..98594b5 100644 --- a/src/main/java/org/gcube/data/access/storagehub/services/ItemsCreator.java +++ b/src/main/java/org/gcube/data/access/storagehub/services/ItemsCreator.java @@ -50,6 +50,7 @@ import org.gcube.common.storagehub.model.exceptions.BackendGenericError; import org.gcube.common.storagehub.model.exceptions.IdNotFoundException; import org.gcube.common.storagehub.model.exceptions.InvalidCallParameters; import org.gcube.common.storagehub.model.exceptions.InvalidItemException; +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; @@ -102,7 +103,7 @@ public class ItemsCreator { @Inject Node2ItemConverter node2Item; @Inject Item2NodeConverter item2Node; - + //@Path("/{id}/create/{type:(?!FILE)[^/?$]*}") @POST @@ -120,21 +121,25 @@ public class ItemsCreator { ses = repository.getRepository().login(CredentialHandler.getAdminCredentials(context)); log.info("time to connect to repo {}",(System.currentTimeMillis()-start)); - + Node destination; try { - destination = ses.getNodeByIdentifier(id); + destination = ses.getNodeByIdentifier(id); }catch(ItemNotFoundException inf) { throw new IdNotFoundException(id); } - + if (!node2Item.checkNodeType(destination, FolderItem.class)) throw new InvalidItemException("the destination item is not a folder"); - + authChecker.checkWriteAuthorizationControl(ses, destination.getIdentifier(), true); - - ses.getWorkspace().getLockManager().lock(destination.getPath(), false, true, 0,login); + try { + ses.getWorkspace().getLockManager().lock(destination.getPath(), false, true, 0,login); + }catch (LockException le) { + throw new ItemLockedException(le); + } + Node newNode; try { newNode = Utils.createFolderInternally(ses, destination, name, description, hidden, login, accountingHandler); @@ -142,7 +147,7 @@ public class ItemsCreator { } finally { ses.getWorkspace().getLockManager().unlock(destination.getPath()); } - + log.info("item with id {} correctly created",newNode.getIdentifier()); toReturn = newNode.getIdentifier(); }catch(StorageHubException she ){ @@ -154,7 +159,7 @@ public class ItemsCreator { }finally{ if (ses!=null) ses.logout(); - + } return toReturn; } @@ -167,25 +172,29 @@ public class ItemsCreator { log.info("create Gcube item called"); Session ses = null; String toReturn = null; - + try{ final String login = AuthorizationProvider.instance.get().getClient().getId(); ses = repository.getRepository().login(CredentialHandler.getAdminCredentials(context)); - + Node destination; try { - destination = ses.getNodeByIdentifier(id); + destination = ses.getNodeByIdentifier(id); }catch(ItemNotFoundException inf) { throw new IdNotFoundException(id); } - + if (!node2Item.checkNodeType(destination, FolderItem.class)) throw new InvalidItemException("the destination item is not a folder"); authChecker.checkWriteAuthorizationControl(ses, destination.getIdentifier(), true); - ses.getWorkspace().getLockManager().lock(destination.getPath(), false, true, 0,login); - + try { + ses.getWorkspace().getLockManager().lock(destination.getPath(), false, true, 0,login); + }catch (LockException le) { + throw new ItemLockedException(le); + } + Node newNode; try { newNode = Utils.createGcubeItemInternally(ses, destination, item.getName(), item.getDescription(), login, item, accountingHandler); @@ -208,7 +217,7 @@ public class ItemsCreator { } return toReturn; } - + @POST @Consumes(MediaType.MULTIPART_FORM_DATA) @@ -228,18 +237,18 @@ public class ItemsCreator { ses = repository.getRepository().login(CredentialHandler.getAdminCredentials(context)); Node destination = ses.getNodeByIdentifier(id); - + log.info("create file called with filename {} in dir {} ", name, destination.getPath() ); if (!node2Item.checkNodeType(destination, FolderItem.class)) throw new InvalidItemException("the destination item is not a folder"); - - + + log.info("session: {}",ses.toString()); - + Node newNode = createFileItemInternally(ses, destination, stream, name, description, login); ses.save(); - + versionHandler.checkinContentNode(newNode, ses); log.info("file with id {} correctly created",newNode.getIdentifier()); toReturn = newNode.getIdentifier(); @@ -259,12 +268,12 @@ public class ItemsCreator { } } return toReturn; - + } - private Node createFileItemInternally(Session ses, Node destinationNode, InputStream stream, String name, String description, String login) throws RepositoryException, UserNotAuthorizedException, BackendGenericError{ + private Node createFileItemInternally(Session ses, Node destinationNode, InputStream stream, String name, String description, String login) throws RepositoryException, UserNotAuthorizedException, ItemLockedException, BackendGenericError{ ContentHandler handler = getContentHandler(stream , name, destinationNode.getPath(), login); @@ -275,12 +284,17 @@ public class ItemsCreator { log.debug("item prepared, fulfilling content"); log.debug("content prepared"); - + Node newNode; try { newNode = ses.getNode(org.gcube.common.storagehub.model.Paths.append(org.gcube.common.storagehub.model.Paths.getPath(destinationNode.getPath()), name).toPath()); authChecker.checkWriteAuthorizationControl(ses, newNode.getIdentifier(), false); - ses.getWorkspace().getLockManager().lock(newNode.getPath(), true, true, 0,login); + try { + ses.getWorkspace().getLockManager().lock(newNode.getPath(), true, true, 0,login); + }catch (LockException le) { + throw new ItemLockedException(le); + } + try { versionHandler.checkoutContentNode(newNode, ses); log.trace("replacing content of class {}",item.getContent().getClass()); @@ -291,7 +305,11 @@ public class ItemsCreator { } }catch(PathNotFoundException pnf) { authChecker.checkWriteAuthorizationControl(ses, destinationNode.getIdentifier(), true); - ses.getWorkspace().getLockManager().lock(destinationNode.getPath(), false, true, 0,login); + try { + ses.getWorkspace().getLockManager().lock(destinationNode.getPath(), false, true, 0,login); + }catch (LockException le) { + throw new ItemLockedException(le); + } try { newNode = item2Node.getNode(destinationNode, item); }finally { @@ -300,11 +318,11 @@ public class ItemsCreator { versionHandler.makeVersionableContent(newNode, ses); accountingHandler.createFolderAddObj(name, item.getClass().getSimpleName(), item.getContent().getMimeType(), ses, newNode, false); } - + return newNode; } - + @POST @Consumes(MediaType.MULTIPART_FORM_DATA) @@ -324,77 +342,78 @@ public class ItemsCreator { ses = repository.getRepository().login(CredentialHandler.getAdminCredentials(context)); Node destination = ses.getNodeByIdentifier(id); - + if (!node2Item.checkNodeType(destination, FolderItem.class)) throw new InvalidItemException("the destination item is not a folder"); - + authChecker.checkWriteAuthorizationControl(ses, destination.getIdentifier() , true); - ses.getWorkspace().getLockManager().lock(destination.getPath(), false, true, 0,login); - Node parentDirectoryNode = null; - try { - parentDirectoryNode = Utils.createFolderInternally(ses, destination, parentFolderName, "", false, login, accountingHandler); + ses.getWorkspace().getLockManager().lock(destination.getPath(), false, true, 0,login); + }catch (LockException le) { + throw new ItemLockedException(le); + } - Set fileNodes = new HashSet<>(); + Node parentDirectoryNode = Utils.createFolderInternally(ses, destination, parentFolderName, "", false, login, accountingHandler); + try { + if (ses.getWorkspace().getLockManager().isLocked(destination.getPath())) + ses.getWorkspace().getLockManager().unlock(destination.getPath()); + } catch (Throwable t){ + log.warn("error unlocking {}", destination.getPath(), t); + } + + Set fileNodes = new HashSet<>(); - HashMap directoryNodeMap = new HashMap<>(); - - try (ArchiveInputStream input = new ArchiveStreamFactory() - .createArchiveInputStream(new BufferedInputStream(stream, 1024*64))){ - ArchiveEntry entry; - while ((entry = input.getNextEntry()) != null) { - if (entry.isDirectory()) { + HashMap directoryNodeMap = new HashMap<>(); + + try (ArchiveInputStream input = new ArchiveStreamFactory() + .createArchiveInputStream(new BufferedInputStream(stream, 1024*64))){ + ArchiveEntry entry; + while ((entry = input.getNextEntry()) != null) { + if (entry.isDirectory()) { + String entirePath = entry.getName(); + String name = entirePath.replaceAll("(.*/)*(.*)/", "$2"); + String parentPath = entirePath.replaceAll("(.*/)*(.*)/", "$1"); + log.debug("creating directory with entire path {}, name {}, parentPath {} ", entirePath, name, parentPath); + Node createdNode; + if (parentPath.isEmpty()) { + createdNode = Utils.createFolderInternally(ses, parentDirectoryNode, name, "", false, login, accountingHandler); + }else { + Node parentNode = directoryNodeMap.get(parentPath); + createdNode = Utils.createFolderInternally(ses, parentNode, name, "", false, login, accountingHandler); + } + directoryNodeMap.put(entirePath, createdNode); + continue; + } else { + try { String entirePath = entry.getName(); - String name = entirePath.replaceAll("(.*/)*(.*)/", "$2"); - String parentPath = entirePath.replaceAll("(.*/)*(.*)/", "$1"); - log.debug("creating directory with entire path {}, name {}, parentPath {} ", entirePath, name, parentPath); - Node createdNode; - if (parentPath.isEmpty()) { - createdNode = Utils.createFolderInternally(ses, parentDirectoryNode, name, "", false, login, accountingHandler); - }else { + String name = entirePath.replaceAll("(.*/)*(.*)", "$2"); + String parentPath = entirePath.replaceAll("(.*/)*(.*)", "$1"); + log.debug("creating file with entire path {}, name {}, parentPath {} ", entirePath, name, parentPath); + Node fileNode = null; + if (parentPath.isEmpty()) + fileNode = createFileItemInternally(ses, parentDirectoryNode, input, name, "", login); + else { Node parentNode = directoryNodeMap.get(parentPath); - createdNode = Utils.createFolderInternally(ses, parentNode, name, "", false, login, accountingHandler); - } - directoryNodeMap.put(entirePath, createdNode); - continue; - } else { - try { - String entirePath = entry.getName(); - String name = entirePath.replaceAll("(.*/)*(.*)", "$2"); - String parentPath = entirePath.replaceAll("(.*/)*(.*)", "$1"); - log.debug("creating file with entire path {}, name {}, parentPath {} ", entirePath, name, parentPath); - Node fileNode = null; - if (parentPath.isEmpty()) - fileNode = createFileItemInternally(ses, parentDirectoryNode, input, name, "", login); - else { - Node parentNode = directoryNodeMap.get(parentPath); - fileNode = createFileItemInternally(ses, parentNode, input, name, "", login); - } - fileNodes.add(fileNode); - }catch(Exception e) { - log.warn("error getting file {}",entry.getName(),e); + fileNode = createFileItemInternally(ses, parentNode, input, name, "", login); } + fileNodes.add(fileNode); + }catch(Exception e) { + log.warn("error getting file {}",entry.getName(),e); } } - } - ses.save(); - for (Node node : fileNodes) - versionHandler.checkinContentNode(node, ses); - toReturn = parentDirectoryNode.getIdentifier(); - - } finally { - try { - if (ses.getWorkspace().getLockManager().isLocked(destination.getPath())) - ses.getWorkspace().getLockManager().unlock(destination.getPath()); - } catch (Throwable t){ - log.warn("error unlocking {}", destination.getPath(), t); - } } + ses.save(); + for (Node node : fileNodes) + versionHandler.checkinContentNode(node, ses); + toReturn = parentDirectoryNode.getIdentifier(); + + + }catch(RepositoryException | ArchiveException | IOException re){ log.error("jcr error extracting archive", re); GXOutboundErrorResponse.throwException(new BackendGenericError("jcr error extracting archive", re)); @@ -412,7 +431,7 @@ public class ItemsCreator { private ContentHandler getContentHandler(InputStream stream , String name, String path, String login) throws BackendGenericError { - + final MultipleOutputStream mos; try{ mos = new MultipleOutputStream(stream, 2); @@ -489,7 +508,7 @@ public class ItemsCreator { try { mos.startWriting(); log.debug("TIMING: writing the stream - finished in {}",System.currentTimeMillis()-start); - + ContentHandler handler = detectorF.get(); MetaInfo info = uploaderF.get(); handler.getContent().setData(NodeConstants.CONTENT_NAME); 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 c9f7448..fc7373f 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 @@ -25,6 +25,7 @@ import javax.jcr.Node; import javax.jcr.NodeIterator; import javax.jcr.RepositoryException; import javax.jcr.Session; +import javax.jcr.lock.LockException; import javax.jcr.version.Version; import javax.servlet.ServletContext; import javax.ws.rs.Consumes; @@ -57,6 +58,7 @@ import org.gcube.common.storagehub.model.exceptions.BackendGenericError; import org.gcube.common.storagehub.model.exceptions.IdNotFoundException; import org.gcube.common.storagehub.model.exceptions.InvalidCallParameters; import org.gcube.common.storagehub.model.exceptions.InvalidItemException; +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; @@ -156,7 +158,7 @@ public class ItemsManager { try{ ses = repository.getRepository().login(CredentialHandler.getAdminCredentials(context)); authChecker.checkReadAuthorizationControl(ses, id); - + //NOT using the internal pattern matching of jcr because of title for shared folder NodeIterator it = ses.getNodeByIdentifier(id).getNodes(); while (it.hasNext()) { @@ -164,11 +166,11 @@ public class ItemsManager { String nodeName = child.getName(); if (!child.hasProperty(NodeProperty.TITLE.toString())) continue; String title = child.getProperty(NodeProperty.TITLE.toString()).getString(); - + String cleanedName = name; if (name.startsWith("*")) cleanedName = name.substring(1); if (name.endsWith("*")) cleanedName = name.substring(0, name.length()-1); - + if ((name.startsWith("*") && (nodeName.endsWith(cleanedName) || title.endsWith(cleanedName))) || (name.endsWith("*") && (nodeName.startsWith(cleanedName) || title.startsWith(cleanedName))) || (nodeName.equals(cleanedName) || title.equals(cleanedName))) toReturn.add(node2Item.getItem(child, excludes)); @@ -280,7 +282,7 @@ public class ItemsManager { @AuthorizationControl(allowed={"URIResolver"}, exception=MyAuthException.class) public Response resolvePublicLink() { InnerMethodName.instance.set("resolvePubliclink"); - + log.warn("arrived id is {}",id); Session ses = null; try{ @@ -306,30 +308,30 @@ public class ItemsManager { } } - + String itemId = complexId; String versionName = null; - + if (complexId.contains(versionPrefix)) { String[] split = complexId.split(versionPrefix); itemId = split[0]; versionName = split[1]; } - + log.warn("item id to retrieve is {}",itemId); - + Node selectedNode = ses.getNodeByIdentifier(itemId); Item item = node2Item.getItem(selectedNode, Arrays.asList(NodeConstants.ACCOUNTING_NAME, NodeConstants.METADATA_NAME)); if (!(item instanceof AbstractFileItem)) throw new InvalidCallParameters("the choosen item is not a File"); - + if (versionName!=null) return downloadVersionInternal(ses, login, itemId, versionName, false); else return downloadFileInternal(ses, (AbstractFileItem) item, login, true); - - + + }catch(RepositoryException re ){ log.error("jcr error getting public link", re); GXOutboundErrorResponse.throwException(new BackendGenericError(re)); @@ -490,7 +492,7 @@ public class ItemsManager { for (Version version: jcrVersions) { boolean currentVersion = ((AbstractFileItem)currentItem).getContent().getStorageId().equals(version.getFrozenNode().getProperty(NodeProperty.STORAGE_ID.toString()).getString()); - + versions.add(new org.gcube.common.storagehub.model.service.Version(version.getIdentifier(), version.getName(), version.getCreated(), currentVersion)); } }catch(RepositoryException re ){ @@ -517,7 +519,7 @@ public class ItemsManager { authChecker.checkReadAuthorizationControl(ses, id); return downloadVersionInternal(ses, login, id, versionName, true); - + }catch(RepositoryException re ){ log.error("jcr error downloading version", re); GXOutboundErrorResponse.throwException(new BackendGenericError(re)); @@ -568,7 +570,7 @@ public class ItemsManager { } throw new InvalidItemException("the version is not valid"); } - + @GET @Path("{id}/anchestors") @Produces(MediaType.APPLICATION_JSON) @@ -663,7 +665,7 @@ public class ItemsManager { .header("Content-Type", "application/zip") .header("Content-Length", -1l) .build(); - + accountingHandler.createReadObj(item.getTitle(), ses, ses.getNodeByIdentifier(item.getId()), false); }finally { if (ses!=null) ses.save(); @@ -682,9 +684,9 @@ public class ItemsManager { return response; } - + private Response downloadFileInternal(Session ses, AbstractFileItem fileItem, String login, boolean withAccounting) throws RepositoryException { - + final InputStream streamToWrite = Utils.getStorageClient(login).getClient().get().RFileAsInputStream(fileItem.getContent().getStorageId()); if (withAccounting) @@ -700,7 +702,7 @@ public class ItemsManager { .build(); } - + @PUT @Path("{id}/move") @@ -739,8 +741,12 @@ public class ItemsManager { if (item.isShared() && (!destinationItem.isShared() || !getSharedParentNode(nodeToMove).getIdentifier().equals(getSharedParentNode(destination).getIdentifier()))) throw new InvalidCallParameters("shared Item cannot be moved in a different shared folder or in a private folder"); - ses.getWorkspace().getLockManager().lock(destination.getPath(), false, true, 0,login); - ses.getWorkspace().getLockManager().lock(nodeToMove.getPath(), true, true, 0,login); + try { + ses.getWorkspace().getLockManager().lock(destination.getPath(), false, true, 0,login); + ses.getWorkspace().getLockManager().lock(nodeToMove.getPath(), true, true, 0,login); + }catch (LockException e) { + throw new ItemLockedException(e); + } try { String uniqueName =(Utils.checkExistanceAndGetUniqueName(ses, destination, nodeToMove.getName())); String newPath = String.format("%s/%s",destination.getPath(), uniqueName); @@ -797,9 +803,12 @@ public class ItemsManager { if (item instanceof FolderItem) throw new InvalidItemException("folder cannot be copied"); - - ses.getWorkspace().getLockManager().lock(destination.getPath(), false, true, 0,login); - ses.getWorkspace().getLockManager().lock(nodeToCopy.getPath(), true, true, 0,login); + try { + ses.getWorkspace().getLockManager().lock(destination.getPath(), false, true, 0,login); + ses.getWorkspace().getLockManager().lock(nodeToCopy.getPath(), true, true, 0,login); + }catch (LockException e) { + throw new ItemLockedException(e); + } try { String uniqueName = Utils.checkExistanceAndGetUniqueName(ses, destination, newFileName); String newPath= String.format("%s/%s", destination.getPath(), uniqueName); @@ -871,8 +880,13 @@ public class ItemsManager { throw new InvalidItemException("protected folder cannot be renamed"); - ses.getWorkspace().getLockManager().lock(nodeToMove.getPath(), true, true, 0,login); - ses.getWorkspace().getLockManager().lock(nodeToMove.getParent().getPath(), false, true, 0,login); + try { + ses.getWorkspace().getLockManager().lock(nodeToMove.getPath(), true, true, 0,login); + ses.getWorkspace().getLockManager().lock(nodeToMove.getParent().getPath(), false, true, 0,login); + }catch (LockException e) { + throw new ItemLockedException(e); + } + try { String uniqueName = Utils.checkExistanceAndGetUniqueName(ses, nodeToMove.getParent(), newName); @@ -919,8 +933,11 @@ public class ItemsManager { final Node nodeToUpdate = ses.getNodeByIdentifier(id); - - ses.getWorkspace().getLockManager().lock(nodeToUpdate.getPath(), false, true, 0,login); + try { + ses.getWorkspace().getLockManager().lock(nodeToUpdate.getPath(), false, true, 0,login); + }catch (LockException e) { + throw new ItemLockedException(e); + } try { item2Node.updateMetadataNode(nodeToUpdate, metadata.getMap(), login); ses.save();