From 2592aebdb18167063867066042bc92acfe5dbd41 Mon Sep 17 00:00:00 2001
From: Emil Siverhall <emil-siv@dsv.su.se>
Date: Mon, 28 May 2012 10:56:06 +0200
Subject: [PATCH 1/2] added ajax date filtering to all peers lists

---
 .../scipro/admin/panels/AdminMailPanel.java   | 14 ++++++++++-
 .../scipro/components/DatePickerPanel.java    | 13 +++++-----
 .../panels/FilterFormRequestStatusPanel.html  |  2 +-
 .../panels/FilterFormReviewStatusPanel.html   |  2 +-
 .../peer/panels/PeerRequestListPanel.html     | 10 +++++---
 .../peer/panels/PeerRequestListPanel.java     | 25 +++++++++++++++++++
 .../peer/panels/PeerReviewListPanel.html      | 10 +++++---
 .../peer/panels/PeerReviewListPanel.java      | 24 ++++++++++++++++++
 .../serviceimpls/PeerRequestServiceImpl.java  | 11 +++++++-
 .../serviceimpls/PeerReviewServiceImpl.java   | 12 ++++++++-
 .../services/PeerRequestService.java          | 15 +++++++++++
 .../services/PeerReviewService.java           | 19 ++++++++++++++
 12 files changed, 138 insertions(+), 19 deletions(-)

diff --git a/src/main/java/se/su/dsv/scipro/admin/panels/AdminMailPanel.java b/src/main/java/se/su/dsv/scipro/admin/panels/AdminMailPanel.java
index 9f6589bdf3..cd37b0c9b3 100644
--- a/src/main/java/se/su/dsv/scipro/admin/panels/AdminMailPanel.java
+++ b/src/main/java/se/su/dsv/scipro/admin/panels/AdminMailPanel.java
@@ -144,7 +144,19 @@ public class AdminMailPanel extends Panel {
 		
 		DateTime start = new DateTime();
 		start = start.minusMonths(6);
-		dpp = new DatePickerPanel("datePanel", start.toDate(), null);
+		dpp = new DatePickerPanel("datePanel", start.toDate(), null) {
+			private static final long serialVersionUID = 8199436051263013307L;
+
+			@Override
+			public void updateStartDate(AjaxRequestTarget target) {
+				updateUserSet(target);
+			}
+			
+			@Override
+			public void updateEndDate(AjaxRequestTarget target) {
+				updateUserSet(target);
+			}
+		};
 		add(dpp);
 	}
 
diff --git a/src/main/java/se/su/dsv/scipro/components/DatePickerPanel.java b/src/main/java/se/su/dsv/scipro/components/DatePickerPanel.java
index a0b5022b3f..33ae3b1b61 100644
--- a/src/main/java/se/su/dsv/scipro/components/DatePickerPanel.java
+++ b/src/main/java/se/su/dsv/scipro/components/DatePickerPanel.java
@@ -11,11 +11,7 @@ import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.Model;
 
