Skip to content

Commit 5e67bfc

Browse files
committed
UY-1486 remove cyclic dependency from ExistingUserFinder
1 parent 072c2ec commit 5e67bfc

File tree

2 files changed

+86
-31
lines changed

2 files changed

+86
-31
lines changed

engine/src/main/java/pl/edu/icm/unity/engine/identity/ExistingUserFinder.java

Lines changed: 53 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,26 +20,31 @@
2020
import pl.edu.icm.unity.base.attribute.Attribute;
2121
import pl.edu.icm.unity.base.attribute.AttributeStatement;
2222
import pl.edu.icm.unity.base.attribute.AttributeType;
23+
import pl.edu.icm.unity.base.authn.CredentialInfo;
2324
import pl.edu.icm.unity.base.entity.Entity;
25+
import pl.edu.icm.unity.base.entity.EntityInformation;
2426
import pl.edu.icm.unity.base.entity.EntityParam;
2527
import pl.edu.icm.unity.base.exceptions.EngineException;
2628
import pl.edu.icm.unity.base.group.GroupContents;
27-
import pl.edu.icm.unity.base.group.GroupMembership;
2829
import pl.edu.icm.unity.base.identity.Identity;
30+
import pl.edu.icm.unity.base.identity.IllegalIdentityValueException;
2931
import pl.edu.icm.unity.base.tx.Transactional;
3032
import pl.edu.icm.unity.base.verifiable.VerifiableElementBase;
3133
import pl.edu.icm.unity.base.verifiable.VerifiableEmail;
32-
import pl.edu.icm.unity.engine.api.EntityManagement;
3334
import pl.edu.icm.unity.engine.api.GroupsManagement;
3435
import pl.edu.icm.unity.engine.api.bulk.BulkGroupQueryService;
3536
import pl.edu.icm.unity.engine.api.bulk.EntityInGroupData;
3637
import pl.edu.icm.unity.engine.api.bulk.GroupMembershipData;
3738
import pl.edu.icm.unity.engine.api.entity.EntityWithContactInfo;
39+
import pl.edu.icm.unity.engine.api.identity.EntityResolver;
3840
import pl.edu.icm.unity.engine.attribute.AttributesHelper;
41+
import pl.edu.icm.unity.engine.credential.EntityCredentialsHelper;
3942
import pl.edu.icm.unity.stdext.identity.EmailIdentity;
4043
import pl.edu.icm.unity.stdext.utils.ContactEmailMetadataProvider;
4144
import pl.edu.icm.unity.store.api.AttributeDAO;
45+
import pl.edu.icm.unity.store.api.EntityDAO;
4246
import pl.edu.icm.unity.store.api.IdentityDAO;
47+
import pl.edu.icm.unity.store.api.MembershipDAO;
4348
import pl.edu.icm.unity.store.types.StoredAttribute;
4449

4550

@@ -49,20 +54,29 @@ class ExistingUserFinder
4954
private final BulkGroupQueryService bulkService;
5055
private final AttributesHelper attrHelper;
5156
private final GroupsManagement groupsManagement;
52-
private final EntityManagement entityManagement;
5357
private final IdentityDAO identityDAO;
5458
private final AttributeDAO attributeDAO;
55-
59+
private final EntityDAO entityDAO;
60+
private final EntityResolver idResolver;
61+
private final EntityCredentialsHelper credentialsHelper;
62+
private final IdentityHelper identityHelper;
63+
private final MembershipDAO membershipDAO;
64+
5665
@Autowired
5766
ExistingUserFinder(@Qualifier("insecure") BulkGroupQueryService bulkService, AttributesHelper attrHelper, @Qualifier("insecure") GroupsManagement groupsManagement,
58-
EntityManagement entityManagement, IdentityDAO identityDAO, AttributeDAO attributeDAO)
67+
IdentityDAO identityDAO, AttributeDAO attributeDAO, EntityDAO entityDAO, EntityResolver idResolver, EntityCredentialsHelper credentialsHelper, IdentityHelper identityHelper,
68+
MembershipDAO membershipDAO)
5969
{
6070
this.bulkService = bulkService;
6171
this.attrHelper = attrHelper;
6272
this.groupsManagement = groupsManagement;
63-
this.entityManagement = entityManagement;
6473
this.attributeDAO = attributeDAO;
6574
this.identityDAO = identityDAO;
75+
this.entityDAO = entityDAO;
76+
this.idResolver = idResolver;
77+
this.credentialsHelper = credentialsHelper;
78+
this.identityHelper = identityHelper;
79+
this.membershipDAO = membershipDAO;
6680

6781
}
6882

