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;