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)); }