@@ -133,9 +147,9 @@ private Set<EntityWithContactInfo> getEntitiesIdsByContactAddressesOnlyRespectDi
133147
for (Long entityId : searchedEntitiesByEmailAttrs.keySet())
134148
{
135149
EntityParam entityParam = new EntityParam(entityId);
136-
Entity entity = entityManagement.getEntity(entityParam);
137-
Map<String, GroupMembership> groups = entityManagement.getGroups(entityParam);
138-
entitiesWithContactAddress.add(new EntityWithContactInfo(entity, searchedEntitiesByEmailAttrs.get(entityId), groups.keySet()));
150+
Entity entity = getEntity(entityParam);
151+
Set<String> groups = getGroups(entity.getId());
152+
entitiesWithContactAddress.add(new EntityWithContactInfo(entity, searchedEntitiesByEmailAttrs.get(entityId), groups));
139153
}
140154

141155
return entitiesWithContactAddress;
@@ -156,15 +170,16 @@ private Set<EntityWithContactInfo> getEntitiesIdsByContactAddressesInIdentity(
156170

157171

158172
}
173+
159174
private EntityWithContactInfo resolveToEntityWithContactAddress(EntityParam entityParam, Set<String> searchedComparableEmails ) throws EngineException
160175
{
161-
Entity entity = entityManagement.getEntity(entityParam);
162-
Map<String, GroupMembership> groups = entityManagement.getGroups(entityParam);
176+
Entity entity = getEntity(entityParam);
177+
Set<String> groups = getGroups(entity.getId());
163178
Identity emailId = entity.getIdentities().stream()
164179
.filter(id -> id.getTypeId().equals(EmailIdentity.ID))
165180
.filter(id -> emailsEqual(searchedComparableEmails, id))
166181
.findAny().orElse(null);
167-
return new EntityWithContactInfo(entity, emailId.getComparableValue(), groups.keySet());
182+
return new EntityWithContactInfo(entity, emailId.getComparableValue(), groups);
168183
}
169184

170185
private Map<Long, String> searchEntitiesByEmailAttrs(Set<String> searchedComparableEmails, List<StoredAttribute> attributes) throws EngineException
@@ -260,4 +275,30 @@ private Set<Entity> searchEntitiesByEmailAttr(Map<Long, EntityInGroupData> membe
260275

261276
return entitiesWithContactAddressAttr;
262277
}
278+
279+
private Entity getEntity(EntityParam entity) throws EngineException
280+
{
281+
entity.validateInitialization();
282+
long entityId = idResolver.getEntityId(entity);
283+
CredentialInfo credInfo = credentialsHelper.getCredentialInfo(entityId);
284+
EntityInformation theState = entityDAO.getByKey(entityId);
285+
return new Entity(getIdentitiesForEntity(entityId), theState, credInfo);
286+
}
287+
288+
private List<Identity> getIdentitiesForEntity(long entityId) throws IllegalIdentityValueException
289+
{
290+
List<Identity> ret = identityHelper.getIdentitiesForEntity(entityId, null);
291+
identityHelper.addDynamic(entityId, ret.stream()
292+
.map(Identity::getTypeId)
293+
.collect(Collectors.toSet()), ret, null);
294+
return ret;
295+
}
296+
297+
private Set<String> getGroups(long entityId)
298+
{
299+
return membershipDAO.getEntityMembership(entityId)
300+
.stream()
301+
.map(g -> g.getGroup())
302+
.collect(Collectors.toSet());
303+
}
263304
}

