diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/UserAccountsDao.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/UserAccountsDao.java index 927538a31..097facf4a 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/UserAccountsDao.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/UserAccountsDao.java @@ -39,6 +39,11 @@ public interface UserAccountsDao { * @return null if the ID is null, or if there is no such UserAccount */ UserAccount getUserAccountByExternalAuthId(String externalAuthId); + + /** + * Get any UserAccounts who act as proxy editors for this profile page. + */ + Collection getUserAccountsWhoProxyForPage(String profilePageUri); /** * Create a new UserAccount in the model. diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/UserAccountsDaoFiltering.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/UserAccountsDaoFiltering.java index 2a08eb9f8..74c1f846e 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/UserAccountsDaoFiltering.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/UserAccountsDaoFiltering.java @@ -47,6 +47,12 @@ public class UserAccountsDaoFiltering extends BaseFiltering implements return innerDao.getUserAccountByExternalAuthId(externalAuthId); } + @Override + public Collection getUserAccountsWhoProxyForPage( + String profilePageUri) { + return innerDao.getUserAccountsWhoProxyForPage(profilePageUri); + } + @Override public String insertUserAccount(UserAccount userAccount) { return innerDao.insertUserAccount(userAccount); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/UserAccountsDaoJena.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/UserAccountsDaoJena.java index 47dbc39ef..48fa1c883 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/UserAccountsDaoJena.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/UserAccountsDaoJena.java @@ -12,6 +12,8 @@ import java.util.Random; import com.hp.hpl.jena.ontology.OntClass; import com.hp.hpl.jena.ontology.OntModel; import com.hp.hpl.jena.ontology.OntResource; +import com.hp.hpl.jena.rdf.model.Literal; +import com.hp.hpl.jena.rdf.model.Property; import com.hp.hpl.jena.rdf.model.Resource; import com.hp.hpl.jena.rdf.model.Statement; import com.hp.hpl.jena.rdf.model.StmtIterator; @@ -24,6 +26,7 @@ import edu.cornell.mannlib.vitro.webapp.beans.PermissionSet; import edu.cornell.mannlib.vitro.webapp.beans.UserAccount; import edu.cornell.mannlib.vitro.webapp.dao.InsertException; import edu.cornell.mannlib.vitro.webapp.dao.UserAccountsDao; +import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary; /** * Implement UserAccountsDao for Jena models. @@ -164,6 +167,41 @@ public class UserAccountsDaoJena extends JenaBaseDao implements UserAccountsDao return getUserAccountByUri(userUri); } + @Override + public Collection getUserAccountsWhoProxyForPage( + String profilePageUri) { + List userUris = new ArrayList(); + + Resource s = null; + Property p = getOntModel().getProperty( + VitroVocabulary.USERACCOUNT_PROXY_EDITOR_FOR); + Resource o = getOntModel().createResource(profilePageUri); + + getOntModel().enterCriticalSection(Lock.READ); + try { + StmtIterator stmts = getOntModel().listStatements(s, p, o); + while (stmts.hasNext()) { + Resource subject = stmts.next().getSubject(); + if (subject != null) { + userUris.add(subject.getURI()); + } + } + stmts.close(); + } finally { + getOntModel().leaveCriticalSection(); + } + + List userAccounts = new ArrayList(); + for (String userUri : userUris) { + UserAccount ua = getUserAccountByUri(userUri); + if (ua != null) { + userAccounts.add(ua); + } + } + + return userAccounts; + } + @Override public String insertUserAccount(UserAccount userAccount) { if (userAccount == null) { @@ -214,8 +252,7 @@ public class UserAccountsDaoJena extends JenaBaseDao implements UserAccountsDao model.add(res, RDF.type, USERACCOUNT_ROOT_USER); } - updatePropertyResourceURIValues(res, - USERACCOUNT_PROXY_EDITOR_FOR, + updatePropertyResourceURIValues(res, USERACCOUNT_PROXY_EDITOR_FOR, userAccount.getProxiedIndividualUris(), model); userAccount.setUri(userUri); @@ -283,8 +320,7 @@ public class UserAccountsDaoJena extends JenaBaseDao implements UserAccountsDao model.remove(res, RDF.type, USERACCOUNT_ROOT_USER); } - updatePropertyResourceURIValues(res, - USERACCOUNT_PROXY_EDITOR_FOR, + updatePropertyResourceURIValues(res, USERACCOUNT_PROXY_EDITOR_FOR, userAccount.getProxiedIndividualUris(), model); } finally { diff --git a/webapp/test/edu/cornell/mannlib/vitro/webapp/dao/jena/UserAccountsDaoJenaTest.java b/webapp/test/edu/cornell/mannlib/vitro/webapp/dao/jena/UserAccountsDaoJenaTest.java index 616d1dea7..f9e148231 100644 --- a/webapp/test/edu/cornell/mannlib/vitro/webapp/dao/jena/UserAccountsDaoJenaTest.java +++ b/webapp/test/edu/cornell/mannlib/vitro/webapp/dao/jena/UserAccountsDaoJenaTest.java @@ -232,6 +232,48 @@ public class UserAccountsDaoJenaTest extends AbstractTestClass { assertEqualAccounts(user1, updated); } + @Test + public void getProxyEditorsFirst() { + String profileOne = NS_MINE + "userNewProxyOne"; + String profileTwo = NS_MINE + "userNewProxyTwo"; + userNew.setProxiedIndividualUris(collection(profileOne, profileTwo)); + + String userUri = dao.insertUserAccount(userNew); + UserAccount user = dao.getUserAccountByUri(userUri); + + assertExpectedAccountUris("proxy for profile one", + Collections.singleton(user), + dao.getUserAccountsWhoProxyForPage(profileOne)); + } + + @Test + public void getProxyEditorsSecond() { + String profileOne = NS_MINE + "userNewProxyOne"; + String profileTwo = NS_MINE + "userNewProxyTwo"; + userNew.setProxiedIndividualUris(collection(profileOne, profileTwo)); + + String userUri = dao.insertUserAccount(userNew); + UserAccount user = dao.getUserAccountByUri(userUri); + + assertExpectedAccountUris("proxy for profile two", + Collections.singleton(user), + dao.getUserAccountsWhoProxyForPage(profileTwo)); + } + + @Test + public void getProxyEditorsBogus() { + String profileOne = NS_MINE + "userNewProxyOne"; + String profileTwo = NS_MINE + "userNewProxyTwo"; + String bogusProfile = NS_MINE + "bogus"; + userNew.setProxiedIndividualUris(collection(profileOne, profileTwo)); + + dao.insertUserAccount(userNew); + + assertExpectedAccountUris("proxy for bogus profile", + Collections. emptySet(), + dao.getUserAccountsWhoProxyForPage(bogusProfile)); + } + // ---------------------------------------------------------------------- // Tests for PermissionSet methods // ---------------------------------------------------------------------- @@ -390,6 +432,22 @@ public class UserAccountsDaoJenaTest extends AbstractTestClass { assertEquals("all permission sets", expectedMaps, actualMaps); } + private void assertExpectedAccountUris(String label, + Set expectedUserAccounts, + Collection actualUserAccounts) { + Set expectedUris = new HashSet(); + for (UserAccount ua : expectedUserAccounts) { + expectedUris.add(ua.getUri()); + } + + Set actualUris = new HashSet(); + for (UserAccount ua : actualUserAccounts) { + actualUris.add(ua.getUri()); + } + + assertEqualSets(label, expectedUris, actualUris); + } + @SuppressWarnings("unused") private void dumpModelStatements() { StmtIterator stmts = ontModel.listStatements(); diff --git a/webapp/test/stubs/edu/cornell/mannlib/vitro/webapp/dao/UserAccountsDaoStub.java b/webapp/test/stubs/edu/cornell/mannlib/vitro/webapp/dao/UserAccountsDaoStub.java index 42aa6a104..cfee2d8df 100644 --- a/webapp/test/stubs/edu/cornell/mannlib/vitro/webapp/dao/UserAccountsDaoStub.java +++ b/webapp/test/stubs/edu/cornell/mannlib/vitro/webapp/dao/UserAccountsDaoStub.java @@ -90,4 +90,11 @@ public class UserAccountsDaoStub implements UserAccountsDao { "UserAccountsDao.getAllUserAccounts() not implemented."); } + @Override + public Collection getUserAccountsWhoProxyForPage( + String profilePageUri) { + throw new RuntimeException( + "UserAccountsDaoStub.getUserAccountsWhoProxyForPage() not implemented."); + } + }