Merged V3.4-BUG-FIX to HEAD

29414: Fix for ALF-7437: CMIS query doesn't return any result when documents are created with a different lang
   and fixes duplicate ALF-8598 : Web QS - Dynamic asset collection failing for non en_US locale
   29445: ALF-9023: Cannot search/retrieve special characters of "???".
   - avoid requirement to escape unicode characters from classification "number, other" and others e.g. name:??? will generate a query (even ff it does not work due to tokenisation)
   29470: ALF-9632 "CMIS query fails if model name contains numbers" fix
      - Ensure CMIS query types are ISO9075 encoded
   29474: ALF-9668 / ALF-6434: Fix LDAP sync regression
   - On an incremental sync when there were no group->group association changes, new groups were getting ignored!


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@29475 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Dave Ward
2011-08-01 14:55:28 +00:00
parent 440883a670
commit e93b7a3aa5
3 changed files with 25 additions and 17 deletions

View File

@@ -41,6 +41,7 @@ import org.alfresco.repo.dictionary.DictionaryListener;
import org.alfresco.repo.tenant.TenantService; import org.alfresco.repo.tenant.TenantService;
import org.alfresco.service.cmr.dictionary.DictionaryService; import org.alfresco.service.cmr.dictionary.DictionaryService;
import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.QName;
import org.alfresco.util.ISO9075;
import org.springframework.extensions.surf.util.AbstractLifecycleBean; import org.springframework.extensions.surf.util.AbstractLifecycleBean;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
@@ -301,7 +302,7 @@ public abstract class CMISAbstractDictionaryService extends AbstractLifecycleBea
*/ */
public CMISTypeDefinition findTypeByQueryName(String queryName) public CMISTypeDefinition findTypeByQueryName(String queryName)
{ {
CMISTypeDefinition typeDef = getRegistry().typeDefsByQueryName.get(queryName.toLowerCase()); CMISTypeDefinition typeDef = getRegistry().typeDefsByQueryName.get(ISO9075.encodeSQL(queryName.toLowerCase()));
return typeDef; return typeDef;
} }
@@ -311,7 +312,7 @@ public abstract class CMISAbstractDictionaryService extends AbstractLifecycleBea
*/ */
public CMISPropertyDefinition findPropertyByQueryName(String queryName) public CMISPropertyDefinition findPropertyByQueryName(String queryName)
{ {
CMISPropertyDefinition propertyDef = getRegistry().propDefsByQueryName.get(queryName.toLowerCase()); CMISPropertyDefinition propertyDef = getRegistry().propDefsByQueryName.get(ISO9075.encodeSQL(queryName.toLowerCase()));
return propertyDef; return propertyDef;
} }

View File