engine/src/test/java/pl/edu/icm/unity/engine/identity/ExistingUserFinderTest.java

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import java.util.Date;
1515
import java.util.HashMap;
1616
import java.util.List;
17-
import java.util.Map;
1817
import java.util.Optional;
1918
import java.util.Set;
2019
import java.util.stream.Collectors;
@@ -39,17 +38,20 @@
3938
import pl.edu.icm.unity.base.identity.IdentityParam;
4039
import pl.edu.icm.unity.base.identity.IllegalIdentityValueException;
4140
import pl.edu.icm.unity.base.verifiable.VerifiableEmail;
42-
import pl.edu.icm.unity.engine.api.EntityManagement;
4341
import pl.edu.icm.unity.engine.api.GroupsManagement;
4442
import pl.edu.icm.unity.engine.api.bulk.BulkGroupQueryService;
4543
import pl.edu.icm.unity.engine.api.bulk.EntityInGroupData;
4644
import pl.edu.icm.unity.engine.api.entity.EntityWithContactInfo;
45+
import pl.edu.icm.unity.engine.api.identity.EntityResolver;
4746
import pl.edu.icm.unity.engine.attribute.AttributesHelper;
47+
import pl.edu.icm.unity.engine.credential.EntityCredentialsHelper;
4848
import pl.edu.icm.unity.stdext.attr.VerifiableEmailAttribute;
4949
import pl.edu.icm.unity.stdext.identity.EmailIdentity;
5050
import pl.edu.icm.unity.stdext.utils.ContactEmailMetadataProvider;
5151
import pl.edu.icm.unity.store.api.AttributeDAO;
52+
import pl.edu.icm.unity.store.api.EntityDAO;
5253
import pl.edu.icm.unity.store.api.IdentityDAO;
54+
import pl.edu.icm.unity.store.api.MembershipDAO;
5355
import pl.edu.icm.unity.store.types.StoredAttribute;
5456

5557
public class ExistingUserFinderTest
@@ -58,10 +60,13 @@ public class ExistingUserFinderTest
5860
private BulkGroupQueryService bulkService = mock(BulkGroupQueryService.class);
5961
private AttributesHelper attrHelper = mock(AttributesHelper.class);
6062
private GroupsManagement groupsManagement = mock(GroupsManagement.class);
61-
private EntityManagement entityManagement = mock(EntityManagement.class);
6263
private IdentityDAO identityDAO = mock(IdentityDAO.class);
6364
private AttributeDAO attributeDAO = mock(AttributeDAO.class);
64-
65+
private EntityDAO entityDAO = mock(EntityDAO.class);
66+
private EntityResolver idResolver = mock(EntityResolver.class);
67+
private EntityCredentialsHelper credentialsHelper = mock(EntityCredentialsHelper.class);
68+
private IdentityHelper identityHelper = mock(IdentityHelper.class);
69+
private MembershipDAO membershipDAO = mock(MembershipDAO.class);
6570

6671

6772
@Test
@@ -70,7 +75,7 @@ public void shouldFindByIdentityCaseInsensitive() throws EngineException
7075
EntityInGroupData entityData = new EntityInGroupData(createEmailEntity("[email protected]", 13), null, null,
7176
null, null, null);
7277
when(bulkService.getMembershipInfo(any())).thenReturn(ImmutableMap.of(13l, entityData));
73-
ExistingUserFinder userFinder = new ExistingUserFinder(bulkService, attrHelper, groupsManagement, entityManagement, identityDAO, attributeDAO);
78+
ExistingUserFinder userFinder = new ExistingUserFinder(bulkService, attrHelper, groupsManagement, identityDAO, attributeDAO, entityDAO, idResolver, credentialsHelper, identityHelper, membershipDAO);
7479

7580
Set<Entity> entityIdByContactAddress = userFinder.getEntitiesIdsByContactAddress("[email protected]");
7681

