Merged V4.0-BUG-FIX to HEAD

37502: Merged V3.4-BUG-FIX to V4.0-BUG-FIX (RECORD ONLY)
      37159: ALF-12541: Fix EOL.
      37172: Merged HEAD to V3.4-BUG-FIX:
         33880: ALF-12777 / ALF-14259: MMT should not install AMPs which override pre-existing files in the war file, unless -force is provided. The MMT is moving toward more of a validation phase (checks things, calculate changes) then an execution phase (makes the changes).
   37526: ALF-11027: update URLs to our Maven repos
   37554: Follow-on fix to ALF-9661 - do not fire update rule (onDeleteAssociation) if node also no longer exists
   - will fail with concurrency/retry error (=> "Attempt to follow reference ... to deleted node")
   - fix targeted for 4.0.3 (requires merge from V4.0-BUG-FIX to V4.0)
   - required by CloudSync (ALF-13941) - eg. last target( SSMN) also deletes source (SSD)
   37564: Pull out some bits to constants, so downstream classes can more easily configure themselves
   37571: ALF-14055: Merged V3.4-BUG-FIX to V4.0-BUG-FIX
      37570: ALF-13751: Catastrophic indexing performance when a repository containing 60,000 sites, all containing the admin user is synced with an LDAP server containing an admin user
         - made LDAP sync only apply incremental changes to zones (rather than removing all and adding all) and made it preserve the AUTH.ALF zone if it is already there, as that contains all the site group paths


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@37572 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Dave Ward
2012-06-08 17:17:36 +00:00
parent 30bd665d3f
commit 193546cc47
3 changed files with 71 additions and 42 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
* Copyright (C) 2005-2012 Alfresco Software Limited.
*
* This file is part of Alfresco
*
@@ -34,45 +34,49 @@ public class SingleAssocRefPolicyRuleTrigger extends RuleTriggerAbstractBase
{
private static Log logger = LogFactory.getLog(OnPropertyUpdateRuleTrigger.class);
private String policyNamespace = NamespaceService.ALFRESCO_URI;
private String policyName;
public void setPolicyNamespace(String policyNamespace)
{
this.policyNamespace = policyNamespace;
}
public void setPolicyName(String policyName)
{
this.policyName = policyName;
}
/**
* @see org.alfresco.repo.rule.ruletrigger.RuleTrigger#registerRuleTrigger()
*/
public void registerRuleTrigger()
{
PropertyCheck.mandatory(this, "policyNamespace", policyNamespace);
private String policyNamespace = NamespaceService.ALFRESCO_URI;
private String policyName;
public void setPolicyNamespace(String policyNamespace)
{
this.policyNamespace = policyNamespace;
}
public void setPolicyName(String policyName)
{
this.policyName = policyName;
}
/**
* @see org.alfresco.repo.rule.ruletrigger.RuleTrigger#registerRuleTrigger()
*/
public void registerRuleTrigger()
{
PropertyCheck.mandatory(this, "policyNamespace", policyNamespace);
PropertyCheck.mandatory(this, "policyName", policyName);
this.policyComponent.bindAssociationBehaviour(
QName.createQName(this.policyNamespace, this.policyName),
this,
new JavaBehaviour(this, "policyBehaviour"));
}
public void policyBehaviour(AssociationRef assocRef)
this.policyComponent.bindAssociationBehaviour(
QName.createQName(this.policyNamespace, this.policyName),
this,
new JavaBehaviour(this, "policyBehaviour"));
}
public void policyBehaviour(AssociationRef assocRef)
{
NodeRef nodeRef = assocRef.getSourceRef();
List<ChildAssociationRef> parentsAssocRefs = this.nodeService.getParentAssocs(nodeRef);
for (ChildAssociationRef parentAssocRef : parentsAssocRefs)
if (nodeService.exists(nodeRef))
{
triggerRules(parentAssocRef.getParentRef(), nodeRef);
if (logger.isDebugEnabled() == true)
List<ChildAssociationRef> parentsAssocRefs = this.nodeService.getParentAssocs(nodeRef);
for (ChildAssociationRef parentAssocRef : parentsAssocRefs)
{
logger.debug(
"OnUpdateAssoc rule triggered (parent); " +
"nodeRef=" + parentAssocRef.getParentRef());
triggerRules(parentAssocRef.getParentRef(), nodeRef);
if (logger.isDebugEnabled() == true)
{
logger.debug(
"OnUpdateAssoc rule triggered (parent); " +
"nodeRef=" + parentAssocRef.getParentRef());
}
}
}
}

View File

@@ -947,7 +947,7 @@ public class ADMLuceneIndexerImpl extends AbstractLuceneIndexerImpl<NodeRef> imp
}
// Only process 'containers' - not leaves
if (getCachedChildren(childAssociationsSinceFlush, nodeRef).isEmpty())
if (getCachedChildren(childAssociationsSinceFlush, nodeRef, cascade).isEmpty())
{
continue;
}
@@ -987,7 +987,7 @@ public class ADMLuceneIndexerImpl extends AbstractLuceneIndexerImpl<NodeRef> imp
if (cascade)
{
List<Path> childPaths = new LinkedList<Path>();
for (ChildAssociationRef childRef : getCachedChildren(childAssociationsSinceFlush, nodeRef))
for (ChildAssociationRef childRef : getCachedChildren(childAssociationsSinceFlush, nodeRef, cascade))
{
childPaths.add(new Path().append(path).append(new Path.ChildAssocElement(childRef)));
}
@@ -998,14 +998,14 @@ public class ADMLuceneIndexerImpl extends AbstractLuceneIndexerImpl<NodeRef> imp
}
private List<ChildAssociationRef> getCachedChildren(
Map<NodeRef, List<ChildAssociationRef>> childAssociationsSinceFlush, NodeRef nodeRef)
Map<NodeRef, List<ChildAssociationRef>> childAssociationsSinceFlush, NodeRef nodeRef, boolean bulkLoad)
{
List <ChildAssociationRef> children = childAssociationsSinceFlush.get(nodeRef);
// Cache the children in case there are many paths to the same node
if (children == null)
{
children = nodeService.getChildAssocs(nodeRef, RegexQNamePattern.MATCH_ALL, RegexQNamePattern.MATCH_ALL, false);
children = nodeService.getChildAssocs(nodeRef, RegexQNamePattern.MATCH_ALL, RegexQNamePattern.MATCH_ALL, bulkLoad);
for (ChildAssociationRef childRef : children)
{
// We don't want index numbers in generated paths

View File

@@ -1671,9 +1671,7 @@ public class ChainingUserRegistrySynchronizer extends AbstractLifecycleBean impl
+ "'. This user will in future be assumed to originate from user registry '" + zone
+ "'.");
}
ChainingUserRegistrySynchronizer.this.authorityService.removeAuthorityFromZones(personName,
zones);
ChainingUserRegistrySynchronizer.this.authorityService.addAuthorityToZones(personName, zoneSet);
updateAuthorityZones(personName, zones, zoneSet);
ChainingUserRegistrySynchronizer.this.personService.setPersonProperties(personName,
personProperties, false);
}
@@ -1875,6 +1873,33 @@ public class ChainingUserRegistrySynchronizer extends AbstractLifecycleBean impl
return zones;
}
/**
* Modifies an authority's zone set from oldZones to newZones in the most efficient manner (avoiding unnecessary
* reindexing cost).
*
* @param authorityName
* @param oldZones
* @param newZones
*/
private void updateAuthorityZones(String authorityName, Set<String> oldZones, final Set<String> newZones)
{
Set<String> zonesToRemove = new HashSet<String>(oldZones);
zonesToRemove.removeAll(newZones);
// Let's keep the authority in the alfresco auth zone if it was already there. Otherwise we may have to
// regenerate all paths to this authority from site groups, which could be very expensive!
zonesToRemove.remove(AuthorityService.ZONE_AUTH_ALFRESCO);
if (!zonesToRemove.isEmpty())
{
this.authorityService.removeAuthorityFromZones(authorityName, zonesToRemove);
}
Set<String> zonesToAdd = new HashSet<String>(newZones);
zonesToAdd.removeAll(oldZones);
if (!zonesToAdd.isEmpty())
{
this.authorityService.addAuthorityToZones(authorityName, zonesToAdd);
}
}
/*
* (non-Javadoc)
* @seeorg.springframework.extensions.surf.util.AbstractLifecycleBean#onBootstrap(org.springframework.context.