@@ -788,9 +788,6 @@ public class ChainingUserRegistrySynchronizer extends AbstractLifecycleBean impl
groupDisplayName = ChainingUserRegistrySynchronizer.this.authorityService.getShortName(groupName); groupDisplayName = ChainingUserRegistrySynchronizer.this.authorityService.getShortName(groupName);
} }
// Add an entry for the parent itself, in case it is a root group
recordParentAssociationDeletion(groupName, null);
// Divide the child associations into person and group associations, dealing with case sensitivity // Divide the child associations into person and group associations, dealing with case sensitivity
Set<String> newChildPersons = newPersonSet(); Set<String> newChildPersons = newPersonSet();
Set<String> newChildGroups = new TreeSet<String>(); Set<String> newChildGroups = new TreeSet<String>();
@@ -821,7 +818,7 @@ public class ChainingUserRegistrySynchronizer extends AbstractLifecycleBean impl
{ {
if (!newChildPersons.remove(child)) if (!newChildPersons.remove(child))
{ {
// Make sure each child features as a key in the creation map // Make sure each person with association changes features as a key in the creation map
recordParentAssociationCreation(child, null); recordParentAssociationCreation(child, null);
recordParentAssociationDeletion(child, groupName); recordParentAssociationDeletion(child, groupName);
} }
@@ -838,6 +835,8 @@ public class ChainingUserRegistrySynchronizer extends AbstractLifecycleBean impl
// Mark as created if new // Mark as created if new
else else
{ {
// Make sure each group to be created features in the association deletion map (as these are handled in the same phase)
recordParentAssociationDeletion(groupName, null);
this.groupsToCreate.put(groupName, groupDisplayName); this.groupsToCreate.put(groupName, groupDisplayName);
} }
@@ -1092,7 +1091,7 @@ public class ChainingUserRegistrySynchronizer extends AbstractLifecycleBean impl
public void processGroups(UserRegistry userRegistry, boolean allowDeletions, boolean splitTxns) public void processGroups(UserRegistry userRegistry, boolean allowDeletions, boolean splitTxns)
{ {
// If we got back some groups, we have to cross reference them with the set of known authorities // If we got back some groups, we have to cross reference them with the set of known authorities
if (allowDeletions || !this.groupParentAssocsToCreate.isEmpty()) if (allowDeletions || !this.groupParentAssocsToDelete.isEmpty())
{ {
final Set<String> allZonePersons = newPersonSet(); final Set<String> allZonePersons = newPersonSet();
final Set<String> allZoneGroups = new TreeSet<String>(); final Set<String> allZoneGroups = new TreeSet<String>();
@@ -1141,8 +1140,9 @@ public class ChainingUserRegistrySynchronizer extends AbstractLifecycleBean impl
} }
// Prune the group associations now that we have complete information // Prune the group associations now that we have complete information
logRetainParentAssociations(this.groupParentAssocsToCreate, allZoneGroups); this.groupParentAssocsToCreate.keySet().retainAll(allZoneGroups);
this.groupParentAssocsToDelete.keySet().retainAll(allZoneGroups); logRetainParentAssociations(this.groupParentAssocsToDelete, allZoneGroups);
this.finalGroupChildAssocs.keySet().retainAll(allZoneGroups);
// Pruning person associations will have to wait until we have passed over all persons and built up // Pruning person associations will have to wait until we have passed over all persons and built up
// this set // this set

View File

@@ -241,7 +241,7 @@ public class ChainingUserRegistrySynchronizerTest extends TestCase
* *
* Z2 * Z2
* G2 - U1, U3, U4, U6 * G2 - U1, U3, U4, U6
* G6 - U3, U4, G7 * G6 - U3, U4, G7, G8 - U4, U8
* </pre> * </pre>
* *
* @throws Exception * @throws Exception
@@ -256,15 +256,17 @@ public class ChainingUserRegistrySynchronizerTest extends TestCase
newPerson("U1", "changeofemail@alfresco.com"), newPerson("U6"), newPerson("U7") newPerson("U1", "changeofemail@alfresco.com"), newPerson("U6"), newPerson("U7")
}, new NodeDescription[] }, new NodeDescription[]
{ {
newGroup("G1", "U1", "U6", "UDangling", "G2"), newGroup("G2", "U1", "GDangling", "G1"), // test cyclic G2 <-> G1 newGroup("G1", "U1", "U6", "UDangling", "G2"), newGroup("G2", "U1", "GDangling", "G1"), // test cyclic G2
// <-> G1
newGroupWithDisplayName("G5", "Amazing Group", "U6", "U7", "G4") newGroupWithDisplayName("G5", "Amazing Group", "U6", "U7", "G4")
}); });
this.applicationContextManager.updateZone("Z2", new NodeDescription[] this.applicationContextManager.updateZone("Z2", new NodeDescription[]
{ {
newPerson("U1", "shouldbeignored@alfresco.com"), newPerson("U5", "u5email@alfresco.com"), newPerson("U6") newPerson("U1", "shouldbeignored@alfresco.com"), newPerson("U5", "u5email@alfresco.com"), newPerson("U6"),
newPerson("U8")
}, new NodeDescription[] }, new NodeDescription[]
{ {
newGroup("G2", "U1", "U3", "U4", "U6"), newGroup("G7") newGroup("G2", "U1", "U3", "U4", "U6"), newGroup("G7"), newGroup("G8", "U4", "U8")
}); });
this.retryingTransactionHelper.doInTransaction(new RetryingTransactionCallback<Object>() this.retryingTransactionHelper.doInTransaction(new RetryingTransactionCallback<Object>()
{ {
@@ -289,8 +291,10 @@ public class ChainingUserRegistrySynchronizerTest extends TestCase
assertExists("Z2", "U4"); assertExists("Z2", "U4");
assertExists("Z2", "U5"); assertExists("Z2", "U5");
assertEmailEquals("U5", "u5email@alfresco.com"); assertEmailEquals("U5", "u5email@alfresco.com");
assertExists("Z2", "U8");
assertExists("Z2", "G6", "U3", "U4", "G7"); assertExists("Z2", "G6", "U3", "U4", "G7");
assertExists("Z2", "G7"); assertExists("Z2", "G7");
assertExists("Z2", "G8", "U4", "U8");
return null; return null;
} }
}); });
@@ -310,8 +314,9 @@ public class ChainingUserRegistrySynchronizerTest extends TestCase
* G6 - u3 * G6 - u3
* *
* Z2 * Z2
* G2 - U1, U3, U6 * G2 - U1
* G6 - U3, G7 * G6 - U3, G7
* G8 - U1, U8
* </pre> * </pre>
* *
* @throws Exception * @throws Exception
@@ -329,11 +334,11 @@ public class ChainingUserRegistrySynchronizerTest extends TestCase
newGroup("G6", "u3") newGroup("G6", "u3")
}), new MockUserRegistry("Z2", new NodeDescription[] }), new MockUserRegistry("Z2", new NodeDescription[]
{ {
newPerson("U1", "somenewemail@alfresco.com"), newPerson("U3"), newPerson("U6") newPerson("U1", "somenewemail@alfresco.com"), newPerson("U3"), newPerson("U6"), newPerson("U8"),
}, new NodeDescription[] }, new NodeDescription[]
{ {
newGroup("G2", "U1", "U3", "U4", "U6"), newGroup("G6", "U3", "U4", "G7"), newGroup("G2", "U1", "U3", "U4", "U6"), newGroup("G6", "U3", "U4", "G7"),
newGroupWithDisplayName("G7", "Late Arrival", "U4", "U5") newGroupWithDisplayName("G7", "Late Arrival", "U4", "U5"), newGroup("G8", "U1", "U8")
})); }));
this.synchronizer.synchronize(true, true, true); this.synchronizer.synchronize(true, true, true);
this.retryingTransactionHelper.doInTransaction(new RetryingTransactionCallback<Object>() this.retryingTransactionHelper.doInTransaction(new RetryingTransactionCallback<Object>()
@@ -354,8 +359,10 @@ public class ChainingUserRegistrySynchronizerTest extends TestCase
assertEmailEquals("U1", "somenewemail@alfresco.com"); assertEmailEquals("U1", "somenewemail@alfresco.com");
assertNotExists("U4"); assertNotExists("U4");
assertNotExists("U5"); assertNotExists("U5");
assertExists("Z2", "U8");
assertExists("Z2", "G7"); assertExists("Z2", "G7");
assertGroupDisplayNameEquals("G7", "Late Arrival"); assertGroupDisplayNameEquals("G7", "Late Arrival");
assertExists("Z2", "G8", "U1", "U8");
return null; return null;
} }
}, false, true); }, false, true);