-
-
-
-
-public class DatePickerPanel extends Panel{
+public abstract class DatePickerPanel extends Panel{
 
 	private static final long serialVersionUID = -5607127520132313062L;
 	
@@ -74,6 +70,7 @@ public class DatePickerPanel extends Panel{
 			@Override
 			protected void onUpdate(AjaxRequestTarget target) {
 				setStartDate(startDtf.getModelObject());
+				updateStartDate(target);
 			}
 		};
 		
@@ -85,7 +82,7 @@ public class DatePickerPanel extends Panel{
 			@Override
 			protected void onUpdate(AjaxRequestTarget target) {
 				setEndDate(endDtf.getModelObject());
-				
+				updateEndDate(target);
 			}
 		};
 		
@@ -128,4 +125,8 @@ public class DatePickerPanel extends Panel{
 		//model.getObject().setEndDate(dpm.getEndDate());
 		endDtf.setModelObject(dpm.getEndDate());
 	}
+	
+	public abstract void updateStartDate(AjaxRequestTarget target);
+	public abstract void updateEndDate(AjaxRequestTarget target);
+
 }
diff --git a/src/main/java/se/su/dsv/scipro/peer/panels/FilterFormRequestStatusPanel.html b/src/main/java/se/su/dsv/scipro/peer/panels/FilterFormRequestStatusPanel.html
index 13185320cc..2082da651d 100644
--- a/src/main/java/se/su/dsv/scipro/peer/panels/FilterFormRequestStatusPanel.html
+++ b/src/main/java/se/su/dsv/scipro/peer/panels/FilterFormRequestStatusPanel.html
@@ -8,7 +8,7 @@
 
 	<wicket:panel>
 		<div wicket:id="container">
-			<label for="checkGroup">Filter by status:</label>
+			<label for="checkGroup">Filter by status</label>
 			<div wicket:id="checkGroup">
 				<div wicket:id="statusView">
 				<input type="checkbox" wicket:id="statusCheckBox"></input>
diff --git a/src/main/java/se/su/dsv/scipro/peer/panels/FilterFormReviewStatusPanel.html b/src/main/java/se/su/dsv/scipro/peer/panels/FilterFormReviewStatusPanel.html
index 13185320cc..2082da651d 100644
--- a/src/main/java/se/su/dsv/scipro/peer/panels/FilterFormReviewStatusPanel.html
+++ b/src/main/java/se/su/dsv/scipro/peer/panels/FilterFormReviewStatusPanel.html
@@ -8,7 +8,7 @@
 
 	<wicket:panel>
 		<div wicket:id="container">
-			<label for="checkGroup">Filter by status:</label>
+			<label for="checkGroup">Filter by status</label>
 			<div wicket:id="checkGroup">
 				<div wicket:id="statusView">
 				<input type="checkbox" wicket:id="statusCheckBox"></input>
diff --git a/src/main/java/se/su/dsv/scipro/peer/panels/PeerRequestListPanel.html b/src/main/java/se/su/dsv/scipro/peer/panels/PeerRequestListPanel.html
index 318374e249..2e8b07492f 100644
--- a/src/main/java/se/su/dsv/scipro/peer/panels/PeerRequestListPanel.html
+++ b/src/main/java/se/su/dsv/scipro/peer/panels/PeerRequestListPanel.html
@@ -6,15 +6,17 @@
 
 		<div class="span-24 prepend-top last">
 		<form wicket:id="form">
-		<div class="span-6">
-		<label>Filter by requesting author:</label>
+		<div class="span-5">
+		<label>Filter by requesting author</label>
 		<br />
 		<input wicket:id="filterAuthor" />
 		<br />
 		</div>
-		<div class="span-6" wicket:id="statusFilter"></div>
+		<div class="span-5" wicket:id="statusFilter"></div>
+		<label>Request created between</label><br />
+         <div class="span-6" wicket:id="datePanel"></div>
 		<div class="span-10" wicket:id="supervisorContainer">	
-		<label>Show only my projects:</label>
+		<label>Show only my projects</label>
 		<br />
         <input type="checkbox" wicket:id="supervisorCheckBox" />
         <br />
diff --git a/src/main/java/se/su/dsv/scipro/peer/panels/PeerRequestListPanel.java b/src/main/java/se/su/dsv/scipro/peer/panels/PeerRequestListPanel.java
index 06e4f9f10c..8e43b06773 100644
--- a/src/main/java/se/su/dsv/scipro/peer/panels/PeerRequestListPanel.java
+++ b/src/main/java/se/su/dsv/scipro/peer/panels/PeerRequestListPanel.java
@@ -3,6 +3,7 @@
  */
 package se.su.dsv.scipro.peer.panels;
 
+import java.util.Date;
 import java.util.Iterator;
 
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -22,10 +23,12 @@ import org.apache.wicket.model.AbstractReadOnlyModel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.spring.injection.annot.SpringBean;
+import org.joda.time.DateTime;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Sort;
 
 import se.su.dsv.scipro.SciProSession;
+import se.su.dsv.scipro.components.DatePickerPanel;
 import se.su.dsv.scipro.components.ItemsPerPageChoice;
 import se.su.dsv.scipro.data.dataobjects.Employee;
 import se.su.dsv.scipro.data.dataobjects.Student;
@@ -137,6 +140,28 @@ public class PeerRequestListPanel extends Panel {
 			};
 			params.setStatuses(statusFilter.getSelectedStatuses());
 			add(statusFilter);
+			
+			DateTime start = new DateTime();
+			start = start.minusMonths(12);
+			params.setCreatedAfter(start.toDate());
+			params.setCreatedBefore(new Date());
+			final DatePickerPanel datePanel = new DatePickerPanel("datePanel", start.toDate(), null) {
+				private static final long serialVersionUID = 1502923890365050302L;
+
+				@Override
+				public void updateStartDate(AjaxRequestTarget target) {
+					params.setCreatedAfter(getStartDate());
+					updateTarget(target, params);
+				}
+				
+				@Override
+				public void updateEndDate(AjaxRequestTarget target) {
+					params.setCreatedBefore(getEndDate());
+					updateTarget(target, params);
+				}
+			};
+			add(datePanel);
+			
 			final AjaxCheckBox supervisorProjects = new AjaxCheckBox("supervisorCheckBox", new Model<Boolean>()) {
 				private static final long serialVersionUID = -7624763782876907386L;
 
diff --git a/src/main/java/se/su/dsv/scipro/peer/panels/PeerReviewListPanel.html b/src/main/java/se/su/dsv/scipro/peer/panels/PeerReviewListPanel.html
index b601ba03ce..c26d9acde5 100644
--- a/src/main/java/se/su/dsv/scipro/peer/panels/PeerReviewListPanel.html
+++ b/src/main/java/se/su/dsv/scipro/peer/panels/PeerReviewListPanel.html
@@ -6,15 +6,17 @@
 
     <div class="span-24 prepend-top last">
         <form wicket:id="form">
-            <div class="span-6">
-                <label>Filter by reviewing author:</label>
+            <div class="span-5">
+                <label>Filter by reviewing author</label>
                 <br/>
                 <input wicket:id="filterAuthor"/>
                 <br/>
             </div>
-            <div class="span-6" wicket:id="statusFilter"></div>
+            <div class="span-5" wicket:id="statusFilter"></div>
+            <label>Review commenced between</label><br />
+            <div class="span-6" wicket:id="datePanel"></div>
             <div class="span-10" wicket:id="supervisorContainer">
-                <label>Show only my projects:</label>
+                <label>Show only my projects</label>
                 <br>
                 <input type="checkbox" wicket:id="supervisorCheckBox"/>
                 <br>
diff --git a/src/main/java/se/su/dsv/scipro/peer/panels/PeerReviewListPanel.java b/src/main/java/se/su/dsv/scipro/peer/panels/PeerReviewListPanel.java
index 80864939b6..5785550575 100644
--- a/src/main/java/se/su/dsv/scipro/peer/panels/PeerReviewListPanel.java
+++ b/src/main/java/se/su/dsv/scipro/peer/panels/PeerReviewListPanel.java
@@ -3,6 +3,7 @@
  */
 package se.su.dsv.scipro.peer.panels;
 
+import java.util.Date;
 import java.util.Iterator;
 
 import org.apache.wicket.PageParameters;
@@ -23,10 +24,12 @@ import org.apache.wicket.model.AbstractReadOnlyModel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.spring.injection.annot.SpringBean;
+import org.joda.time.DateTime;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Sort;
 
 import se.su.dsv.scipro.SciProSession;
+import se.su.dsv.scipro.components.DatePickerPanel;
 import se.su.dsv.scipro.components.ItemsPerPageChoice;
 import se.su.dsv.scipro.data.dataobjects.Employee;
 import se.su.dsv.scipro.data.dataobjects.Student;
@@ -159,6 +162,27 @@ public class PeerReviewListPanel extends Panel {
 				}
 			};
 			add(statusFilter);
+			
+			DateTime start = new DateTime();
+			start = start.minusMonths(12);
+			params.setCreatedAfter(start.toDate());
+			params.setCreatedBefore(new Date());
+			final DatePickerPanel datePanel = new DatePickerPanel("datePanel", start.toDate(), null) {
+				private static final long serialVersionUID = -411662653140866688L;
+
+				@Override
+				public void updateStartDate(AjaxRequestTarget target) {
+					params.setCreatedAfter(getStartDate());
+					updateTarget(target, params);
+				}
+				
+				@Override
+				public void updateEndDate(AjaxRequestTarget target) {
+					params.setCreatedBefore(getEndDate());
+					updateTarget(target, params);
+				}
+			};
+			add(datePanel);
 			final AjaxCheckBox supervisorProjects = new AjaxCheckBox("supervisorCheckBox", new Model<Boolean>()) {
 				private static final long serialVersionUID = -6475334474261478489L;
 
diff --git a/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/PeerRequestServiceImpl.java b/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/PeerRequestServiceImpl.java
index 3f84e8a8a8..d152512515 100644
--- a/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/PeerRequestServiceImpl.java
+++ b/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/PeerRequestServiceImpl.java
@@ -2,6 +2,7 @@ package se.su.dsv.scipro.springdata.serviceimpls;
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Date;
 import java.util.List;
 
 import javax.annotation.Resource;
@@ -132,6 +133,13 @@ public class PeerRequestServiceImpl extends AbstractQueryService<PeerRequest, Lo
 		}
     }
     
