From e6b0bb96fbc371d9c43ef4896567d25042f7f94c Mon Sep 17 00:00:00 2001 From: Britt Park Date: Thu, 26 Apr 2007 18:35:59 +0000 Subject: [PATCH] Reworked AVMLockingService to use lists where appropriate. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@5567 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../attributes/hibernate/Attributes.hbm.xml | 2 +- .../avm/locking/AVMLockingServiceImpl.java | 49 ++++++++++--------- .../avm/locking/AVMLockingServiceTest.java | 1 + .../service/cmr/avm/locking/AVMLock.java | 22 +++++++-- 4 files changed, 45 insertions(+), 29 deletions(-) diff --git a/source/java/org/alfresco/repo/attributes/hibernate/Attributes.hbm.xml b/source/java/org/alfresco/repo/attributes/hibernate/Attributes.hbm.xml index 4e306cbadc..2503d115bd 100644 --- a/source/java/org/alfresco/repo/attributes/hibernate/Attributes.hbm.xml +++ b/source/java/org/alfresco/repo/attributes/hibernate/Attributes.hbm.xml @@ -55,7 +55,7 @@ + length="1024"/> > attrs = - fAttributeService.query(keys, new AttrQueryEquals(path)); + fAttributeService.query(keys, new AttrQueryEquals(MD5.Digest(path.getBytes()))); if (attrs.size() == 0) { return null; @@ -157,7 +158,7 @@ public class AVMLockingServiceImpl implements AVMLockingService { return locks; } - for (Attribute entry : userLocks.values()) + for (Attribute entry : userLocks) { String webProject = entry.get("web_project").getStringValue(); String path = entry.get("path").getStringValue(); @@ -180,7 +181,7 @@ public class AVMLockingServiceImpl implements AVMLockingService { throw new AVMExistsException("Lock Exists: " + keys); } - fAttributeService.setAttribute(keys, lock.getPath(), lockData); + fAttributeService.setAttribute(keys, MD5.Digest(lock.getPath().getBytes()), lockData); keys.clear(); keys.add(LOCK_TABLE); keys.add(USERS); @@ -191,13 +192,13 @@ public class AVMLockingServiceImpl implements AVMLockingService keys.remove(2); if (userEntry == null) { - fAttributeService.setAttribute(keys, user, new MapAttributeValue()); + fAttributeService.setAttribute(keys, user, new ListAttributeValue()); } keys.add(user); Attribute entry = new MapAttributeValue(); entry.put("web_project", new StringAttributeValue(lock.getWebProject())); entry.put("path", new StringAttributeValue(lock.getPath())); - fAttributeService.setAttribute(keys, GUID.generate(), entry); + fAttributeService.addAttribute(keys, entry); keys.remove(2); } } @@ -208,18 +209,19 @@ public class AVMLockingServiceImpl implements AVMLockingService public void removeLock(String webProject, String path) { path = normalizePath(path); + String pathKey = MD5.Digest(path.getBytes()); List keys = new ArrayList(); keys.add(LOCK_TABLE); keys.add(WEB_PROJECTS); keys.add(webProject); - keys.add(path); + keys.add(pathKey); Attribute lockData = fAttributeService.getAttribute(keys); if (lockData == null) { throw new AVMNotFoundException("Lock does not exist: " + webProject + " " + path); } keys.remove(3); - fAttributeService.removeAttribute(keys, path); + fAttributeService.removeAttribute(keys, pathKey); AVMLock lock = new AVMLock(lockData); List userKeys = new ArrayList(); userKeys.add(LOCK_TABLE); @@ -228,13 +230,13 @@ public class AVMLockingServiceImpl implements AVMLockingService { userKeys.add(user); Attribute userLocks = fAttributeService.getAttribute(userKeys); - for (Map.Entry entry : userLocks.entrySet()) + for (int i = 0; i < userLocks.size(); i++) { - Attribute lockInfo = entry.getValue(); + Attribute lockInfo = userLocks.get(i); if (lockInfo.get("web_project").getStringValue().equals(lock.getWebProject()) && lockInfo.get("path").getStringValue().equals(lock.getPath())) { - fAttributeService.removeAttribute(userKeys, entry.getKey()); + fAttributeService.removeAttribute(userKeys, i); break; } } @@ -285,26 +287,25 @@ public class AVMLockingServiceImpl implements AVMLockingService */ public void removeWebProject(String webProject) { - List locks = getWebProjectLocks(webProject); List userKeys = new ArrayList(); userKeys.add(LOCK_TABLE); userKeys.add(USERS); - for (AVMLock lock : locks) + List users = fAttributeService.getKeys(userKeys); + for (String user : users) { - for (String user : lock.getOwners()) + userKeys.add(user); + Attribute userLocks = fAttributeService.getAttribute(userKeys); + Iterator iter = userLocks.iterator(); + while (iter.hasNext()) { - userKeys.add(user); - Attribute userLocks = fAttributeService.getAttribute(userKeys); - for (Map.Entry entry : userLocks.entrySet()) + Attribute lockInfo = iter.next(); + if (lockInfo.get("web_project").getStringValue().equals(webProject)) { - if (entry.getValue().get("web_project").getStringValue().equals(lock.getWebProject()) && - entry.getValue().get("path").getStringValue().equals(lock.getPath())) - { - fAttributeService.removeAttribute(userKeys, entry.getKey()); - } + iter.remove(); } - userKeys.remove(2); } + userKeys.remove(2); + fAttributeService.setAttribute(userKeys, user, userLocks); } List keys = new ArrayList(); keys.add(LOCK_TABLE); diff --git a/source/java/org/alfresco/repo/avm/locking/AVMLockingServiceTest.java b/source/java/org/alfresco/repo/avm/locking/AVMLockingServiceTest.java index 05f07c4568..13cc8e37bf 100644 --- a/source/java/org/alfresco/repo/avm/locking/AVMLockingServiceTest.java +++ b/source/java/org/alfresco/repo/avm/locking/AVMLockingServiceTest.java @@ -110,6 +110,7 @@ public class AVMLockingServiceTest extends TestCase assertEquals(1, fService.getUsersLocks("Buffy").size()); assertEquals(1, fService.getWebProjectLocks("alfresco").size()); fService.removeWebProject("alfresco"); + System.out.println(fAttributeService.getAttribute(".avm_lock_table")); assertEquals(0, fService.getUsersLocks("Spike").size()); assertEquals(0, fService.getUsersLocks("Buffy").size()); assertEquals(0, fService.getUsersLocks("Willow").size()); diff --git a/source/java/org/alfresco/service/cmr/avm/locking/AVMLock.java b/source/java/org/alfresco/service/cmr/avm/locking/AVMLock.java index e21d7f840d..fb22d9fd27 100644 --- a/source/java/org/alfresco/service/cmr/avm/locking/AVMLock.java +++ b/source/java/org/alfresco/service/cmr/avm/locking/AVMLock.java @@ -30,7 +30,8 @@ import java.util.ArrayList; import java.util.List; import org.alfresco.repo.attributes.Attribute; -import org.alfresco.repo.attributes.BooleanAttributeValue; +import org.alfresco.repo.attributes.ListAttribute; +import org.alfresco.repo.attributes.ListAttributeValue; import org.alfresco.repo.attributes.MapAttribute; import org.alfresco.repo.attributes.MapAttributeValue; import org.alfresco.repo.attributes.StringAttributeValue; @@ -83,6 +84,15 @@ public class AVMLock implements Serializable fWebProject = webProject; fStore = store; fPath = path; + while (fPath.startsWith("/")) + { + fPath = fPath.substring(1); + } + while (fPath.endsWith("/")) + { + fPath = fPath.substring(0, fPath.length() - 1); + } + fPath = fPath.replaceAll("/+", "/"); fType = type; fOwners = owners; } @@ -92,7 +102,11 @@ public class AVMLock implements Serializable { fPath = lockData.get(PATH).getStringValue(); fStore = lockData.get(STORE).getStringValue(); - fOwners = new ArrayList(lockData.get(OWNERS).keySet()); + fOwners = new ArrayList(); + for (Attribute owner : lockData.get(OWNERS)) + { + fOwners.add(owner.getStringValue()); + } fType = AVMLockingService.Type.valueOf(lockData.get(TYPE).getStringValue()); fWebProject = lockData.get(WEBPROJECT).getStringValue(); } @@ -104,11 +118,11 @@ public class AVMLock implements Serializable lockData.put(STORE, new StringAttributeValue(fStore)); lockData.put(TYPE, new StringAttributeValue(fType.name())); lockData.put(WEBPROJECT, new StringAttributeValue(fWebProject)); - MapAttribute owners = new MapAttributeValue(); + ListAttribute owners = new ListAttributeValue(); for (String owner : fOwners) { // The value is a dummy. - owners.put(owner, new BooleanAttributeValue(true)); + owners.add(new StringAttributeValue(owner)); } lockData.put(OWNERS, owners); return lockData;