diff --git a/citesphere/src/main/java/edu/asu/diging/citesphere/core/model/jobs/IGroupSyncJob.java b/citesphere/src/main/java/edu/asu/diging/citesphere/core/model/jobs/IGroupSyncJob.java index 49f6b6c00..501bcf3cd 100644 --- a/citesphere/src/main/java/edu/asu/diging/citesphere/core/model/jobs/IGroupSyncJob.java +++ b/citesphere/src/main/java/edu/asu/diging/citesphere/core/model/jobs/IGroupSyncJob.java @@ -19,5 +19,9 @@ public interface IGroupSyncJob { void setFinishedOn(OffsetDateTime finishedOn); OffsetDateTime getFinishedOn(); + + String getGroupName(); + + void setGroupName(String groupName); } \ No newline at end of file diff --git a/citesphere/src/main/java/edu/asu/diging/citesphere/core/model/jobs/impl/GroupSyncJob.java b/citesphere/src/main/java/edu/asu/diging/citesphere/core/model/jobs/impl/GroupSyncJob.java index d6a41b55f..82e3524ec 100644 --- a/citesphere/src/main/java/edu/asu/diging/citesphere/core/model/jobs/impl/GroupSyncJob.java +++ b/citesphere/src/main/java/edu/asu/diging/citesphere/core/model/jobs/impl/GroupSyncJob.java @@ -3,6 +3,7 @@ import java.time.OffsetDateTime; import javax.persistence.Entity; +import javax.persistence.Transient; import edu.asu.diging.citesphere.core.model.jobs.IGroupSyncJob; @@ -13,6 +14,8 @@ public class GroupSyncJob extends Job implements IGroupSyncJob { private long total; private long current; private OffsetDateTime finishedOn; + @Transient + private String groupName; /* (non-Javadoc) * @see edu.asu.diging.citesphere.core.model.jobs.impl.IGroupSyncJob#getGroupId() @@ -64,4 +67,14 @@ public OffsetDateTime getFinishedOn() { public void setFinishedOn(OffsetDateTime finishedOn) { this.finishedOn = finishedOn; } + + @Override + public String getGroupName() { + return groupName; + } + + @Override + public void setGroupName(String groupName) { + this.groupName = groupName; + } } diff --git a/citesphere/src/main/java/edu/asu/diging/citesphere/core/repository/jobs/GroupSyncJobRepository.java b/citesphere/src/main/java/edu/asu/diging/citesphere/core/repository/jobs/GroupSyncJobRepository.java index 77f266f21..66fe7d6af 100644 --- a/citesphere/src/main/java/edu/asu/diging/citesphere/core/repository/jobs/GroupSyncJobRepository.java +++ b/citesphere/src/main/java/edu/asu/diging/citesphere/core/repository/jobs/GroupSyncJobRepository.java @@ -6,6 +6,7 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.repository.PagingAndSortingRepository; +import edu.asu.diging.citesphere.core.model.jobs.JobStatus; import edu.asu.diging.citesphere.core.model.jobs.impl.GroupSyncJob; public interface GroupSyncJobRepository extends PagingAndSortingRepository { @@ -15,4 +16,8 @@ public interface GroupSyncJobRepository extends PagingAndSortingRepository findByGroupIdIn(List groupIds, Pageable page); public long countByGroupIdIn(List groupIds); + + public List findByGroupIdInAndStatus(List groupIds, JobStatus status, Pageable page); + + public long countByGroupIdInAndStatus(List groupIds, JobStatus status); } diff --git a/citesphere/src/main/java/edu/asu/diging/citesphere/core/service/jobs/ISyncJobManager.java b/citesphere/src/main/java/edu/asu/diging/citesphere/core/service/jobs/ISyncJobManager.java index bb245da6c..4eff46b4b 100644 --- a/citesphere/src/main/java/edu/asu/diging/citesphere/core/service/jobs/ISyncJobManager.java +++ b/citesphere/src/main/java/edu/asu/diging/citesphere/core/service/jobs/ISyncJobManager.java @@ -13,9 +13,9 @@ public interface ISyncJobManager { GroupSyncJob getMostRecentJob(String groupId); - List getJobs(IUser user, Pageable page); + List getJobs(IUser user, Pageable page, String groupId, String status); - long getJobsCount(IUser user); + long getJobsCount(IUser user, String groupId, String status); void cancelJob(String jobId); diff --git a/citesphere/src/main/java/edu/asu/diging/citesphere/core/service/jobs/impl/SyncJobManager.java b/citesphere/src/main/java/edu/asu/diging/citesphere/core/service/jobs/impl/SyncJobManager.java index fa4fb77df..01bc41667 100644 --- a/citesphere/src/main/java/edu/asu/diging/citesphere/core/service/jobs/impl/SyncJobManager.java +++ b/citesphere/src/main/java/edu/asu/diging/citesphere/core/service/jobs/impl/SyncJobManager.java @@ -1,6 +1,7 @@ package edu.asu.diging.citesphere.core.service.jobs.impl; import java.time.OffsetDateTime; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Optional; @@ -12,8 +13,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; -import edu.asu.diging.citesphere.core.model.jobs.IJob; import edu.asu.diging.citesphere.core.model.jobs.JobStatus; import edu.asu.diging.citesphere.core.model.jobs.impl.GroupSyncJob; import edu.asu.diging.citesphere.core.repository.jobs.GroupSyncJobRepository; @@ -62,18 +63,57 @@ public GroupSyncJob getMostRecentJob(String groupId) { } @Override - public List getJobs(IUser user, Pageable page) { + public List getJobs(IUser user, Pageable page, String groupId, String status) { List groups = citationManager.getGroups(user); - return jobRepo.findByGroupIdIn(groups.stream().map(g -> g.getGroupId() + "").collect(Collectors.toList()), page); + if (groups == null || groups.isEmpty()) { + return Collections.emptyList(); + } + Map groupNames = groups.stream().collect( + Collectors.toMap(g -> g.getGroupId() + "", ICitationGroup::getName, (existing, replacement) -> existing)); + List groupIds = groups.stream().map(g -> g.getGroupId() + "").collect(Collectors.toList()); + if (StringUtils.hasText(groupId)) { + if (!groupIds.contains(groupId)) { + return Collections.emptyList(); + } + groupIds = Collections.singletonList(groupId); + } + List jobs; + if (StringUtils.hasText(status)) { + try { + JobStatus jobStatus = JobStatus.valueOf(status.toUpperCase()); + jobs = jobRepo.findByGroupIdInAndStatus(groupIds, jobStatus, page); + } catch (IllegalArgumentException e) { + return Collections.emptyList(); + } + } else { + jobs = jobRepo.findByGroupIdIn(groupIds, page); + } + jobs.forEach(job -> job.setGroupName(groupNames.get(job.getGroupId()))); + return jobs; } @Override - public long getJobsCount(IUser user) { + public long getJobsCount(IUser user, String groupId, String status) { List groups = citationManager.getGroups(user); if (groups == null) { return -1; } - return jobRepo.countByGroupIdIn(groups.stream().map(g -> g.getGroupId() + "").collect(Collectors.toList())); + List groupIds = groups.stream().map(g -> g.getGroupId() + "").collect(Collectors.toList()); + if (StringUtils.hasText(groupId)) { + if (!groupIds.contains(groupId)) { + return 0; + } + groupIds = Collections.singletonList(groupId); + } + if (StringUtils.hasText(status)) { + try { + JobStatus jobStatus = JobStatus.valueOf(status.toUpperCase()); + return jobRepo.countByGroupIdInAndStatus(groupIds, jobStatus); + } catch (IllegalArgumentException e) { + return 0; + } + } + return jobRepo.countByGroupIdIn(groupIds); } @Override diff --git a/citesphere/src/main/java/edu/asu/diging/citesphere/web/user/jobs/SyncJobsController.java b/citesphere/src/main/java/edu/asu/diging/citesphere/web/user/jobs/SyncJobsController.java index cf13e4dfd..53c719049 100644 --- a/citesphere/src/main/java/edu/asu/diging/citesphere/web/user/jobs/SyncJobsController.java +++ b/citesphere/src/main/java/edu/asu/diging/citesphere/web/user/jobs/SyncJobsController.java @@ -1,5 +1,8 @@ package edu.asu.diging.citesphere.web.user.jobs; +import java.util.Arrays; +import java.util.List; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort.Direction; @@ -7,9 +10,14 @@ import org.springframework.security.core.Authentication; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; +import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import edu.asu.diging.citesphere.core.model.jobs.JobStatus; +import edu.asu.diging.citesphere.core.service.ICitationManager; import edu.asu.diging.citesphere.core.service.jobs.ISyncJobManager; +import edu.asu.diging.citesphere.model.bib.ICitationGroup; import edu.asu.diging.citesphere.user.IUser; @Controller @@ -17,16 +25,48 @@ public class SyncJobsController { @Autowired private ISyncJobManager jobManager; + + @Autowired + private ICitationManager citationManager; @RequestMapping("/auth/jobs/sync/list") public String list(Model model, @PageableDefault(sort = { "createdOn" }, direction = Direction.DESC) Pageable page, - Authentication authentication) { - long total = jobManager.getJobsCount((IUser) authentication.getPrincipal()); + Authentication authentication, @RequestParam(name = "groupId", required = false) String groupId, + @RequestParam(name = "status", required = false) String status) { + IUser user = (IUser) authentication.getPrincipal(); + List groups = citationManager.getGroups(user); + model.addAttribute("groups", groups); + model.addAttribute("statuses", Arrays.asList(JobStatus.values())); + String selectedGroupId = StringUtils.hasText(groupId) ? groupId : ""; + model.addAttribute("selectedGroupId", selectedGroupId); + String selectedGroupName = "Group"; + if (StringUtils.hasText(groupId) && groups != null) { + selectedGroupName = groups.stream() + .filter(g -> g != null && groupId.equals(g.getGroupId() + "")) + .findFirst() + .map(g -> StringUtils.hasText(g.getName()) ? g.getName() : groupId) + .orElse("Group"); + } + model.addAttribute("selectedGroupName", selectedGroupName); + String selectedStatus = StringUtils.hasText(status) ? status : ""; + model.addAttribute("selectedStatus", selectedStatus); + String selectedStatusName = "Status"; + if (StringUtils.hasText(status)) { + try { + JobStatus jobStatus = JobStatus.valueOf(status.toUpperCase()); + selectedStatusName = jobStatus.name(); + } catch (IllegalArgumentException e) { + selectedStatusName = "Status"; + } + } + model.addAttribute("selectedStatusName", selectedStatusName); + long total = jobManager.getJobsCount(user, groupId, status); if (total == -1) { return "redirect:/"; } - model.addAttribute("jobs", jobManager.getJobs((IUser) authentication.getPrincipal(), page)); - model.addAttribute("total", Math.ceil(total/page.getPageSize())); + model.addAttribute("jobs", jobManager.getJobs(user, page, groupId, status)); + double pageCount = Math.ceil((double) total / page.getPageSize()); + model.addAttribute("total", pageCount < 1 ? 1 : pageCount); model.addAttribute("page", page.getPageNumber() + 1); return "auth/jobs/list"; } diff --git a/citesphere/src/main/webapp/WEB-INF/views/auth/jobs/list.html b/citesphere/src/main/webapp/WEB-INF/views/auth/jobs/list.html index bad98d32e..ddb0aba77 100644 --- a/citesphere/src/main/webapp/WEB-INF/views/auth/jobs/list.html +++ b/citesphere/src/main/webapp/WEB-INF/views/auth/jobs/list.html @@ -4,15 +4,34 @@