diff --git a/config/alfresco/authentication-services-context.xml b/config/alfresco/authentication-services-context.xml
index 50023a746f..ea5c2bcc18 100644
--- a/config/alfresco/authentication-services-context.xml
+++ b/config/alfresco/authentication-services-context.xml
@@ -228,6 +228,9 @@
+
+
+
diff --git a/config/alfresco/public-services-security-context.xml b/config/alfresco/public-services-security-context.xml
index 28e0dfce01..7fd54e0cb7 100644
--- a/config/alfresco/public-services-security-context.xml
+++ b/config/alfresco/public-services-security-context.xml
@@ -819,6 +819,7 @@
org.alfresco.service.cmr.security.PersonService.createPerson=ACL_METHOD.ROLE_ADMINISTRATOR
org.alfresco.service.cmr.security.PersonService.deletePerson=ACL_METHOD.ROLE_ADMINISTRATOR
org.alfresco.service.cmr.security.PersonService.getAllPeople=ACL_ALLOW
+ org.alfresco.service.cmr.security.PersonService.getPeopleFilteredByProperty=ACL_ALLOW
org.alfresco.service.cmr.security.PersonService.getPeopleContainer=ACL_ALLOW
org.alfresco.service.cmr.security.PersonService.getUserNamesAreCaseSensitive=ACL_ALLOW
org.alfresco.service.cmr.security.PersonService.getUserIdentifier=ACL_ALLOW
diff --git a/source/java/org/alfresco/repo/security/person/PersonServiceImpl.java b/source/java/org/alfresco/repo/security/person/PersonServiceImpl.java
index 1bd7e9adfb..458dceccf0 100644
--- a/source/java/org/alfresco/repo/security/person/PersonServiceImpl.java
+++ b/source/java/org/alfresco/repo/security/person/PersonServiceImpl.java
@@ -41,6 +41,7 @@ import org.alfresco.repo.policy.JavaBehaviour;
import org.alfresco.repo.policy.PolicyComponent;
import org.alfresco.repo.security.permissions.PermissionServiceSPI;
import org.alfresco.repo.tenant.TenantService;
+import org.alfresco.service.cmr.dictionary.DictionaryService;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
@@ -86,6 +87,8 @@ public class PersonServiceImpl implements PersonService,
private SearchService searchService;
private AuthorityService authorityService;
+
+ private DictionaryService dictionaryService;
private PermissionServiceSPI permissionServiceSPI;
@@ -700,6 +703,54 @@ public class PersonServiceImpl implements PersonService,
return nodes;
}
+ public Set getPeopleFilteredByProperty(QName propertyKey, Serializable propertyValue)
+ {
+ // check that given property key is defined for content model type 'cm:person'
+ // and throw exception if it isn't
+ if (this.dictionaryService.getProperty(ContentModel.TYPE_PERSON, propertyKey) == null)
+ {
+ throw new AlfrescoRuntimeException("Property '" + propertyKey + "' is not defined "
+ + "for content model type cm:person");
+ }
+
+ LinkedHashSet people = new LinkedHashSet();
+
+ //
+ // Search for people using the given property
+ //
+
+ SearchParameters sp = new SearchParameters();
+ sp.setLanguage(SearchService.LANGUAGE_LUCENE);
+ sp.setQuery("@cm\\:" + propertyKey.getLocalName() + ":\"" + propertyValue + "\"");
+ sp.addStore(tenantService.getName(storeRef));
+ sp.excludeDataInTheCurrentTransaction(false);
+
+ ResultSet rs = null;
+
+ try
+ {
+ rs = searchService.query(sp);
+
+ for (ResultSetRow row : rs)
+ {
+ NodeRef nodeRef = row.getNodeRef();
+ if (nodeService.exists(nodeRef))
+ {
+ people.add(nodeRef);
+ }
+ }
+ }
+ finally
+ {
+ if (rs != null)
+ {
+ rs.close();
+ }
+ }
+
+ return people;
+ }
+
// Policies
/* (non-Javadoc)
@@ -737,6 +788,11 @@ public class PersonServiceImpl implements PersonService,
{
this.authorityService = authorityService;
}
+
+ public void setDictionaryService(DictionaryService dictionaryService)
+ {
+ this.dictionaryService = dictionaryService;
+ }
public void setPermissionServiceSPI(PermissionServiceSPI permissionServiceSPI)
{
diff --git a/source/java/org/alfresco/repo/security/person/PersonTest.java b/source/java/org/alfresco/repo/security/person/PersonTest.java
index 447143ed7a..3c5fe5fe0f 100644
--- a/source/java/org/alfresco/repo/security/person/PersonTest.java
+++ b/source/java/org/alfresco/repo/security/person/PersonTest.java
@@ -268,6 +268,12 @@ public class PersonTest extends BaseSpringTest
assertEquals(1, personService.getAllPeople().size());
assertTrue(personService.getAllPeople().contains(personService.getPerson("derek")));
+ assertEquals(1, personService.getPeopleFilteredByProperty(ContentModel.PROP_USERNAME, "derek").size());
+ assertEquals(1, personService.getPeopleFilteredByProperty(ContentModel.PROP_EMAIL, "dh@dh").size());
+ assertEquals(1, personService.getPeopleFilteredByProperty(ContentModel.PROP_ORGID, "alfresco").size());
+ assertEquals(0, personService.getPeopleFilteredByProperty(ContentModel.PROP_USERNAME, "glen").size());
+ assertEquals(0, personService.getPeopleFilteredByProperty(ContentModel.PROP_EMAIL, "gj@email.com").size());
+ assertEquals(0, personService.getPeopleFilteredByProperty(ContentModel.PROP_ORGID, "microsoft").size());
personService.deletePerson("derek");
assertEquals(0, personService.getAllPeople().size());
@@ -301,6 +307,12 @@ public class PersonTest extends BaseSpringTest
assertEquals(1, personService.getAllPeople().size());
assertTrue(personService.getAllPeople().contains(personService.getPerson("Derek")));
+ assertEquals(1, personService.getPeopleFilteredByProperty(ContentModel.PROP_USERNAME, "Derek").size());
+ assertEquals(1, personService.getPeopleFilteredByProperty(ContentModel.PROP_EMAIL, "dh@dh").size());
+ assertEquals(1, personService.getPeopleFilteredByProperty(ContentModel.PROP_ORGID, "alfresco").size());
+ assertEquals(0, personService.getPeopleFilteredByProperty(ContentModel.PROP_USERNAME, "Glen").size());
+ assertEquals(0, personService.getPeopleFilteredByProperty(ContentModel.PROP_EMAIL, "gj@email.com").size());
+ assertEquals(0, personService.getPeopleFilteredByProperty(ContentModel.PROP_ORGID, "microsoft").size());
assertEquals(personService.personExists("derek"), EqualsHelper.nullSafeEquals(personService.getUserIdentifier("derek"), "Derek"));
assertEquals(personService.personExists("dEREK"), EqualsHelper.nullSafeEquals(personService.getUserIdentifier("dEREK"), "Derek"));
assertEquals(personService.personExists("DEREK"), EqualsHelper.nullSafeEquals(personService.getUserIdentifier("DEREK"), "Derek"));
diff --git a/source/java/org/alfresco/service/cmr/security/PersonService.java b/source/java/org/alfresco/service/cmr/security/PersonService.java
index eff711b3a5..33b841200c 100644
--- a/source/java/org/alfresco/service/cmr/security/PersonService.java
+++ b/source/java/org/alfresco/service/cmr/security/PersonService.java
@@ -154,6 +154,16 @@ public interface PersonService
*/
@Auditable
public Set getAllPeople();
+
+ /**
+ * Get people filtered by the given property name/value pair
+ *
+ * @param propertyKey property key of property to filter people by
+ * @param propertyValue property value of property to filter people by
+ * @return people filtered by the given property name/value pair
+ */
+ @Auditable
+ public Set getPeopleFilteredByProperty(QName propertyKey, Serializable propertyValue);
/**
* Return the container that stores people.