From 6902f96bc6a1000d857604e79af91f3aca0d1165 Mon Sep 17 00:00:00 2001
From: Emil Siverhall <emil-siv@dsv.su.se>
Date: Mon, 30 Jul 2012 10:34:32 +0200
Subject: [PATCH] added service method to retrieve currently open application
 periods and unit test to confirm results

---
 .../ApplicationPeriodServiceImpl.java         | 30 +++++++
 .../services/ApplicationPeriodService.java    |  5 ++
 .../springdata/TestApplicationPeriod.java     | 89 +++++++++++++++++++
 3 files changed, 124 insertions(+)
 create mode 100644 src/test/java/se/su/dsv/scipro/springdata/TestApplicationPeriod.java

diff --git a/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/ApplicationPeriodServiceImpl.java b/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/ApplicationPeriodServiceImpl.java
index 6e2279e65f..ba9cd5d8be 100644
--- a/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/ApplicationPeriodServiceImpl.java
+++ b/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/ApplicationPeriodServiceImpl.java
@@ -1,13 +1,22 @@
 package se.su.dsv.scipro.springdata.serviceimpls;
 
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
 import javax.annotation.Resource;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.data.domain.Sort;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import com.mysema.query.types.expr.BooleanExpression;
+
 import se.su.dsv.scipro.match.dataobject.ApplicationPeriod;
+import se.su.dsv.scipro.match.dataobject.QApplicationPeriod;
+import se.su.dsv.scipro.peer.data.dataobjects.PeerRequest;
 import se.su.dsv.scipro.springdata.repos.ApplicationPeriodRepo;
 import se.su.dsv.scipro.springdata.services.ApplicationPeriodService;
 
@@ -25,5 +34,26 @@ public class ApplicationPeriodServiceImpl extends AbstractQueryService<Applicati
 		super(applicationPeriodRepo, applicationPeriodRepo);
 		System.out.println("ApplicationPeriodServiceImpl instantiating...");
 	}
+
+	@Override
+	public List<ApplicationPeriod> getCurrentPeriods(Date currentDate) {
+		Iterable<ApplicationPeriod> periods = applicationPeriodRepo.findAll(startedBefore(currentDate).and(endedAfter(currentDate)));
+		return constructList(periods);
+	}
+	
+	private BooleanExpression startedBefore(Date currentDate){
+		return QApplicationPeriod.applicationPeriod.startDate.before(currentDate);
+	}
     
+	private BooleanExpression endedAfter(Date currentDate){
+		return QApplicationPeriod.applicationPeriod.endDate.after(currentDate);
+	}
+	
+	private List<ApplicationPeriod> constructList(Iterable<ApplicationPeriod> periods) {
+		List<ApplicationPeriod> list = new ArrayList<ApplicationPeriod>();
+		for(ApplicationPeriod ap : periods) {
+			list.add(ap);
+		}
+		return list;
+	}
 }
diff --git a/src/main/java/se/su/dsv/scipro/springdata/services/ApplicationPeriodService.java b/src/main/java/se/su/dsv/scipro/springdata/services/ApplicationPeriodService.java
index 0277d87557..2f742d44b3 100644
--- a/src/main/java/se/su/dsv/scipro/springdata/services/ApplicationPeriodService.java
+++ b/src/main/java/se/su/dsv/scipro/springdata/services/ApplicationPeriodService.java
@@ -1,7 +1,12 @@
 package se.su.dsv.scipro.springdata.services;
 
+import java.util.Date;
+import java.util.List;
+
 import se.su.dsv.scipro.match.dataobject.ApplicationPeriod;
 
 public interface ApplicationPeriodService extends GenericService<ApplicationPeriod, Long>, QueryService<ApplicationPeriod, Long> {
 
+	 List<ApplicationPeriod> getCurrentPeriods(final Date currentDate);
+	 
 }
diff --git a/src/test/java/se/su/dsv/scipro/springdata/TestApplicationPeriod.java b/src/test/java/se/su/dsv/scipro/springdata/TestApplicationPeriod.java
new file mode 100644
index 0000000000..7ab005e5f1
--- /dev/null
+++ b/src/test/java/se/su/dsv/scipro/springdata/TestApplicationPeriod.java
@@ -0,0 +1,89 @@
+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.HashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Set;
+
+import org.jsoup.select.Evaluator.AllElements;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.annotation.Rollback;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.transaction.annotation.Transactional;
+
+import se.su.dsv.scipro.data.dataobjects.ProjectClass;
+import se.su.dsv.scipro.match.dataobject.ApplicationPeriod;
+import se.su.dsv.scipro.springdata.services.ApplicationPeriodService;
+import se.su.dsv.scipro.springdata.services.ProjectClassService;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(inheritLocations = false, locations = {
+        "classpath:test-applicationContext.xml"
+})
+public class TestApplicationPeriod {
+
+	@Autowired
+	private ApplicationPeriodService periodService;
+	@Autowired
+	private ProjectClassService projectClassService;
+	
+	private SimpleDateFormat date = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
+	private ApplicationPeriod currentBachelor, currentMaster, futureBachelor, pastMaster;
+	private ProjectClass bachelor, master;
+    
+	@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);
+        
+		Set<ProjectClass> bachelorSet = new HashSet<ProjectClass>();
+		bachelorSet.add(bachelor);
+		Set<ProjectClass> masterSet = new HashSet<ProjectClass>();
+		masterSet.add(master);
+		
+		currentBachelor = createPeriod(bachelorSet, date("2012-07-15"), date("2012-08-15"), date("2012-09-01"), "Current bachelor period");
+		currentMaster = createPeriod(masterSet, date("2012-07-10"), date("2012-08-10"), date("2012-08-25"), "Current master period");
+		futureBachelor = createPeriod(bachelorSet, date("2012-08-16"), date("2012-09-16"), date("2012-09-25"), "Future bachelor period");
+		pastMaster = createPeriod(masterSet, date("2012-05-25"), date("2012-07-01"), date("2012-07-15"), "Past master period");
+	}
+
+    @Test
+    @Transactional
+    @Rollback
+    public void testGetCurrentPeriods() {
+    	Date currentDate = date("2012-07-30");
+    	List<ApplicationPeriod> currentPeriods = periodService.getCurrentPeriods(currentDate);
+    	Assert.assertEquals(Arrays.asList(new ApplicationPeriod[]{currentBachelor, currentMaster}), currentPeriods);
+    	
+    }
+    
+    private Date date(String dateString) {
+        try {
+            return date.parse(dateString);
+        } catch (ParseException e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    private ApplicationPeriod createPeriod(final Set<ProjectClass> projectClassSet, final Date startDate, final Date endDate, final Date courseStartDate, final String name) {
+        ApplicationPeriod appPeriod = new ApplicationPeriod();
+        appPeriod.setStartDate(startDate);
+        appPeriod.setEndDate(endDate);
+        appPeriod.setCourseStartDate(courseStartDate);
+        appPeriod.setProjectClass(projectClassSet);
+        appPeriod.setName(name);
+    	return periodService.save(appPeriod);
+    }
+}