Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -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<GroupSyncJob, String> {
Expand All @@ -14,5 +15,11 @@ public interface GroupSyncJobRepository extends PagingAndSortingRepository<Group

public List<GroupSyncJob> findByGroupIdIn(List<String> groupIds, Pageable page);

public List<GroupSyncJob> findByGroupIdInAndStatus(List<String> groupIds, JobStatus status, Pageable page);

public List<GroupSyncJob> findByGroupId(String groupId, Pageable page);

public List<GroupSyncJob> findByGroupIdAndStatus(String groupId, JobStatus status, Pageable page);

public long countByGroupIdIn(List<String> groupIds);
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import org.springframework.data.domain.Pageable;

import edu.asu.diging.citesphere.core.model.jobs.JobStatus;
import edu.asu.diging.citesphere.core.model.jobs.impl.GroupSyncJob;
import edu.asu.diging.citesphere.user.IUser;

Expand All @@ -14,7 +15,15 @@ public interface ISyncJobManager {
GroupSyncJob getMostRecentJob(String groupId);

List<GroupSyncJob> getJobs(IUser user, Pageable page);


List<GroupSyncJob> getJobs(IUser user, JobStatus status, Pageable page);

List<GroupSyncJob> getJobs(String groupId, Pageable page);

List<GroupSyncJob> getJobs(String groupId, JobStatus status, Pageable page);

List<GroupSyncJob> getJobs(IUser user, String groupId, JobStatus jobStatus, Pageable page);

long getJobsCount(IUser user);

void cancelJob(String jobId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,31 @@ public List<GroupSyncJob> getJobs(IUser user, Pageable page) {
return jobRepo.findByGroupIdIn(groups.stream().map(g -> g.getGroupId() + "").collect(Collectors.toList()), page);
}

@Override
public List<GroupSyncJob> getJobs(IUser user, JobStatus status, Pageable page) {
List<ICitationGroup> groups = citationManager.getGroups(user);
return jobRepo.findByGroupIdInAndStatus(groups.stream().map(g -> g.getGroupId() + "").collect(Collectors.toList()), status, page);
}

@Override
public List<GroupSyncJob> getJobs(String groupId, Pageable page) {
return jobRepo.findByGroupId(groupId, page);
}

@Override
public List<GroupSyncJob> getJobs(String groupId, JobStatus status, Pageable page) {
return jobRepo.findByGroupIdAndStatus(groupId, status, page);
}

@Override
public List<GroupSyncJob> getJobs(IUser user, String groupId, JobStatus jobStatus, Pageable page) {
if (groupId.equals("All")) {
return jobStatus == null ? getJobs(user, page) : getJobs(user, jobStatus, page);
} else {
return jobStatus == null ? getJobs(groupId, page) : getJobs(groupId, jobStatus, page);
}
}

@Override
public long getJobsCount(IUser user) {
List<ICitationGroup> groups = citationManager.getGroups(user);
Expand All @@ -89,4 +114,5 @@ public void cancelJob(String jobId) {
jobRepo.save(job);
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@
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.model.jobs.JobStatus;
import edu.asu.diging.citesphere.core.service.jobs.ISyncJobManager;
import edu.asu.diging.citesphere.user.IUser;

Expand All @@ -19,13 +21,17 @@ public class SyncJobsController {
private ISyncJobManager jobManager;

@RequestMapping("/auth/jobs/sync/list")
public String list(Model model, @PageableDefault(sort = { "createdOn" }, direction = Direction.DESC) Pageable page,
Authentication authentication) {
public String list(Model model, @PageableDefault(sort = { "createdOn" }, direction = Direction.DESC) Pageable page, Authentication authentication,
@RequestParam(value = "groupId", required = false, defaultValue = "All") String groupId,
@RequestParam(value = "jobStatus", required = false, defaultValue = "All") String jobStatus) {
long total = jobManager.getJobsCount((IUser) authentication.getPrincipal());
if (total == -1) {
return "redirect:/";
}
model.addAttribute("jobs", jobManager.getJobs((IUser) authentication.getPrincipal(), page));
JobStatus jobStatusEnum = jobStatus.equals("All") ? null : JobStatus.valueOf(jobStatus);
model.addAttribute("jobs", jobManager.getJobs((IUser) authentication.getPrincipal(), groupId, jobStatusEnum, page));
model.addAttribute("jobStatus", jobStatus);
model.addAttribute("groupId", groupId);
model.addAttribute("total", Math.ceil(total/page.getPageSize()));
model.addAttribute("page", page.getPageNumber() + 1);
return "auth/jobs/list";
Expand Down
34 changes: 34 additions & 0 deletions citesphere/src/main/webapp/WEB-INF/views/auth/jobs/list.html
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,24 @@
window.location.href = "[(@{|/auth/jobs/sync/list|})]?page=" + (page - 1);
}
});

$("#jobStatus").change(function () {
var groupId = $("#findgroupId").val();
var jobStatus = $("#jobStatus").val();
if ($("#jobStatus").val() === 'All') {
window.location.href = [[@{/auth/jobs/sync/list}]];
} else {
window.location.href = [[@{/auth/jobs/sync/list}]] + "?jobStatus=" + jobStatus + "&groupId=" + groupId;
}
});

$("#findBygroupIdBtn").click(function() {
var groupId = $("#findgroupId").val();
var jobStatus = $("#jobStatus").val();
if (groupId != undefined && groupId != '') {
window.location.href = [[@{/auth/jobs/sync/list}]] + "?jobStatus=" + jobStatus + "&groupId=" + groupId;
}
});
});
</script>
</head>
Expand All @@ -23,6 +41,22 @@
<div layout:fragment="content">
<h1>Jobs</h1>

<div class="input-group">
<input type="text" id="findgroupId" name="findgroupId" class="form-control" placeholder="Find by group id"/>
<div class="input-group-addon" id="findBygroupIdBtn" style="cursor: pointer;"><i class="icon-search"></i></div>
</div>
<br>

<label for="jobStatus">Job Status</label>
<select class="form-control" id="jobStatus" name="jobStatus" >
<span >
<option th:selected="${#strings.equals(jobStatus, 'All')}">All</option>
<span th:each="status:${T(edu.asu.diging.citesphere.core.model.jobs.JobStatus).values()}">
<option th:selected="${#strings.equals(jobStatus, status)}" th:value="${status}" th:text="${status}">[[${status]]</option>
</span>
</span>
</select><br>

<ul id="pagination-top" class="pagination-sm"></ul>

<table class="table table-striped">
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
package edu.asu.diging.citesphere.core.service.jobs.impl;

import java.util.ArrayList;
import java.util.List;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;

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;
import edu.asu.diging.citesphere.core.service.ICitationManager;
import edu.asu.diging.citesphere.model.bib.ICitationGroup;
import edu.asu.diging.citesphere.model.bib.impl.CitationGroup;
import edu.asu.diging.citesphere.user.IUser;
import edu.asu.diging.citesphere.user.impl.User;

public class SyncJobManagerTest {

@InjectMocks
private SyncJobManager managerToTest;

@Mock
private GroupSyncJobRepository jobRepo;

@Mock
private ICitationManager citationManager;

private IUser user;
private int page;
private int pageSize;
private Pageable paging;
private List<ICitationGroup> citationGroupList;
private ICitationGroup citationGroup1;
private ICitationGroup citationGroup2;
private List<GroupSyncJob> groupSyncJobList;
private List<GroupSyncJob> groupSyncJobEmptyList;
private GroupSyncJob groupSyncJob1;
private GroupSyncJob groupSyncJob2;
private List<String> groupIds;
private JobStatus status;
private String groupId;

@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
user = new User();
page = 1;
pageSize = 10;
paging = PageRequest.of(page, pageSize);

citationGroup1 = new CitationGroup();
citationGroup1.setGroupId(1L);
citationGroup2 = new CitationGroup();
groupSyncJob1 = new GroupSyncJob();
groupSyncJob2 = new GroupSyncJob();

citationGroupList = new ArrayList<>();
citationGroupList.add(citationGroup1);
citationGroupList.add(citationGroup2);

groupSyncJobList = new ArrayList<>();
groupSyncJobList.add(groupSyncJob1);
groupSyncJobList.add(groupSyncJob2);

groupIds = new ArrayList<>();

groupSyncJobEmptyList = new ArrayList<>();
status = JobStatus.DONE;
groupId = "group1";
}

@Test
public void test_getJobs_succsess() {
Mockito.when(jobRepo.findByGroupIdIn(groupIds, paging)).thenReturn(groupSyncJobList);
List<GroupSyncJob> actualResponse = managerToTest.getJobs(user, paging);
Assert.assertEquals(2, actualResponse.size());
}

@Test
public void test_getJobs_resultsNotFound() {
Mockito.when(jobRepo.findByGroupIdIn(groupIds, paging)).thenReturn(groupSyncJobEmptyList);
List<GroupSyncJob> actualResponse = managerToTest.getJobs(user, paging);
Assert.assertTrue(actualResponse.isEmpty());
}

@Test
public void test_getJobs_byJobStatus() {
Mockito.when(jobRepo.findByGroupIdInAndStatus(groupIds, status, paging)).thenReturn(groupSyncJobList);
List<GroupSyncJob> actualResponse = managerToTest.getJobs(user, status, paging);
Assert.assertEquals(2, actualResponse.size());
}

@Test
public void test_getJobs_byJobStatus_resultsNotFound() {
Mockito.when(jobRepo.findByGroupIdInAndStatus(groupIds, status, paging)).thenReturn(groupSyncJobEmptyList);
List<GroupSyncJob> actualResponse = managerToTest.getJobs(user, status, paging);
Assert.assertTrue(actualResponse.isEmpty());
}

@Test
public void test_getJobs_byGroupId() {
Mockito.when(jobRepo.findByGroupId(groupId, paging)).thenReturn(groupSyncJobList);
List<GroupSyncJob> actualResponse = managerToTest.getJobs(groupId, paging);
Assert.assertEquals(2, actualResponse.size());
}

@Test
public void test_getJobs_byGroupId_resultsNotFound() {
Mockito.when(jobRepo.findByGroupId(groupId, paging)).thenReturn(groupSyncJobEmptyList);
List<GroupSyncJob> actualResponse = managerToTest.getJobs(groupId, paging);
Assert.assertTrue(actualResponse.isEmpty());
}

@Test
public void test_getJobs_byJobStatusAndGroupId() {
Mockito.when(jobRepo.findByGroupIdAndStatus(groupId, status, paging))
.thenReturn(groupSyncJobList);
List<GroupSyncJob> actualResponse = managerToTest.getJobs(groupId, status, paging);
Assert.assertEquals(2, actualResponse.size());
}

@Test
public void test_getJobs_byJobStatusAndGroupId_resultsNotFound() {
Mockito.when(jobRepo.findByGroupIdAndStatus(groupId, status, paging))
.thenReturn(groupSyncJobEmptyList);
List<GroupSyncJob> actualResponse = managerToTest.getJobs(groupId, status, paging);
Assert.assertTrue(actualResponse.isEmpty());
}
}