From 0d81c6a30de716121cceb1000eba8dce7d193d85 Mon Sep 17 00:00:00 2001 From: Kevin Roast Date: Tue, 19 Jun 2007 13:45:12 +0000 Subject: [PATCH] AVMLockingException now has I18N message for locked item error. Added new variant of hasAccess() method to AVMLockingService to support the case where you already have the NodeRef of the webproject available (improves performance by removing the need to perform a lucene search to locate the webproject node). git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@6017 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- config/alfresco/avm-services-context.xml | 8 +- .../alfresco/messages/avm-messages.properties | 3 +- .../repo/avm/AVMLockingAwareService.java | 4 +- .../avm/locking/AVMLockingServiceImpl.java | 88 +++++++++++++------ .../cmr/avm/locking/AVMLockingService.java | 11 +++ 5 files changed, 82 insertions(+), 32 deletions(-) diff --git a/config/alfresco/avm-services-context.xml b/config/alfresco/avm-services-context.xml index c9507dbac1..a383498990 100644 --- a/config/alfresco/avm-services-context.xml +++ b/config/alfresco/avm-services-context.xml @@ -339,9 +339,9 @@ + + workspace://SpacesStore + - - - - + \ No newline at end of file diff --git a/config/alfresco/messages/avm-messages.properties b/config/alfresco/messages/avm-messages.properties index 1b0603fcd9..9ba915b862 100644 --- a/config/alfresco/messages/avm-messages.properties +++ b/config/alfresco/messages/avm-messages.properties @@ -1,3 +1,4 @@ # AVM related messages -expiredcontent.workflow.title=Expired Content In ''{0}'' \ No newline at end of file +expiredcontent.workflow.title=Expired Content In ''{0}'' +avmlockservice.locked=You do not have access to the item at path {0} it is currently locked by another user. \ No newline at end of file diff --git a/source/java/org/alfresco/repo/avm/AVMLockingAwareService.java b/source/java/org/alfresco/repo/avm/AVMLockingAwareService.java index 738f40319c..53cf50dcf4 100644 --- a/source/java/org/alfresco/repo/avm/AVMLockingAwareService.java +++ b/source/java/org/alfresco/repo/avm/AVMLockingAwareService.java @@ -823,12 +823,12 @@ public class AVMLockingAwareService implements AVMService String userName = fAuthenticationService.getCurrentUserName(); if (!fLockingService.hasAccess(webProject, path, userName)) { - throw new AVMLockingException(userName + " does not have access to " + path); + throw new AVMLockingException("avmlockservice.locked", new Object[]{path}); } fLockingService.addWebProject(webProject); if (fLockingService.getLock(webProject, storePath[1]) == null) { - List owners = new ArrayList(); + List owners = new ArrayList(1); owners.add(userName); AVMLock lock = new AVMLock(webProject, storePath[0], storePath[1], AVMLockingService.Type.DISCRETIONARY, owners); fLockingService.lockPath(lock); diff --git a/source/java/org/alfresco/repo/avm/locking/AVMLockingServiceImpl.java b/source/java/org/alfresco/repo/avm/locking/AVMLockingServiceImpl.java index e11d63e108..7e7246ff96 100644 --- a/source/java/org/alfresco/repo/avm/locking/AVMLockingServiceImpl.java +++ b/source/java/org/alfresco/repo/avm/locking/AVMLockingServiceImpl.java @@ -35,7 +35,6 @@ import org.alfresco.repo.attributes.Attribute; import org.alfresco.repo.attributes.ListAttributeValue; import org.alfresco.repo.attributes.MapAttributeValue; import org.alfresco.repo.attributes.StringAttributeValue; -import org.alfresco.repo.node.db.DbNodeServiceImpl; import org.alfresco.repo.transaction.RetryingTransactionHelper; import org.alfresco.service.cmr.attributes.AttrQueryEquals; import org.alfresco.service.cmr.attributes.AttributeService; @@ -53,6 +52,7 @@ import org.alfresco.service.cmr.search.SearchService; import org.alfresco.service.cmr.security.AuthorityService; import org.alfresco.service.cmr.security.AuthorityType; import org.alfresco.service.cmr.security.PersonService; +import org.alfresco.service.namespace.RegexQNamePattern; import org.alfresco.util.MD5; import org.alfresco.util.Pair; @@ -67,6 +67,13 @@ public class AVMLockingServiceImpl implements AVMLockingService public static final String USERS = "users"; public static final String STORES = "stores"; + private static final String ROLE_CONTENT_MANAGER = "ContentManager"; + + /** + * Store name containing the web project nodes. + */ + private String webProjectStore; + /** * SearchService for access to web project properties. */ @@ -97,8 +104,13 @@ public class AVMLockingServiceImpl implements AVMLockingService */ private RetryingTransactionHelper fRetryingTransactionHelper; - public AVMLockingServiceImpl() + + /** + * @param webProjectStore The webProjectStore to set + */ + public void setWebProjectStore(String webProjectStore) { + this.webProjectStore = webProjectStore; } /** @@ -175,7 +187,7 @@ public class AVMLockingServiceImpl implements AVMLockingService public AVMLock getLock(String webProject, String path) { path = normalizePath(path); - List keys = new ArrayList(); + List keys = new ArrayList(3); keys.add(LOCK_TABLE); keys.add(WEB_PROJECTS); keys.add(webProject); @@ -211,7 +223,7 @@ public class AVMLockingServiceImpl implements AVMLockingService */ public List getUsersLocks(String user) { - List keys = new ArrayList(); + List keys = new ArrayList(3); keys.add(LOCK_TABLE); keys.add(USERS); keys.add(user); @@ -294,7 +306,7 @@ public class AVMLockingServiceImpl implements AVMLockingService { path = normalizePath(path); String pathKey = MD5.Digest(path.getBytes()); - List keys = new ArrayList(); + List keys = new ArrayList(4); keys.add(LOCK_TABLE); keys.add(WEB_PROJECTS); keys.add(webProject); @@ -326,7 +338,7 @@ public class AVMLockingServiceImpl implements AVMLockingService } userKeys.remove(2); } - List storeKeys = new ArrayList(); + List storeKeys = new ArrayList(3); storeKeys.add(LOCK_TABLE); storeKeys.add(STORES); String store = lock.getStore(); @@ -349,7 +361,7 @@ public class AVMLockingServiceImpl implements AVMLockingService */ public void addWebProject(String webProject) { - List keys = new ArrayList(); + List keys = new ArrayList(3); keys.add(LOCK_TABLE); keys.add(WEB_PROJECTS); keys.add(webProject); @@ -366,7 +378,7 @@ public class AVMLockingServiceImpl implements AVMLockingService */ public List getWebProjectLocks(String webProject) { - List keys = new ArrayList(); + List keys = new ArrayList(3); keys.add(LOCK_TABLE); keys.add(WEB_PROJECTS); keys.add(webProject); @@ -387,7 +399,7 @@ public class AVMLockingServiceImpl implements AVMLockingService */ public void removeWebProject(String webProject) { - List userKeys = new ArrayList(); + List userKeys = new ArrayList(2); userKeys.add(LOCK_TABLE); userKeys.add(USERS); List users = fAttributeService.getKeys(userKeys); @@ -430,7 +442,7 @@ public class AVMLockingServiceImpl implements AVMLockingService storeKeys.remove(2); fAttributeService.setAttribute(storeKeys, store, storeLocks); } - List keys = new ArrayList(); + List keys = new ArrayList(2); keys.add(LOCK_TABLE); keys.add(WEB_PROJECTS); fAttributeService.removeAttribute(keys, webProject); @@ -441,7 +453,7 @@ public class AVMLockingServiceImpl implements AVMLockingService */ public List getStoreLocks(String store) { - List locks = new ArrayList(); + List locks = new ArrayList(3); List keys = new ArrayList(); keys.add(LOCK_TABLE); keys.add(STORES); @@ -514,7 +526,7 @@ public class AVMLockingServiceImpl implements AVMLockingService */ public void removeStoreLocks(String store) { - List storeKeys = new ArrayList(); + List storeKeys = new ArrayList(3); storeKeys.add(LOCK_TABLE); storeKeys.add(STORES); storeKeys.add(store); @@ -544,21 +556,47 @@ public class AVMLockingServiceImpl implements AVMLockingService { return true; } - StoreRef storeRef = new StoreRef(StoreRef.PROTOCOL_WORKSPACE, "SpacesStore"); - ResultSet results = fSearchService.query(storeRef, "lucene", "@wca\\:avmstore:\"" + webProject + "\" +TYPE:\"wca:webfolder\""); - System.out.println(results.getNodeRefs()); + StoreRef storeRef = new StoreRef(this.webProjectStore); + ResultSet results = fSearchService.query( + storeRef, + SearchService.LANGUAGE_LUCENE, + "@wca\\:avmstore:\"" + webProject + "\" +TYPE:\"wca:webfolder\""); if (results.getNodeRefs().size() == 1) { - List children = fNodeService.getChildAssocs(results.getNodeRefs().get(0)); - for (ChildAssociationRef child : children) + return hasAccess(webProject, results.getNodeRefs().get(0), avmPath, user); + } + return false; + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.avm.locking.AVMLockingService#hasAccess(org.alfresco.service.cmr.repository.NodeRef, java.lang.String, java.lang.String) + */ + public boolean hasAccess(NodeRef webProjectRef, String avmPath, String user) + { + if (fPersonService.getPerson(user) == null && + !fAuthorityService.authorityExists(user)) + { + return false; + } + if (fAuthorityService.isAdminAuthority(user)) + { + return true; + } + String webProject = (String)fNodeService.getProperty(webProjectRef, WCMAppModel.PROP_AVMSTORE); + return hasAccess(webProject, webProjectRef, avmPath, user); + } + + private boolean hasAccess(String webProject, NodeRef webProjectRef, String avmPath, String user) + { + List children = fNodeService.getChildAssocs( + webProjectRef, WCMAppModel.ASSOC_WEBUSER, RegexQNamePattern.MATCH_ALL); + for (ChildAssociationRef child : children) + { + NodeRef childRef = child.getChildRef(); + if (fNodeService.getProperty(childRef, WCMAppModel.PROP_WEBUSERNAME).equals(user) && + fNodeService.getProperty(childRef, WCMAppModel.PROP_WEBUSERROLE).equals(ROLE_CONTENT_MANAGER)) { - NodeRef childRef = child.getChildRef(); - if (fNodeService.getType(childRef).equals(WCMAppModel.TYPE_WEBUSER) && - fNodeService.getProperty(childRef, WCMAppModel.PROP_WEBUSERNAME).equals(user) && - fNodeService.getProperty(childRef, WCMAppModel.PROP_WEBUSERROLE).equals("ContentManager")) - { - return true; - } + return true; } } String[] storePath = avmPath.split(":"); @@ -619,7 +657,7 @@ public class AVMLockingServiceImpl implements AVMLockingService */ public List getWebProjects() { - List keys = new ArrayList(); + List keys = new ArrayList(2); keys.add(LOCK_TABLE); keys.add(WEB_PROJECTS); return fAttributeService.getKeys(keys); diff --git a/source/java/org/alfresco/service/cmr/avm/locking/AVMLockingService.java b/source/java/org/alfresco/service/cmr/avm/locking/AVMLockingService.java index 16b0801dce..0adaee9339 100644 --- a/source/java/org/alfresco/service/cmr/avm/locking/AVMLockingService.java +++ b/source/java/org/alfresco/service/cmr/avm/locking/AVMLockingService.java @@ -28,6 +28,8 @@ package org.alfresco.service.cmr.avm.locking; import java.io.Serializable; import java.util.List; +import org.alfresco.service.cmr.repository.NodeRef; + /** * Service to handle AVM locking. * @author britt @@ -123,6 +125,15 @@ public interface AVMLockingService */ public boolean hasAccess(String webProject, String avmPath, String user); + /** + * Is the user allowed to do anything to the given asset, other than read? + * @param webProjectRef The NodeRef to the web project that this path is being checked in. + * @param avmPath A full avmPath + * @param user The name of the user, group, role to check on. + * @return Whether the user has access. + */ + public boolean hasAccess(NodeRef webProjectRef, String avmPath, String user); + /** * Get the names of all the web projects the service knows about. * @return The list of web project names.