Author: bdaw
Date: 2009-05-09 17:28:54 -0400 (Sat, 09 May 2009)
New Revision: 488
Modified:
idm/trunk/idm-core/src/main/java/org/jboss/identity/idm/impl/api/IdentitySearchCriteriaImpl.java
idm/trunk/idm-core/src/main/java/org/jboss/identity/idm/impl/api/query/AbstractQueryExecutor.java
idm/trunk/idm-core/src/main/java/org/jboss/identity/idm/impl/api/query/GroupQueryExecutorImpl.java
idm/trunk/idm-core/src/main/java/org/jboss/identity/idm/impl/api/query/UserQueryExecutorImpl.java
idm/trunk/idm-core/src/main/java/org/jboss/identity/idm/impl/api/session/managers/RelationshipManagerImpl.java
idm/trunk/idm-testsuite/src/test/java/org/jboss/identity/idm/impl/api/APILDAPTestCase.java
idm/trunk/idm-testsuite/src/test/java/org/jboss/identity/idm/impl/api/APITestCase.java
idm/trunk/idm-testsuite/src/test/java/org/jboss/identity/idm/impl/api/RelationshipManagerTest.java
idm/trunk/integration/jboss5/pom.xml
idm/trunk/integration/jboss5/src/main/resources/assembly.xml
Log:
cascade search impl for findAssociatedUsers and findAssociatedGroups
Modified:
idm/trunk/idm-core/src/main/java/org/jboss/identity/idm/impl/api/IdentitySearchCriteriaImpl.java
===================================================================
---
idm/trunk/idm-core/src/main/java/org/jboss/identity/idm/impl/api/IdentitySearchCriteriaImpl.java 2009-05-09
15:10:05 UTC (rev 487)
+++
idm/trunk/idm-core/src/main/java/org/jboss/identity/idm/impl/api/IdentitySearchCriteriaImpl.java 2009-05-09
21:28:54 UTC (rev 488)
@@ -25,10 +25,24 @@
import org.jboss.identity.idm.api.IdentitySearchCriteria;
import org.jboss.identity.idm.api.SortOrder;
import org.jboss.identity.idm.api.UnsupportedCriterium;
+import org.jboss.identity.idm.api.IdentityType;
+import org.jboss.identity.idm.api.Attribute;
+import org.jboss.identity.idm.api.User;
+import org.jboss.identity.idm.api.Group;
+import org.jboss.identity.idm.api.IdentitySession;
import org.jboss.identity.idm.spi.search.IdentityObjectSearchCriteria;
+import org.jboss.identity.idm.impl.helper.Tools;
import java.util.Map;
import java.util.HashMap;
+import java.util.List;
+import java.util.Collection;
+import java.util.Set;
+import java.util.HashSet;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.LinkedList;
/**
* @author <a href="mailto:boleslaw.dawidowicz at redhat.com">Boleslaw
Dawidowicz</a>
@@ -239,4 +253,247 @@
result = 31 * result + (filter != null ? filter.hashCode() : 0);
return result;
}
+
+
+ // Static helper methods:
+
+
+
+ public static <T extends IdentityType> List<T>
applyCriteria(IdentitySession identitySession,
+
IdentityObjectSearchCriteria criteria,
+ List<T> types)
throws Exception
+ {
+
+
+ // First pass - filters
+
+ if(criteria.isFiltered())
+ {
+ if (criteria.getFilter() != null)
+ {
+ filterByIdFilter(types, criteria.getFilter());
+ }
+
+ if (criteria.getValues() != null && criteria.getValues().size() > 0)
+ {
+ filterByAttributesValues(identitySession, types, criteria.getValues());
+ }
+
+ }
+
+ // Second pass - sort
+
+ if (criteria.isSorted())
+ {
+ if (criteria.getSortAttributeName() != null)
+ {
+ sortByAttributeName(identitySession, types, criteria.getSortAttributeName(),
criteria.isAscending());
+ }
+ else
+ {
+ sortByName(types, criteria.isAscending());
+ }
+ }
+
+ List<T> results = types;
+
+ // Third pass - cut the page
+
+ if (criteria.isPaged())
+ {
+ results = cutPageFromResults(results, criteria);
+ }
+
+ return results;
+ }
+
+ //TODO: quick impl. should be reviewed
+ private static void filterByAttributesValues(IdentitySession identitySession,
+ Collection<? extends IdentityType>
types,
+ Map<String, String[]> attrs) throws
Exception
+ {
+ Set<IdentityType> toRemove = new HashSet<IdentityType>();
+
+ for (IdentityType type : types)
+ {
+ //TODO: AttributeManager should have .getAttributes(type, names) to improve and
not obtain everything
+ Map<String, Attribute> presentAttrs =
identitySession.getAttributesManager().getAttributes(type);
+
+ for (Map.Entry<String, String[]> entry : attrs.entrySet())
+ {
+ if (presentAttrs.containsKey(entry.getKey()))
+ {
+ Set<String> given = new
HashSet<String>(Arrays.asList(entry.getValue()));
+ Attribute attr = presentAttrs.get(entry.getKey());
+
+ Collection present = null;
+
+ if (attr != null)
+ {
+ present = attr.getValues();
+ }
+ else
+ {
+ present = Collections.emptySet();
+ }
+
+ for (String s : given)
+ {
+ if (!present.contains(s))
+ {
+ toRemove.add(type);
+ break;
+ }
+ }
+
+ }
+ else
+ {
+ toRemove.add(type);
+ break;
+
+ }
+ }
+ }
+
+ for (IdentityType type : toRemove)
+ {
+ types.remove(type);
+ }
+
+ }
+
+ //TODO: quick impl. should be reviewed
+ private static void filterByIdFilter(List<? extends IdentityType> types, String
filter) throws Exception
+ {
+ Set<IdentityType> toRemove = new HashSet<IdentityType>();
+
+ String regex = Tools.wildcardToRegex(filter);
+
+
+ for (IdentityType type : types)
+ {
+ String id = null;
+
+ if (type instanceof User)
+ {
+ id = type.getId();
+ }
+ else if (type instanceof Group)
+ {
+ id = ((Group)type).getName();
+ }
+ else
+ {
+ // shouldn't happen
+ throw new IllegalStateException();
+ }
+
+ if (!id.matches(regex))
+ {
+ toRemove.add(type);
+ }
+ }
+
+ for (IdentityType type : toRemove)
+ {
+ types.remove(type);
+ }
+
+ }
+
+ private static <T extends IdentityType> void sortByName(List<T> objects,
final boolean ascending)
+ {
+ Collections.sort(objects, new Comparator<T>(){
+ public int compare(T o1, T o2)
+ {
+ if (o1 instanceof User && o2 instanceof User)
+ {
+ if (ascending)
+ {
+ return o1.getId().compareTo(o2.getId());
+ }
+ else
+ {
+ return o2.getId().compareTo(o1.getId());
+ }
+ }
+ else
+ {
+ Group g1 = (Group)o1;
+ Group g2 = (Group)o2;
+
+ if (ascending)
+ {
+ return g1.getName().compareTo(g2.getName());
+ }
+ else
+ {
+ return g2.getName().compareTo(g1.getName());
+ }
+
+ }
+ }
+ });
+ }
+
+ private static <T extends IdentityType> void sortByAttributeName(IdentitySession
identitySession,
+ List<T>
objects,
+ String attributeName,
final boolean ascending)
+ throws Exception
+ {
+
+ //TODO: Check if attribute has "text" type and delegate to name sort if
not
+
+ // Pre fetch attributes
+ final Map<T, String> attributes = new HashMap<T, String>();
+
+ for (T object : objects)
+ {
+ Attribute attr = identitySession.getAttributesManager().getAttribute(object,
attributeName);
+
+ if (attr != null && attr.getValue() != null)
+ {
+ attributes.put(object, attr.getValue().toString());
+ }
+ else
+ {
+ attributes.put(object, "");
+ }
+ }
+
+
+
+ Collections.sort(objects, new Comparator<T>(){
+ public int compare(T o1, T o2)
+ {
+ String a1 = attributes.get(o1);
+ String a2 = attributes.get(o2);
+
+ if (ascending)
+ {
+ return a1.compareTo(a2);
+ }
+ else
+ {
+ return a2.compareTo(a1);
+ }
+ }
+ });
+ }
+
+ //TODO: dummy and inefficient...
+ private static <T extends IdentityType> List<T>
cutPageFromResults(List<T> objects,
+
IdentityObjectSearchCriteria criteria)
+ {
+ List<T> results = new LinkedList<T>();
+ for (int i = criteria.getFirstResult(); i < criteria.getFirstResult() +
criteria.getMaxResults(); i++)
+ {
+ if (i < objects.size())
+ {
+ results.add(objects.get(i));
+ }
+ }
+ return results;
+ }
}
Modified:
idm/trunk/idm-core/src/main/java/org/jboss/identity/idm/impl/api/query/AbstractQueryExecutor.java
===================================================================
---
idm/trunk/idm-core/src/main/java/org/jboss/identity/idm/impl/api/query/AbstractQueryExecutor.java 2009-05-09
15:10:05 UTC (rev 487)
+++
idm/trunk/idm-core/src/main/java/org/jboss/identity/idm/impl/api/query/AbstractQueryExecutor.java 2009-05-09
21:28:54 UTC (rev 488)
@@ -84,51 +84,8 @@
}
- protected <T extends IdentityType> List<T>
applyCriteria(IdentityObjectSearchCriteria criteria, List<T> types) throws
Exception
- {
- // First pass - filters
- if(criteria.isFiltered())
- {
- if (criteria.getFilter() != null)
- {
- filterByIdFilter(types, criteria.getFilter());
- }
-
- if (criteria.getValues() != null && criteria.getValues().size() > 0)
- {
- filterByAttributesValues(types, criteria.getValues());
- }
-
- }
-
- // Second pass - sort
-
- if (criteria.isSorted())
- {
- if (criteria.getSortAttributeName() != null)
- {
- sortByAttributeName(types, criteria.getSortAttributeName(),
criteria.isAscending());
- }
- else
- {
- sortByName(types, criteria.isAscending());
- }
- }
-
- List<T> results = types;
-
- // Third pass - cut the page
-
- if (criteria.isPaged())
- {
- results = cutPageFromResults(results, criteria);
- }
-
- return results;
- }
-
protected List<Role> applyCriteriaRoles(IdentityObjectSearchCriteria criteria,
List<Role> roles)
{
//TODO: No criteria in RoleQueryBuilder for now...
@@ -136,188 +93,5 @@
return roles;
}
- //TODO: quick impl. should be reviewed
- private void filterByAttributesValues(Collection<? extends IdentityType> types,
Map<String, String[]> attrs) throws Exception
- {
- Set<IdentityType> toRemove = new HashSet<IdentityType>();
-
- for (IdentityType type : types)
- {
- //TODO: AttributeManager should have .getAttributes(type, names) to improve and
not obtain everything
- Map<String, Attribute> presentAttrs =
identitySession.getAttributesManager().getAttributes(type);
-
- for (Map.Entry<String, String[]> entry : attrs.entrySet())
- {
- if (presentAttrs.containsKey(entry.getKey()))
- {
- Set<String> given = new
HashSet<String>(Arrays.asList(entry.getValue()));
- Attribute attr = presentAttrs.get(entry.getKey());
-
- Collection present = null;
-
- if (attr != null)
- {
- present = attr.getValues();
- }
- else
- {
- present = Collections.emptySet();
- }
-
- for (String s : given)
- {
- if (!present.contains(s))
- {
- toRemove.add(type);
- break;
- }
- }
-
- }
- else
- {
- toRemove.add(type);
- break;
-
- }
- }
- }
-
- for (IdentityType type : toRemove)
- {
- types.remove(type);
- }
-
- }
-
- //TODO: quick impl. should be reviewed
- private void filterByIdFilter(List<? extends IdentityType> types, String filter)
throws Exception
- {
- Set<IdentityType> toRemove = new HashSet<IdentityType>();
-
- String regex = Tools.wildcardToRegex(filter);
-
-
- for (IdentityType type : types)
- {
- String id = null;
-
- if (type instanceof User)
- {
- id = type.getId();
- }
- else if (type instanceof Group)
- {
- id = ((Group)type).getName();
- }
- else
- {
- // shouldn't happen
- throw new IllegalStateException();
- }
-
- if (!id.matches(regex))
- {
- toRemove.add(type);
- }
- }
-
- for (IdentityType type : toRemove)
- {
- types.remove(type);
- }
-
- }
-
- private <T extends IdentityType> void sortByName(List<T> objects, final
boolean ascending)
- {
- Collections.sort(objects, new Comparator<T>(){
- public int compare(T o1, T o2)
- {
- if (o1 instanceof User && o2 instanceof User)
- {
- if (ascending)
- {
- return o1.getId().compareTo(o2.getId());
- }
- else
- {
- return o2.getId().compareTo(o1.getId());
- }
- }
- else
- {
- Group g1 = (Group)o1;
- Group g2 = (Group)o2;
-
- if (ascending)
- {
- return g1.getName().compareTo(g2.getName());
- }
- else
- {
- return g2.getName().compareTo(g1.getName());
- }
-
- }
- }
- });
- }
-
- private <T extends IdentityType> void sortByAttributeName(List<T> objects,
String attributeName, final boolean ascending)
- throws Exception
- {
-
- //TODO: Check if attribute has "text" type and delegate to name sort if
not
-
- // Pre fetch attributes
- final Map<T, String> attributes = new HashMap<T, String>();
-
- for (T object : objects)
- {
- Attribute attr = identitySession.getAttributesManager().getAttribute(object,
attributeName);
-
- if (attr != null && attr.getValue() != null)
- {
- attributes.put(object, attr.getValue().toString());
- }
- else
- {
- attributes.put(object, "");
- }
- }
-
-
-
- Collections.sort(objects, new Comparator<T>(){
- public int compare(T o1, T o2)
- {
- String a1 = attributes.get(o1);
- String a2 = attributes.get(o2);
-
- if (ascending)
- {
- return a1.compareTo(a2);
- }
- else
- {
- return a2.compareTo(a1);
- }
- }
- });
- }
-
- //TODO: dummy and inefficient...
- private <T extends IdentityType> List<T> cutPageFromResults(List<T>
objects, IdentityObjectSearchCriteria criteria)
- {
- List<T> results = new LinkedList<T>();
- for (int i = criteria.getFirstResult(); i < criteria.getFirstResult() +
criteria.getMaxResults(); i++)
- {
- if (i < objects.size())
- {
- results.add(objects.get(i));
- }
- }
- return results;
- }
+
}
Modified:
idm/trunk/idm-core/src/main/java/org/jboss/identity/idm/impl/api/query/GroupQueryExecutorImpl.java
===================================================================
---
idm/trunk/idm-core/src/main/java/org/jboss/identity/idm/impl/api/query/GroupQueryExecutorImpl.java 2009-05-09
15:10:05 UTC (rev 487)
+++
idm/trunk/idm-core/src/main/java/org/jboss/identity/idm/impl/api/query/GroupQueryExecutorImpl.java 2009-05-09
21:28:54 UTC (rev 488)
@@ -27,6 +27,7 @@
import org.jboss.identity.idm.api.IdentitySession;
import org.jboss.identity.idm.api.query.QueryException;
import org.jboss.identity.idm.impl.NotYetImplementedException;
+import org.jboss.identity.idm.impl.api.IdentitySearchCriteriaImpl;
import java.util.Collection;
import java.util.List;
@@ -163,7 +164,7 @@
{
mainResults.add(uniqueResult);
- applyCriteria(q.searchCriteria, mainResults);
+ IdentitySearchCriteriaImpl.applyCriteria(identitySession, q.searchCriteria,
mainResults);
return mainResults;
}
else if (q.groupId == null &&
@@ -318,7 +319,7 @@
}
}
- applyCriteria(q.searchCriteria, mainResults);
+ IdentitySearchCriteriaImpl.applyCriteria(identitySession, q.searchCriteria,
mainResults);
}
catch (Exception e)
{
Modified:
idm/trunk/idm-core/src/main/java/org/jboss/identity/idm/impl/api/query/UserQueryExecutorImpl.java
===================================================================
---
idm/trunk/idm-core/src/main/java/org/jboss/identity/idm/impl/api/query/UserQueryExecutorImpl.java 2009-05-09
15:10:05 UTC (rev 487)
+++
idm/trunk/idm-core/src/main/java/org/jboss/identity/idm/impl/api/query/UserQueryExecutorImpl.java 2009-05-09
21:28:54 UTC (rev 488)
@@ -27,6 +27,7 @@
import org.jboss.identity.idm.api.IdentitySession;
import org.jboss.identity.idm.api.query.QueryException;
import org.jboss.identity.idm.impl.NotYetImplementedException;
+import org.jboss.identity.idm.impl.api.IdentitySearchCriteriaImpl;
import java.util.Collection;
import java.util.List;
@@ -111,7 +112,7 @@
resultsRelatedGroups.size() == 0)
{
resultsMain.add(uniqueUser);
- resultsMain = applyCriteria(q.searchCriteria, resultsMain);
+ resultsMain = IdentitySearchCriteriaImpl.applyCriteria(identitySession,
q.searchCriteria, resultsMain);
return resultsMain;
}
else if (q.userId == null &&
@@ -203,7 +204,7 @@
// As results were merged criteria need to be applied separately
if (resultsMain.size() > 0)
{
- resultsMain = applyCriteria(q.searchCriteria, resultsMain);
+ resultsMain = IdentitySearchCriteriaImpl.applyCriteria(identitySession,
q.searchCriteria, resultsMain);
}
}
Modified:
idm/trunk/idm-core/src/main/java/org/jboss/identity/idm/impl/api/session/managers/RelationshipManagerImpl.java
===================================================================
---
idm/trunk/idm-core/src/main/java/org/jboss/identity/idm/impl/api/session/managers/RelationshipManagerImpl.java 2009-05-09
15:10:05 UTC (rev 487)
+++
idm/trunk/idm-core/src/main/java/org/jboss/identity/idm/impl/api/session/managers/RelationshipManagerImpl.java 2009-05-09
21:28:54 UTC (rev 488)
@@ -38,6 +38,7 @@
import org.jboss.identity.idm.spi.store.IdentityObjectSearchCriteriaType;
import org.jboss.identity.idm.impl.NotYetImplementedException;
import org.jboss.identity.idm.impl.api.session.managers.AbstractManager;
+import org.jboss.identity.idm.impl.api.IdentitySearchCriteriaImpl;
import java.util.Collection;
import java.util.Iterator;
@@ -467,6 +468,28 @@
return true;
}
+ private Collection<Group> findAssociatedGroupsCascaded(Collection<Group>
previous, Group group, String groupType, boolean parent, IdentitySearchCriteria criteria)
throws IdentityException
+ {
+ Collection<Group> results = findAssociatedGroups(group, groupType, parent,
false, criteria);
+
+ List<Group> newResults = new LinkedList<Group>();
+
+
+ // For each result make recursive call unless it is already in previous results
+ for (Group result : results)
+ {
+ if (!previous.contains(result))
+ {
+ newResults.add(result);
+ previous.add(result);
+ newResults.addAll(findAssociatedGroupsCascaded(previous, result, groupType,
parent, criteria));
+ }
+ }
+
+ return newResults;
+
+ }
+
public Collection<Group> findAssociatedGroups(Group group, String groupType,
boolean parent, boolean cascade, IdentitySearchCriteria criteria) throws
IdentityException
{
@@ -477,17 +500,36 @@
IdentityObjectType iot = groupType != null ? getIdentityObjectType(groupType) :
null;
- //TODO Handle cascade
+
+
if (cascade)
{
- throw new NotYetImplementedException("Support for 'cascade'
argument is not yet implemented. Please use 'false' value for now");
+ Set<Group> prev = new HashSet<Group>();
+ prev.add(group);
+ identities = (List<Group>)findAssociatedGroupsCascaded(prev, group,
groupType, parent, criteria);
+
+ try
+ {
+ //TODO: don't perform when only one repository call was made
+ if (criteria != null)
+ {
+ IdentitySearchCriteriaImpl.applyCriteria(identitySession,
convertSearchControls(criteria), identities);
+ }
+ }
+ catch (Exception e)
+ {
+ throw new IdentityException("Failed to apply criteria", e);
+ }
+
+ return identities;
}
Collection<IdentityObject> ios =
getRepository().findIdentityObject(getInvocationContext(), createIdentityObject(group),
MEMBER, parent, convertSearchControls(criteria));
for (IdentityObject io : ios)
{
- if (iot == null || io.getIdentityType().getName().equals(iot.getName()))
+ if ((iot == null &&
!io.getIdentityType().getName().equals(getUserObjectType().getName())) ||
+ (iot != null &&
io.getIdentityType().getName().equals(iot.getName())))
{
identities.add(createGroup(io));
}
@@ -599,10 +641,37 @@
List<User> identities = new LinkedList<User>();
- //TODO Handle cascade
if (cascade)
{
- throw new NotYetImplementedException("Support for 'cascade'
argument is not yet implemented. Please use 'false' value for now");
+ // Do non cascaded call
+
+ identities.addAll(findAssociatedUsers(group, false, criteria));
+
+ // Find all associated groups (cascaded)
+ Collection<Group> groups = findAssociatedGroups(group, null, true, true,
criteria);
+
+
+ for (Group asociatedGroup : groups)
+ {
+ identities.addAll(findAssociatedUsers(asociatedGroup, false, criteria));
+ }
+
+ try
+ {
+
+ //TODO: don't perform when only one repository call was made
+ if (criteria != null)
+ {
+ IdentitySearchCriteriaImpl.applyCriteria(identitySession,
convertSearchControls(criteria), identities);
+ }
+ }
+ catch (Exception e)
+ {
+ throw new IdentityException("Failed to apply criteria", e);
+ }
+
+ return identities;
+
}
Collection<IdentityObject> ios =
getRepository().findIdentityObject(getInvocationContext(), createIdentityObject(group),
MEMBER, true, convertSearchControls(criteria));
Modified:
idm/trunk/idm-testsuite/src/test/java/org/jboss/identity/idm/impl/api/APILDAPTestCase.java
===================================================================
---
idm/trunk/idm-testsuite/src/test/java/org/jboss/identity/idm/impl/api/APILDAPTestCase.java 2009-05-09
15:10:05 UTC (rev 487)
+++
idm/trunk/idm-testsuite/src/test/java/org/jboss/identity/idm/impl/api/APILDAPTestCase.java 2009-05-09
21:28:54 UTC (rev 488)
@@ -109,6 +109,12 @@
}
@Test
+ public void testRelationshipManagerCascade() throws Exception
+ {
+ relationshipManagerTest.testCascade(getRealmName());
+ }
+
+ @Test
public void testRelationshipManagerMergedRoleAssociations() throws Exception
{
relationshipManagerTest.testMergedRoleAssociations(getRealmName());
Modified:
idm/trunk/idm-testsuite/src/test/java/org/jboss/identity/idm/impl/api/APITestCase.java
===================================================================
---
idm/trunk/idm-testsuite/src/test/java/org/jboss/identity/idm/impl/api/APITestCase.java 2009-05-09
15:10:05 UTC (rev 487)
+++
idm/trunk/idm-testsuite/src/test/java/org/jboss/identity/idm/impl/api/APITestCase.java 2009-05-09
21:28:54 UTC (rev 488)
@@ -106,6 +106,12 @@
}
@Test
+ public void testRelationshipManagerCascade() throws Exception
+ {
+ relationshipManagerTest.testCascade(getRealmName());
+ }
+
+ @Test
public void testRelationshipManagerMergedRoleAssociations() throws Exception
{
relationshipManagerTest.testMergedRoleAssociations(getRealmName());
Modified:
idm/trunk/idm-testsuite/src/test/java/org/jboss/identity/idm/impl/api/RelationshipManagerTest.java
===================================================================
---
idm/trunk/idm-testsuite/src/test/java/org/jboss/identity/idm/impl/api/RelationshipManagerTest.java 2009-05-09
15:10:05 UTC (rev 487)
+++
idm/trunk/idm-testsuite/src/test/java/org/jboss/identity/idm/impl/api/RelationshipManagerTest.java 2009-05-09
21:28:54 UTC (rev 488)
@@ -29,6 +29,7 @@
import org.jboss.identity.idm.api.IdentitySearchCriteria;
import java.util.Arrays;
+import java.util.Collection;
import junit.framework.Assert;
@@ -312,6 +313,73 @@
}
+ public void testCascade(String realmName) throws Exception
+ {
+
+ IdentitySessionFactory factory = ctx.getIdentitySessionFactory();
+
+ IdentitySession session = factory.createIdentitySession(realmName);
+
+ ctx.begin();
+
+ // Create stuff
+ User user1 = session.getPersistenceManager().createUser("user1");
+ User user2 = session.getPersistenceManager().createUser("user2");
+ User user3 = session.getPersistenceManager().createUser("user3");
+ User user4 = session.getPersistenceManager().createUser("user4");
+ User user5 = session.getPersistenceManager().createUser("user5");
+ User user6 = session.getPersistenceManager().createUser("user6");
+ User user7 = session.getPersistenceManager().createUser("user7");
+
+ Group group1 = session.getPersistenceManager().createGroup("group1",
ORGANIZATION);
+ Group group2 = session.getPersistenceManager().createGroup("group2",
ORGANIZATION);
+ Group group3 = session.getPersistenceManager().createGroup("group3",
ORGANIZATION);
+ Group group4 = session.getPersistenceManager().createGroup("group4",
ORGANIZATION);
+ Group group5 = session.getPersistenceManager().createGroup("group5",
ORGANIZATION);
+
+
+ // Create looped associations
+ session.getRelationshipManager().associateGroups(group1, group2);
+ session.getRelationshipManager().associateGroups(group1, group3);
+ session.getRelationshipManager().associateGroups(group2, group4);
+ session.getRelationshipManager().associateGroups(group2, group5);
+ session.getRelationshipManager().associateGroups(group3, group1);
+
+ // Assign users
+ session.getRelationshipManager().associateUser(group1, user1);
+ session.getRelationshipManager().associateUser(group2, user2);
+ session.getRelationshipManager().associateUser(group3, user3);
+ session.getRelationshipManager().associateUser(group5, user4);
+ session.getRelationshipManager().associateUser(group5, user5);
+
+
+ // Make sure that algorithm doesn't go in a loop
+ Collection<Group> results = session.getRelationshipManager().
+ findAssociatedGroups(group1, ORGANIZATION, true, true);
+
+ assertEquals(4, results.size());
+ assertFalse(results.contains(group1));
+ assertTrue(results.contains(group2));
+ assertTrue(results.contains(group3));
+ assertTrue(results.contains(group4));
+ assertTrue(results.contains(group5));
+
+
+ // And get all users associated in a tree
+ Collection<User> results2 = session.getRelationshipManager().
+ findAssociatedUsers(group1, true);
+
+ assertEquals(5, results2.size());
+ assertFalse(results2.contains(user6));
+ assertFalse(results2.contains(user7));
+ assertTrue(results2.contains(user1));
+ assertTrue(results2.contains(user2));
+ assertTrue(results2.contains(user3));
+ assertTrue(results2.contains(user4));
+ assertTrue(results2.contains(user5));
+
+ }
+
public void testMergedRoleAssociations(String realmName) throws Exception
{
IdentitySessionFactory factory = ctx.getIdentitySessionFactory();
Modified: idm/trunk/integration/jboss5/pom.xml
===================================================================
--- idm/trunk/integration/jboss5/pom.xml 2009-05-09 15:10:05 UTC (rev 487)
+++ idm/trunk/integration/jboss5/pom.xml 2009-05-09 21:28:54 UTC (rev 488)
@@ -24,10 +24,25 @@
<dependency>
<groupId>org.jboss.identity</groupId>
- <artifactId>idm</artifactId>
+ <artifactId>idm-core</artifactId>
<version>${version}</version>
</dependency>
<dependency>
+ <groupId>org.jboss.identity</groupId>
+ <artifactId>idm-hibernate</artifactId>
+ <version>${version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.identity</groupId>
+ <artifactId>idm-ldap</artifactId>
+ <version>${version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.identity</groupId>
+ <artifactId>idm-cache</artifactId>
+ <version>${version}</version>
+ </dependency>
+ <dependency>
<groupId>org.jboss.jbossas</groupId>
<artifactId>jboss-as-system-jmx</artifactId>
<version>${jboss.version}</version>
Modified: idm/trunk/integration/jboss5/src/main/resources/assembly.xml
===================================================================
--- idm/trunk/integration/jboss5/src/main/resources/assembly.xml 2009-05-09 15:10:05 UTC
(rev 487)
+++ idm/trunk/integration/jboss5/src/main/resources/assembly.xml 2009-05-09 21:28:54 UTC
(rev 488)
@@ -22,7 +22,10 @@
<outputDirectory>/</outputDirectory>
<includes>
<include>org.jboss.identity.integration:idm-jboss5</include>
- <include>org.jboss.identity:idm</include>
+ <include>org.jboss.identity:idm-cache</include>
+ <include>org.jboss.identity:idm-ldap</include>
+ <include>org.jboss.identity:idm-hibernate</include>
+ <include>org.jboss.identity:idm-core</include>
<include>org.jboss.identity:idm-api</include>
<include>org.jboss.identity:idm-common</include>
<include>org.jboss.identity:idm-spi</include>