+    private BooleanExpression createdBetween(Date from, Date to) {
+    	if(from!=null&to!=null)
+    		return QPeerRequest.peerRequest.dateCreated.between(from, to);
+    	else
+    		return null;
+    }
+    
     private BooleanBuilder statusFilter(Collection<RequestStatus> statuses){
     	BooleanBuilder e = new BooleanBuilder();
     	if(statuses!=null && !statuses.isEmpty()){
@@ -150,7 +158,8 @@ public class PeerRequestServiceImpl extends AbstractQueryService<PeerRequest, Lo
     private Predicate predicateFromParams(FilterParams params) {
 		return isRequester(params.getAuthor())
 				.and(statusFilter(params.getStatuses()))
-				.and(supervisorIs(params.getSupervisor()));
+				.and(supervisorIs(params.getSupervisor()))
+				.and(createdBetween(params.getCreatedAfter(), params.getCreatedBefore()));
     }
 
 	@Transactional ( readOnly = false )
diff --git a/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/PeerReviewServiceImpl.java b/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/PeerReviewServiceImpl.java
index 2d05e5a36f..d90c1f3c1f 100644
--- a/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/PeerReviewServiceImpl.java
+++ b/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/PeerReviewServiceImpl.java
@@ -1,6 +1,7 @@
 package se.su.dsv.scipro.springdata.serviceimpls;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 import javax.annotation.Resource;
@@ -55,7 +56,8 @@ public class PeerReviewServiceImpl extends AbstractQueryService<PeerReview, Long
 	private Predicate predicateFromParams(FilterParams params) {
 		return reviewerIs(params.getAuthor())
 				.and(statusFilter(params.isIncludeCompleted(), params.isIncludeAborted(), params.isIncludeInProgress()))
-					.and(supervisorIs(params.getSupervisor()));
+					.and(supervisorIs(params.getSupervisor()))
+					.and(startedBetween(params.getCreatedAfter(), params.getCreatedBefore()));
 	}
 
 	
@@ -181,6 +183,14 @@ public class PeerReviewServiceImpl extends AbstractQueryService<PeerReview, Long
 	private BooleanExpression isSubmitted(boolean isSubmitted){
 		return QPeerReview.peerReview.submitted.eq(isSubmitted);
 	}
+	
+	private BooleanExpression startedBetween(Date from, Date to) {
+		if(from!=null&&to!=null) {
+			return QPeerReview.peerReview.dateCreated.between(from, to);
+		}
+		else
+			return null;
+	}
 
 	//Construct a list from Iterable Object.
 	private List<PeerReview> constructList(Iterable<PeerReview> reviews) {
diff --git a/src/main/java/se/su/dsv/scipro/springdata/services/PeerRequestService.java b/src/main/java/se/su/dsv/scipro/springdata/services/PeerRequestService.java
index 3b600d558f..dace639726 100644
--- a/src/main/java/se/su/dsv/scipro/springdata/services/PeerRequestService.java
+++ b/src/main/java/se/su/dsv/scipro/springdata/services/PeerRequestService.java
@@ -2,6 +2,7 @@ package se.su.dsv.scipro.springdata.services;
 
 import java.io.Serializable;
 import java.util.Collection;
+import java.util.Date;
 import java.util.List;
 
 import org.springframework.data.domain.Page;
@@ -36,6 +37,8 @@ public interface PeerRequestService extends GenericService<PeerRequest, Long>, Q
 		private Employee supervisor;
 		private Student author;
 		private Collection<RequestStatus> statuses;
+		private Date createdAfter;
+		private Date createdBefore;
 		
 		public void setSupervisor(Employee supervisor) {
 			this.supervisor = supervisor;
@@ -55,6 +58,18 @@ public interface PeerRequestService extends GenericService<PeerRequest, Long>, Q
 		public Student getAuthor() {
 			return author;
 		}
+		public void setCreatedAfter(Date createdAfter) {
+			this.createdAfter = createdAfter;
+		}
+		public Date getCreatedAfter() {
+			return createdAfter;
+		}
+		public void setCreatedBefore(Date createdBefore) {
+			this.createdBefore = createdBefore;
+		}
+		public Date getCreatedBefore() {
+			return createdBefore;
+		}
 		
     }
 }
diff --git a/src/main/java/se/su/dsv/scipro/springdata/services/PeerReviewService.java b/src/main/java/se/su/dsv/scipro/springdata/services/PeerReviewService.java
index 65ea0d035c..8665f245f4 100644
--- a/src/main/java/se/su/dsv/scipro/springdata/services/PeerReviewService.java
+++ b/src/main/java/se/su/dsv/scipro/springdata/services/PeerReviewService.java
@@ -1,6 +1,7 @@
 package se.su.dsv.scipro.springdata.services;
 
 import java.io.Serializable;
+import java.util.Date;
 import java.util.List;
 
 import org.springframework.data.domain.Page;
@@ -39,6 +40,8 @@ public interface PeerReviewService extends GenericService<PeerReview, Long>, Que
 		private boolean includeCompleted;
 		private boolean includeAborted;
 		private boolean includeInProgress;
+		private Date createdAfter;
+		private Date createdBefore;
 		
 		public void setIncludeCompleted(boolean includeCompleted) {
 			this.includeCompleted = includeCompleted;
@@ -80,5 +83,21 @@ public interface PeerReviewService extends GenericService<PeerReview, Long>, Que
 			return author;
 		}
 
+		public void setCreatedAfter(Date createdAfter) {
+			this.createdAfter = createdAfter;
+		}
+
+		public Date getCreatedAfter() {
+			return createdAfter;
+		}
+
+		public void setCreatedBefore(Date createdBefore) {
+			this.createdBefore = createdBefore;
+		}
+
+		public Date getCreatedBefore() {
+			return createdBefore;
+		}
+
     }
 }

