From dbe338478842ec3336055281c5fa4d379d5d61d3 Mon Sep 17 00:00:00 2001
From: Fredrik Friis <fred-fri@dsv.su.se>
Date: Thu, 12 Apr 2012 13:36:50 +0900
Subject: [PATCH 01/13] checklist repo and service layer added

---
 .../springdata/repos/ChecklistRepo.java       | 17 ++++++++++
 .../serviceimpls/ChecklistServiceImpl.java    | 32 +++++++++++++++++++
 .../springdata/services/ChecklistService.java | 13 ++++++++
 3 files changed, 62 insertions(+)
 create mode 100644 src/main/java/se/su/dsv/scipro/springdata/repos/ChecklistRepo.java
 create mode 100644 src/main/java/se/su/dsv/scipro/springdata/serviceimpls/ChecklistServiceImpl.java
 create mode 100644 src/main/java/se/su/dsv/scipro/springdata/services/ChecklistService.java

diff --git a/src/main/java/se/su/dsv/scipro/springdata/repos/ChecklistRepo.java b/src/main/java/se/su/dsv/scipro/springdata/repos/ChecklistRepo.java
new file mode 100644
index 0000000000..91aed3c6c8
--- /dev/null
+++ b/src/main/java/se/su/dsv/scipro/springdata/repos/ChecklistRepo.java
@@ -0,0 +1,17 @@
+package se.su.dsv.scipro.springdata.repos;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.querydsl.QueryDslPredicateExecutor;
+import org.springframework.transaction.annotation.Transactional;
+import se.su.dsv.scipro.data.dataobjects.CheckList;
+
+/**
+ * @author: fred-fri
+ * date: 2012 03 26
+ */
+@Transactional(readOnly = true)
+public interface ChecklistRepo extends JpaRepository<CheckList, Long>, QueryDslPredicateExecutor<CheckList> {
+
+    //nothing here yet
+
+}
diff --git a/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/ChecklistServiceImpl.java b/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/ChecklistServiceImpl.java
new file mode 100644
index 0000000000..df5718698f
--- /dev/null
+++ b/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/ChecklistServiceImpl.java
@@ -0,0 +1,32 @@
+package se.su.dsv.scipro.springdata.serviceimpls;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import se.su.dsv.scipro.data.dataobjects.CheckList;
+import se.su.dsv.scipro.springdata.repos.ChecklistRepo;
+import se.su.dsv.scipro.springdata.services.ChecklistService;
+
+import javax.annotation.Resource;
+
+/**
+ * @author: fred-fri
+ * date: 2012 03 26
+ */
+@Service ( "checklistService" )
+@Transactional ( readOnly = true )
+public class ChecklistServiceImpl extends AbstractQueryService<CheckList, Long> implements ChecklistService {
+
+	@Resource
+	private ChecklistRepo checklistRepo;
+
+	@Autowired
+	public ChecklistServiceImpl(
+            @Qualifier("checklistRepo")
+            ChecklistRepo checklistRepo) {
+		super(checklistRepo, checklistRepo);
+		System.out.println("BLA BLA");
+	}
+
+}
diff --git a/src/main/java/se/su/dsv/scipro/springdata/services/ChecklistService.java b/src/main/java/se/su/dsv/scipro/springdata/services/ChecklistService.java
new file mode 100644
index 0000000000..6fd17981eb
--- /dev/null
+++ b/src/main/java/se/su/dsv/scipro/springdata/services/ChecklistService.java
@@ -0,0 +1,13 @@
+package se.su.dsv.scipro.springdata.services;
+
+import se.su.dsv.scipro.data.dataobjects.CheckList;
+
+/**
+ * @author: fred-fri
+ * date: 2012 03 26
+ */
+public interface ChecklistService extends CrudService<CheckList, Long>, QueryService<CheckList, Long> {
+
+    //nothing here yet
+
+}

From cfe7e42f65043a51f047e71f9c312ec5a556dd38 Mon Sep 17 00:00:00 2001
From: Fredrik Friis <fred-fri@dsv.su.se>
Date: Thu, 12 Apr 2012 13:39:07 +0900
Subject: [PATCH 02/13] added user date hashmap to checklist

---
 .../dsv/scipro/data/dataobjects/CheckList.java   | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/CheckList.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/CheckList.java
