diff --git a/src/main/java/se/su/dsv/scipro/basepanels/MainMenuPanel.java b/src/main/java/se/su/dsv/scipro/basepanels/MainMenuPanel.java index 5c8eebbf94..1598d646fe 100644 --- a/src/main/java/se/su/dsv/scipro/basepanels/MainMenuPanel.java +++ b/src/main/java/se/su/dsv/scipro/basepanels/MainMenuPanel.java @@ -25,7 +25,9 @@ import se.su.dsv.scipro.message.pages.PrivateMessagesPage; import se.su.dsv.scipro.peer.pages.PeerReviewTemplatePage; import se.su.dsv.scipro.project.pages.FinalSeminarProjectListPage; import se.su.dsv.scipro.project.pages.ProjectOppositionPage; +import se.su.dsv.scipro.project.pages.ProjectPartnerPage; import se.su.dsv.scipro.project.pages.ProjectStartPage; +import se.su.dsv.scipro.project.pages.ProjectChecklistPage; import se.su.dsv.scipro.security.auth.MetaDataActionStrategy; import se.su.dsv.scipro.security.auth.roles.Roles; import se.su.dsv.scipro.supervisor.pages.SupervisorProjectsFinalSeminarPage; diff --git a/src/main/java/se/su/dsv/scipro/checklists/panels/CreateCheckListTemplatePanel.html b/src/main/java/se/su/dsv/scipro/checklists/panels/CreateCheckListTemplatePanel.html new file mode 100644 index 0000000000..ae81354e01 --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/checklists/panels/CreateCheckListTemplatePanel.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<html + xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd"> +<head> +<meta http-equiv="Content-type" content="text/html;charset=UTF-8" /> +</head> +<body> + <wicket:panel> + <div wicket:id="feedbackPanel"></div> + <form wicket:id="form"> + <div> + <input wicket:id="questions" type="text" /> + </div> + <input wicket:id="button" type="submit"/> + </form> + <div> + <a href="#" wicket:id="link">Print</a> + </div> + + <div> + <a href="#" wicket:id="newLink">New Link</a> + </div> + </wicket:panel> +</body> +</html> \ No newline at end of file diff --git a/src/main/java/se/su/dsv/scipro/checklists/panels/CreateCheckListTemplatePanel.java b/src/main/java/se/su/dsv/scipro/checklists/panels/CreateCheckListTemplatePanel.java new file mode 100644 index 0000000000..5705cfbd88 --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/checklists/panels/CreateCheckListTemplatePanel.java @@ -0,0 +1,159 @@ +package se.su.dsv.scipro.checklists.panels; + +import java.util.ArrayList; +import java.util.List; +import java.util.SortedSet; + +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.ajax.markup.html.AjaxLink; +import org.apache.wicket.ajax.markup.html.form.AjaxButton; +import org.apache.wicket.markup.html.WebMarkupContainer; +import org.apache.wicket.markup.html.WebPage; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.html.basic.MultiLineLabel; +import org.apache.wicket.markup.html.form.Form; +import org.apache.wicket.markup.html.form.Radio; +import org.apache.wicket.markup.html.form.RadioChoice; +import org.apache.wicket.markup.html.form.RadioGroup; +import org.apache.wicket.markup.html.form.RequiredTextField; +import org.apache.wicket.markup.html.form.TextField; +import org.apache.wicket.markup.html.list.ListItem; +import org.apache.wicket.markup.html.list.ListView; +import org.apache.wicket.markup.html.panel.FeedbackPanel; +import org.apache.wicket.markup.html.panel.Panel; +import org.apache.wicket.model.CompoundPropertyModel; +import org.apache.wicket.model.IModel; +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.data.dao.interfaces.CheckListAnswerDao; +import se.su.dsv.scipro.data.dao.interfaces.CheckListDao; +import se.su.dsv.scipro.data.dao.interfaces.CheckListQuestionDao; +import se.su.dsv.scipro.data.dao.interfaces.CheckListTemplateDao; +import se.su.dsv.scipro.data.dao.interfaces.ProjectClassDao; +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.CheckListTemplate; +import se.su.dsv.scipro.data.dataobjects.GeneralSystemSettings; +import se.su.dsv.scipro.data.dataobjects.ProjectClass; +import se.su.dsv.scipro.data.enums.CheckListQuestionAnswer; +import se.su.dsv.scipro.data.enums.StateOfMind; +import se.su.dsv.scipro.knol.resource.page.StaticImage; +import edu.emory.mathcs.backport.java.util.Arrays; + +/** + * @author fnorbe@dsv.su.se + */ + +public class CreateCheckListTemplatePanel extends Panel { + + private static final long serialVersionUID = 8862892008428526067L; + + @SpringBean + private CheckListDao checkListDao; + + @SpringBean + private CheckListAnswerDao checkListAnswerDao; + + @SpringBean + private CheckListQuestionDao checkListQuestionDao; + + @SpringBean + private CheckListTemplateDao checkListTemplateDao; + + @SpringBean + private ProjectClassDao projectClassDao; + + private String question = ""; + private String title = ""; + + private ProjectClass projectClass; + + private CheckListTemplate checkListTemplate = new CheckListTemplate(); + + public CreateCheckListTemplatePanel(String id) { + super(id); + projectClass = projectClassDao.getProjectClass(ProjectClass.BACHELOR); + final FeedbackPanel feedbackPanel = new FeedbackPanel("feedbackPanel"); + feedbackPanel.setOutputMarkupId(true); + add(feedbackPanel); + Form<CheckListTemplate> form = new Form<CheckListTemplate>("form"); + final TextField<String> titleField = new RequiredTextField<String>("title", + new PropertyModel<String>(this, "title")); + final TextField<String> questionField = new RequiredTextField<String>("questions", + new PropertyModel<String>(this, "question")); + questionField.setOutputMarkupId(true); + RadioChoice<ProjectClass> radioChoice = new RadioChoice<ProjectClass>("view", + new PropertyModel<ProjectClass>(this, "projectClass"), projectClassDao.findAll()); + + IModel<List<String>> questionModel = new LoadableDetachableModel<List<String>>() { + + private static final long serialVersionUID = 1L; + + @Override + protected List<String> load() { + // TODO Auto-generated method stub + return checkListTemplate.getQuestions(); + } + }; + + AjaxLink<Void> printLink = new AjaxLink<Void>("addQuestionLink") { + + private static final long serialVersionUID = 1L; + + @Override + public void onClick(AjaxRequestTarget target) { + checkListTemplate.getQuestions().add(question); + question = ""; + target.addComponent(questionField); + } + }; + AjaxButton button = new AjaxButton("button", new Model<String>("Save")) { + + /** + * + */ + private static final long serialVersionUID = 1L; + + @Override + protected void onSubmit(AjaxRequestTarget target, Form<?> form) { + + checkListTemplate.setLevel(projectClass); + checkListTemplate.setCreator(SciProSession.get().getUser()); + checkListTemplate.setName(title); + + target.addComponent(feedbackPanel); + + } + }; + form.add(titleField); + form.add(radioChoice); + form.add(button); + form.add(questionField); + add(form); + + + + AjaxLink<Void> newLink = new AjaxLink<Void>("newLink") { + + /** + * + */ + private static final long serialVersionUID = 1L; + + @Override + public void onClick(AjaxRequestTarget target) { + checkListTemplate = new CheckListTemplate(); + + } + }; + add(printLink); + add(newLink); + + }; + +} diff --git a/src/main/java/se/su/dsv/scipro/checklists/panels/TrafficLightPanel.html b/src/main/java/se/su/dsv/scipro/checklists/panels/TrafficLightPanel.html new file mode 100644 index 0000000000..ed606075c0 --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/checklists/panels/TrafficLightPanel.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html + xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd"> +<head> +<meta http-equiv="Content-type" content="text/html;charset=UTF-8" /> +</head> +<body> + <wicket:panel> + <div wicket:id="stateOfMindContainer"> + <form wicket:id="form"> + <table wicket:id="group"> + <tr wicket:id="persons"> + <td><input type="radio" wicket:id="radio" /></td> + <td><img wicket:id="image" /></td> + </tr> + </table> + </form> + </div> + <div wicket:id="checkLists"> + <div wicket:id="listView"> + <span wicket:id="question"></span> + <div wicket:id="listViewAnswer"> + <span wicket:id="answer"></span> + </div> + </div> + </div> + </wicket:panel> +</body> +</html> \ No newline at end of file diff --git a/src/main/java/se/su/dsv/scipro/checklists/panels/TrafficLightPanel.java b/src/main/java/se/su/dsv/scipro/checklists/panels/TrafficLightPanel.java new file mode 100644 index 0000000000..bc91621b35 --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/checklists/panels/TrafficLightPanel.java @@ -0,0 +1,148 @@ +package se.su.dsv.scipro.checklists.panels; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.wicket.markup.html.WebMarkupContainer; +import org.apache.wicket.markup.html.WebPage; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.html.form.Form; +import org.apache.wicket.markup.html.form.Radio; +import org.apache.wicket.markup.html.form.RadioGroup; +import org.apache.wicket.markup.html.list.ListItem; +import org.apache.wicket.markup.html.list.ListView; +import org.apache.wicket.markup.html.panel.Panel; +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.dao.interfaces.CheckListAnswerDao; +import se.su.dsv.scipro.data.dao.interfaces.CheckListDao; +import se.su.dsv.scipro.data.dao.interfaces.CheckListQuestionDao; +import se.su.dsv.scipro.data.dao.interfaces.CheckListTemplateDao; +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.enums.CheckListQuestionAnswer; +import se.su.dsv.scipro.data.enums.StateOfMind; +import se.su.dsv.scipro.knol.resource.page.StaticImage; +import edu.emory.mathcs.backport.java.util.Arrays; + +/** + * @author fnorbe@dsv.su.se + */ + +public class TrafficLightPanel extends Panel { + + private static final long serialVersionUID = 8862892008428526067L; + + @SpringBean + private CheckListDao checkListDao; + + @SpringBean + private CheckListAnswerDao checkListAnswerDao; + + @SpringBean + private CheckListQuestionDao checkListQuestionDao; + + @SpringBean + private CheckListTemplateDao checkListTemplateDao; + + public TrafficLightPanel(String id) { + super(id); + WebMarkupContainer stateOfMindContainer = new WebMarkupContainer("stateOfMindContainer"); + add(stateOfMindContainer); + + Form<StateOfMind> f = new Form<StateOfMind>("form"); + stateOfMindContainer.add(f); + RadioGroup<StateOfMind> group = new RadioGroup<StateOfMind>("group"); + f.add(group); + + ListView<StateOfMind> persons = new ListView<StateOfMind>("persons", + Arrays.asList(StateOfMind.values())) { + protected void populateItem(ListItem<StateOfMind> item) { + StateOfMind stateOfMind = item.getModelObject(); + item.add(new Radio<StateOfMind>("radio", item.getModel())); + StaticImage image = null; + if (stateOfMind.equals(StateOfMind.FINE)) { + image = new StaticImage("image", new Model<String>( + "images/icons/green_ball_32.png")); + } else if (stateOfMind.equals(StateOfMind.NEEDHELP)) { + image = new StaticImage("image", new Model<String>( + "images/icons/red_ball_32.png")); + } else if (stateOfMind.equals(StateOfMind.NEUTRAL)) { + image = new StaticImage("image", new Model<String>( + "images/icons/yellow_ball_32.png")); + } + item.add(image); + }; + }; + group.add(persons); + + List<CheckList> checkLists = checkListDao.findCheckLists(SciProSession.get() + .getActiveProject()); + if (checkLists.size() < 1) { + CheckList checkList = new CheckList("Test", SciProSession.get().getActiveProject()); + CheckListQuestion checkListQuestion = new CheckListQuestion("Testquestion?"); + checkListQuestion = checkListQuestionDao.save(checkListQuestion); + checkList.getQuestions().add(checkListQuestion); + checkList = checkListDao.save(checkList); + } + + ListView<CheckList> checkListsListView = new ListView<CheckList>("checkLists", checkLists) { + + /** + * + */ + private static final long serialVersionUID = 1L; + + @Override + protected void populateItem(ListItem<CheckList> item) { + + ListView<CheckListQuestion> listView = new ListView<CheckListQuestion>( + "listView", + new ArrayList<CheckListQuestion>(item.getModel().getObject().getQuestions())) { + + private static final long serialVersionUID = 1L; + + @Override + protected void populateItem(ListItem<CheckListQuestion> item) { + CheckListQuestion checkListQuestion = item.getModel().getObject(); + if(checkListQuestion.getAnswers().size() == 0){ + CheckListAnswer checkListAnswer = new CheckListAnswer(SciProSession.get().getUser(), CheckListQuestionAnswer.GREEN); + checkListAnswer = checkListAnswerDao.save(checkListAnswer); + checkListQuestion.getAnswers().add(checkListAnswer); + checkListQuestionDao.save(checkListQuestion); + + } + item.add(new Label("question", item.getModel().getObject().getQuestion())); + + ListView<CheckListAnswer> listView = new ListView<CheckListAnswer>( + "listViewAnswer", + new ArrayList<CheckListAnswer>(item.getModel().getObject().getAnswers())) { + + private static final long serialVersionUID = 1L; + + @Override + protected void populateItem(ListItem<CheckListAnswer> item) { + item.add(new Label("answer", item.getModel().getObject().getAnswer().toString())); + + + } + + }; + item.add(listView); + + } + + }; + + item.add(listView); + + } + }; + + add(checkListsListView); + }; + +} diff --git a/src/main/java/se/su/dsv/scipro/conference/pages/ProjectConferencePage.java b/src/main/java/se/su/dsv/scipro/conference/pages/ProjectConferencePage.java index 904cfd0479..915b18711c 100644 --- a/src/main/java/se/su/dsv/scipro/conference/pages/ProjectConferencePage.java +++ b/src/main/java/se/su/dsv/scipro/conference/pages/ProjectConferencePage.java @@ -5,12 +5,12 @@ package se.su.dsv.scipro.conference.pages; import java.util.HashSet; import java.util.Set; -import java.util.StringTokenizer; import org.apache.wicket.PageParameters; import org.apache.wicket.RequestCycle; import org.apache.wicket.RestartResponseException; import org.apache.wicket.markup.html.panel.EmptyPanel; +import org.apache.wicket.model.AbstractReadOnlyModel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.LoadableDetachableModel; import org.apache.wicket.protocol.http.RequestUtils; @@ -53,24 +53,10 @@ public class ProjectConferencePage extends ProjectPage { public ProjectConferencePage(PageParameters pp) { super(pp); - String projectId = pp.getString("pid"); - String boardMessageId = null; - if (projectId != null) { - StringTokenizer stringTokenizer = new StringTokenizer(projectId, "&"); - boolean first = true; - for (int i = 0; i < 2; i++) { - if (stringTokenizer.hasMoreTokens()) { - if (first) { - projectId = stringTokenizer.nextToken().trim(); - first = false; - } else { - boardMessageId = stringTokenizer.nextToken().trim(); - } - } - } - } + Long projectId = pp.getAsLong("pid"); + Long boardMessageId = pp.getAsLong("cid"); if (projectId == null && SciProSession.get().getActiveProject() != null) { - projectId = String.valueOf(SciProSession.get().getActiveProject().getId()); + projectId = SciProSession.get().getActiveProject().getId(); } if (projectId != null) { final Project project = projectDao.load(Long.valueOf(projectId)); @@ -126,23 +112,23 @@ public class ProjectConferencePage extends ProjectPage { messageBoard.setTitle(projectModel.getObject().getTitle()); messageBoard = messageBoardDao.save(messageBoard); } - messageBoardModel = new LoadableDetachableModel<MessageBoard>() { + messageBoardModel = new AbstractReadOnlyModel<MessageBoard>() { private static final long serialVersionUID = 1L; @Override - protected MessageBoard load() { + public MessageBoard getObject() { return messageBoardDao.reLoad(messageBoard); } }; if (boardMessageId != null) { final BoardMessage bm = boardMessageDao.load(Long.valueOf(boardMessageId)); - if (bm != null && messageBoard.getBoardMessageSet().contains(bm)) { - boardMessageModel = new LoadableDetachableModel<BoardMessage>() { + if (bm != null) { + boardMessageModel = new AbstractReadOnlyModel<BoardMessage>() { private static final long serialVersionUID = 1L; @Override - protected BoardMessage load() { + public BoardMessage getObject() { return boardMessageDao.reLoad(bm); } }; diff --git a/src/main/java/se/su/dsv/scipro/conference/pages/SupervisorConferencePage.java b/src/main/java/se/su/dsv/scipro/conference/pages/SupervisorConferencePage.java index 248bcb088d..77e4fbe596 100644 --- a/src/main/java/se/su/dsv/scipro/conference/pages/SupervisorConferencePage.java +++ b/src/main/java/se/su/dsv/scipro/conference/pages/SupervisorConferencePage.java @@ -11,6 +11,7 @@ import org.apache.wicket.PageParameters; import org.apache.wicket.RequestCycle; import org.apache.wicket.RestartResponseException; import org.apache.wicket.markup.html.panel.EmptyPanel; +import org.apache.wicket.model.AbstractReadOnlyModel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.LoadableDetachableModel; import org.apache.wicket.protocol.http.RequestUtils; @@ -56,22 +57,8 @@ public class SupervisorConferencePage extends AbstractSupervisorPage { public SupervisorConferencePage(PageParameters pp) { super(pp); - String projectId = pp.getString("pid"); - String boardMessageId = null; - if (projectId != null) { - StringTokenizer stringTokenizer = new StringTokenizer(projectId, "&"); - boolean first = true; - for (int i = 0; i < 2; i++) { - if (stringTokenizer.hasMoreTokens()) { - if (first) { - projectId = stringTokenizer.nextToken().trim(); - first = false; - } else { - boardMessageId = stringTokenizer.nextToken().trim(); - } - } - } - } + Long projectId = pp.getAsLong(PROJECTID); + Long boardMessageId = pp.getAsLong("cid"); if (projectId == null) { add(new EmptyPanel("conferencePanel")); } else { @@ -122,23 +109,24 @@ public class SupervisorConferencePage extends AbstractSupervisorPage { messageBoard.setTitle(projectModel.getObject().getTitle()); messageBoard = messageBoardDao.save(messageBoard); } - messageBoardModel = new LoadableDetachableModel<MessageBoard>() { + messageBoardModel = new AbstractReadOnlyModel<MessageBoard>() { private static final long serialVersionUID = 1L; @Override - protected MessageBoard load() { + public MessageBoard getObject() { return messageBoardDao.reLoad(messageBoard); } + }; if (boardMessageId != null) { final BoardMessage bm = boardMessageDao.load(Long.valueOf(boardMessageId)); - if (bm != null && messageBoard.getBoardMessageSet().contains(bm)) { - boardMessageModel = new LoadableDetachableModel<BoardMessage>() { + if (bm != null) { + boardMessageModel = new AbstractReadOnlyModel<BoardMessage>() { private static final long serialVersionUID = 1L; @Override - protected BoardMessage load() { + public BoardMessage getObject() { return boardMessageDao.reLoad(bm); } }; diff --git a/src/main/java/se/su/dsv/scipro/conference/panels/ConferencePanel.java b/src/main/java/se/su/dsv/scipro/conference/panels/ConferencePanel.java index c22e32565b..cf5a5225ff 100644 --- a/src/main/java/se/su/dsv/scipro/conference/panels/ConferencePanel.java +++ b/src/main/java/se/su/dsv/scipro/conference/panels/ConferencePanel.java @@ -32,6 +32,7 @@ import se.su.dsv.scipro.data.controllers.NotificationController; import se.su.dsv.scipro.data.controllers.NotificationMessage; import se.su.dsv.scipro.data.dao.interfaces.BoardMessageDao; import se.su.dsv.scipro.data.dao.interfaces.CommentThreadDao; +import se.su.dsv.scipro.data.dao.interfaces.MessageBoardDao; import se.su.dsv.scipro.data.dataobjects.BoardMessage; import se.su.dsv.scipro.data.dataobjects.MessageBoard; import se.su.dsv.scipro.data.dataobjects.User; @@ -51,6 +52,8 @@ public class ConferencePanel extends Panel { private BoardMessageDao boardMessageDao; @SpringBean private CommentThreadDao commentThreadDao; + @SpringBean + private MessageBoardDao messageBoardDao; @SpringBean private NotificationController notificationController; @@ -61,6 +64,7 @@ public class ConferencePanel extends Panel { private IModel<BoardMessage> boardMessageModel; private Set<SubscriberModel> subscriberModels; private FeedbackPanel feedbackPanel; + private final static int BOARDMESSAGESPERPAGE = 10; public ConferencePanel(String id, IModel<MessageBoard> messageBoardModel, Set<SubscriberModel> subscriberModels, IModel<BoardMessage> boardMessageModel) { @@ -80,7 +84,7 @@ public class ConferencePanel extends Panel { feedbackPanel = new FeedbackPanel("feedbackPanel"); feedbackPanel.setOutputMarkupId(true); add(feedbackPanel); - + add(new SendWallMessageForm("sendForm")); webMarkupContainer = new WebMarkupContainer("container"); loadUserDataView(new BoardMessageDataProvider(messageBoardModel)); @@ -88,11 +92,17 @@ public class ConferencePanel extends Panel { webMarkupContainer.setOutputMarkupId(true); webMarkupContainer.add(new PagingNavigator("pagingNavigator", dataView)); add(webMarkupContainer); + if (boardMessageModel != null) { + + int index = boardMessageDao.getBoardMessageSortOrderIndex(boardMessageModel.getObject()); + System.out.println(index); + dataView.setCurrentPage(index/BOARDMESSAGESPERPAGE); + } } public void loadUserDataView(IDataProvider<BoardMessage> boardMessageDataProvider) { - dataView = new DataView<BoardMessage>("boardMessageDataView", boardMessageDataProvider, 10) { + dataView = new DataView<BoardMessage>("boardMessageDataView", boardMessageDataProvider, BOARDMESSAGESPERPAGE) { private static final long serialVersionUID = 1L; @@ -112,8 +122,10 @@ public class ConferencePanel extends Panel { @Override public void onClick(AjaxRequestTarget target) { - BoardMessage boardMessageTemp = boardMessageDao.reLoad(bm); - boardMessageDao.delete(boardMessageTemp); + MessageBoard mb = messageBoardModel.getObject(); + mb.removeFromBoardMessages(boardMessageDao.reLoad(bm)); + messageBoardDao.save(mb); + boardMessageDao.delete(boardMessageDao.reLoad(bm)); webMarkupContainer.removeAll(); loadUserDataView(new BoardMessageDataProvider(messageBoardModel)); webMarkupContainer.add(dataView); @@ -242,23 +254,28 @@ public class ConferencePanel extends Panel { } else { BoardMessage bm = new BoardMessage(); bm.setMessage(message); - bm.setMessageBoard(messageBoardModel.getObject()); bm.setFromUser(SciProSession.get().getUser()); bm = boardMessageDao.save(bm); + + MessageBoard mb = messageBoardModel.getObject(); + mb.addToBoardMessages(bm); + messageBoardDao.save(mb); for (SubscriberModel subscriberModel : subscriberModels) { - notificationController.notifyConferencePost(subscriberModel.getUser(), message, messageBoardModel.getObject().getTitle(), + notificationController.notifyConferencePost(subscriberModel.getUser(), + message, messageBoardModel.getObject().getTitle(), subscriberModel.getNotificationPriority(), subscriberModel.getAbsolutePath()); } + messageTextArea.setDefaultModelObject(""); webMarkupContainer.removeAll(); loadUserDataView(new BoardMessageDataProvider(messageBoardModel)); webMarkupContainer.add(dataView); webMarkupContainer.add(new PagingNavigator("pagingNavigator", dataView)); target.addComponent(webMarkupContainer); - target.addComponent(messageTextArea); - + target.addComponent(messageTextArea); + } target.addComponent(feedbackPanel); } diff --git a/src/main/java/se/su/dsv/scipro/data/controllers/impl/NotificationControllerImpl.java b/src/main/java/se/su/dsv/scipro/data/controllers/impl/NotificationControllerImpl.java index fb11252c3f..1e7a680d93 100644 --- a/src/main/java/se/su/dsv/scipro/data/controllers/impl/NotificationControllerImpl.java +++ b/src/main/java/se/su/dsv/scipro/data/controllers/impl/NotificationControllerImpl.java @@ -224,7 +224,7 @@ public class NotificationControllerImpl implements NotificationController { NotificationMessage notificationMessage = new NotificationMessage(webNotificationMessage, mailSubject, mailMessage); - processNotification(user, notificationMessage, absolutePath + "&" + classId, + processNotification(user, notificationMessage, absolutePath + "/cid/" + classId, notificationPriority); } diff --git a/src/main/java/se/su/dsv/scipro/data/dao/interfaces/BoardMessageDao.java b/src/main/java/se/su/dsv/scipro/data/dao/interfaces/BoardMessageDao.java index 3603f8a918..9e1a0636cd 100644 --- a/src/main/java/se/su/dsv/scipro/data/dao/interfaces/BoardMessageDao.java +++ b/src/main/java/se/su/dsv/scipro/data/dao/interfaces/BoardMessageDao.java @@ -4,7 +4,6 @@ import java.util.List; import se.su.dsv.scipro.data.dataobjects.BoardMessage; import se.su.dsv.scipro.data.dataobjects.MessageBoard; -import se.su.dsv.scipro.data.dataobjects.User; /** * @author Johan Aschan - aschan@dsv.su.se @@ -17,4 +16,6 @@ public interface BoardMessageDao extends Dao<BoardMessage>{ final int count); public int getBoardMessageListCount(final MessageBoard mb); + public int getBoardMessageSortOrderIndex(final BoardMessage bm); + } diff --git a/src/main/java/se/su/dsv/scipro/data/dao/interfaces/CheckListAnswerDao.java b/src/main/java/se/su/dsv/scipro/data/dao/interfaces/CheckListAnswerDao.java new file mode 100644 index 0000000000..8fe29de76d --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/data/dao/interfaces/CheckListAnswerDao.java @@ -0,0 +1,7 @@ +package se.su.dsv.scipro.data.dao.interfaces; + +import se.su.dsv.scipro.data.dataobjects.CheckListAnswer; + +public interface CheckListAnswerDao extends Dao<CheckListAnswer> { + +} diff --git a/src/main/java/se/su/dsv/scipro/data/dao/interfaces/CheckListDao.java b/src/main/java/se/su/dsv/scipro/data/dao/interfaces/CheckListDao.java new file mode 100644 index 0000000000..4c5058033e --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/data/dao/interfaces/CheckListDao.java @@ -0,0 +1,11 @@ +package se.su.dsv.scipro.data.dao.interfaces; + +import java.util.List; + +import se.su.dsv.scipro.data.dataobjects.CheckList; +import se.su.dsv.scipro.data.dataobjects.Project; + +public interface CheckListDao extends Dao<CheckList> { + + public List<CheckList> findCheckLists(final Project project); +} diff --git a/src/main/java/se/su/dsv/scipro/data/dao/interfaces/CheckListQuestionDao.java b/src/main/java/se/su/dsv/scipro/data/dao/interfaces/CheckListQuestionDao.java new file mode 100644 index 0000000000..fbf00a0b71 --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/data/dao/interfaces/CheckListQuestionDao.java @@ -0,0 +1,7 @@ +package se.su.dsv.scipro.data.dao.interfaces; + +import se.su.dsv.scipro.data.dataobjects.CheckListQuestion; + +public interface CheckListQuestionDao extends Dao<CheckListQuestion> { + +} diff --git a/src/main/java/se/su/dsv/scipro/data/dao/interfaces/CheckListTemplateDao.java b/src/main/java/se/su/dsv/scipro/data/dao/interfaces/CheckListTemplateDao.java new file mode 100644 index 0000000000..24885dffb9 --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/data/dao/interfaces/CheckListTemplateDao.java @@ -0,0 +1,8 @@ +package se.su.dsv.scipro.data.dao.interfaces; + +import se.su.dsv.scipro.data.dataobjects.CheckListTemplate; + + +public interface CheckListTemplateDao extends Dao<CheckListTemplate> { + +} diff --git a/src/main/java/se/su/dsv/scipro/data/dao/interfaces/MessageBoardDao.java b/src/main/java/se/su/dsv/scipro/data/dao/interfaces/MessageBoardDao.java index 2d18e06550..f7d7bc6fa4 100644 --- a/src/main/java/se/su/dsv/scipro/data/dao/interfaces/MessageBoardDao.java +++ b/src/main/java/se/su/dsv/scipro/data/dao/interfaces/MessageBoardDao.java @@ -4,7 +4,6 @@ package se.su.dsv.scipro.data.dao.interfaces; import se.su.dsv.scipro.data.dataobjects.MessageBoard; -import se.su.dsv.scipro.data.dataobjects.User; import se.su.dsv.scipro.data.dataobjects.interfaces.Commentable; /** @@ -15,6 +14,6 @@ import se.su.dsv.scipro.data.dataobjects.interfaces.Commentable; public interface MessageBoardDao extends Dao<MessageBoard>{ - public MessageBoard getMessageBoard(Commentable commentableDomainObject); - + public MessageBoard getMessageBoard(final Commentable commentableDomainObject); + } diff --git a/src/main/java/se/su/dsv/scipro/data/dao/jpa/BoardMessageDaoJPAImp.java b/src/main/java/se/su/dsv/scipro/data/dao/jpa/BoardMessageDaoJPAImp.java index fbf94f58ae..d750476587 100644 --- a/src/main/java/se/su/dsv/scipro/data/dao/jpa/BoardMessageDaoJPAImp.java +++ b/src/main/java/se/su/dsv/scipro/data/dao/jpa/BoardMessageDaoJPAImp.java @@ -19,7 +19,6 @@ import org.springframework.transaction.annotation.Transactional; import se.su.dsv.scipro.data.dao.interfaces.BoardMessageDao; import se.su.dsv.scipro.data.dataobjects.BoardMessage; import se.su.dsv.scipro.data.dataobjects.MessageBoard; -import se.su.dsv.scipro.data.dataobjects.User; /** * @author Johan Aschan - aschan@dsv.su.se @@ -44,7 +43,7 @@ public class BoardMessageDaoJPAImp extends AbstractDaoJPAImp<BoardMessage> TypedQuery<BoardMessage> query = em .createQuery( "select bm FROM BoardMessage bm, MessageBoard mb " + - "WHERE bm member of mb.boardMessageSet AND mb = :mb ORDER BY bm.dateCreated DESC", BoardMessage.class); + "WHERE bm member of mb.boardMessages AND mb = :mb ORDER BY bm.dateCreated DESC", BoardMessage.class); query.setHint(QueryHints.HINT_CACHEABLE, "true"); query.setParameter("mb", mb); query.setFirstResult(first); @@ -68,7 +67,7 @@ public class BoardMessageDaoJPAImp extends AbstractDaoJPAImp<BoardMessage> TypedQuery<Long> query = em .createQuery( "SELECT COUNT (bm) FROM BoardMessage bm, MessageBoard mb " + - "WHERE bm member of mb.boardMessageSet AND mb = :mb", Long.class); + "WHERE bm member of mb.boardMessages AND mb = :mb", Long.class); query.setHint(QueryHints.HINT_CACHEABLE, "true"); query.setParameter("mb", mb); return query.getSingleResult().intValue(); @@ -77,6 +76,24 @@ public class BoardMessageDaoJPAImp extends AbstractDaoJPAImp<BoardMessage> }); } - - + + // Hibernate seemms not to support the index operator for the moment, but this query should be used if it does in the future. + @Override + @Transactional(readOnly = true) + public int getBoardMessageSortOrderIndex(final BoardMessage bm){ + return getJpaTemplate().execute(new JpaCallback<Integer>() { + @Override + public Integer doInJpa(EntityManager em) + throws PersistenceException { + TypedQuery<Integer> query = em + .createQuery( + "SELECT index(b) FROM MessageBoard mb JOIN mb.boardMessages b " + + "WHERE b = :bm", Integer.class); + query.setHint(QueryHints.HINT_CACHEABLE, "true"); + query.setParameter("bm", bm); + return query.getSingleResult().intValue(); + + } + }); + } } diff --git a/src/main/java/se/su/dsv/scipro/data/dao/jpa/CheckListAnswerDaoJPAImp.java b/src/main/java/se/su/dsv/scipro/data/dao/jpa/CheckListAnswerDaoJPAImp.java new file mode 100644 index 0000000000..e30b653abd --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/data/dao/jpa/CheckListAnswerDaoJPAImp.java @@ -0,0 +1,23 @@ +package se.su.dsv.scipro.data.dao.jpa; + +import org.springframework.stereotype.Repository; + +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; + +/** + * + * @author Fredrik Norberg - fnorbe@dsv.su.se + * + */ + +@Repository("checkListAnswerDao") +public class CheckListAnswerDaoJPAImp extends AbstractDaoJPAImp<CheckListAnswer> + implements CheckListAnswerDao { + + public CheckListAnswerDaoJPAImp() { + super(CheckListAnswer.class); + } +} diff --git a/src/main/java/se/su/dsv/scipro/data/dao/jpa/CheckListDaoJPAImp.java b/src/main/java/se/su/dsv/scipro/data/dao/jpa/CheckListDaoJPAImp.java new file mode 100644 index 0000000000..94994e3311 --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/data/dao/jpa/CheckListDaoJPAImp.java @@ -0,0 +1,50 @@ +package se.su.dsv.scipro.data.dao.jpa; + +import java.util.ArrayList; +import java.util.List; + +import javax.persistence.EntityManager; +import javax.persistence.NoResultException; +import javax.persistence.PersistenceException; +import javax.persistence.TypedQuery; + +import org.hibernate.ejb.QueryHints; +import org.springframework.orm.jpa.JpaCallback; +import org.springframework.stereotype.Repository; + +import se.su.dsv.scipro.data.dao.interfaces.CheckListDao; +import se.su.dsv.scipro.data.dataobjects.CheckList; +import se.su.dsv.scipro.data.dataobjects.Project; + +/** + * + * @author Fredrik Norberg - fnorbe@dsv.su.se + * + */ + +@Repository("checkListDao") +public class CheckListDaoJPAImp extends AbstractDaoJPAImp<CheckList> implements CheckListDao { + + public CheckListDaoJPAImp() { + super(CheckList.class); + } + + public List<CheckList> findCheckLists(final Project project) { + return getJpaTemplate().execute(new JpaCallback<List<CheckList>>() { + public List<CheckList> doInJpa(EntityManager em) throws PersistenceException { + String q = "select s " + "from CheckList s " + "where s.project = :project"; + + TypedQuery<CheckList> query = em.createQuery(q, CheckList.class); + query.setParameter("project", project); + query.setHint(QueryHints.HINT_CACHEABLE, "true"); + try { + return query.getResultList(); + } catch (NoResultException e) { + return new ArrayList<CheckList>(); + } + + } + + }); + } +} diff --git a/src/main/java/se/su/dsv/scipro/data/dao/jpa/CheckListQuestionDaoJPAImp.java b/src/main/java/se/su/dsv/scipro/data/dao/jpa/CheckListQuestionDaoJPAImp.java new file mode 100644 index 0000000000..35eda47251 --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/data/dao/jpa/CheckListQuestionDaoJPAImp.java @@ -0,0 +1,21 @@ +package se.su.dsv.scipro.data.dao.jpa; + +import org.springframework.stereotype.Repository; + +import se.su.dsv.scipro.data.dao.interfaces.CheckListQuestionDao; +import se.su.dsv.scipro.data.dataobjects.CheckListQuestion; + +/** + * + * @author Fredrik Norberg - fnorbe@dsv.su.se + * + */ + +@Repository("checkListQuestionDao") +public class CheckListQuestionDaoJPAImp extends AbstractDaoJPAImp<CheckListQuestion> + implements CheckListQuestionDao { + + public CheckListQuestionDaoJPAImp() { + super(CheckListQuestion.class); + } +} diff --git a/src/main/java/se/su/dsv/scipro/data/dao/jpa/CheckListTemplateDaoJPAImp.java b/src/main/java/se/su/dsv/scipro/data/dao/jpa/CheckListTemplateDaoJPAImp.java new file mode 100644 index 0000000000..12e9a906e9 --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/data/dao/jpa/CheckListTemplateDaoJPAImp.java @@ -0,0 +1,23 @@ +package se.su.dsv.scipro.data.dao.jpa; + +import org.springframework.stereotype.Repository; + +import se.su.dsv.scipro.data.dao.interfaces.CheckListQuestionDao; +import se.su.dsv.scipro.data.dao.interfaces.CheckListTemplateDao; +import se.su.dsv.scipro.data.dataobjects.CheckListQuestion; +import se.su.dsv.scipro.data.dataobjects.CheckListTemplate; + +/** + * + * @author Fredrik Norberg - fnorbe@dsv.su.se + * + */ + +@Repository("checkListTemplateDao") +public class CheckListTemplateDaoJPAImp extends AbstractDaoJPAImp<CheckListTemplate> + implements CheckListTemplateDao { + + public CheckListTemplateDaoJPAImp() { + super(CheckListTemplate.class); + } +} diff --git a/src/main/java/se/su/dsv/scipro/data/dao/jpa/MessageBoardDaoJPAImp.java b/src/main/java/se/su/dsv/scipro/data/dao/jpa/MessageBoardDaoJPAImp.java index 649deda415..c2882b4c09 100644 --- a/src/main/java/se/su/dsv/scipro/data/dao/jpa/MessageBoardDaoJPAImp.java +++ b/src/main/java/se/su/dsv/scipro/data/dao/jpa/MessageBoardDaoJPAImp.java @@ -14,6 +14,7 @@ import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; import se.su.dsv.scipro.data.dao.interfaces.MessageBoardDao; +import se.su.dsv.scipro.data.dataobjects.BoardMessage; import se.su.dsv.scipro.data.dataobjects.MessageBoard; import se.su.dsv.scipro.data.dataobjects.User; import se.su.dsv.scipro.data.dataobjects.interfaces.Commentable; diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/BoardMessage.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/BoardMessage.java index 6dbf3d0161..6008a96fe9 100644 --- a/src/main/java/se/su/dsv/scipro/data/dataobjects/BoardMessage.java +++ b/src/main/java/se/su/dsv/scipro/data/dataobjects/BoardMessage.java @@ -7,14 +7,12 @@ import java.util.ArrayList; import java.util.List; import javax.persistence.Cacheable; -import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Lob; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; -import javax.persistence.OneToOne; import javax.persistence.Table; import org.hibernate.annotations.Cache; @@ -48,9 +46,6 @@ public class BoardMessage extends DomainObject implements Commentable, Comparabl @OneToMany private List<BoardMessage> replyMessageList = new ArrayList<BoardMessage>(0); - @ManyToOne(optional=false) - private MessageBoard messageBoard; - @Override public Long getId() { return id; @@ -65,20 +60,6 @@ public class BoardMessage extends DomainObject implements Commentable, Comparabl } - /** - * @return the messageBoard - */ - public MessageBoard getMessageBoard() { - return messageBoard; - } - - /** - * @param messageBoard the messageBoard to set - */ - public void setMessageBoard(MessageBoard messageBoard) { - this.messageBoard = messageBoard; - } - @Override public String getCommentKey() { return BoardMessage.class.getCanonicalName().toString(); @@ -140,8 +121,6 @@ public class BoardMessage extends DomainObject implements Commentable, Comparabl } if(this.getId() != null && o.getId() != null) return this.getId().compareTo(o.getId()); - if(this.message != null && o.message != null) - return message.compareTo(o.message); //By now we have to conclude the two objects are basically two objects full of nulls return 0; } 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 new file mode 100644 index 0000000000..a44465e669 --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/data/dataobjects/CheckList.java @@ -0,0 +1,137 @@ +package se.su.dsv.scipro.data.dataobjects; + +import java.util.SortedSet; +import java.util.TreeSet; + +import javax.persistence.Cacheable; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.Table; + +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; +import org.hibernate.annotations.Sort; +import org.hibernate.annotations.SortType; + +/** + * + * @author Fredrik Norberg fnorbe@dsv.su.se + * + */ + +@Entity +@Table(name = "checklist") +@Cacheable(true) +@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) +// Hibernate +public class CheckList extends DomainObject { + + private static final long serialVersionUID = 2959377496669050427L; + + @Id + @GeneratedValue + private Long id; + + @Column(nullable = false) + private String name; + + @ManyToOne(optional = false) + private Project project; + + + @OneToMany + @Sort(type = SortType.NATURAL) + private SortedSet<CheckListQuestion> questions = new TreeSet<CheckListQuestion>(); + + public CheckList() { + } + + public CheckList(String name, Project project) { + this.name = name; + this.project = project; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public void setName(String name) { + this.name = name; + } + + /** + * @return the questions + */ + public SortedSet<CheckListQuestion> getQuestions() { + return questions; + } + + /** + * @param questions + * the questions to set + */ + public void setQuestions(SortedSet<CheckListQuestion> questions) { + this.questions = questions; + } + + /** + * @return the project + */ + public Project getProject() { + return project; + } + + /** + * @param project the project to set + */ + public void setProject(Project project) { + this.project = project; + } + + @Override + public int hashCode() { + final int weight = 31; + int result = 17; + + result = weight * result + ((id == null) ? 0 : (int) (id ^ (id >>> 32))); + + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (obj instanceof CheckList) { + + CheckList other = (CheckList) obj; + + if (id == null) { + if (other.id != null) + return false; + } else if (!id.equals(other.id)) + return false; + + return true; + } + return false; + } + + /** + * @return the name + */ + public String getName() { + return name; + } + +} diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/CheckListAnswer.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/CheckListAnswer.java new file mode 100644 index 0000000000..3045baded3 --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/data/dataobjects/CheckListAnswer.java @@ -0,0 +1,124 @@ +package se.su.dsv.scipro.data.dataobjects; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Lob; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + +import se.su.dsv.scipro.data.enums.CheckListQuestionAnswer; + +/** + * @author Fredrik Norberg fnorbe@dsv.su.se + * + */ +@Entity +@Table(name = "checklist_answer") +public class CheckListAnswer extends DomainObject { + + private static final long serialVersionUID = 2959377496669050427L; + + @Id + @GeneratedValue + private Long id; + + @Enumerated(EnumType.STRING) + @Column(nullable=false) + private CheckListQuestionAnswer answer; + + @ManyToOne(optional=false) + private User user; + + @Lob + private String comment; + + public CheckListAnswer() { + } + + public CheckListAnswer(User user, CheckListQuestionAnswer answer) { + this.user = user; + this.answer = answer; + } + + public CheckListAnswer(User user, CheckListQuestionAnswer answer, String comment) { + this.user = user; + this.answer = answer; + this.comment = comment; + } + + public CheckListQuestionAnswer getAnswer() { + return answer; + } + + public void setAnswer(CheckListQuestionAnswer answer) { + this.answer = answer; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + + + /** + * @return the comment + */ + public String getComment() { + return comment; + } + + /** + * @param comment the comment to set + */ + public void setComment(String comment) { + this.comment = comment; + } + + @Override + public int hashCode() { + final int weight = 31; + int result = 17; + + result = weight * result + ((id == null) ? 0 : (int) (id ^ (id >>> 32))); + + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (obj instanceof CheckListAnswer) { + + CheckListAnswer other = (CheckListAnswer) obj; + + if (id == null) { + if (other.id != null) + return false; + } else if (!id.equals(other.id)) + return false; + + return true; + } + return false; + } + +} \ No newline at end of file diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/CheckListQuestion.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/CheckListQuestion.java new file mode 100644 index 0000000000..c81037bd91 --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/data/dataobjects/CheckListQuestion.java @@ -0,0 +1,133 @@ +package se.su.dsv.scipro.data.dataobjects; + +import java.util.ArrayList; +import java.util.List; + +import javax.persistence.Cacheable; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Lob; +import javax.persistence.OneToMany; +import javax.persistence.Table; + +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; + +/** + * @author Fredrik Norberg - fnorbe@dsv.su.se + */ + +@Entity +@Table(name = "checklist_question") +@Cacheable(true) +@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) +public class CheckListQuestion extends DomainObject implements + Comparable<CheckListQuestion> { + + private static final long serialVersionUID = 2959377496669050427L; + + @Id + @GeneratedValue + private Long id; + + @Lob + @Column(nullable = false) + private String question; + + @Column(nullable = false) + private int questionNumber; + + @OneToMany + private List<CheckListAnswer> answers = new ArrayList<CheckListAnswer>(1); + + public CheckListQuestion() { + } + + public CheckListQuestion(String question) { + this.question = question; + questionNumber = answers.size() + 1; + } + + public String getQuestion() { + return question; + } + + public void setQuestion(String question) { + this.question = question; + } + + public int getQuestionNumber() { + return questionNumber; + } + + public void setQuestionNumber(int questionNumber) { + this.questionNumber = questionNumber; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + + + /** + * @return the answers + */ + public List<CheckListAnswer> getAnswers() { + return answers; + } + + /** + * @param answers the answers to set + */ + public void setAnswers(List<CheckListAnswer> answers) { + this.answers = answers; + } + + @Override + public int hashCode() { + final int weight = 31; + int result = 17; + + result = weight * result + ((id == null) ? 0 : (int) (id ^ (id >>> 32))); + + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (obj instanceof CheckListQuestion) { + + CheckListQuestion other = (CheckListQuestion) obj; + + if (id == null) { + if (other.id != null) + return false; + } else if (!id.equals(other.id)) + return false; + + return true; + } + return false; + } + + @Override + public String toString() { + return getQuestion(); + } + + @Override + public int compareTo(CheckListQuestion other) { + return other.questionNumber - questionNumber; + } +} \ No newline at end of file diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/CheckListTemplate.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/CheckListTemplate.java new file mode 100644 index 0000000000..a4ba4cade7 --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/data/dataobjects/CheckListTemplate.java @@ -0,0 +1,126 @@ +package se.su.dsv.scipro.data.dataobjects; + +import java.util.ArrayList; +import java.util.List; + +import javax.persistence.Column; +import javax.persistence.ElementCollection; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Lob; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + +/** + * @author Fredrik Norberg - fnorbe@dsv.su.se + * + */ +@Entity +@Table(name="checklist_template") +public class CheckListTemplate extends DomainObject { + + private static final long serialVersionUID = 2959377496669050427L; + + @Id + @GeneratedValue + private Long id; + + @Column(nullable=false) + private String name; + + @Lob + @ElementCollection + private List<String> questions = new ArrayList<String>(1); + + @ManyToOne(optional=false) + private User creator; + + @ManyToOne(optional=false) + private ProjectClass level; + + public CheckListTemplate() {} + + public CheckListTemplate(String name, User creator) { + this.name = name; + this.creator = creator; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public void setCreator(User creator) { + this.creator = creator; + } + + public User getCreator() { + return creator; + } + + public List<String> getQuestions(){ + return questions; + } + + public void setQuestions(List<String> questions){ + this.questions = questions; + } + + + /** + * @return the level + */ + public ProjectClass getLevel() { + return level; + } + + /** + * @param level the level to set + */ + public void setLevel(ProjectClass level) { + this.level = level; + } + + @Override + public int hashCode() { + final int weight = 31; + int result = 17; + + result = weight * result + ((id == null) ? 0 : (int) (id ^ (id >>> 32))); + + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (obj instanceof CheckListTemplate){ + + CheckListTemplate other = (CheckListTemplate) obj; + + if (id == null) { + if (other.id != null) + return false; + } else if (!id.equals(other.id)) + return false; + + return true; + } + return false; + } +} \ No newline at end of file diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/MessageBoard.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/MessageBoard.java index 24e44fee06..2cd5ea75da 100644 --- a/src/main/java/se/su/dsv/scipro/data/dataobjects/MessageBoard.java +++ b/src/main/java/se/su/dsv/scipro/data/dataobjects/MessageBoard.java @@ -4,6 +4,7 @@ package se.su.dsv.scipro.data.dataobjects; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.SortedSet; import java.util.TreeSet; @@ -15,7 +16,10 @@ import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; +import javax.persistence.ManyToMany; import javax.persistence.OneToMany; +import javax.persistence.OrderBy; +import javax.persistence.OrderColumn; import javax.persistence.PrePersist; import javax.persistence.PreUpdate; import javax.persistence.Table; @@ -70,32 +74,27 @@ public class MessageBoard extends DomainObject{ if(getCommentableKey().length() > 255) throw new IllegalArgumentException("CommentThread-commentableKey may not be longer than 255 characters"); } - + + @OrderColumn(name="orderIndex") + @ManyToMany + private List<BoardMessage> boardMessages = new ArrayList<BoardMessage>(); - @Sort(type=SortType.NATURAL) - @OneToMany(mappedBy="messageBoard", orphanRemoval=true, cascade=CascadeType.ALL, targetEntity=BoardMessage.class) - private SortedSet<BoardMessage> boardMessageSet = new TreeSet<BoardMessage>(); - - - public List<BoardMessage> getBoardMessageList() { - return new ArrayList<BoardMessage>(boardMessageSet); - } - - public SortedSet<BoardMessage> getBoardMessageSet() { - return boardMessageSet; - } - - - public void setBoardMessageSet( SortedSet<BoardMessage> boardMessageList) { - this.boardMessageSet = boardMessageList; - } - /** - * @return the commentableKey - */ public String getCommentableKey() { return commentableKey; } + + public void addToBoardMessages(BoardMessage boardMessage){ + int pos = Collections.binarySearch(boardMessages, boardMessage); + if (pos < 0) { + pos = -pos - 1; + } + boardMessages.add(pos, boardMessage); + } + + public void removeFromBoardMessages(BoardMessage boardMessage){ + boardMessages.remove(boardMessage); + } /** * @param commentableKey the commentableKey to set */ diff --git a/src/main/java/se/su/dsv/scipro/data/enums/CheckListQuestionAnswer.java b/src/main/java/se/su/dsv/scipro/data/enums/CheckListQuestionAnswer.java new file mode 100644 index 0000000000..397b191276 --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/data/enums/CheckListQuestionAnswer.java @@ -0,0 +1,7 @@ +package se.su.dsv.scipro.data.enums; + +public enum CheckListQuestionAnswer { + RED, + GREEN, + YELLOW +} diff --git a/src/main/java/se/su/dsv/scipro/peer/pages/AbstractSupervisorPeerPage.java b/src/main/java/se/su/dsv/scipro/peer/pages/AbstractSupervisorPeerPage.java index 674b792bc7..95630ea6ae 100644 --- a/src/main/java/se/su/dsv/scipro/peer/pages/AbstractSupervisorPeerPage.java +++ b/src/main/java/se/su/dsv/scipro/peer/pages/AbstractSupervisorPeerPage.java @@ -21,9 +21,9 @@ public abstract class AbstractSupervisorPeerPage extends AbstractSupervisorPage @Override protected List<MenuItem> getItemList() { - final List<MenuItem> items = new ArrayList<MenuItem>(); - items.add(new MenuItem("My projects", SupervisorPeerStatsPage.class, MenuHighlightReviewPage.class, ImageIcon.ICON_STATISTICS)); + final List<MenuItem> items = new ArrayList<MenuItem>(); items.add(new MenuItem("Peer portal", SupervisorPeerPortalPage.class, ImageIcon.ICON_FIND)); + items.add(new MenuItem("My projects", SupervisorPeerStatsPage.class, MenuHighlightReviewPage.class, ImageIcon.ICON_STATISTICS)); items.add(new MenuItem("How to write a good review", SupervisorPeerReviewGuidePage.class, ImageIcon.ICON_HELP)); return items; } diff --git a/src/main/java/se/su/dsv/scipro/peer/pages/ProjectPeerReviewGuidePage.java b/src/main/java/se/su/dsv/scipro/peer/pages/ProjectPeerReviewGuidePage.java index 646f7d2812..0b43a15fe7 100644 --- a/src/main/java/se/su/dsv/scipro/peer/pages/ProjectPeerReviewGuidePage.java +++ b/src/main/java/se/su/dsv/scipro/peer/pages/ProjectPeerReviewGuidePage.java @@ -2,6 +2,10 @@ package se.su.dsv.scipro.peer.pages; import org.apache.wicket.PageParameters; +import se.su.dsv.scipro.security.auth.Authorization; +import se.su.dsv.scipro.security.auth.roles.Roles; + +@Authorization(authorizedRoles={Roles.SYSADMIN}) public class ProjectPeerReviewGuidePage extends AbstractProjectPeerPage { public ProjectPeerReviewGuidePage(PageParameters pp) { diff --git a/src/main/java/se/su/dsv/scipro/peer/pages/SupervisorPeerReviewGuidePage.java b/src/main/java/se/su/dsv/scipro/peer/pages/SupervisorPeerReviewGuidePage.java index 5331d6a8ba..bc76c49272 100644 --- a/src/main/java/se/su/dsv/scipro/peer/pages/SupervisorPeerReviewGuidePage.java +++ b/src/main/java/se/su/dsv/scipro/peer/pages/SupervisorPeerReviewGuidePage.java @@ -2,6 +2,10 @@ package se.su.dsv.scipro.peer.pages; import org.apache.wicket.PageParameters; +import se.su.dsv.scipro.security.auth.Authorization; +import se.su.dsv.scipro.security.auth.roles.Roles; + +@Authorization(authorizedRoles={Roles.SYSADMIN}) public class SupervisorPeerReviewGuidePage extends AbstractSupervisorPeerPage { public SupervisorPeerReviewGuidePage(PageParameters pp) { diff --git a/src/main/java/se/su/dsv/scipro/project/pages/ProjectChecklistPage.html b/src/main/java/se/su/dsv/scipro/project/pages/ProjectChecklistPage.html new file mode 100644 index 0000000000..2921c71d9a --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/project/pages/ProjectChecklistPage.html @@ -0,0 +1,10 @@ +<!DOCTYPE html> +<html + xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd"> +<body> +<wicket:extend> +<!-- <div wicket:id="trafficLightPanel"></div> --> +<!-- <div wicket:id="createCheckList"></div> --> +</wicket:extend> +</body> +</html> \ No newline at end of file diff --git a/src/main/java/se/su/dsv/scipro/project/pages/ProjectChecklistPage.java b/src/main/java/se/su/dsv/scipro/project/pages/ProjectChecklistPage.java new file mode 100644 index 0000000000..ad39c2dbc3 --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/project/pages/ProjectChecklistPage.java @@ -0,0 +1,22 @@ +package se.su.dsv.scipro.project.pages; + +import org.apache.wicket.PageParameters; + +import se.su.dsv.scipro.security.auth.Authorization; +import se.su.dsv.scipro.security.auth.roles.Roles; + +/** + * @author Fredrik Norberg - fnorbe@dsv.su.se + * + */ + +@Authorization(authorizedRoles={Roles.SYSADMIN}) //TODO Hidden for initial deployment +public class ProjectChecklistPage extends ProjectPage { + + public ProjectChecklistPage(PageParameters pp) { + super(pp); + //add(new TrafficLightPanel("trafficLightPanel")); + //add(new CreateCheckListTemplatePanel("createCheckList")); + } + +} diff --git a/src/main/java/se/su/dsv/scipro/project/panels/ProjectTabMenuPanel.java b/src/main/java/se/su/dsv/scipro/project/panels/ProjectTabMenuPanel.java index b351cbd3c9..d1ad784e74 100644 --- a/src/main/java/se/su/dsv/scipro/project/panels/ProjectTabMenuPanel.java +++ b/src/main/java/se/su/dsv/scipro/project/panels/ProjectTabMenuPanel.java @@ -18,6 +18,7 @@ import se.su.dsv.scipro.project.pages.ProjectPage; import se.su.dsv.scipro.project.pages.ProjectPartnerPage; import se.su.dsv.scipro.project.pages.ProjectSchedulePlannerPage; import se.su.dsv.scipro.project.pages.ProjectStartPage; +import se.su.dsv.scipro.project.pages.ProjectChecklistPage; import se.su.dsv.scipro.repository.panels.ProjectFilePanel; /** @@ -47,6 +48,7 @@ public class ProjectTabMenuPanel extends AbstractMenuPanel { itemList.add(new MenuItem("Peer review", ProjectPeerPortalPage.class)); itemList.add(new MenuItem("All Final Seminars", FinalSeminarProjectListPage.class)); itemList.add(new MenuItem("Conference", ProjectConferencePage.class)); + itemList.add(new MenuItem("Checklists", ProjectChecklistPage.class)); } else { itemList.add(new MenuItem("No active project!", NoActiveProjectPage.class)); itemList.add(new MenuItem("Project Partner", ProjectPartnerPage.class)); diff --git a/src/main/resources/META-INF/persistence.xml b/src/main/resources/META-INF/persistence.xml index cea9c530c7..7d6e6766b3 100644 --- a/src/main/resources/META-INF/persistence.xml +++ b/src/main/resources/META-INF/persistence.xml @@ -67,6 +67,10 @@ <class>se.su.dsv.scipro.data.dataobjects.ProjectPartner</class> <class>se.su.dsv.scipro.data.dataobjects.CheckPlagiarismEvent</class> <class>se.su.dsv.scipro.data.dataobjects.WebNotification</class> + <class>se.su.dsv.scipro.data.dataobjects.CheckListTemplate</class> + <class>se.su.dsv.scipro.data.dataobjects.CheckList</class> + <class>se.su.dsv.scipro.data.dataobjects.CheckListAnswer</class> + <class>se.su.dsv.scipro.data.dataobjects.CheckListQuestion</class> <properties> @@ -171,6 +175,10 @@ <class>se.su.dsv.scipro.data.dataobjects.ProjectPartner</class> <class>se.su.dsv.scipro.data.dataobjects.CheckPlagiarismEvent</class> <class>se.su.dsv.scipro.data.dataobjects.WebNotification</class> + <class>se.su.dsv.scipro.data.dataobjects.CheckListTemplate</class> + <class>se.su.dsv.scipro.data.dataobjects.CheckList</class> + <class>se.su.dsv.scipro.data.dataobjects.CheckListAnswer</class> + <class>se.su.dsv.scipro.data.dataobjects.CheckListQuestion</class> <properties> diff --git a/src/main/webapp/css/scipro.css b/src/main/webapp/css/scipro.css index 1d5fe781cd..a607f46718 100644 --- a/src/main/webapp/css/scipro.css +++ b/src/main/webapp/css/scipro.css @@ -1053,3 +1053,7 @@ div.wicket-aa ul li.selected { font-size: 1.4em; font-style: strong; } + +body { + font: 0.8em/21px arial,sans-serif; +} diff --git a/src/test/java/se/su/dsv/scipro/dao/jpa/TestBoardMessageDaoJPA.java b/src/test/java/se/su/dsv/scipro/dao/jpa/TestBoardMessageDaoJPA.java index 8b4ed74aa2..abd9ebcab1 100644 --- a/src/test/java/se/su/dsv/scipro/dao/jpa/TestBoardMessageDaoJPA.java +++ b/src/test/java/se/su/dsv/scipro/dao/jpa/TestBoardMessageDaoJPA.java @@ -94,17 +94,24 @@ public class TestBoardMessageDaoJPA { Set<User> subscribers = new HashSet<User>(); subscribers.add(user); - messageBoard = new MessageBoard(presenterProject); - messageBoard.setTitle("test"); - messageBoard = messageBoardDao.save(messageBoard); + boardMessage = new BoardMessage(); boardMessage.setFromUser(user); boardMessage.setMessage("Test"); - boardMessage.setMessageBoard(messageBoard); boardMessage = boardMessageDao.save(boardMessage); + + boardMessage = new BoardMessage(); + boardMessage.setFromUser(user); + boardMessage.setMessage("Test"); + boardMessage = boardMessageDao.save(boardMessage); + + messageBoard = new MessageBoard(presenterProject); + messageBoard.setTitle("test"); + messageBoard.getBoardMessages().add(boardMessage); + messageBoard = messageBoardDao.save(messageBoard); } @@ -123,5 +130,11 @@ public class TestBoardMessageDaoJPA { Assert.assertEquals(1, boardMessageDao.getBoardMessageListCount(messageBoard)); } + @Test + @Transactional + @Rollback + public void getBoardMessageSortOrderIndex() { + Assert.assertEquals(0, boardMessageDao.getBoardMessageSortOrderIndex(boardMessage)); + } }