Merged BRANCHES/DEV/V4.1-BUG-FIX to HEAD

42280: ALF-16175: Merged PATCHES/V4.0.1 to V4.1-BUG-FIX
      42177: ALF-16096: Repo corruption in MT - clean-up assistance requested
              - abstracted childAuthorityCache put, get and remove into private methods to avoid further mistakes in the future.
              - changed childAuthorityCache  key to be unique per tenant.

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@42290 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Kevin Roast 2012-10-03 09:03:51 +00:00
parent 566b91afd7
commit c9aed8c892

View File

@ -251,7 +251,7 @@ public class AuthorityDAOImpl implements AuthorityDAO, NodeServicePolicies.Befor
throw new AlfrescoRuntimeException("Authorities of the type " + authorityType throw new AlfrescoRuntimeException("Authorities of the type " + authorityType
+ " may not be added to other authorities"); + " may not be added to other authorities");
} }
childAuthorityCache.remove(parentRef); removeCachedChildAuthorities(parentRef);
parentRefs.add(parentRef); parentRefs.add(parentRef);
} }
NodeRef childRef = getAuthorityOrNull(childName); NodeRef childRef = getAuthorityOrNull(childName);
@ -303,6 +303,11 @@ public class AuthorityDAOImpl implements AuthorityDAO, NodeServicePolicies.Befor
authorityLookupCache.put(cacheKey(name), childRef); authorityLookupCache.put(cacheKey(name), childRef);
} }
private NodeRef cacheKey(NodeRef nodeRef)
{
return tenantService.getName(nodeRef);
}
private Pair<String, String> cacheKey(String authorityName) private Pair<String, String> cacheKey(String authorityName)
{ {
String tenantDomain = AuthorityType.getAuthorityType(authorityName) == AuthorityType.USER ? tenantService.getDomain(authorityName) : tenantService.getCurrentUserDomain(); String tenantDomain = AuthorityType.getAuthorityType(authorityName) == AuthorityType.USER ? tenantService.getDomain(authorityName) : tenantService.getCurrentUserDomain();
@ -699,7 +704,7 @@ public class AuthorityDAOImpl implements AuthorityDAO, NodeServicePolicies.Befor
throw new UnknownAuthorityException("An authority was not found for " + childName); throw new UnknownAuthorityException("An authority was not found for " + childName);
} }
nodeService.removeChild(parentRef, childRef); nodeService.removeChild(parentRef, childRef);
childAuthorityCache.remove(parentRef); removeCachedChildAuthorities(parentRef);
if (AuthorityType.getAuthorityType(childName) == AuthorityType.USER) if (AuthorityType.getAuthorityType(childName) == AuthorityType.USER)
{ {
userAuthorityCache.remove(childName); userAuthorityCache.remove(childName);
@ -962,14 +967,14 @@ public class AuthorityDAOImpl implements AuthorityDAO, NodeServicePolicies.Befor
} }
else else
{ {
List<ChildAssociationRef> cars = childAuthorityCache.get(nodeRef); List<ChildAssociationRef> cars = getCachedChildAuthorities(nodeRef);
if (cars == null) if (cars == null)
{ {
cars = nodeService.getChildAssocs(nodeRef, RegexQNamePattern.MATCH_ALL, cars = nodeService.getChildAssocs(nodeRef, RegexQNamePattern.MATCH_ALL,
RegexQNamePattern.MATCH_ALL, false); RegexQNamePattern.MATCH_ALL, false);
if (!cars.isEmpty() && cars.get(0).getTypeQName().equals(ContentModel.ASSOC_MEMBER)) if (!cars.isEmpty() && cars.get(0).getTypeQName().equals(ContentModel.ASSOC_MEMBER))
{ {
childAuthorityCache.put(nodeRef, cars); putCachedChildAuthorities(nodeRef, cars);
} }
} }
@ -992,12 +997,12 @@ public class AuthorityDAOImpl implements AuthorityDAO, NodeServicePolicies.Befor
// Take advantage of the fact that the authority name is on the child association // Take advantage of the fact that the authority name is on the child association
public boolean isAuthorityContained(NodeRef authorityNodeRef, String authorityToFind) public boolean isAuthorityContained(NodeRef authorityNodeRef, String authorityToFind)
{ {
List<ChildAssociationRef> cars = childAuthorityCache.get(authorityNodeRef); List<ChildAssociationRef> cars = getCachedChildAuthorities(authorityNodeRef);
if (cars == null) if (cars == null)
{ {
cars = nodeService.getChildAssocs(authorityNodeRef, RegexQNamePattern.MATCH_ALL, cars = nodeService.getChildAssocs(authorityNodeRef, RegexQNamePattern.MATCH_ALL,
RegexQNamePattern.MATCH_ALL, false); RegexQNamePattern.MATCH_ALL, false);
childAuthorityCache.put(authorityNodeRef, cars); putCachedChildAuthorities(authorityNodeRef, cars);
} }
// Loop over children recursively to find authorityToFind // Loop over children recursively to find authorityToFind
@ -1021,7 +1026,7 @@ public class AuthorityDAOImpl implements AuthorityDAO, NodeServicePolicies.Befor
NodeRef parentRef = car.getParentRef(); NodeRef parentRef = car.getParentRef();
if (dictionaryService.isSubClass(nodeService.getType(parentRef), ContentModel.TYPE_AUTHORITY_CONTAINER)) if (dictionaryService.isSubClass(nodeService.getType(parentRef), ContentModel.TYPE_AUTHORITY_CONTAINER))
{ {
childAuthorityCache.remove(parentRef); removeCachedChildAuthorities(parentRef);
} }
} }
} }
@ -1369,4 +1374,19 @@ public class AuthorityDAOImpl implements AuthorityDAO, NodeServicePolicies.Befor
this.policyComponent.bindClassBehaviour(QName.createQName(NamespaceService.ALFRESCO_URI, "onUpdateProperties"), ContentModel.TYPE_AUTHORITY, new JavaBehaviour( this.policyComponent.bindClassBehaviour(QName.createQName(NamespaceService.ALFRESCO_URI, "onUpdateProperties"), ContentModel.TYPE_AUTHORITY, new JavaBehaviour(
this, "onUpdateProperties")); this, "onUpdateProperties"));
} }
private List<ChildAssociationRef> getCachedChildAuthorities(NodeRef parentNodeRef)
{
return childAuthorityCache.get(cacheKey(parentNodeRef));
}
private void removeCachedChildAuthorities(NodeRef parentNodeRef)
{
childAuthorityCache.remove(cacheKey(parentNodeRef));
}
private void putCachedChildAuthorities(NodeRef parentNodeRef, List<ChildAssociationRef> children)
{
childAuthorityCache.put(cacheKey(parentNodeRef), children);
}
} }