index ed80e1002f..9d14b383f9 100644
--- a/src/main/java/se/su/dsv/scipro/data/dataobjects/CheckList.java
+++ b/src/main/java/se/su/dsv/scipro/data/dataobjects/CheckList.java
@@ -4,8 +4,7 @@ import org.hibernate.annotations.Cache;
 import org.hibernate.annotations.CacheConcurrencyStrategy;
 
 import javax.persistence.*;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
 
 /**
  * 
@@ -39,7 +38,18 @@ public class CheckList extends DomainObject {
 	
 	@ManyToMany
 	private List<ChecklistCategory> categories = new ArrayList<ChecklistCategory>();
-	
+
+    @ElementCollection(fetch=FetchType.EAGER)
+    private Map<User, Date> userLastOpenDate = new HashMap<User, Date>();
+
+    public Map<User, Date> getUserLastOpenDate() {
+        return userLastOpenDate;
+    }
+
+    public void setUserLastOpenDate(Map<User, Date> userLastOpenDate) {
+        this.userLastOpenDate = userLastOpenDate;
+    }
+
 	public CheckList() {
 	}
 	

From 5d1c34515a6530c2780ff210cdb067ebd2121edb Mon Sep 17 00:00:00 2001
From: Fredrik Friis <fred-fri@dsv.su.se>
Date: Thu, 12 Apr 2012 13:46:28 +0900
Subject: [PATCH 03/13] added service methods

---
 .../serviceimpls/ChecklistServiceImpl.java    | 21 +++++++++++++++++++
 .../springdata/services/ChecklistService.java |  7 +++++--
 2 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/ChecklistServiceImpl.java b/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/ChecklistServiceImpl.java
index df5718698f..b1d5fc0de3 100644
--- a/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/ChecklistServiceImpl.java
+++ b/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/ChecklistServiceImpl.java
@@ -5,10 +5,14 @@ import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import se.su.dsv.scipro.data.dataobjects.CheckList;
+import se.su.dsv.scipro.data.dataobjects.CheckListAnswer;
+import se.su.dsv.scipro.data.dataobjects.CheckListQuestion;
+import se.su.dsv.scipro.data.dataobjects.User;
 import se.su.dsv.scipro.springdata.repos.ChecklistRepo;
 import se.su.dsv.scipro.springdata.services.ChecklistService;
 
 import javax.annotation.Resource;
+import java.util.Date;
 
 /**
  * @author: fred-fri
@@ -28,5 +32,22 @@ public class ChecklistServiceImpl extends AbstractQueryService<CheckList, Long>
 		super(checklistRepo, checklistRepo);
 		System.out.println("BLA BLA");
 	}
+    
+    @Override
+    public CheckList updateUserLastOpenDate(CheckList checklist, User user) {
+        checklist.getUserLastOpenDate().put(user, new Date());
+        return checklistRepo.save(checklist);
+    }
 
+    @Override
+    public boolean hasChangedSinceUserLastOpenDate(CheckList checklist, User user) {
+        for (CheckListQuestion clq : checklist.getQuestions()){
+            for (CheckListAnswer cla : clq.getAnswers()){
+                if (cla.getLastModified().after(checklist.getUserLastOpenDate().get(user))){
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
 }
diff --git a/src/main/java/se/su/dsv/scipro/springdata/services/ChecklistService.java b/src/main/java/se/su/dsv/scipro/springdata/services/ChecklistService.java
index 6fd17981eb..9213a4ef15 100644
--- a/src/main/java/se/su/dsv/scipro/springdata/services/ChecklistService.java
+++ b/src/main/java/se/su/dsv/scipro/springdata/services/ChecklistService.java
@@ -1,6 +1,7 @@
 package se.su.dsv.scipro.springdata.services;
 
 import se.su.dsv.scipro.data.dataobjects.CheckList;
+import se.su.dsv.scipro.data.dataobjects.User;
 
 /**
  * @author: fred-fri
@@ -8,6 +9,8 @@ import se.su.dsv.scipro.data.dataobjects.CheckList;
  */
 public interface ChecklistService extends CrudService<CheckList, Long>, QueryService<CheckList, Long> {
 
-    //nothing here yet
-
+    public CheckList updateUserLastOpenDate(CheckList checklist, User user);
+    
+    public boolean hasChangedSinceUserLastOpenDate(CheckList checklist, User user);
+    
 }

From 17752d682782b5ee130e690cda0f5dfb473d211d Mon Sep 17 00:00:00 2001
From: Fredrik Friis <fred-fri@dsv.su.se>
Date: Thu, 12 Apr 2012 13:48:40 +0900
Subject: [PATCH 04/13] edited service method

---
 .../scipro/springdata/serviceimpls/ChecklistServiceImpl.java   | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/ChecklistServiceImpl.java b/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/ChecklistServiceImpl.java