@@ -86,7 +91,7 @@ public void shouldFindByAttributeCaseInsensitive() throws EngineException
8691
when(bulkService.getMembershipInfo(any())).thenReturn(ImmutableMap.of(13l, entityData));
8792
when(attrHelper.getFirstVerifiableAttributeValueFilteredByMeta(eq(ContactEmailMetadataProvider.NAME), any()))
8893
.thenReturn(Optional.of(VerifiableEmail.fromJsonString(emailAttr.getValues().get(0))));
89-
ExistingUserFinder userFinder = new ExistingUserFinder(bulkService, attrHelper, groupsManagement, entityManagement, identityDAO, attributeDAO);
94+
ExistingUserFinder userFinder = new ExistingUserFinder(bulkService, attrHelper, groupsManagement, identityDAO, attributeDAO, entityDAO, idResolver, credentialsHelper, identityHelper, membershipDAO);
9095

9196
Set<Entity> entityIdByContactAddress = userFinder.getEntitiesIdsByContactAddress("[email protected]");
9297

@@ -109,7 +114,7 @@ public void shouldFindAllEntitiesWithGivenEmail() throws EngineException
109114
eq(Arrays.asList(emailAttr))))
110115
.thenReturn(Optional.of(VerifiableEmail.fromJsonString(emailAttr.getValues().get(0))));
111116

112-
ExistingUserFinder userFinder = new ExistingUserFinder(bulkService, attrHelper, groupsManagement, entityManagement, identityDAO, attributeDAO);
117+
ExistingUserFinder userFinder = new ExistingUserFinder(bulkService, attrHelper, groupsManagement, identityDAO, attributeDAO, entityDAO, idResolver, credentialsHelper, identityHelper, membershipDAO);
113118
Set<Entity> entityIdByContactAddress = userFinder.getEntitiesIdsByContactAddress("[email protected]");
114119
assertThat(entityIdByContactAddress.size()).isEqualTo(2);
115120
assertThat(entityIdByContactAddress.stream().map(e -> e.getId()).collect(Collectors.toSet())).contains(14L, 13L);
@@ -138,12 +143,18 @@ public void shouldFindAllEntitiesWithGivenEmailRespectOnlyDirectAttributes() thr
138143

139144
when(identityDAO.getIdByTypeAndValues(EmailIdentity.ID, List.of("[email protected]"))).thenReturn(Set.of(14L));
140145
when(attributeDAO.getAttributesOfGroupMembers(List.of(ContactEmailMetadataProvider.NAME), List.of("/"))).thenReturn(List.of(new StoredAttribute(emailAttr, 13L)));
141-
when(entityManagement.getEntity(new EntityParam(13L))).thenReturn(entityWithEmailAttrData);
142-
when(entityManagement.getEntity(new EntityParam(14L))).thenReturn(entityWithIdEmailData);
143-
when(entityManagement.getGroups(new EntityParam(14L))).thenReturn(Map.of("/", new GroupMembership("/", 14L, new Date()), "/B", new GroupMembership("/B", 14L, new Date())));
144-
when(entityManagement.getGroups(new EntityParam(13L))).thenReturn(Map.of("/", new GroupMembership("/", 13L, new Date()), "/A", new GroupMembership("/A", 14L, new Date())));
145-
146-
ExistingUserFinder userFinder = new ExistingUserFinder(bulkService, attrHelper, groupsManagement, entityManagement, identityDAO, attributeDAO);
146+
147+
when(idResolver.getEntityId(new EntityParam(13L))).thenReturn(13L);
148+
when(entityDAO.getByKey(13L)).thenReturn(entityWithEmailAttrData.getEntityInformation());
149+
when(identityHelper.getIdentitiesForEntity(13L, null)).thenReturn(entityWithEmailAttrData.getIdentities());
150+
when(membershipDAO.getEntityMembership(13L)).thenReturn(List.of(new GroupMembership("/", 13L, new Date()), new GroupMembership("/A", 13L, new Date())));
151+
152+
when(idResolver.getEntityId(new EntityParam(14L))).thenReturn(14L);
153+
when(entityDAO.getByKey(14L)).thenReturn(entityWithIdEmailData.getEntityInformation());
154+
when(identityHelper.getIdentitiesForEntity(14L, null)).thenReturn(entityWithIdEmailData.getIdentities());
155+
when(membershipDAO.getEntityMembership(14L)).thenReturn(List.of(new GroupMembership("/", 14L, new Date()), new GroupMembership("/B", 14L, new Date())));
156+
157+
ExistingUserFinder userFinder = new ExistingUserFinder(bulkService, attrHelper, groupsManagement, identityDAO, attributeDAO, entityDAO, idResolver, credentialsHelper, identityHelper, membershipDAO);
147158
Set<EntityWithContactInfo> entityIdByContactAddress = userFinder.getEntitiesIdsByContactAddressesWithDirectAttributeCheck(Set.of("[email protected]"));
148159
assertThat(entityIdByContactAddress.stream().map(e -> e.entity.getId()).collect(Collectors.toSet())).contains(14L, 13L);
149160
assertThat(entityIdByContactAddress.stream().filter(e -> e.entity.getId().equals(13l)).findFirst().get().groups).containsExactlyElementsOf(Set.of("/A", "/"));
@@ -160,14 +171,17 @@ public void shouldFindAllEntitiesWithGivenEmailRespectOnlyEmailIdentity() throws
160171
when(attrHelper.getAttributeTypeWithSingeltonMetadata(ContactEmailMetadataProvider.NAME)).thenReturn(null);
161172