From b58b91003ff8abac80a37f12560911ed46e52c90 Mon Sep 17 00:00:00 2001
From: Emil Siverhall <emil-siv@dsv.su.se>
Date: Mon, 28 May 2012 13:44:53 +0200
Subject: [PATCH 2/2] new unit tests for params filtering on peer reviews

---
 .../serviceimpls/PeerReviewServiceImpl.java   |   2 +-
 .../dsv/scipro/springdata/TestPeerReview.java | 258 ++++++++++++------
 2 files changed, 176 insertions(+), 84 deletions(-)

diff --git a/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/PeerReviewServiceImpl.java b/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/PeerReviewServiceImpl.java
index d90c1f3c1f..80f2a03b16 100644
--- a/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/PeerReviewServiceImpl.java
+++ b/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/PeerReviewServiceImpl.java
@@ -137,7 +137,7 @@ public class PeerReviewServiceImpl extends AbstractQueryService<PeerReview, Long
 	private BooleanBuilder statusFilter(boolean includeCompleted,boolean includeAborted,boolean includeInProgress) {
 		BooleanBuilder e = new BooleanBuilder();
 		if(includeCompleted)
-			e.and(isAborted(false).and(isSubmitted(true)).and(isDeleted(false)));
+			e.or(isAborted(false).and(isSubmitted(true)).and(isDeleted(false)));
 		if(includeAborted)
 			e.or(isAborted(true).and(isSubmitted(false)).and(isDeleted(false)));
 		if(includeInProgress)
diff --git a/src/test/java/se/su/dsv/scipro/springdata/TestPeerReview.java b/src/test/java/se/su/dsv/scipro/springdata/TestPeerReview.java
index cc307070c2..180a5713ba 100644
--- a/src/test/java/se/su/dsv/scipro/springdata/TestPeerReview.java
+++ b/src/test/java/se/su/dsv/scipro/springdata/TestPeerReview.java
@@ -1,15 +1,21 @@
 package se.su.dsv.scipro.springdata;
 
 
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.Arrays;
+import java.util.Date;
 import java.util.List;
+import java.util.Locale;
 
 import junit.framework.Assert;
 
+import org.joda.time.DateTime;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.PageRequest;
 import org.springframework.test.annotation.Rollback;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@@ -18,18 +24,15 @@ import org.springframework.transaction.annotation.Transactional;
 import se.su.dsv.scipro.data.dataobjects.Employee;
 import se.su.dsv.scipro.data.dataobjects.Project;
 import se.su.dsv.scipro.data.dataobjects.ProjectClass;
-import se.su.dsv.scipro.data.dataobjects.ProjectFollower;
 import se.su.dsv.scipro.data.dataobjects.Student;
 import se.su.dsv.scipro.data.dataobjects.User;
 import se.su.dsv.scipro.data.enums.ProjectStatus;
-import se.su.dsv.scipro.data.enums.ProjectTeamMemberRoles;
 import se.su.dsv.scipro.peer.data.dataobjects.PeerRequest;
 import se.su.dsv.scipro.peer.data.dataobjects.PeerReview;
 import se.su.dsv.scipro.peer.enums.RequestStatus;
 import se.su.dsv.scipro.springdata.services.PeerRequestService;
 import se.su.dsv.scipro.springdata.services.PeerReviewService;
 import se.su.dsv.scipro.springdata.services.ProjectClassService;
-import se.su.dsv.scipro.springdata.services.ProjectFollowerService;
 import se.su.dsv.scipro.springdata.services.ProjectService;
 import se.su.dsv.scipro.springdata.services.RoleService;
 import se.su.dsv.scipro.springdata.services.UserService;
@@ -60,107 +63,41 @@ public class TestPeerReview {
     private ProjectClass bachelor;
     private ProjectClass master;
     private PeerReview review1, review2, review3;
-    private PeerRequest request1, request2, request3, awaitingRequest;
+    private PeerRequest request1, request2, request3, request4;
 
     @Before
     public void startTransaction() throws Exception {
 
         bachelor = new ProjectClass(ProjectClass.BACHELOR, "Bachelor", "Bachelor degree thesis project");
         bachelor = projectClassService.save(bachelor);
-
         master = new ProjectClass(ProjectClass.MASTER, "Master", "Master degree thesis project");
         master = projectClassService.save(master);
        
         employeeUser = new User();
         employeeUser = userService.save(employeeUser);
-
         reviewer = new User();
         reviewer = userService.save(reviewer);
         requester = new User();
         requester = userService.save(requester);
         
-        reviewerRole = new Student();
-        reviewerRole.setUser(reviewer);
-        reviewerRole = (Student) roleService.save(reviewerRole);
-        requesterRole = new Student();
-        requesterRole.setUser(requester);
-        requesterRole = (Student) roleService.save(requesterRole);
-        
+        reviewerRole = newStudent(reviewer);
+        requesterRole = newStudent(requester);
+
         headSupervisor = new Employee();
         headSupervisor.setUser(employeeUser);
         headSupervisor = (Employee) roleService.save(headSupervisor);
 
-        reviewerProject = new Project();
-        reviewerProject.setProjectClass(bachelor);
-        reviewerProject.setTitle("Project 1");
-        reviewerProject.setHeadSupervisor(headSupervisor);
-        reviewerProject.addProjectParticipant(reviewerRole);
-        reviewerProject.setProjectStatus(ProjectStatus.ACTIVE);
-        reviewerProject = projectService.save(reviewerProject);
-        
-        requesterProject = new Project();
-        requesterProject.setProjectClass(master);
-        requesterProject.setTitle("Project 2");
-        requesterProject.setHeadSupervisor(headSupervisor);
-        requesterProject.addProjectParticipant(requesterRole);
-        requesterProject.setProjectStatus(ProjectStatus.ACTIVE);
-        requesterProject = projectService.save(requesterProject);    
+        reviewerProject = newProject(bachelor, reviewerRole, headSupervisor, ProjectStatus.ACTIVE);
+        requesterProject = newProject(master, requesterRole, headSupervisor, ProjectStatus.ACTIVE);
 
-        request1 = new PeerRequest();
-		request1.setComment("Request 1");
-		request1.setRequester(requesterRole);
-		request1.setProject(requesterProject);
-		request1 = peerRequestService.save(request1);
-		
-		review1 = new PeerReview();
-		review1.setReviewer(reviewerRole);
-		review1.setProject(reviewerProject);
-		review1.setComment("Overall ok!");
-		review1.setPeerRequest(request1);
-		request1.setStatus(RequestStatus.FINISHED);
-		request1 = peerRequestService.save(request1);
-		review1.setSubmitted(true);
-		review1 = peerReviewService.save(review1);
-		
-		request2 = new PeerRequest();
-		request2.setComment("Request 2");
-		request2.setRequester(requesterRole);
-		request2.setProject(requesterProject);
-		request2 = peerRequestService.save(request2);
-		
-		review2 = new PeerReview();
-		review2.setReviewer(reviewerRole);
-		review2.setProject(reviewerProject);
-		review2.setComment("Overall ok!");
-		review2.setPeerRequest(request2);
-		request2.setStatus(RequestStatus.FINISHED);
-		request2 = peerRequestService.save(request2);
-		review2.setSubmitted(true);
-		review2 = peerReviewService.save(review2);
-		
-		request3 = new PeerRequest();
-		request3.setComment("Request 3");
-		request3.setRequester(requesterRole);
-		request3.setProject(requesterProject);
-		request3 = peerRequestService.save(request3);
-		
-		review3 = new PeerReview();
-		review3.setReviewer(reviewerRole);
-		review3.setProject(reviewerProject);
-		review3.setComment("Overall ok!");
-		review3.setPeerRequest(request2);
-		request3.setStatus(RequestStatus.TAKEN);
-		request3 = peerRequestService.save(request3);
-		review3.setSubmitted(false);
-		review3 = peerReviewService.save(review3);
-		
-		awaitingRequest = new PeerRequest();
-		awaitingRequest.setComment("Awaiting request");
-		awaitingRequest.setRequester(requesterRole);
-		awaitingRequest.setProject(requesterProject);
-		awaitingRequest.setStatus(RequestStatus.WAITING);
-		awaitingRequest = peerRequestService.save(awaitingRequest);
+        request1 = newRequest(requesterRole, requesterProject, "Request 1", null);
+		request2 = newRequest(requesterRole, requesterProject, "Request 2", null);
+		request3 = newRequest(requesterRole, requesterProject, "Request 3", null);
+		request4 = newRequest(requesterRole, requesterProject, "Request 4", RequestStatus.WAITING);
 		
+		review1 = newReview(reviewerRole, reviewerProject, request1, RequestStatus.FINISHED, false, true);
+		review2 = newReview(reviewerRole, reviewerProject, request2, RequestStatus.FINISHED, false, true);
+		review3 = newReview(reviewerRole, reviewerProject, request3, RequestStatus.TAKEN, false, false);
     }
 
     @Test
@@ -220,7 +157,162 @@ public class TestPeerReview {
     public void testFindAwaitingRequestsByProject(){
     	List<PeerRequest> awaitingRequests = peerRequestService.findAwaitingRequests(requesterProject);
     	Assert.assertEquals(1, awaitingRequests.size());
-    	Assert.assertEquals(Arrays.asList(new PeerRequest[]{awaitingRequest}), awaitingRequests);
+    	Assert.assertEquals(Arrays.asList(new PeerRequest[]{request4}), awaitingRequests);
     }
     
+    @Test
+    @Transactional
+    @Rollback
+    public void testCountAllAbortedReviews(){
+    	Long allAborted = peerReviewService.countAllAborted();
+    	Long expected = new Long(0);
+    	Assert.assertEquals(expected, allAborted);
+    	
+    	review2.setAborted(true);
+    	review2.setSubmitted(false);
+    	review3.setAborted(true);
+    	
+    	allAborted = peerReviewService.countAllAborted();
+    	expected = new Long(2);
+    	Assert.assertEquals(expected, allAborted);
+    }
+    
+    @Test
+    @Transactional
+    @Rollback
+    public void testCountAllInProgressReviews(){
+    	Long allInProgress = peerReviewService.countAllInProgress();
+    	Long expected = new Long(1);
+    	Assert.assertEquals(expected, allInProgress);
+    	
+    	review3.setSubmitted(true);
+    	
+    	allInProgress = peerReviewService.countAllInProgress();
+    	expected = new Long(0);
+    	Assert.assertEquals(expected, allInProgress);
+    }
+    
+    @Test
+    @Transactional
+    @Rollback
+    public void testCountAllCompletedReviews(){
+    	Long allCompleted = peerReviewService.countAllCompleted();
+    	Long expected = new Long(2);
+    	Assert.assertEquals(expected, allCompleted);
+    	
+    	review3.setSubmitted(true);
+    	
+    	allCompleted = peerReviewService.countAllCompleted();
+    	expected = new Long(3);
+    	Assert.assertEquals(expected, allCompleted);
+    }
+    
+    @Test
+    @Transactional
+    @Rollback
+    public void testCountAllReviewsByStudent(){
+    	Long allReviewsByStudent = peerReviewService.countAllReviewsByStudent(reviewerRole);
+    	Long expected = new Long(3);
+    	Assert.assertEquals(expected, allReviewsByStudent);
+    }
+    
+    @Test
+    @Transactional
+    @Rollback
+    public void testFindAllWithParams(){
+    	PeerReviewService.FilterParams params = new PeerReviewService.FilterParams();
+    	params.setAuthor(reviewerRole);
+    	List<PeerReview> reviewList = peerReviewService.findAll(params, new PageRequest(0, 10)).getContent();
+    	Assert.assertEquals(Arrays.asList(new PeerReview[]{review1,review2,review3}), reviewList);
+    	
+    	review3.setReviewer(requesterRole);
+    	reviewList = peerReviewService.findAll(params, new PageRequest(0, 10)).getContent();
+    	Assert.assertEquals(Arrays.asList(new PeerReview[]{review1,review2}), reviewList);
+
+    	params.setAuthor(null);
+    	reviewList = peerReviewService.findAll(params, new PageRequest(0, 10)).getContent();
+    	Assert.assertEquals(Arrays.asList(new PeerReview[]{review1,review2,review3}), reviewList);
+    	
+    	params.setIncludeAborted(false);
+    	params.setIncludeCompleted(false);
+    	params.setIncludeInProgress(true);
+    	reviewList = peerReviewService.findAll(params, new PageRequest(0, 10)).getContent();
+    	Assert.assertEquals(Arrays.asList(new PeerReview[]{review3}), reviewList);
+    	
+    	review3.setAborted(true);
+    	params.setIncludeAborted(true);
+    	reviewList = peerReviewService.findAll(params, new PageRequest(0, 10)).getContent();
+    	Assert.assertEquals(Arrays.asList(new PeerReview[]{review3}), reviewList);
+    }
+    
+    @Test
+    @Transactional
+    @Rollback
+    public void testReviewParamsDateFiltering() throws ParseException {
+    	PeerReviewService.FilterParams params = new PeerReviewService.FilterParams();
+        SimpleDateFormat date = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
+        
+        Date january12 = date.parse("2012-01-12");
+        Date february15 = date.parse("2012-02-15");
+        Date march21 = date.parse("2012-03-21");
+        Date april05 = date.parse("2012-04-05");
+        Date may02 = date.parse("2012-05-02");
+        Date march27 = date.parse("2012-03-27");
+        
+        review1.setDateCreated(february15);
+        review2.setDateCreated(march21);
+        review3.setDateCreated(may02);
+        
+        params.setCreatedAfter(january12);
+        params.setCreatedBefore(april05);
+        
+        List<PeerReview> reviewList = peerReviewService.findAll(params, new PageRequest(0,10)).getContent();
+        Assert.assertEquals(2, reviewList.size());
+        Assert.assertEquals(Arrays.asList(new PeerReview[]{review1,review2}), reviewList);
+        
+        review3.setDateCreated(march27);
+        reviewList = peerReviewService.findAll(params, new PageRequest(0,10)).getContent();
+        Assert.assertEquals(Arrays.asList(new PeerReview[]{review1,review2,review3}), reviewList);
+    }
+    
+    //Helper methods for setting up test objects
+    
+    private PeerReview newReview(final Student reviewer, final Project project, PeerRequest request, final RequestStatus status, boolean aborted, boolean submitted) {
+    	PeerReview review = new PeerReview();
+		review.setReviewer(reviewer);
+		review.setProject(project);
+		review.setComment("Hi there!");
+		review.setPeerRequest(request);
+		request.setStatus(status);
+		request = peerRequestService.save(request);
+		review.setSubmitted(submitted);
+		review.setAborted(aborted);
+		return peerReviewService.save(review);
+    }
+    
+    private PeerRequest newRequest(final Student requester, final Project project, final String comment, final RequestStatus status){
+    	PeerRequest request = new PeerRequest();
+    	request.setComment(comment);
+		request.setRequester(requester);
+		request.setProject(project);
+		if(status!=null)
+			request.setStatus(status);
+    	return peerRequestService.save(request);
+    }
+    
+    private Student newStudent(final User user) {
+    	Student student = new Student();
+    	student.setUser(user);
+    	return (Student) roleService.save(student);
+    }
+    
+    private Project newProject(final ProjectClass pc, final Student role, final Employee headSupervisor, final ProjectStatus status){
+    	Project newProject = new Project();
+    	newProject.setProjectClass(pc);
+    	newProject.setTitle("Project title");
+    	newProject.setHeadSupervisor(headSupervisor);
+    	newProject.addProjectParticipant(role);
+    	newProject.setProjectStatus(status);
+    	return projectService.save(newProject);
+    }
 }