index b1d5fc0de3..b626029ab7 100644
--- a/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/ChecklistServiceImpl.java
+++ b/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/ChecklistServiceImpl.java
@@ -41,6 +41,9 @@ public class ChecklistServiceImpl extends AbstractQueryService<CheckList, Long>
 
     @Override
     public boolean hasChangedSinceUserLastOpenDate(CheckList checklist, User user) {
+        if (checklist.getUserLastOpenDate().get(user)==null){
+            checklist = updateUserLastOpenDate(checklist, user);
+        }
         for (CheckListQuestion clq : checklist.getQuestions()){
             for (CheckListAnswer cla : clq.getAnswers()){
                 if (cla.getLastModified().after(checklist.getUserLastOpenDate().get(user))){

From 906a39096cad97814a842c4d7f7c74353bd5f26f Mon Sep 17 00:00:00 2001
From: Fredrik Friis <fred-fri@dsv.su.se>
Date: Thu, 12 Apr 2012 14:01:40 +0900
Subject: [PATCH 05/13] the list of checklists now shows if there has been a
 change since users last open

---
 .../checklists/panels/ListCheckListPanel.java | 33 +++++++++++--------
 1 file changed, 19 insertions(+), 14 deletions(-)

diff --git a/src/main/java/se/su/dsv/scipro/checklists/panels/ListCheckListPanel.java b/src/main/java/se/su/dsv/scipro/checklists/panels/ListCheckListPanel.java
index b29ec7b834..1f070ca2ac 100644
--- a/src/main/java/se/su/dsv/scipro/checklists/panels/ListCheckListPanel.java
+++ b/src/main/java/se/su/dsv/scipro/checklists/panels/ListCheckListPanel.java
@@ -1,7 +1,5 @@
 package se.su.dsv.scipro.checklists.panels;
 
-import java.util.List;
-
 import org.apache.wicket.PageParameters;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.AjaxLink;
@@ -16,27 +14,21 @@ import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.LoadableDetachableModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.spring.injection.annot.SpringBean;
-
 import se.su.dsv.scipro.SciProSession;
 import se.su.dsv.scipro.data.controllers.CheckListController;
-import se.su.dsv.scipro.data.dao.interfaces.CheckListDao;
-import se.su.dsv.scipro.data.dao.interfaces.ChecklistCategoryDao;
-import se.su.dsv.scipro.data.dao.interfaces.ProjectDao;
-import se.su.dsv.scipro.data.dao.interfaces.ProjectScheduleEventDao;
-import se.su.dsv.scipro.data.dao.interfaces.RoleDao;
-import se.su.dsv.scipro.data.dataobjects.CheckList;
-import se.su.dsv.scipro.data.dataobjects.CheckListAnswer;
-import se.su.dsv.scipro.data.dataobjects.CheckListQuestion;
-import se.su.dsv.scipro.data.dataobjects.Project;
-import se.su.dsv.scipro.data.dataobjects.ProjectScheduleEvent;
+import se.su.dsv.scipro.data.dao.interfaces.*;
+import se.su.dsv.scipro.data.dataobjects.*;
 import se.su.dsv.scipro.data.enums.CheckListQuestionAnswer;
 import se.su.dsv.scipro.data.enums.CheckListRole;
 import se.su.dsv.scipro.icons.ImageObject;
 import se.su.dsv.scipro.project.pages.ProjectViewCheckListPage;
+import se.su.dsv.scipro.springdata.services.ChecklistService;
 import se.su.dsv.scipro.supervisor.pages.SupervisorChecklistPage;
 import se.su.dsv.scipro.supervisor.pages.SupervisorViewCheckListPage;
 import se.su.dsv.scipro.util.JavascriptEventConfirmation;
 
+import java.util.List;
+
 /**
  * @author Fredrik Norberg fnorbe@dsv.su.se
  * 
@@ -53,6 +45,8 @@ public class ListCheckListPanel extends Panel {
 	private RoleDao roleDao;
 	@SpringBean
 	private ProjectScheduleEventDao pseDao;
+    @SpringBean
+    private ChecklistService checklistService;
 
 	@SpringBean
 	CheckListController checkListController;
@@ -91,7 +85,18 @@ public class ListCheckListPanel extends Panel {
 			private static final long serialVersionUID = 1L;
 			@Override
 			protected void populateItem(final ListItem<CheckList> item) {
-				Label listName = new Label("listName", item.getModel().getObject().getName());
+
+
+                Label listName;
+
+                if (checklistService.hasChangedSinceUserLastOpenDate(item.getModelObject(), SciProSession.get().getUser())){
+                    listName = new Label("listName", item.getModel().getObject().getName() + " *change*");
+                } else {
+                    listName = new Label("listName", item.getModel().getObject().getName());
+                }
+
+
+
 				final CheckList cl = item.getModelObject();
 				final PageParameters pp = new PageParameters();
 				pp.put("checklist", cl.getId());

From d50681c2b7feb38b6feb3687f8cbb0abc93130df Mon Sep 17 00:00:00 2001
From: Fredrik Friis <fred-fri@dsv.su.se>
Date: Fri, 13 Apr 2012 18:33:25 +0900
Subject: [PATCH 06/13] indication is now removed when user opens the checklist

---
 .../checklists/panels/ViewCheckListPanel.java | 28 ++++++++-----------
 .../serviceimpls/ChecklistServiceImpl.java    |  1 +
 .../springdata/services/ChecklistService.java |  1 +
 3 files changed, 14 insertions(+), 16 deletions(-)

diff --git a/src/main/java/se/su/dsv/scipro/checklists/panels/ViewCheckListPanel.java b/src/main/java/se/su/dsv/scipro/checklists/panels/ViewCheckListPanel.java
index ff214e944d..94ad3841b0 100644
--- a/src/main/java/se/su/dsv/scipro/checklists/panels/ViewCheckListPanel.java
+++ b/src/main/java/se/su/dsv/scipro/checklists/panels/ViewCheckListPanel.java
@@ -1,14 +1,8 @@
 package se.su.dsv.scipro.checklists.panels;
 
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.AjaxLink;
 import org.apache.wicket.behavior.AttributeAppender;
-import org.apache.wicket.behavior.SimpleAttributeModifier;
 import org.apache.wicket.extensions.markup.html.basic.SmartLinkLabel;
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.markup.html.WebMarkupContainer;
@@ -23,22 +17,20 @@ import org.apache.wicket.model.LoadableDetachableModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.PropertyModel;
 import org.apache.wicket.spring.injection.annot.SpringBean;
-
 import se.su.dsv.scipro.SciProSession;
 import se.su.dsv.scipro.components.SciProTooltipBehavior;
 import se.su.dsv.scipro.data.dao.interfaces.CheckListDao;
 import se.su.dsv.scipro.data.dao.interfaces.ProjectDao;
-import se.su.dsv.scipro.data.dataobjects.CheckList;
-import se.su.dsv.scipro.data.dataobjects.CheckListAnswer;
-import se.su.dsv.scipro.data.dataobjects.CheckListQuestion;
-import se.su.dsv.scipro.data.dataobjects.FileDescription;
-import se.su.dsv.scipro.data.dataobjects.Member;
-import se.su.dsv.scipro.data.dataobjects.Project;
-import se.su.dsv.scipro.data.dataobjects.ProjectScheduleEvent;
-import se.su.dsv.scipro.data.dataobjects.User;
+import se.su.dsv.scipro.data.dataobjects.*;
 import se.su.dsv.scipro.data.enums.CheckListQuestionAnswer;
 import se.su.dsv.scipro.data.enums.CheckListRole;
 import se.su.dsv.scipro.repository.FileRepository;
+import se.su.dsv.scipro.springdata.services.ChecklistService;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
 
 public class ViewCheckListPanel extends Panel {
 
@@ -54,12 +46,16 @@ public class ViewCheckListPanel extends Panel {
     
     @SpringBean
     private ProjectDao projectDao;
-    
+
+    @SpringBean
+    private ChecklistService checklistService;
+
     private Project project;
     private CheckList checkList;
 
     public ViewCheckListPanel(final String id, final Long checkListId) {
         super(id);
+        checklistService.updateUserLastOpenDate(checklistService.findOne(checkListId), SciProSession.get().getUser());
         LoadableDetachableModel<CheckListModel> checkListModel =
             new LoadableDetachableModel<CheckListModel>() {
 
diff --git a/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/ChecklistServiceImpl.java b/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/ChecklistServiceImpl.java
index b626029ab7..5f2cc18db3 100644
--- a/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/ChecklistServiceImpl.java
+++ b/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/ChecklistServiceImpl.java
@@ -34,6 +34,7 @@ public class ChecklistServiceImpl extends AbstractQueryService<CheckList, Long>
 	}
     
     @Override
+    @Transactional ( readOnly = false )
     public CheckList updateUserLastOpenDate(CheckList checklist, User user) {
         checklist.getUserLastOpenDate().put(user, new Date());
         return checklistRepo.save(checklist);
diff --git a/src/main/java/se/su/dsv/scipro/springdata/services/ChecklistService.java b/src/main/java/se/su/dsv/scipro/springdata/services/ChecklistService.java
index 9213a4ef15..8f2735248b 100644
--- a/src/main/java/se/su/dsv/scipro/springdata/services/ChecklistService.java
+++ b/src/main/java/se/su/dsv/scipro/springdata/services/ChecklistService.java
@@ -7,6 +7,7 @@ import se.su.dsv.scipro.data.dataobjects.User;
  * @author: fred-fri
  * date: 2012 03 26
  */
+//@Component
 public interface ChecklistService extends CrudService<CheckList, Long>, QueryService<CheckList, Long> {
 
     public CheckList updateUserLastOpenDate(CheckList checklist, User user);

From ce82fe1bb9423aaf262868db36f8d90a3f6ab719 Mon Sep 17 00:00:00 2001
From: Fredrik Friis <fred-fri@dsv.su.se>
Date: Fri, 13 Apr 2012 18:45:05 +0900
Subject: [PATCH 07/13] indication is removed if the user is the one who makes
 a change in the checklist

---
 .../checklists/panels/AnswerDialogPanel.java  | 30 ++++++++++++-------
 .../checklists/panels/ViewCheckListPanel.java |  4 ++-
 2 files changed, 22 insertions(+), 12 deletions(-)

diff --git a/src/main/java/se/su/dsv/scipro/checklists/panels/AnswerDialogPanel.java b/src/main/java/se/su/dsv/scipro/checklists/panels/AnswerDialogPanel.java
index 4c16810918..f90f0114c8 100644
--- a/src/main/java/se/su/dsv/scipro/checklists/panels/AnswerDialogPanel.java
+++ b/src/main/java/se/su/dsv/scipro/checklists/panels/AnswerDialogPanel.java
@@ -7,23 +7,23 @@ import org.apache.wicket.model.Model;
 import org.apache.wicket.model.PropertyModel;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.odlabs.wiquery.ui.dialog.Dialog;
-
-import se.su.dsv.scipro.checklists.panels.AnswerDialogPanel.AnswerDialog;
+import se.su.dsv.scipro.SciProSession;
 import se.su.dsv.scipro.data.dao.interfaces.CheckListAnswerDao;
 import se.su.dsv.scipro.data.dao.interfaces.CheckListQuestionDao;
 import se.su.dsv.scipro.data.dataobjects.CheckListAnswer;
 import se.su.dsv.scipro.data.dataobjects.CheckListQuestion;
 import se.su.dsv.scipro.data.dataobjects.User;
 import se.su.dsv.scipro.data.enums.CheckListQuestionAnswer;
+import se.su.dsv.scipro.springdata.services.ChecklistService;
 
 public class AnswerDialogPanel extends Panel {
 
     private static final long serialVersionUID = 1L;
     private AnswerDialog dialog;
 
-    public AnswerDialogPanel(String id, User currentUser) {
+    public AnswerDialogPanel(String id, User currentUser, Long checklistId) {
         super(id);
-        dialog = new AnswerDialog("answerDialog", currentUser);
+        dialog = new AnswerDialog("answerDialog", currentUser, checklistId);
         add(dialog);       
     }
 
@@ -32,35 +32,42 @@ public class AnswerDialogPanel extends Panel {
         private static final long serialVersionUID = 1L;
         @SpringBean
         private CheckListAnswerDao checkListAnswerDao;
-
+        private Long checklistId;
+        
+        
         @SpringBean
         private CheckListQuestionDao checkListQuestionDao;
         private final User currentUser;
       
-        public AnswerDialog(String id, User currentUser) {
+        public AnswerDialog(String id, User currentUser, Long checklistId) {
             super(id);
+            this.checklistId = checklistId;
             this.currentUser = currentUser;
             setModal(true);
             setAutoOpen(false);
             setWidth(400);
             setHeight(400);
-            add(new AnswerForm("answerForm"));
+            add(new AnswerForm("answerForm", checklistId));
         }
      
         public void dialogContent(CheckListQuestion clq) { 
             setTitle(clq.getQuestion());
-            replace(new AnswerForm("answerForm", clq));
+            replace(new AnswerForm("answerForm", clq, checklistId));
         }
 
         private class AnswerForm extends Form<Void> {
+            
+            @SpringBean
+            private ChecklistService checklistService;
+            
             private static final long serialVersionUID = 1L;
             private TrafficLightPanel trafficLights;
             private CheckListQuestion clq;
             private CheckListAnswer answer;
             private TextArea<String> commentArea;
             private String comment;
-
-            public AnswerForm(String id, CheckListQuestion clq) {
+            
+            public AnswerForm(String id, CheckListQuestion clq, Long checklistId) {
                 super(id);
                 setMultiPart(true);
                 answer = clq.getAnswerFromUser(currentUser);
@@ -81,7 +88,7 @@ public class AnswerDialogPanel extends Panel {
                 add(commentArea);
             }
 
-            public AnswerForm(String id) {
+            public AnswerForm(String id, Long checklistId) {
                 super(id);
                 add(new TrafficLightPanel("trafficLights"));
                 add(new TextArea<String>("commentArea"));
@@ -96,6 +103,7 @@ public class AnswerDialogPanel extends Panel {
                 clq = checkListQuestionDao.reLoad(clq);
                 clq.addAnswer(checkListAnswerDao.save(clAnswer));
                 clq = checkListQuestionDao.save(clq);
+                checklistService.updateUserLastOpenDate(checklistService.findOne(checklistId), SciProSession.get().getUser());
                 setResponsePage(getPage());            
             }
         }
diff --git a/src/main/java/se/su/dsv/scipro/checklists/panels/ViewCheckListPanel.java b/src/main/java/se/su/dsv/scipro/checklists/panels/ViewCheckListPanel.java
index 94ad3841b0..0abbe7aa96 100644
--- a/src/main/java/se/su/dsv/scipro/checklists/panels/ViewCheckListPanel.java
+++ b/src/main/java/se/su/dsv/scipro/checklists/panels/ViewCheckListPanel.java
@@ -37,6 +37,7 @@ public class ViewCheckListPanel extends Panel {
     private static final long serialVersionUID = 1L;
 
     private AnswerDialogPanel answerDialog;
+    private Long checklistId;
 
     @SpringBean
     private CheckListDao checkListDao;
@@ -55,6 +56,7 @@ public class ViewCheckListPanel extends Panel {
 
     public ViewCheckListPanel(final String id, final Long checkListId) {
         super(id);
+        this.checklistId = checkListId;
         checklistService.updateUserLastOpenDate(checklistService.findOne(checkListId), SciProSession.get().getUser());
         LoadableDetachableModel<CheckListModel> checkListModel =
             new LoadableDetachableModel<CheckListModel>() {
@@ -82,7 +84,7 @@ public class ViewCheckListPanel extends Panel {
     }
 
     private void initComponents(final IModel<CheckListModel> checkListModel) {
-        answerDialog = new AnswerDialogPanel("answerDialog", getCurrentUser());
+        answerDialog = new AnswerDialogPanel("answerDialog", getCurrentUser(), checklistId);
         add(answerDialog);
 
         ListView<CheckListQuestion> checkListQuestions =

From 9d0314c77d0887ed6838087d59d5473db1d500b9 Mon Sep 17 00:00:00 2001
From: Fredrik Friis <fred-fri@dsv.su.se>
Date: Fri, 13 Apr 2012 18:55:01 +0900
Subject: [PATCH 08/13] works for supervisor too. made supervisor project
 checklist page a bit wider.

---
 .../dsv/scipro/supervisor/pages/SupervisorChecklistPage.html  | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorChecklistPage.html b/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorChecklistPage.html
index 5eda478c7d..1b5c2d7390 100644
--- a/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorChecklistPage.html
+++ b/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorChecklistPage.html
@@ -3,9 +3,9 @@
 	xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
 <body>
 <wicket:extend>
-		<div class="span-10 colborder">
+		<div class="span-13 colborder">
 		<h5 class="peer-title">Checklists added to project</h5>
-			<div class="span-10 last">
+			<div class="span-13 last">
 				<div wicket:id="listCheckListPanel"></div>
 			</div>
 		</div>

From 66889d017e360f3d0a654cf206167aaf914ba9f4 Mon Sep 17 00:00:00 2001
From: Fredrik Friis <fred-fri@dsv.su.se>
Date: Fri, 13 Apr 2012 18:57:48 +0900
Subject: [PATCH 09/13] changed indication text to new answer instead of change

---
 .../se/su/dsv/scipro/checklists/panels/ListCheckListPanel.java  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/main/java/se/su/dsv/scipro/checklists/panels/ListCheckListPanel.java b/src/main/java/se/su/dsv/scipro/checklists/panels/ListCheckListPanel.java
index 1f070ca2ac..4d6b0cbec3 100644
--- a/src/main/java/se/su/dsv/scipro/checklists/panels/ListCheckListPanel.java
+++ b/src/main/java/se/su/dsv/scipro/checklists/panels/ListCheckListPanel.java
@@ -90,7 +90,7 @@ public class ListCheckListPanel extends Panel {
                 Label listName;
 
                 if (checklistService.hasChangedSinceUserLastOpenDate(item.getModelObject(), SciProSession.get().getUser())){
-                    listName = new Label("listName", item.getModel().getObject().getName() + " *change*");
+                    listName = new Label("listName", item.getModel().getObject().getName() + " *new answer*");
                 } else {
                     listName = new Label("listName", item.getModel().getObject().getName());
                 }

From 29d25873a8a8d8b4c9794054781ac0a9e5b181e1 Mon Sep 17 00:00:00 2001
From: Fredrik Friis <fred-fri@dsv.su.se>
Date: Fri, 13 Apr 2012 19:06:21 +0900
Subject: [PATCH 10/13] using capital letters for indications to make them more
 visible

---
 .../se/su/dsv/scipro/checklists/panels/ListCheckListPanel.java  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/main/java/se/su/dsv/scipro/checklists/panels/ListCheckListPanel.java b/src/main/java/se/su/dsv/scipro/checklists/panels/ListCheckListPanel.java
index 4d6b0cbec3..b6b57cd8a4 100644
--- a/src/main/java/se/su/dsv/scipro/checklists/panels/ListCheckListPanel.java
+++ b/src/main/java/se/su/dsv/scipro/checklists/panels/ListCheckListPanel.java
@@ -90,7 +90,7 @@ public class ListCheckListPanel extends Panel {
                 Label listName;
 
                 if (checklistService.hasChangedSinceUserLastOpenDate(item.getModelObject(), SciProSession.get().getUser())){
-                    listName = new Label("listName", item.getModel().getObject().getName() + " *new answer*");
+                    listName = new Label("listName", item.getModel().getObject().getName() + " *NEW ANSWER*");
                 } else {
                     listName = new Label("listName", item.getModel().getObject().getName());
                 }

From 335125dc3239fb3162d035321a8393c401c8c59e Mon Sep 17 00:00:00 2001
From: Fredrik Friis <fred-fri@dsv.su.se>
Date: Fri, 13 Apr 2012 19:16:00 +0900
Subject: [PATCH 11/13] added sql to current sql

---
 resources/db_update_scripts/current.sql | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/resources/db_update_scripts/current.sql b/resources/db_update_scripts/current.sql
index e69de29bb2..bdae56b464 100644
--- a/resources/db_update_scripts/current.sql
+++ b/resources/db_update_scripts/current.sql
@@ -0,0 +1,12 @@
+CREATE TABLE IF NOT EXISTS `CheckList_userLastOpenDate` (
+  `CheckList_id` bigint(20) NOT NULL,
+  `userLastOpenDate` datetime DEFAULT NULL,
+  `userLastOpenDate_KEY` bigint(20) NOT NULL,
+  PRIMARY KEY (`CheckList_id`,`userLastOpenDate_KEY`),
+  KEY `FKF7E07AB26D025A9` (`userLastOpenDate_KEY`),
+  KEY `FKF7E07AB21F327355` (`CheckList_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+
+ALTER TABLE `CheckList_userLastOpenDate`
+  ADD CONSTRAINT `FKF7E07AB21F327355` FOREIGN KEY (`CheckList_id`) REFERENCES `checklist` (`id`),
+  ADD CONSTRAINT `FKF7E07AB26D025A9` FOREIGN KEY (`userLastOpenDate_KEY`) REFERENCES `user` (`id`);
\ No newline at end of file

From 68f76ae00b3c3112512c9917fe587ad0e1ac1a55 Mon Sep 17 00:00:00 2001
From: Fredrik Friis <fred-fri@dsv.su.se>
Date: Fri, 13 Apr 2012 21:38:02 +0900
Subject: [PATCH 12/13] testing, one method doesnt seem to work

---
 .../dsv/scipro/springdata/TestChecklist.java  | 206 ++++++++++++++++++
 1 file changed, 206 insertions(+)
 create mode 100644 src/test/java/se/su/dsv/scipro/springdata/TestChecklist.java

diff --git a/src/test/java/se/su/dsv/scipro/springdata/TestChecklist.java b/src/test/java/se/su/dsv/scipro/springdata/TestChecklist.java
new file mode 100644
index 0000000000..05342fa4ad
--- /dev/null
+++ b/src/test/java/se/su/dsv/scipro/springdata/TestChecklist.java
@@ -0,0 +1,206 @@
+package se.su.dsv.scipro.springdata;
+
+
+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.dao.interfaces.CheckListAnswerDao;
+import se.su.dsv.scipro.data.dao.interfaces.CheckListQuestionDao;
+import se.su.dsv.scipro.data.dao.interfaces.ProjectDao;
+import se.su.dsv.scipro.data.dataobjects.*;
+import se.su.dsv.scipro.data.enums.CheckListQuestionAnswer;
+import se.su.dsv.scipro.match.facade.ApplicationPeriodFacade;
+import se.su.dsv.scipro.springdata.services.*;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(inheritLocations = false, locations = {
+        "classpath:test-applicationContext.xml"
+})
+public class TestChecklist {
+
+    @Autowired
+    private UserService userService;
+    @Autowired
+    private ProjectIdeaService projectIdeaService;
+    @Autowired
+    private ProjectClassService projectClassService;
+    @Autowired
+    private RoleService roleService;
+    @Autowired
+    private ApplicationPeriodFacade applicationPeriodFacade;
+    @Autowired
+    private MatchService matchService;
+
+    @Autowired
+    private ProjectDao projectDao;
+    @Autowired
+    private ChecklistService checklistService;
+    @Autowired
+    private CheckListQuestionDao checkListQuestionDao;
+    @Autowired
+    private CheckListAnswerDao checkListAnswerDao;
+    
+    private User employee1;
+    private Employee employee1Role;
+    private ProjectClass bachelor;
+    private Project project;
+
+    private List<CheckList> checkLists;
+    private CheckList checkList;
+
+    private List<CheckListQuestion> checkListQuestions;
+    private CheckListQuestion checkListQuestion;
+    
+    private List<CheckListAnswer> checkListAnswers;
+    private CheckListAnswer checkListAnswer;
+
+    @Before
+    public void startTransaction() throws Exception {
+
+        employee1 = new User();
+        employee1 = userService.save(employee1);
+
+        employee1Role = new Employee();
+        employee1Role.setUser(employee1);
+        employee1Role = (Employee) roleService.save(employee1Role);
+        
+        bachelor = new ProjectClass(ProjectClass.BACHELOR, "Bachelor", "Bachelor degree thesis project");
+        bachelor = projectClassService.save(bachelor);
+
+        project = new Project();
+        project.setHeadSupervisor(employee1Role);
+        project.setTitle("project");
+        project.setProjectClass(bachelor);
+        project = projectDao.save(project);
+
+        checkListAnswers = new ArrayList<CheckListAnswer>();
+        checkListAnswer = new CheckListAnswer();
+        checkListAnswer.setAnswer(CheckListQuestionAnswer.GREEN);
+        checkListAnswer.setUser(employee1);
+        checkListAnswer = checkListAnswerDao.save(checkListAnswer);
+        checkListAnswers.add(checkListAnswer);
+
+        checkListQuestions = new ArrayList<CheckListQuestion>();
+        checkListQuestion = new CheckListQuestion();
+        checkListQuestion.setQuestion("question?");
+        checkListQuestion.setQuestionNumber(1);
+        checkListQuestion.setAnswers(checkListAnswers);
+        checkListQuestion = checkListQuestionDao.save(checkListQuestion);
+        checkListQuestions.add(checkListQuestion);
+
+        checkLists = new ArrayList<CheckList>();
+        checkList = new CheckList();
+        checkList.setName("checklist");
+        checkList.setProject(project);
+        checkList.setQuestions(checkListQuestions);
+        checkList = checklistService.save(checkList);
+    }
+
+    @Test
+    @Transactional
+    @Rollback
+    public void testStuff() {
+        Assert.assertTrue(
+        checkList.getQuestions()!=null
+        && !checkList.getQuestions().isEmpty()
+        && checkList.getQuestions().get(0)!=null
+        && checkList.getQuestions().get(0).getAnswers() != null
+        && !checkList.getQuestions().get(0).getAnswers().isEmpty()
+        && checkList.getQuestions().get(0).getAnswers().get(0) != null
+        && checkList.getQuestions().get(0).getAnswers().get(0).getAnswer() != null
+        && checkList.getQuestions().get(0).getAnswers().get(0).getAnswer().equals(CheckListQuestionAnswer.GREEN)
+        && checkList.getUserLastOpenDate().get(employee1) == null
+        );
+    }
+
+    /**
+     * If we run method, the date should get updated.
+     */
+    @Test
+    @Transactional
+    @Rollback
+    public void testupdateUserLastOpenDate() {
+        /**
+         * Since the date is null ATM, we need to put a new date and save the checklist.
+         */
+        Date oldDate = new Date();
+        checkList.getUserLastOpenDate().put(employee1, oldDate);
+        checkList = checklistService.save(checkList);
+        /**
+         * Then we run the method, which should update the date to a newer date.
+         */
+        checkList = checklistService.updateUserLastOpenDate(checkList, employee1);
+        Date newDate = checkList.getUserLastOpenDate().get(employee1);
+        /**
+         * The old date should now be before the new date.
+         */
+        Assert.assertTrue(oldDate.before(newDate));
+    }
+
+    /**
+     * If we run method with user, getUserLastOpenUpdate for user should no longer be null.
+     */
+    @Test
+    @Transactional
+    @Rollback
+    public void testhasChangedSinceUserLastOpenDate1() {
+        checklistService.hasChangedSinceUserLastOpenDate(checkList, employee1);
+        Assert.assertNotSame(null, checkList.getUserLastOpenDate().get(employee1));
+    }
+    
+    /**
+     * User has not yet opened the checklist with the new functionality. We have no way of knowing
+     * when the user last opened the checklist, so method should return false.
+     */
+    @Test
+    @Transactional
+    @Rollback
+    public void testhasChangedSinceUserLastOpenDate2() {
+        Assert.assertFalse(checklistService.hasChangedSinceUserLastOpenDate(checkList, employee1));
+    }
+
+    /**
+     * We run the update method. Since the updated date will be newer than the lastModified of
+     * the checklistanswer, the method should return false.
+     */
+    @Test
+    @Transactional
+    @Rollback
+    public void testhasChangedSinceUserLastOpenDate3() {
+        checkList = checklistService.updateUserLastOpenDate(checkList, employee1);
+        Assert.assertFalse(checklistService.hasChangedSinceUserLastOpenDate(checkList, employee1));
+    }
+
+    @Test
+    @Transactional
+    @Rollback
+    public void testhasChangedSinceUserLastOpenDate4() {
+//        Assert.assertTrue(checkList.getUserLastOpenDate().get(employee1)==null); true
+
+//        Date lastModified = checkListAnswer.getLastModified();
+//        Assert.assertTrue(lastModified!=null); true
+
+//        checkList = checklistService.updateUserLastOpenDate(checkList, employee1);
+//        Assert.assertTrue(checkList.getUserLastOpenDate().get(employee1)!=null); true
+        
+        checkList = checklistService.updateUserLastOpenDate(checkList, employee1);
+        Date newDate = new Date();
+        checkListAnswer.setLastModified(newDate);
+
+//        Assert.assertTrue(checkList.getUserLastOpenDate().get(employee1).before(newDate)); true
+
+        Assert.assertFalse(checklistService.hasChangedSinceUserLastOpenDate(checkList, employee1));
+
+    }
+    
+}

From 7849c8ff5444caee022400603d7de611c0b9f15d Mon Sep 17 00:00:00 2001
From: Fredrik Friis <fred-fri@dsv.su.se>
Date: Fri, 13 Apr 2012 22:01:00 +0900
Subject: [PATCH 13/13] actually it works, you just need to add some waiting in
 between updating dates

---
 .../dsv/scipro/springdata/TestChecklist.java  | 74 ++++++++++---------
 1 file changed, 38 insertions(+), 36 deletions(-)

diff --git a/src/test/java/se/su/dsv/scipro/springdata/TestChecklist.java b/src/test/java/se/su/dsv/scipro/springdata/TestChecklist.java
index 05342fa4ad..7a84c42be0 100644
--- a/src/test/java/se/su/dsv/scipro/springdata/TestChecklist.java
+++ b/src/test/java/se/su/dsv/scipro/springdata/TestChecklist.java
@@ -123,30 +123,6 @@ public class TestChecklist {
         );
     }
 
-    /**
-     * If we run method, the date should get updated.
-     */
-    @Test
-    @Transactional
-    @Rollback
-    public void testupdateUserLastOpenDate() {
-        /**
-         * Since the date is null ATM, we need to put a new date and save the checklist.
-         */
-        Date oldDate = new Date();
-        checkList.getUserLastOpenDate().put(employee1, oldDate);
-        checkList = checklistService.save(checkList);
-        /**
-         * Then we run the method, which should update the date to a newer date.
-         */
-        checkList = checklistService.updateUserLastOpenDate(checkList, employee1);
-        Date newDate = checkList.getUserLastOpenDate().get(employee1);
-        /**
-         * The old date should now be before the new date.
-         */
-        Assert.assertTrue(oldDate.before(newDate));
-    }
-
     /**
      * If we run method with user, getUserLastOpenUpdate for user should no longer be null.
      */
@@ -157,6 +133,29 @@ public class TestChecklist {
         checklistService.hasChangedSinceUserLastOpenDate(checkList, employee1);
         Assert.assertNotSame(null, checkList.getUserLastOpenDate().get(employee1));
     }
+
+    /**
+     * If we run method, the date should get updated.
+     */
+    @Test
+    @Transactional
+    @Rollback
+    public void testupdateUserLastOpenDate2() {
+
+        checkList = checklistService.updateUserLastOpenDate(checkList, employee1);
+        Date oldDate = checkList.getUserLastOpenDate().get(employee1);
+
+        try {
+            Thread.sleep(10);
+        } catch (InterruptedException e) {
+            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
+        }
+
+        checkList = checklistService.updateUserLastOpenDate(checkList, employee1);
+        Date newDate = checkList.getUserLastOpenDate().get(employee1);
+
+        Assert.assertTrue(oldDate.before(newDate));
+    }
     
     /**
      * User has not yet opened the checklist with the new functionality. We have no way of knowing
@@ -181,25 +180,28 @@ public class TestChecklist {
         Assert.assertFalse(checklistService.hasChangedSinceUserLastOpenDate(checkList, employee1));
     }
 
+    /**
+     * We run the update method to get a date. Then we set an answers lastModified to a later date.
+     * The method should return true, since this would mean changes have been made after the user
+     * last opened the checklist.
+     */
     @Test
     @Transactional
     @Rollback
     public void testhasChangedSinceUserLastOpenDate4() {
-//        Assert.assertTrue(checkList.getUserLastOpenDate().get(employee1)==null); true
 
-//        Date lastModified = checkListAnswer.getLastModified();
-//        Assert.assertTrue(lastModified!=null); true
-
-//        checkList = checklistService.updateUserLastOpenDate(checkList, employee1);
-//        Assert.assertTrue(checkList.getUserLastOpenDate().get(employee1)!=null); true
-        
         checkList = checklistService.updateUserLastOpenDate(checkList, employee1);
-        Date newDate = new Date();
-        checkListAnswer.setLastModified(newDate);
 
-//        Assert.assertTrue(checkList.getUserLastOpenDate().get(employee1).before(newDate)); true
-
-        Assert.assertFalse(checklistService.hasChangedSinceUserLastOpenDate(checkList, employee1));
+        try {
+            Thread.sleep(10);
+        } catch (InterruptedException e) {
+            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
+        }
+        
+        checkListAnswer.setLastModified(new Date());
+        checkListAnswerDao.save(checkListAnswer);
+        
+        Assert.assertTrue(checklistService.hasChangedSinceUserLastOpenDate(checkList, employee1));
 
     }