mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-06-16 17:55:15 +00:00
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
This commit is contained in:
parent
e73ce68e8f
commit
e6b0bb96fb
@ -55,7 +55,7 @@
|
|||||||
<subclass name="StringAttributeImpl" proxy="StringAttribute" lazy="false"
|
<subclass name="StringAttributeImpl" proxy="StringAttribute" lazy="false"
|
||||||
discriminator-value="S">
|
discriminator-value="S">
|
||||||
<property name="stringValue" column="string_value" type="string"
|
<property name="stringValue" column="string_value" type="string"
|
||||||
length="512"/>
|
length="1024"/>
|
||||||
</subclass>
|
</subclass>
|
||||||
<!-- A serializable attribute -->
|
<!-- A serializable attribute -->
|
||||||
<subclass name="SerializableAttributeImpl" proxy="SerializableAttribute" lazy="false"
|
<subclass name="SerializableAttributeImpl" proxy="SerializableAttribute" lazy="false"
|
||||||
|
@ -26,10 +26,11 @@
|
|||||||
package org.alfresco.repo.avm.locking;
|
package org.alfresco.repo.avm.locking;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.alfresco.repo.attributes.Attribute;
|
import org.alfresco.repo.attributes.Attribute;
|
||||||
|
import org.alfresco.repo.attributes.ListAttributeValue;
|
||||||
import org.alfresco.repo.attributes.MapAttributeValue;
|
import org.alfresco.repo.attributes.MapAttributeValue;
|
||||||
import org.alfresco.repo.attributes.StringAttributeValue;
|
import org.alfresco.repo.attributes.StringAttributeValue;
|
||||||
import org.alfresco.repo.transaction.RetryingTransactionHelper;
|
import org.alfresco.repo.transaction.RetryingTransactionHelper;
|
||||||
@ -40,7 +41,7 @@ import org.alfresco.service.cmr.avm.AVMExistsException;
|
|||||||
import org.alfresco.service.cmr.avm.AVMNotFoundException;
|
import org.alfresco.service.cmr.avm.AVMNotFoundException;
|
||||||
import org.alfresco.service.cmr.avm.locking.AVMLock;
|
import org.alfresco.service.cmr.avm.locking.AVMLock;
|
||||||
import org.alfresco.service.cmr.avm.locking.AVMLockingService;
|
import org.alfresco.service.cmr.avm.locking.AVMLockingService;
|
||||||
import org.alfresco.util.GUID;
|
import org.alfresco.util.MD5;
|
||||||
import org.alfresco.util.Pair;
|
import org.alfresco.util.Pair;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -116,7 +117,7 @@ public class AVMLockingServiceImpl implements AVMLockingService
|
|||||||
keys.add(WEB_PROJECTS);
|
keys.add(WEB_PROJECTS);
|
||||||
keys.add(webProject);
|
keys.add(webProject);
|
||||||
List<Pair<String, Attribute>> attrs =
|
List<Pair<String, Attribute>> attrs =
|
||||||
fAttributeService.query(keys, new AttrQueryEquals(path));
|
fAttributeService.query(keys, new AttrQueryEquals(MD5.Digest(path.getBytes())));
|
||||||
if (attrs.size() == 0)
|
if (attrs.size() == 0)
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
@ -157,7 +158,7 @@ public class AVMLockingServiceImpl implements AVMLockingService
|
|||||||
{
|
{
|
||||||
return locks;
|
return locks;
|
||||||
}
|
}
|
||||||
for (Attribute entry : userLocks.values())
|
for (Attribute entry : userLocks)
|
||||||
{
|
{
|
||||||
String webProject = entry.get("web_project").getStringValue();
|
String webProject = entry.get("web_project").getStringValue();
|
||||||
String path = entry.get("path").getStringValue();
|
String path = entry.get("path").getStringValue();
|
||||||
@ -180,7 +181,7 @@ public class AVMLockingServiceImpl implements AVMLockingService
|
|||||||
{
|
{
|
||||||
throw new AVMExistsException("Lock Exists: " + keys);
|
throw new AVMExistsException("Lock Exists: " + keys);
|
||||||
}
|
}
|
||||||
fAttributeService.setAttribute(keys, lock.getPath(), lockData);
|
fAttributeService.setAttribute(keys, MD5.Digest(lock.getPath().getBytes()), lockData);
|
||||||
keys.clear();
|
keys.clear();
|
||||||
keys.add(LOCK_TABLE);
|
keys.add(LOCK_TABLE);
|
||||||
keys.add(USERS);
|
keys.add(USERS);
|
||||||
@ -191,13 +192,13 @@ public class AVMLockingServiceImpl implements AVMLockingService
|
|||||||
keys.remove(2);
|
keys.remove(2);
|
||||||
if (userEntry == null)
|
if (userEntry == null)
|
||||||
{
|
{
|
||||||
fAttributeService.setAttribute(keys, user, new MapAttributeValue());
|
fAttributeService.setAttribute(keys, user, new ListAttributeValue());
|
||||||
}
|
}
|
||||||
keys.add(user);
|
keys.add(user);
|
||||||
Attribute entry = new MapAttributeValue();
|
Attribute entry = new MapAttributeValue();
|
||||||
entry.put("web_project", new StringAttributeValue(lock.getWebProject()));
|
entry.put("web_project", new StringAttributeValue(lock.getWebProject()));
|
||||||
entry.put("path", new StringAttributeValue(lock.getPath()));
|
entry.put("path", new StringAttributeValue(lock.getPath()));
|
||||||
fAttributeService.setAttribute(keys, GUID.generate(), entry);
|
fAttributeService.addAttribute(keys, entry);
|
||||||
keys.remove(2);
|
keys.remove(2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -208,18 +209,19 @@ public class AVMLockingServiceImpl implements AVMLockingService
|
|||||||
public void removeLock(String webProject, String path)
|
public void removeLock(String webProject, String path)
|
||||||
{
|
{
|
||||||
path = normalizePath(path);
|
path = normalizePath(path);
|
||||||
|
String pathKey = MD5.Digest(path.getBytes());
|
||||||
List<String> keys = new ArrayList<String>();
|
List<String> keys = new ArrayList<String>();
|
||||||
keys.add(LOCK_TABLE);
|
keys.add(LOCK_TABLE);
|
||||||
keys.add(WEB_PROJECTS);
|
keys.add(WEB_PROJECTS);
|
||||||
keys.add(webProject);
|
keys.add(webProject);
|
||||||
keys.add(path);
|
keys.add(pathKey);
|
||||||
Attribute lockData = fAttributeService.getAttribute(keys);
|
Attribute lockData = fAttributeService.getAttribute(keys);
|
||||||
if (lockData == null)
|
if (lockData == null)
|
||||||
{
|
{
|
||||||
throw new AVMNotFoundException("Lock does not exist: " + webProject + " " + path);
|
throw new AVMNotFoundException("Lock does not exist: " + webProject + " " + path);
|
||||||
}
|
}
|
||||||
keys.remove(3);
|
keys.remove(3);
|
||||||
fAttributeService.removeAttribute(keys, path);
|
fAttributeService.removeAttribute(keys, pathKey);
|
||||||
AVMLock lock = new AVMLock(lockData);
|
AVMLock lock = new AVMLock(lockData);
|
||||||
List<String> userKeys = new ArrayList<String>();
|
List<String> userKeys = new ArrayList<String>();
|
||||||
userKeys.add(LOCK_TABLE);
|
userKeys.add(LOCK_TABLE);
|
||||||
@ -228,13 +230,13 @@ public class AVMLockingServiceImpl implements AVMLockingService
|
|||||||
{
|
{
|
||||||
userKeys.add(user);
|
userKeys.add(user);
|
||||||
Attribute userLocks = fAttributeService.getAttribute(userKeys);
|
Attribute userLocks = fAttributeService.getAttribute(userKeys);
|
||||||
for (Map.Entry<String, Attribute> 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())
|
if (lockInfo.get("web_project").getStringValue().equals(lock.getWebProject())
|
||||||
&& lockInfo.get("path").getStringValue().equals(lock.getPath()))
|
&& lockInfo.get("path").getStringValue().equals(lock.getPath()))
|
||||||
{
|
{
|
||||||
fAttributeService.removeAttribute(userKeys, entry.getKey());
|
fAttributeService.removeAttribute(userKeys, i);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -285,26 +287,25 @@ public class AVMLockingServiceImpl implements AVMLockingService
|
|||||||
*/
|
*/
|
||||||
public void removeWebProject(String webProject)
|
public void removeWebProject(String webProject)
|
||||||
{
|
{
|
||||||
List<AVMLock> locks = getWebProjectLocks(webProject);
|
|
||||||
List<String> userKeys = new ArrayList<String>();
|
List<String> userKeys = new ArrayList<String>();
|
||||||
userKeys.add(LOCK_TABLE);
|
userKeys.add(LOCK_TABLE);
|
||||||
userKeys.add(USERS);
|
userKeys.add(USERS);
|
||||||
for (AVMLock lock : locks)
|
List<String> users = fAttributeService.getKeys(userKeys);
|
||||||
|
for (String user : users)
|
||||||
{
|
{
|
||||||
for (String user : lock.getOwners())
|
userKeys.add(user);
|
||||||
|
Attribute userLocks = fAttributeService.getAttribute(userKeys);
|
||||||
|
Iterator<Attribute> iter = userLocks.iterator();
|
||||||
|
while (iter.hasNext())
|
||||||
{
|
{
|
||||||
userKeys.add(user);
|
Attribute lockInfo = iter.next();
|
||||||
Attribute userLocks = fAttributeService.getAttribute(userKeys);
|
if (lockInfo.get("web_project").getStringValue().equals(webProject))
|
||||||
for (Map.Entry<String, Attribute> entry : userLocks.entrySet())
|
|
||||||
{
|
{
|
||||||
if (entry.getValue().get("web_project").getStringValue().equals(lock.getWebProject()) &&
|
iter.remove();
|
||||||
entry.getValue().get("path").getStringValue().equals(lock.getPath()))
|
|
||||||
{
|
|
||||||
fAttributeService.removeAttribute(userKeys, entry.getKey());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
userKeys.remove(2);
|
|
||||||
}
|
}
|
||||||
|
userKeys.remove(2);
|
||||||
|
fAttributeService.setAttribute(userKeys, user, userLocks);
|
||||||
}
|
}
|
||||||
List<String> keys = new ArrayList<String>();
|
List<String> keys = new ArrayList<String>();
|
||||||
keys.add(LOCK_TABLE);
|
keys.add(LOCK_TABLE);
|
||||||
|
@ -110,6 +110,7 @@ public class AVMLockingServiceTest extends TestCase
|
|||||||
assertEquals(1, fService.getUsersLocks("Buffy").size());
|
assertEquals(1, fService.getUsersLocks("Buffy").size());
|
||||||
assertEquals(1, fService.getWebProjectLocks("alfresco").size());
|
assertEquals(1, fService.getWebProjectLocks("alfresco").size());
|
||||||
fService.removeWebProject("alfresco");
|
fService.removeWebProject("alfresco");
|
||||||
|
System.out.println(fAttributeService.getAttribute(".avm_lock_table"));
|
||||||
assertEquals(0, fService.getUsersLocks("Spike").size());
|
assertEquals(0, fService.getUsersLocks("Spike").size());
|
||||||
assertEquals(0, fService.getUsersLocks("Buffy").size());
|
assertEquals(0, fService.getUsersLocks("Buffy").size());
|
||||||
assertEquals(0, fService.getUsersLocks("Willow").size());
|
assertEquals(0, fService.getUsersLocks("Willow").size());
|
||||||
|
@ -30,7 +30,8 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.alfresco.repo.attributes.Attribute;
|
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.MapAttribute;
|
||||||
import org.alfresco.repo.attributes.MapAttributeValue;
|
import org.alfresco.repo.attributes.MapAttributeValue;
|
||||||
import org.alfresco.repo.attributes.StringAttributeValue;
|
import org.alfresco.repo.attributes.StringAttributeValue;
|
||||||
@ -83,6 +84,15 @@ public class AVMLock implements Serializable
|
|||||||
fWebProject = webProject;
|
fWebProject = webProject;
|
||||||
fStore = store;
|
fStore = store;
|
||||||
fPath = path;
|
fPath = path;
|
||||||
|
while (fPath.startsWith("/"))
|
||||||
|
{
|
||||||
|
fPath = fPath.substring(1);
|
||||||
|
}
|
||||||
|
while (fPath.endsWith("/"))
|
||||||
|
{
|
||||||
|
fPath = fPath.substring(0, fPath.length() - 1);
|
||||||
|
}
|
||||||
|
fPath = fPath.replaceAll("/+", "/");
|
||||||
fType = type;
|
fType = type;
|
||||||
fOwners = owners;
|
fOwners = owners;
|
||||||
}
|
}
|
||||||
@ -92,7 +102,11 @@ public class AVMLock implements Serializable
|
|||||||
{
|
{
|
||||||
fPath = lockData.get(PATH).getStringValue();
|
fPath = lockData.get(PATH).getStringValue();
|
||||||
fStore = lockData.get(STORE).getStringValue();
|
fStore = lockData.get(STORE).getStringValue();
|
||||||
fOwners = new ArrayList<String>(lockData.get(OWNERS).keySet());
|
fOwners = new ArrayList<String>();
|
||||||
|
for (Attribute owner : lockData.get(OWNERS))
|
||||||
|
{
|
||||||
|
fOwners.add(owner.getStringValue());
|
||||||
|
}
|
||||||
fType = AVMLockingService.Type.valueOf(lockData.get(TYPE).getStringValue());
|
fType = AVMLockingService.Type.valueOf(lockData.get(TYPE).getStringValue());
|
||||||
fWebProject = lockData.get(WEBPROJECT).getStringValue();
|
fWebProject = lockData.get(WEBPROJECT).getStringValue();
|
||||||
}
|
}
|
||||||
@ -104,11 +118,11 @@ public class AVMLock implements Serializable
|
|||||||
lockData.put(STORE, new StringAttributeValue(fStore));
|
lockData.put(STORE, new StringAttributeValue(fStore));
|
||||||
lockData.put(TYPE, new StringAttributeValue(fType.name()));
|
lockData.put(TYPE, new StringAttributeValue(fType.name()));
|
||||||
lockData.put(WEBPROJECT, new StringAttributeValue(fWebProject));
|
lockData.put(WEBPROJECT, new StringAttributeValue(fWebProject));
|
||||||
MapAttribute owners = new MapAttributeValue();
|
ListAttribute owners = new ListAttributeValue();
|
||||||
for (String owner : fOwners)
|
for (String owner : fOwners)
|
||||||
{
|
{
|
||||||
// The value is a dummy.
|
// The value is a dummy.
|
||||||
owners.put(owner, new BooleanAttributeValue(true));
|
owners.add(new StringAttributeValue(owner));
|
||||||
}
|
}
|
||||||
lockData.put(OWNERS, owners);
|
lockData.put(OWNERS, owners);
|
||||||
return lockData;
|
return lockData;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user