diff --git a/citesphere/pom.xml b/citesphere/pom.xml index f4ecd84a0..bc0cb325c 100644 --- a/citesphere/pom.xml +++ b/citesphere/pom.xml @@ -25,7 +25,7 @@ 2.2.6.RELEASE 0.12 0.4 - 1.19 + 1.23 $2a$04$oQo44vqcDIFRoYKiAXoNheurzkwX9dcNmowvTX/hsWuBMwijqn44i @@ -377,7 +377,7 @@ mysql mysql-connector-java - 8.0.28 + 8.0.33 @@ -410,27 +410,27 @@ org.apache.tiles tiles-template - 3.0.1 + 3.0.8 org.apache.tiles tiles-core - 3.0.1 + 3.0.8 org.apache.tiles tiles-api - 3.0.1 + 3.0.8 org.apache.tiles tiles-servlet - 3.0.1 + 3.0.8 org.apache.tiles tiles-jsp - 3.0.1 + 3.0.8 @@ -563,7 +563,7 @@ commons-io commons-io - 2.7 + 2.14.0 diff --git a/citesphere/src/main/java/edu/asu/diging/citesphere/core/service/ICitationManager.java b/citesphere/src/main/java/edu/asu/diging/citesphere/core/service/ICitationManager.java index b82672bbc..e434356ad 100644 --- a/citesphere/src/main/java/edu/asu/diging/citesphere/core/service/ICitationManager.java +++ b/citesphere/src/main/java/edu/asu/diging/citesphere/core/service/ICitationManager.java @@ -18,11 +18,13 @@ import edu.asu.diging.citesphere.core.exceptions.ZoteroHttpStatusException; import edu.asu.diging.citesphere.core.exceptions.ZoteroItemCreationFailedException; import edu.asu.diging.citesphere.core.service.impl.CitationPage; +import edu.asu.diging.citesphere.model.authority.IAuthorityEntry; import edu.asu.diging.citesphere.model.bib.ICitation; import edu.asu.diging.citesphere.model.bib.ICitationGroup; import edu.asu.diging.citesphere.model.bib.ItemType; import edu.asu.diging.citesphere.model.bib.impl.BibField; import edu.asu.diging.citesphere.model.bib.impl.CitationResults; +import edu.asu.diging.citesphere.model.transfer.impl.Citations; import edu.asu.diging.citesphere.user.IUser; public interface ICitationManager { @@ -86,6 +88,8 @@ CloseableIterator getAllGroupItems(IUser user, String groupId, String void deleteLocalGroupCitations(String groupId); + Citations findAuthorityCitations(IAuthorityEntry entry, IUser user); + ICitation addCitationToReferences(IUser user, ICitation citation, String zoteroGroupId, String referenceCitationKey, String reference) throws SelfCitationException, ZoteroConnectionException, CitationIsOutdatedException, ZoteroHttpStatusException, ZoteroItemCreationFailedException; diff --git a/citesphere/src/main/java/edu/asu/diging/citesphere/core/service/impl/CitationManager.java b/citesphere/src/main/java/edu/asu/diging/citesphere/core/service/impl/CitationManager.java index 0e3c1091d..3ee869ad3 100644 --- a/citesphere/src/main/java/edu/asu/diging/citesphere/core/service/impl/CitationManager.java +++ b/citesphere/src/main/java/edu/asu/diging/citesphere/core/service/impl/CitationManager.java @@ -10,10 +10,12 @@ import java.util.Set; import java.util.concurrent.ExecutionException; import java.util.function.BiFunction; +import java.util.stream.Collectors; import javax.annotation.PostConstruct; import javax.transaction.Transactional; +import org.bson.types.ObjectId; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.PropertySource; @@ -41,6 +43,7 @@ import edu.asu.diging.citesphere.core.zotero.IZoteroManager; import edu.asu.diging.citesphere.data.bib.CitationGroupRepository; import edu.asu.diging.citesphere.data.bib.ICitationDao; +import edu.asu.diging.citesphere.model.authority.IAuthorityEntry; import edu.asu.diging.citesphere.model.bib.ICitation; import edu.asu.diging.citesphere.model.bib.ICitationCollection; import edu.asu.diging.citesphere.model.bib.ICitationGroup; @@ -49,6 +52,7 @@ import edu.asu.diging.citesphere.model.bib.impl.BibField; import edu.asu.diging.citesphere.model.bib.impl.CitationGroup; import edu.asu.diging.citesphere.model.bib.impl.CitationResults; +import edu.asu.diging.citesphere.model.transfer.impl.Citations; import edu.asu.diging.citesphere.model.bib.impl.Reference; import edu.asu.diging.citesphere.user.IUser; @@ -506,6 +510,23 @@ public CitationPage getPrevAndNextCitation(IUser user, String groupId, String co public void deleteLocalGroupCitations(String groupId) { citationStore.deleteCitationByGroupId(groupId); } + + @Override + public Citations findAuthorityCitations(IAuthorityEntry entry, IUser user) { + List groups = getGroups(user); + + if (groups == null || groups.isEmpty()) { + return null; + } + + Set groupIds = groups.stream() + .map(group -> group.getKey().toString()) + .collect(Collectors.toSet()); + + Citations citations = citationDao.findCitationsByPersonUri(entry.getUri(), groupIds); + + return citations; + } @Override public ICitation addCitationToReferences(IUser user, ICitation citation, String zoteroGroupId, diff --git a/citesphere/src/main/java/edu/asu/diging/citesphere/web/user/authorities/AuthorityItemsController.java b/citesphere/src/main/java/edu/asu/diging/citesphere/web/user/authorities/AuthorityItemsController.java new file mode 100644 index 000000000..7c7471623 --- /dev/null +++ b/citesphere/src/main/java/edu/asu/diging/citesphere/web/user/authorities/AuthorityItemsController.java @@ -0,0 +1,53 @@ +package edu.asu.diging.citesphere.web.user.authorities; + +import java.util.ArrayList; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import edu.asu.diging.citesphere.core.service.IAuthorityService; +import edu.asu.diging.citesphere.core.service.ICitationManager; +import edu.asu.diging.citesphere.model.authority.IAuthorityEntry; +import edu.asu.diging.citesphere.model.bib.ICitation; +import edu.asu.diging.citesphere.model.transfer.impl.Citations; +import edu.asu.diging.citesphere.user.IUser; + +@Controller +public class AuthorityItemsController { + + private final Logger logger = LoggerFactory.getLogger(getClass()); + + @Autowired + private IAuthorityService authorityService; + + @Autowired + private ICitationManager citationManager; + + + @RequestMapping("/auth/authority/items") + public String showPage(Model model, @RequestParam("uri") String uri, Authentication authentication) { + List authorityEntries = authorityService.findByUri((IUser) authentication.getPrincipal(), uri); + + if(authorityEntries == null || authorityEntries.isEmpty()) { + model.addAttribute("error", "No entry found for URI: " + uri); + } else if (authorityEntries.size() > 1) { + logger.error("Found multiple entries for URI: " + uri); + model.addAttribute("error", "Found multiple entries for URI: " + uri); + } else { + Citations citations = citationManager.findAuthorityCitations(authorityEntries.get(0), (IUser) authentication.getPrincipal()); + if (citations != null) { + model.addAttribute("items", citations.getCitations()); + } else { + model.addAttribute("items", new ArrayList()); + } + } + return "auth/authorities/showItemsByName"; + } +} diff --git a/citesphere/src/main/webapp/WEB-INF/views/auth/authorities/authorityItems.html b/citesphere/src/main/webapp/WEB-INF/views/auth/authorities/authorityItems.html new file mode 100644 index 000000000..9e84398e8 --- /dev/null +++ b/citesphere/src/main/webapp/WEB-INF/views/auth/authorities/authorityItems.html @@ -0,0 +1,27 @@ + + + +
+ +
+
+ + + + + + + + +
Title
+ + [[${entry.title}]] + +
+
+
+ + \ No newline at end of file diff --git a/citesphere/src/main/webapp/WEB-INF/views/auth/authorities/list.html b/citesphere/src/main/webapp/WEB-INF/views/auth/authorities/list.html index d5bcd3a9f..c797c3112 100644 --- a/citesphere/src/main/webapp/WEB-INF/views/auth/authorities/list.html +++ b/citesphere/src/main/webapp/WEB-INF/views/auth/authorities/list.html @@ -114,7 +114,7 @@

Managed Authority Entries

- + - diff --git a/citesphere/src/main/webapp/WEB-INF/views/auth/authorities/showItemsByName.html b/citesphere/src/main/webapp/WEB-INF/views/auth/authorities/showItemsByName.html new file mode 100644 index 000000000..e9cb20cc1 --- /dev/null +++ b/citesphere/src/main/webapp/WEB-INF/views/auth/authorities/showItemsByName.html @@ -0,0 +1,104 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/citesphere/src/test/java/edu/asu/diging/citesphere/core/service/impl/CitationManagerTest.java b/citesphere/src/test/java/edu/asu/diging/citesphere/core/service/impl/CitationManagerTest.java index 3d7464164..a1677914b 100644 --- a/citesphere/src/test/java/edu/asu/diging/citesphere/core/service/impl/CitationManagerTest.java +++ b/citesphere/src/test/java/edu/asu/diging/citesphere/core/service/impl/CitationManagerTest.java @@ -1,7 +1,14 @@ package edu.asu.diging.citesphere.core.service.impl; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThrows; import static org.mockito.Matchers.any; import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.ArrayList; @@ -12,7 +19,6 @@ import java.util.Optional; import java.util.Set; -import org.bson.types.ObjectId; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -35,6 +41,7 @@ import edu.asu.diging.citesphere.core.zotero.IZoteroManager; import edu.asu.diging.citesphere.data.bib.CitationGroupRepository; import edu.asu.diging.citesphere.data.bib.ICitationDao; +import edu.asu.diging.citesphere.model.authority.IAuthorityEntry; import edu.asu.diging.citesphere.model.bib.ICitation; import edu.asu.diging.citesphere.model.bib.ICitationGroup; import edu.asu.diging.citesphere.model.bib.IReference; @@ -42,6 +49,7 @@ import edu.asu.diging.citesphere.model.bib.impl.CitationGroup; import edu.asu.diging.citesphere.model.bib.impl.CitationResults; import edu.asu.diging.citesphere.model.bib.impl.Reference; +import edu.asu.diging.citesphere.model.transfer.impl.Citations; import edu.asu.diging.citesphere.user.IUser; import edu.asu.diging.citesphere.user.impl.User; @@ -62,6 +70,9 @@ public class CitationManagerTest { @Mock private ICitationDao citationDao; + @Mock + private IAuthorityEntry authorityEntry; + @InjectMocks private CitationManager managerToTest; @@ -525,4 +536,65 @@ public void test_addCitationToReferences_selfCitation() throws SelfCitationExcep when(citationStore.save(citation)).thenReturn(updatedCitation); ICitation result = managerToTest.addCitationToReferences(user, citation, GROUP_ID, referenceCitationKey, REFERENCE); } + + @Test + public void test_findAuthorityCitations_returnsCitations() { + String uri = "person-uri"; + when(authorityEntry.getUri()).thenReturn(uri); + + Map groupVersions = new HashMap<>(); + groupVersions.put(GROUP1_ID, new Long(20)); + groupVersions.put(GROUP2_ID, new Long(3)); + Mockito.when(zoteroManager.getGroupsVersion(user)).thenReturn(groupVersions); + Mockito.when(groupRepository.save((CitationGroup)group1)).thenReturn((CitationGroup)group1); + Mockito.when(groupRepository.save((CitationGroup)group2)).thenReturn((CitationGroup)group2); + Mockito.when(zoteroManager.getGroup(user, GROUP1_ID + "", true)).thenReturn((CitationGroup)group1); + Mockito.when(zoteroManager.getGroup(user, GROUP2_ID + "", true)).thenReturn((CitationGroup)group2); + + Set groupIds = Set.of(GROUP1_ID.toString(), GROUP2_ID.toString()); + Citations expectedCitations = new Citations(); + when(citationDao.findCitationsByPersonUri(uri, groupIds)).thenReturn(expectedCitations); + + Citations result = managerToTest.findAuthorityCitations(authorityEntry, user); + + assertNotNull(result); + assertEquals(expectedCitations, result); + } + + @Test + public void test_findAuthorityCitations_noGroups() { + + String uri = "person-uri"; + when(authorityEntry.getUri()).thenReturn(uri); + + Mockito.when(zoteroManager.getGroupsVersion(user)).thenReturn(null); + + Citations result = managerToTest.findAuthorityCitations(authorityEntry, user); + + assertNull(result); + verify(citationDao, never()).findCitationsByPersonUri(uri, null); + } + + @Test + public void test_findAuthorityCitations_nullAuthorityEntry() { + String uri = "person-uri"; + when(authorityEntry.getUri()).thenReturn(uri); + + Map groupVersions = new HashMap<>(); + groupVersions.put(GROUP1_ID, new Long(20)); + groupVersions.put(GROUP2_ID, new Long(3)); + Mockito.when(zoteroManager.getGroupsVersion(user)).thenReturn(groupVersions); + Mockito.when(groupRepository.save((CitationGroup)group1)).thenReturn((CitationGroup)group1); + Mockito.when(groupRepository.save((CitationGroup)group2)).thenReturn((CitationGroup)group2); + Mockito.when(zoteroManager.getGroup(user, GROUP1_ID + "", true)).thenReturn((CitationGroup)group1); + Mockito.when(zoteroManager.getGroup(user, GROUP2_ID + "", true)).thenReturn((CitationGroup)group2); + + Set groupIds = Set.of(GROUP1_ID.toString(), GROUP2_ID.toString()); + Citations expectedCitations = new Citations(); + when(citationDao.findCitationsByPersonUri(uri, groupIds)).thenReturn(expectedCitations); + + assertThrows(NullPointerException.class, () -> { + managerToTest.findAuthorityCitations(null, user); + }); + } }