162173
when(identityDAO.getIdByTypeAndValues(EmailIdentity.ID, List.of("[email protected]", "[email protected]"))).thenReturn(Set.of(14L, 15L));
163-
when(entityManagement.getEntity(new EntityParam(14L))).thenReturn(entityWithIdEmailData1);
164-
when(entityManagement.getGroups(new EntityParam(14L))).thenReturn(Map.of("/", new GroupMembership("/", 15L, new Date()), "/B", new GroupMembership("/B", 14L, new Date())));
165-
when(entityManagement.getEntity(new EntityParam(15L))).thenReturn(entityWithIdEmailData2);
166-
when(entityManagement.getGroups(new EntityParam(15L))).thenReturn(Map.of("/", new GroupMembership("/", 15L, new Date()), "/C", new GroupMembership("/C", 14L, new Date())));
167-
174+
when(idResolver.getEntityId(new EntityParam(14L))).thenReturn(14L);
175+
when(entityDAO.getByKey(14L)).thenReturn(entityWithIdEmailData1.getEntityInformation());
176+
when(identityHelper.getIdentitiesForEntity(14L, null)).thenReturn(entityWithIdEmailData1.getIdentities());
177+
when(membershipDAO.getEntityMembership(14L)).thenReturn(List.of(new GroupMembership("/", 14L, new Date()), new GroupMembership("/B", 14L, new Date())));
168178

179+
when(idResolver.getEntityId(new EntityParam(15L))).thenReturn(15L);
180+
when(entityDAO.getByKey(15L)).thenReturn(entityWithIdEmailData2.getEntityInformation());
181+
when(identityHelper.getIdentitiesForEntity(15L, null)).thenReturn(entityWithIdEmailData2.getIdentities());
182+
when(membershipDAO.getEntityMembership(15L)).thenReturn(List.of(new GroupMembership("/", 15L, new Date()), new GroupMembership("/C", 15L, new Date())));
169183

170-
ExistingUserFinder userFinder = new ExistingUserFinder(bulkService, attrHelper, groupsManagement, entityManagement, identityDAO, attributeDAO);
184+
ExistingUserFinder userFinder = new ExistingUserFinder(bulkService, attrHelper, groupsManagement, identityDAO, attributeDAO, entityDAO, idResolver, credentialsHelper, identityHelper, membershipDAO);
171185
Set<EntityWithContactInfo> entityIdByContactAddress = userFinder.getEntitiesIdsByContactAddressesWithDirectAttributeCheck(Set.of("[email protected]", "[email protected]"));
172186

173187
assertThat(entityIdByContactAddress.stream().map(e -> e.entity.getId()).collect(Collectors.toSet())).contains(14L, 15L);

0 commit comments

Comments
 (0)