From 6f651fcf4f0553aa6b0c17f8db594bb5db7131ee Mon Sep 17 00:00:00 2001 From: j2blake Date: Fri, 28 Oct 2011 22:14:38 +0000 Subject: [PATCH] NIHVIVO-2343 Create method: UserAccountsDao.setProxyAccountsOnProfile() and use it. --- .../user/UserAccountsMyAccountPage.java | 21 ++++++++- .../vitro/webapp/dao/UserAccountsDao.java | 6 +++ .../filtering/UserAccountsDaoFiltering.java | 8 +++- .../webapp/dao/jena/UserAccountsDaoJena.java | 46 +++++++++++++++++++ .../dao/jena/UserAccountsDaoJenaTest.java | 43 +++++++++++++++++ .../vitro/webapp/dao/UserAccountsDaoStub.java | 7 +++ 6 files changed, 129 insertions(+), 2 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/accounts/user/UserAccountsMyAccountPage.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/accounts/user/UserAccountsMyAccountPage.java index 8c28f5a52..2dbdce066 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/accounts/user/UserAccountsMyAccountPage.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/accounts/user/UserAccountsMyAccountPage.java @@ -165,7 +165,12 @@ public class UserAccountsMyAccountPage extends UserAccountsPage { userAccount.setEmailAddress(emailAddress); userAccount.setFirstName(firstName); userAccount.setLastName(lastName); - userAccount.setProxiedIndividualUris(proxyUris); + + Individual profilePage = getProfilePage(userAccount); + if (profilePage != null) { + userAccountsDao.setProxyAccountsOnProfile(profilePage.getURI(), + proxyUris); + } strategy.setAdditionalProperties(userAccount); @@ -199,10 +204,15 @@ public class UserAccountsMyAccountPage extends UserAccountsPage { Individual profilePage = getProfilePage(userAccount); if (profilePage == null) { + log.debug("no profile page"); proxyUsers = Collections.emptyList(); } else { String uri = profilePage.getURI(); + log.debug("profile page at " + uri); proxyUsers = userAccountsDao.getUserAccountsWhoProxyForPage(uri); + if (log.isDebugEnabled()) { + log.debug(getUrisFromUserAccounts(proxyUsers)); + } } return buildProxyListFromUserAccounts(proxyUsers); @@ -268,6 +278,15 @@ public class UserAccountsMyAccountPage extends UserAccountsPage { } } + private List getUrisFromUserAccounts( + Collection proxyUsers) { + List list = new ArrayList(); + for (UserAccount u : proxyUsers) { + list.add(u.getUri()); + } + return list; + } + public static class ProxyInfo { private final String uri; private final String label; 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 097facf4a..77d828d85 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/UserAccountsDao.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/UserAccountsDao.java @@ -84,6 +84,12 @@ public interface UserAccountsDao { */ void deleteUserAccount(String userAccountUri); + /** + * Set so that these UserAccounts, and only these, are authorized as proxies on this + * profile page. + */ + void setProxyAccountsOnProfile(String profilePageUri, Collection userAccountUris); + /** * Get the PermissionSet for this URI. * 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 74c1f846e..40f304ee5 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 @@ -46,7 +46,7 @@ public class UserAccountsDaoFiltering extends BaseFiltering implements public UserAccount getUserAccountByExternalAuthId(String externalAuthId) { return innerDao.getUserAccountByExternalAuthId(externalAuthId); } - + @Override public Collection getUserAccountsWhoProxyForPage( String profilePageUri) { @@ -68,6 +68,12 @@ public class UserAccountsDaoFiltering extends BaseFiltering implements innerDao.deleteUserAccount(userAccountUri); } + @Override + public void setProxyAccountsOnProfile(String profilePageUri, + Collection userAccountUris) { + innerDao.setProxyAccountsOnProfile(profilePageUri, userAccountUris); + } + @Override public PermissionSet getPermissionSetByUri(String uri) { return innerDao.getPermissionSetByUri(uri); 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 48fa1c883..bdb8a21db 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 @@ -345,6 +345,52 @@ public class UserAccountsDaoJena extends JenaBaseDao implements UserAccountsDao } } + @Override + public void setProxyAccountsOnProfile(String profilePageUri, + Collection userAccountUris) { + Property p = getOntModel().getProperty( + VitroVocabulary.USERACCOUNT_PROXY_EDITOR_FOR); + Resource o = getOntModel().createResource(profilePageUri); + + // figure out what needs to be added and what needs to be removed. + List removeThese = new ArrayList(); + List addThese = new ArrayList(userAccountUris); + getOntModel().enterCriticalSection(Lock.READ); + try { + Resource s = null; + StmtIterator stmts = getOntModel().listStatements(s, p, o); + while (stmts.hasNext()) { + Resource subject = stmts.next().getSubject(); + if (subject != null) { + String uri = subject.getURI(); + if (addThese.contains(uri)) { + addThese.remove(uri); + } else { + removeThese.add(uri); + } + } + } + stmts.close(); + } finally { + getOntModel().leaveCriticalSection(); + } + + // now do it. + getOntModel().enterCriticalSection(Lock.WRITE); + try { + for (String uri : removeThese) { + Resource s = getOntModel().createResource(uri); + getOntModel().remove(s, p, o); + } + for (String uri: addThese) { + Resource s = getOntModel().createResource(uri); + getOntModel().add(s, p, o); + } + } finally { + getOntModel().leaveCriticalSection(); + } + } + @Override public PermissionSet getPermissionSetByUri(String uri) { if (uri == null) { 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 f9e148231..68bf50fac 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 @@ -58,6 +58,9 @@ public class UserAccountsDaoJenaTest extends AbstractTestClass { private static final String URI_ROLE2 = NS_MINE + "role2"; private static final String URI_ROLE3 = NS_MINE + "role3"; + private static final String URI_PROFILE1 = NS_MINE + "profile1"; + private static final String URI_PROFILE2 = NS_MINE + "profile2"; + private OntModel ontModel; private WebappDaoFactoryJena wadf; private UserAccountsDaoJena dao; @@ -65,6 +68,10 @@ public class UserAccountsDaoJenaTest extends AbstractTestClass { private UserAccount user1; private UserAccount userNew; + private UserAccount userA; + private UserAccount userB; + private UserAccount userC; + @Before public void setup() throws IOException { InputStream stream = UserAccountsDaoJenaTest.class @@ -89,6 +96,16 @@ public class UserAccountsDaoJenaTest extends AbstractTestClass { userNew = userAccount("", "email@here", "Joe", "Blow", "XXXX", "YYYY", 0L, false, 1, 0L, Status.ACTIVE, "jblow", false, EMPTY, false, EMPTY); + + userA = userAccount("", "aahern@here", "Alf", "Ahern", "XXXX", "YYYY", + 0L, false, 1, 0L, Status.ACTIVE, "aahern", false, EMPTY, false, + collection(URI_PROFILE1)); + userB = userAccount("", "email@here", "Betty", "Boop", "XXXX", "YYYY", + 0L, false, 1, 0L, Status.ACTIVE, "bboop", false, EMPTY, false, + collection(URI_PROFILE1, URI_PROFILE2)); + userC = userAccount("", "ccallas@here", "Charlie", "Callas", "XXXX", + "YYYY", 0L, false, 1, 0L, Status.ACTIVE, "ccallas", false, + EMPTY, false, collection(URI_PROFILE2)); } // ---------------------------------------------------------------------- @@ -232,6 +249,10 @@ public class UserAccountsDaoJenaTest extends AbstractTestClass { assertEqualAccounts(user1, updated); } + // ---------------------------------------------------------------------- + // Tests for proxy-related methods + // ---------------------------------------------------------------------- + @Test public void getProxyEditorsFirst() { String profileOne = NS_MINE + "userNewProxyOne"; @@ -274,6 +295,22 @@ public class UserAccountsDaoJenaTest extends AbstractTestClass { dao.getUserAccountsWhoProxyForPage(bogusProfile)); } + @Test + public void setProxyEditorsOnProfile() { + String uriA = dao.insertUserAccount(userA); + String uriB = dao.insertUserAccount(userB); + String uriC = dao.insertUserAccount(userC); + + dao.setProxyAccountsOnProfile(URI_PROFILE1, collection(uriB, uriC)); + + assertExpectedProxies("userA", collection(), + dao.getUserAccountByUri(uriA).getProxiedIndividualUris()); + assertExpectedProxies("userB", collection(URI_PROFILE1, URI_PROFILE2), + dao.getUserAccountByUri(uriB).getProxiedIndividualUris()); + assertExpectedProxies("userC", collection(URI_PROFILE1, URI_PROFILE2), + dao.getUserAccountByUri(uriC).getProxiedIndividualUris()); + } + // ---------------------------------------------------------------------- // Tests for PermissionSet methods // ---------------------------------------------------------------------- @@ -448,6 +485,12 @@ public class UserAccountsDaoJenaTest extends AbstractTestClass { assertEqualSets(label, expectedUris, actualUris); } + private void assertExpectedProxies(String label, + Collection expected, Set actual) { + Set expectedSet = new HashSet(expected); + assertEqualSets(label, expectedSet, actual); + } + @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 cfee2d8df..9c782a90b 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 @@ -97,4 +97,11 @@ public class UserAccountsDaoStub implements UserAccountsDao { "UserAccountsDaoStub.getUserAccountsWhoProxyForPage() not implemented."); } + @Override + public void setProxyAccountsOnProfile(String profilePageUri, + Collection userAccountUris) { + throw new RuntimeException( + "UserAccountsDaoStub.setProxyAccountsOnProfile() not implemented."); + } + }