diff --git a/src/main/java/se/su/dsv/scipro/SciProApplication.java b/src/main/java/se/su/dsv/scipro/SciProApplication.java index 2b3c943ee1..01a475ce26 100644 --- a/src/main/java/se/su/dsv/scipro/SciProApplication.java +++ b/src/main/java/se/su/dsv/scipro/SciProApplication.java @@ -32,6 +32,8 @@ import se.su.dsv.scipro.admin.pages.settings.AdminServerEnvironmentSettingsPage; import se.su.dsv.scipro.basepages.DemoPage; import se.su.dsv.scipro.basepages.errorpages.AccessDeniedPage; import se.su.dsv.scipro.basepages.errorpages.NotFoundPage; +import se.su.dsv.scipro.conference.pages.ProjectConferencePage; +import se.su.dsv.scipro.conference.pages.SupervisorConferencePage; import se.su.dsv.scipro.json.pages.JsonDeletePrivateMessagePage; import se.su.dsv.scipro.json.pages.JsonDeleteRecipientPage; import se.su.dsv.scipro.json.pages.JsonLoginPage; @@ -50,6 +52,18 @@ import se.su.dsv.scipro.knol.resource.page.ResourcePage; import se.su.dsv.scipro.loginlogout.pages.LoginPage; import se.su.dsv.scipro.loginlogout.pages.LogoutPage; import se.su.dsv.scipro.message.pages.PrivateMessagesPage; +import se.su.dsv.scipro.peer.pages.PeerRequestSubmissionPage; +import se.su.dsv.scipro.peer.pages.PeerReviewTemplateCreationPage; +import se.su.dsv.scipro.peer.pages.PeerReviewTemplatePage; +import se.su.dsv.scipro.peer.pages.PeerReviewTemplatePreviewPage; +import se.su.dsv.scipro.peer.pages.ProjectPeerPortalPage; +import se.su.dsv.scipro.peer.pages.ProjectPeerReviewGuidePage; +import se.su.dsv.scipro.peer.pages.ProjectPeerReviewPage; +import se.su.dsv.scipro.peer.pages.ProjectPeerStatsPage; +import se.su.dsv.scipro.peer.pages.SupervisorPeerPortalPage; +import se.su.dsv.scipro.peer.pages.SupervisorPeerReviewGuidePage; +import se.su.dsv.scipro.peer.pages.SupervisorPeerReviewPage; +import se.su.dsv.scipro.peer.pages.SupervisorPeerStatsPage; import se.su.dsv.scipro.project.pages.FinalSeminarProjectListPage; import se.su.dsv.scipro.project.pages.NoActiveProjectPage; import se.su.dsv.scipro.project.pages.ProjectEventPage; @@ -200,6 +214,7 @@ public class SciProApplication extends RepositoryApplication implements IThemabl /* * Project pages */ + mountBookmarkablePage("project/conference", ProjectConferencePage.class); mountBookmarkablePage("project/schedule/event", ProjectEventPage.class); mountBookmarkablePage("project/schedule/generator", ProjectScheduleGeneratorPage.class); mountBookmarkablePage("project/files", ProjectFilePage.class); @@ -223,12 +238,13 @@ public class SciProApplication extends RepositoryApplication implements IThemabl mountBookmarkablePage("supervisor/schedule/groupevent", SupervisorGroupEventPage.class); mountBookmarkablePage("supervisor/project/details/schedule/generator", SupervisorScheduleGeneratorPage.class); mountBookmarkablePage("supervisor/antiplagiarism", SupervisorAntiPlagiarismLinkPage.class); + mountBookmarkablePage("supervisor/conference", SupervisorConferencePage.class); /* * Peer pages */ - /* TODO Removed for deployment-test + //admin mountBookmarkablePage("peer/review/template/preview", PeerReviewTemplatePreviewPage.class); mountBookmarkablePage("peer/templates/create", PeerReviewTemplateCreationPage.class); diff --git a/src/main/java/se/su/dsv/scipro/admin/pages/settings/AdminFinalSeminarSettingsPage.html b/src/main/java/se/su/dsv/scipro/admin/pages/settings/AdminFinalSeminarSettingsPage.html index 746ea997f7..0481d54428 100644 --- a/src/main/java/se/su/dsv/scipro/admin/pages/settings/AdminFinalSeminarSettingsPage.html +++ b/src/main/java/se/su/dsv/scipro/admin/pages/settings/AdminFinalSeminarSettingsPage.html @@ -19,8 +19,20 @@ <td><input name="3" wicket:id="daysBeforeFinalSeminarCanRegisterAsOpponent" type="text" /></td> </tr> <tr> - <td><label for="4">File format of uploaded theses and opposition-reports must be PDF:</label></td> - <td><input name="4" type="checkbox" wicket:id="finalSeminarThesisMustBeAPDF" /></td> + <td><label for="4">Turnitin username (should be an instructor with quick submit activated):</label></td> + <td><input name="4" wicket:id="turnItInUsername" type="text" /></td> + </tr> + <tr> + <td><label for="5">Forname for Turnitin user:</label></td> + <td><input name="5" wicket:id="turnItInForname" type="text" /></td> + </tr> + <tr> + <td><label for="6">Surname for Turnitin user:</label></td> + <td><input name="6" wicket:id=turnItInSurname type="text" /></td> + </tr> + <tr> + <td><label for="7">File format of uploaded theses and opposition-reports must be PDF:</label></td> + <td><input name="7" type="checkbox" wicket:id="finalSeminarThesisMustBeAPDF" /></td> </tr> </table> diff --git a/src/main/java/se/su/dsv/scipro/admin/pages/settings/AdminFinalSeminarSettingsPage.java b/src/main/java/se/su/dsv/scipro/admin/pages/settings/AdminFinalSeminarSettingsPage.java index 3f052fd2c9..2013d2f89f 100644 --- a/src/main/java/se/su/dsv/scipro/admin/pages/settings/AdminFinalSeminarSettingsPage.java +++ b/src/main/java/se/su/dsv/scipro/admin/pages/settings/AdminFinalSeminarSettingsPage.java @@ -3,6 +3,7 @@ package se.su.dsv.scipro.admin.pages.settings; import org.apache.wicket.PageParameters; import org.apache.wicket.markup.html.form.CheckBox; import org.apache.wicket.markup.html.form.Form; +import org.apache.wicket.markup.html.form.PasswordTextField; import org.apache.wicket.markup.html.form.RequiredTextField; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.model.CompoundPropertyModel; @@ -28,16 +29,22 @@ public class AdminFinalSeminarSettingsPage extends AbstractAdminSettingsPage { private class FinalSeminarSettingsForm extends Form<GeneralSystemSettings> { private static final long serialVersionUID = 1L; - + public FinalSeminarSettingsForm(String id, IModel<GeneralSystemSettings> model) { super(id, model ); TextField<Integer> activeParticipation = new RequiredTextField<Integer>("finalSeminarMaxActiveParticipants"); TextField<Integer> registerAsActive = new RequiredTextField<Integer>("daysBeforeFinalSeminarCanRegisterAsActiveParticipant"); TextField<Integer> registerAsOpponent = new RequiredTextField<Integer>("daysBeforeFinalSeminarCanRegisterAsOpponent"); + TextField<String> turnitinUsername = new RequiredTextField<String>("turnItInUsername"); + TextField<String> turnitinForname = new RequiredTextField<String>("turnItInForname"); + TextField<String> turnitinSurname = new RequiredTextField<String>("turnItInSurname"); CheckBox pdfCheckBox = new CheckBox("finalSeminarThesisMustBeAPDF"); add(registerAsActive); add(registerAsOpponent); add(activeParticipation); + add(turnitinUsername); + add(turnitinForname); + add(turnitinSurname); add(pdfCheckBox); } diff --git a/src/main/java/se/su/dsv/scipro/admin/pages/settings/AdminGeneralSettingsPage.html b/src/main/java/se/su/dsv/scipro/admin/pages/settings/AdminGeneralSettingsPage.html index 85f613f152..47721c888b 100644 --- a/src/main/java/se/su/dsv/scipro/admin/pages/settings/AdminGeneralSettingsPage.html +++ b/src/main/java/se/su/dsv/scipro/admin/pages/settings/AdminGeneralSettingsPage.html @@ -2,8 +2,44 @@ <html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd"> <body> -<wicket:extend> - <h1>General Settings</h1> -</wicket:extend> + <wicket:extend> + <h5 class="peer-title">General Settings</h5> + <form wicket:id="finalSeminarSettingsForm"> + <table> + <tr> + <td><label for="1">Sender name for e-mail + notifications:</label> + </td> + <td><input name="1" wicket:id="mailFromName" type="text" /> + </td> + </tr> + <tr> + <td><label for="2">Sender address for e-mail + notifications:</label> + </td> + <td><input name="2" wicket:id="systemFromMail" type="text" /> + </td> + </tr> + <tr> + <td><label for="3">SMTP server address:</label> + </td> + <td><input name="3" wicket:id="smtpServer" type="text" /> + </td> + </tr> + <tr> + <td><label for="7">Enable e-mail notifications:</label> + </td> + <td><input name="7" type="checkbox" wicket:id="mailNotifications" /> + </td> + </tr> + </table> + + <button type="submit"> + <img src="css/blueprint/plugins/buttons/icons/tick.png" alt="" /> + Save changes + </button> + + </form> + </wicket:extend> </body> </html> \ No newline at end of file diff --git a/src/main/java/se/su/dsv/scipro/admin/pages/settings/AdminGeneralSettingsPage.java b/src/main/java/se/su/dsv/scipro/admin/pages/settings/AdminGeneralSettingsPage.java index 54b917abef..7fe92a4013 100644 --- a/src/main/java/se/su/dsv/scipro/admin/pages/settings/AdminGeneralSettingsPage.java +++ b/src/main/java/se/su/dsv/scipro/admin/pages/settings/AdminGeneralSettingsPage.java @@ -1,13 +1,50 @@ package se.su.dsv.scipro.admin.pages.settings; import org.apache.wicket.PageParameters; +import org.apache.wicket.markup.html.form.CheckBox; +import org.apache.wicket.markup.html.form.Form; +import org.apache.wicket.markup.html.form.RequiredTextField; +import org.apache.wicket.markup.html.form.TextField; +import org.apache.wicket.model.CompoundPropertyModel; +import org.apache.wicket.model.IModel; +import org.apache.wicket.spring.injection.annot.SpringBean; import se.su.dsv.scipro.admin.pages.AbstractAdminSettingsPage; +import se.su.dsv.scipro.data.dao.interfaces.GeneralSystemSettingsDao; +import se.su.dsv.scipro.data.dataobjects.GeneralSystemSettings; public class AdminGeneralSettingsPage extends AbstractAdminSettingsPage { + @SpringBean + private GeneralSystemSettingsDao generalSystemSettingsDao; + public AdminGeneralSettingsPage(final PageParameters pp) { super(pp); + + add(new AdminGeneralSettingsForm( + "finalSeminarSettingsForm", + new CompoundPropertyModel<GeneralSystemSettings>(generalSystemSettingsDao.getGeneralSystemSettingsInstance()))); } + private class AdminGeneralSettingsForm extends Form<GeneralSystemSettings> { + private static final long serialVersionUID = 1L; + + public AdminGeneralSettingsForm(String id, IModel<GeneralSystemSettings> model) { + super(id, model ); + TextField<String> mailFromName = new RequiredTextField<String>("mailFromName"); + TextField<String> systemFromMail = new RequiredTextField<String>("systemFromMail"); + TextField<String> smtpServer = new RequiredTextField<String>("smtpServer"); + CheckBox mailNotifications = new CheckBox("mailNotifications"); + add(mailFromName); + add(systemFromMail); + add(smtpServer); + add(mailNotifications); + } + + @Override + protected void onSubmit() { + setModelObject( generalSystemSettingsDao.save(getModelObject()) ); + info("General settings saved"); + } + } } diff --git a/src/main/java/se/su/dsv/scipro/admin/panels/AdminRolesPanel.java b/src/main/java/se/su/dsv/scipro/admin/panels/AdminRolesPanel.java index d0c25b24c0..f644986eb8 100644 --- a/src/main/java/se/su/dsv/scipro/admin/panels/AdminRolesPanel.java +++ b/src/main/java/se/su/dsv/scipro/admin/panels/AdminRolesPanel.java @@ -112,7 +112,7 @@ public class AdminRolesPanel extends Panel { searchField.add(userSearchTextBehaviour); add(searchField); - loadUserDataView(new UserSearchDataProvider(null, null)); + loadUserDataView(new UserSearchDataProvider(null, null, null)); container.add(dataView); add(container); @@ -123,18 +123,18 @@ public class AdminRolesPanel extends Panel { public void checkRole() { switch (selectedRole) { case ALL: - loadUserDataView(new UserSearchDataProvider(userSearch, null)); + loadUserDataView(new UserSearchDataProvider(userSearch, null, null)); break; case EMPLOYEE: loadUserDataView(new UserSearchDataProvider(userSearch, - Employee.class)); + Employee.class, null)); break; case SYSADMIN: loadUserDataView(new UserSearchDataProvider(userSearch, - SysAdmin.class)); + SysAdmin.class, null)); break; case ADMIN: - loadUserDataView(new UserSearchDataProvider(userSearch, Admin.class)); + loadUserDataView(new UserSearchDataProvider(userSearch, Admin.class, null)); break; } } diff --git a/src/main/java/se/su/dsv/scipro/basepanels/UserSettingsPanel.html b/src/main/java/se/su/dsv/scipro/basepanels/UserSettingsPanel.html index cf2b034a91..4acacee27b 100644 --- a/src/main/java/se/su/dsv/scipro/basepanels/UserSettingsPanel.html +++ b/src/main/java/se/su/dsv/scipro/basepanels/UserSettingsPanel.html @@ -1,19 +1,27 @@ <!DOCTYPE html> -<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd"> +<html + xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd"> <body> -<wicket:panel> - <form wicket:id="userSettingsForm"> - <div class="span-10 last"> - <div class="info-box rounded-box span-10 last">If you do not have any projects to choose from, contact your supervisor and ask him/her to register a thesis course for you in Daisy.</div> - </div> - <div class="span-10 last"> - <label for="activeProject">Active project</label> - <select name="Active project" wicket:id="activeProject" id="activeProject"></select> - <div> - <input type="submit" wicket:id="applyButton" value="Apply"> - </div> - </div> - </form> -</wicket:panel> + <wicket:panel> + <form wicket:id="userSettingsForm"> + <div class="span-10 last"> + <div class="info-box rounded-box span-10 last">If you do not + have any projects to choose from, contact your supervisor and ask + him/her to register a thesis course for you in Daisy.</div> + </div> + <div class="span-10 last"> + <label for="activeProject">Active project</label> <select + name="Active project" wicket:id="activeProject" id="activeProject"></select> + <div class="span-10 last"> + <label>Mail notifications you want</label> + <div wicket:id="notificationPriority"><input type="radio" /> + </div> + </div> + + <button type="submit" ><img src="css/blueprint/plugins/buttons/icons/tick.png" alt=""/> Save changes</button> + + </div> + </form> + </wicket:panel> </body> </html> \ No newline at end of file diff --git a/src/main/java/se/su/dsv/scipro/basepanels/UserSettingsPanel.java b/src/main/java/se/su/dsv/scipro/basepanels/UserSettingsPanel.java index 511bc8a112..e92659db21 100644 --- a/src/main/java/se/su/dsv/scipro/basepanels/UserSettingsPanel.java +++ b/src/main/java/se/su/dsv/scipro/basepanels/UserSettingsPanel.java @@ -5,13 +5,14 @@ import java.util.List; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; -import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.Button; import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.IChoiceRenderer; +import org.apache.wicket.markup.html.form.RadioChoice; import org.apache.wicket.markup.html.panel.Panel; -import org.apache.wicket.model.Model; +import org.apache.wicket.model.CompoundPropertyModel; +import org.apache.wicket.model.IModel; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.spring.injection.annot.SpringBean; @@ -20,6 +21,8 @@ import se.su.dsv.scipro.data.dao.interfaces.ProjectDao; import se.su.dsv.scipro.data.dao.interfaces.UserSettingsDao; import se.su.dsv.scipro.data.dataobjects.Project; import se.su.dsv.scipro.data.dataobjects.UserSettings; +import se.su.dsv.scipro.data.enums.NotificationPriority; +import edu.emory.mathcs.backport.java.util.Arrays; /** * * @author Martin Peters - mpeters@dsv.su.se @@ -36,16 +39,18 @@ public class UserSettingsPanel extends Panel { public UserSettingsPanel(String id) { super(id); - - add(new UserSettingsForm("userSettingsForm")); + UserSettings userSettings = userSettingsDao.getUserSettings(SciProSession.get().getUser()); + if(userSettings == null) + userSettings = new UserSettings(SciProSession.get().getUser()); + add(new UserSettingsForm("userSettingsForm", new CompoundPropertyModel<UserSettings>(userSettings))); } - private class UserSettingsForm extends Form<Void> { + private class UserSettingsForm extends Form<UserSettings> { private static final long serialVersionUID = 1L; private Project activeProject; - public UserSettingsForm(String id) { - super(id); + public UserSettingsForm(String id, IModel<UserSettings> model) { + super(id, model); activeProject = SciProSession.get().getActiveProject(); List<Project> userProjects = new ArrayList<Project>(); @@ -67,14 +72,22 @@ public class UserSettingsPanel extends Panel { }); projectChoice.setNullValid(true); add(projectChoice); - Button applyButton = new Button("applyButton"){ - private static final long serialVersionUID = 1L; - @Override - public void onSubmit(){ - setResponsePage(this.getPage().getClass(),this.getPage().getPageParameters()); - } - }; - add(applyButton); + + NotificationPriority[] array = NotificationPriority.values(); + + List<NotificationPriority> notificationPriorities = new ArrayList<NotificationPriority>(Arrays.asList(array)); + + RadioChoice<NotificationPriority> radioChoice = new RadioChoice<NotificationPriority>("notificationPriority", notificationPriorities ); + add(radioChoice); + + + + } + + @Override + public void onSubmit(){ + userSettingsDao.save(getModelObject()); + setResponsePage(this.getPage().getClass(),this.getPage().getPageParameters()); } }//UserSettingsForm diff --git a/src/main/java/se/su/dsv/scipro/commentthread/panel/CommentThreadPanel.html b/src/main/java/se/su/dsv/scipro/commentthread/panel/CommentThreadPanel.html deleted file mode 100644 index 8053f15ad1..0000000000 --- a/src/main/java/se/su/dsv/scipro/commentthread/panel/CommentThreadPanel.html +++ /dev/null @@ -1,68 +0,0 @@ -<!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="container" class="prepend-top last"> - <div class="comment last" wicket:id="comment"> - <div class="comment-header last"> - <div class="last"> - <span wicket:id="from" class="comment-posted-by">Dan Kjellman</span> - </div> - <div class="last"> - <span class="comment-posted-date">Posted: </span> - <span wicket:id="date" class="comment-posted-date"></span> - <a href="#" wicket:id="editComment"> - <img class="icon-12" src="images/icons/edit_16x16.png" " alt="Edit" title="Edit" /> - <span class="small"> Edit</span> - </a> - <a href="#" wicket:id="deleteComment"> - <img class="icon-12" src="images/icons/delete_16x16.png" alt="Delete" title="Delete" /> - <span class="small"> Delete</span> - </a> - </div> - </div> - <div class="comment-bottom-border last"></div> - <div class="comment-area last"> - <p wicket:id="message">This is the comment</p> - </div> - - </div> - <div wicket:id="navigator" class="comment-pager last"></div> - </div> - <div class="last comment-form"> - <form wicket:id="commentForm"> - <div class="last"> - <strong>Comment:</strong> - </div> - <div class="last"> - <textarea wicket:id="textMessage" ></textarea> - </div> - <div class="last"> - <button wicket:id="submitButton" class="button">Submit comment - <img src="images/icons/chat_16x16.png" alt=""/> - </button> - </div> - </form> - </div> - <div wicket:id="dialog"> - <div wicket:id="dialogContainer" class="comment-form"> - <form wicket:id="editCommentForm"> - <div> - <textarea wicket:id="editTextMessage" ></textarea> - </div> - <div> - <button wicket:id="submitButton" class="button">Save - <img src="css/blueprint/plugins/buttons/icons/tick.png" alt=""/> - </button> - </div> - </form> - </div> - </div> - -</wicket:panel> - -</body> -</html> \ No newline at end of file diff --git a/src/main/java/se/su/dsv/scipro/commentthread/panel/CommentThreadPanel.java b/src/main/java/se/su/dsv/scipro/commentthread/panel/CommentThreadPanel.java deleted file mode 100644 index c4d69e9dc3..0000000000 --- a/src/main/java/se/su/dsv/scipro/commentthread/panel/CommentThreadPanel.java +++ /dev/null @@ -1,298 +0,0 @@ -/** - * - */ -package se.su.dsv.scipro.commentthread.panel; - -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.List; - -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.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.TextArea; -import org.apache.wicket.markup.html.list.ListItem; -import org.apache.wicket.markup.html.list.PageableListView; -import org.apache.wicket.markup.html.panel.Panel; -import org.apache.wicket.model.IModel; -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.SciProSession; -import se.su.dsv.scipro.data.DomainObjectDetachableModel; -import se.su.dsv.scipro.data.dao.interfaces.CommentDao; -import se.su.dsv.scipro.data.dao.interfaces.CommentThreadDao; -import se.su.dsv.scipro.data.dataobjects.Comment; -import se.su.dsv.scipro.data.dataobjects.CommentThread; -import se.su.dsv.scipro.data.dataobjects.interfaces.Commentable; -import se.su.dsv.scipro.message.panels.CustomPagingNavigator; -import se.su.dsv.scipro.security.auth.roles.Roles; - -/** - * @author Johan Aschan - aschan@dsv.su.se - * - */ -public class CommentThreadPanel extends Panel { - - private static final long serialVersionUID = 1L; - - @SpringBean - private CommentThreadDao commentThreadDao; - @SpringBean - private CommentDao commentDao; - - private WebMarkupContainer webMarkupContainer; - - private PageableListView<Comment> commentListView; - private CustomPagingNavigator customPagingNavigator; - private int numberOfComments; - private TextArea<String> textArea; - private WebMarkupContainer dialogContainer; - private Dialog dialog; - private final IModel<CommentThread> threadModel; - private final EditCommentForm editCommentForm; - - public CommentThreadPanel(final String id, final Commentable keyObject, final int numberOfComments) { - super(id); - - final String className = keyObject.getCommentKey(); - final Long classId = keyObject.getId(); - - this.numberOfComments = numberOfComments; - - CommentThread commentThread = commentThreadDao.getCommentThread(keyObject); - if (commentThread == null) { - //TODO rewrite so thread is only created on demand, ie when someone's posted - CommentThread ct = new CommentThread(keyObject); - commentThread = commentThreadDao.save(ct); - } - - threadModel = new DomainObjectDetachableModel<CommentThread>(commentThreadDao, commentThread); - - webMarkupContainer = new WebMarkupContainer("container"); - webMarkupContainer.setOutputMarkupId(true); - generateCommentListView(); - webMarkupContainer.add(commentListView); - add(webMarkupContainer); - webMarkupContainer.add(customPagingNavigator); - - Comment newComment = new Comment( SciProSession.get().getUser(), commentThread ); - add(new CommentForm("commentForm", new Model<Comment>(newComment))); - - dialogContainer = new WebMarkupContainer("dialogContainer"); - dialog = new Dialog("dialog"); - dialog.setModal(true); - dialog.setAutoOpen(false); - dialog.setWidth(470); - dialog.add(dialogContainer); - add(dialog); - - dialogContainer.setOutputMarkupId(true); - editCommentForm = new EditCommentForm("editCommentForm", new DomainObjectDetachableModel<Comment>(commentDao, new Comment()) ); - dialogContainer.add(editCommentForm); - - } - - private void generateCommentListView() { - threadModel.detach(); //Forces reinit of model object so collection is attached to session, ugly solution, don't copy.. - List<Comment> commentList = threadModel.getObject().getCommentsList(); - - commentListView = new PageableListView<Comment>("comment", commentList, numberOfComments) { - - private static final long serialVersionUID = 1L; - - @Override - protected void populateItem(final ListItem<Comment> item) { - final Comment c = item.getModelObject(); - DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm"); - item.add(new Label("date", df.format(c.getDateCreated()))); - item.add( c.getCreator().getDisplayComponent("from") ); - item.add(new MultiLineLabel("message", new PropertyModel<String>(item.getDefaultModel(), "comment")).setEnabled(false)); - item.add(new CommentDeleteLink("deleteComment", c)); - item.add(new CommentEditLink("editComment", c)); - }; - }; - - customPagingNavigator = new CustomPagingNavigator("navigator", commentListView) { - - private static final long serialVersionUID = 1L; - - @Override - public boolean isVisible() { - return commentListView.size() > 0; - } - }; - } - - public class CommentForm extends Form<Comment> { - - private static final long serialVersionUID = 1L; - - public CommentForm(final String id, final IModel<Comment> commentModel) { - super(id, commentModel); - - textArea = new TextArea<String>("textMessage",new PropertyModel<String>(commentModel,"comment")); - textArea.setOutputMarkupId(true); - add(textArea); - AjaxButton ajaxButton = new AjaxButton("submitButton", new Model<String>("Submit Comment")) { - - private static final long serialVersionUID = 1L; - - @Override - protected void onSubmit(AjaxRequestTarget target, Form<?> form) { - - Comment comment = (Comment) form.getDefaultModelObject(); - comment = commentDao.save(comment); - /* - * Do not, on purpose set the forms defaultModelObject to the now persisted object, - * we leave the original object so it can be re reused for any number of submits - * * - */ - - webMarkupContainer.remove(commentListView); - webMarkupContainer.remove(customPagingNavigator); - textArea.setDefaultModelObject(""); - generateCommentListView(); - webMarkupContainer.add(commentListView); - webMarkupContainer.add(customPagingNavigator); - target.addComponent(textArea); - target.addComponent(webMarkupContainer); - } - - }; - ajaxButton.setOutputMarkupId(true); - add(ajaxButton); - - } - } - - private class CommentDeleteLink extends AjaxLink<Comment> { - - private static final long serialVersionUID = 5900025667153930797L; - private Comment comment; - - public CommentDeleteLink(String id, Comment comment) { - super(id); - this.comment = comment; - - } - - @Override - public boolean isVisible() { - SciProSession session = SciProSession.get(); - if( session.authorizedForRole(Roles.ADMIN) ) - return true; - if( comment.getCreator().equals( session.getUser() ) ) - return true; - return false; - } - - @Override - public void onClick(AjaxRequestTarget target) { - - comment = commentDao.reLoad(comment); - comment.getCommentThread().getComments().remove(comment); - commentDao.delete(comment); - - webMarkupContainer.remove(commentListView); - webMarkupContainer.remove(customPagingNavigator); - generateCommentListView(); - webMarkupContainer.add(commentListView); - webMarkupContainer.add(customPagingNavigator); - target.addComponent(webMarkupContainer); - } - - } - - private class CommentEditLink extends AjaxLink<Comment> { - - private static final long serialVersionUID = 5900025667153930797L; - private final Comment comment; - - public CommentEditLink(final String id, final Comment comment) { - super(id); - this.comment = comment; - } - - @Override - public boolean isVisible() { - SciProSession session = SciProSession.get(); - if( session.authorizedForRole(Roles.ADMIN) ) - return true; - if( comment.getCreator().equals( session.getUser() ) ) - return true; - - return false; - } - - @Override - public void onClick(AjaxRequestTarget target) { - editCommentForm.setDefaultModelObject( comment ); - //editCommentForm.setTextAreaDefaultModelObject( comment.getComment()); - /* - * TODO Investigate bug that occurs when this panel gets hidden and re-shown - * in resources-view, edit-text-area displays text from the wrong model-object. - */ - dialog.open(target); - target.addComponent(dialog); - } - - } - - private class EditCommentForm extends Form<Comment> { - - private static final long serialVersionUID = 1L; - - private final TextArea<String> editTextArea; - - public EditCommentForm(final String id, final IModel<Comment> commentModel) { - super(id,commentModel); - - editTextArea = new TextArea<String>("editTextMessage",new PropertyModel<String>(commentModel,"comment")); - editTextArea.setOutputMarkupId(true); - add(editTextArea); - dialog.setTitle("Edit Comment"); - - AjaxButton ajaxButton = new AjaxButton("submitButton", new Model<String>("Save")) { - private static final long serialVersionUID = 1L; - - @Override - protected void onSubmit(AjaxRequestTarget target, Form<?> form) { - //DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - //Date date = new Date(); - //df.format(date) - //editComment.setComment(((CommentThreadModel) form.getModelObject()).getEditTextMessage() + "\n\nLast edited: " +df.format(date) + " by: " + user.getFirstName() + " " + user.getLastName()) ; - - /* - * !!! We do not have to explicitly save object! It is currently being persisted by cascade! - */ - - webMarkupContainer.remove(commentListView); - webMarkupContainer.remove(customPagingNavigator); - generateCommentListView(); - webMarkupContainer.add(commentListView); - webMarkupContainer.add(customPagingNavigator); - dialog.close(target); - target.addComponent(webMarkupContainer); - } - - }; - ajaxButton.setOutputMarkupId(true); - add(ajaxButton); - - } - /* - * Attempt to fix weird incorrect-updating of text-area content when panel is used in resources-view - */ - public void setTextAreaDefaultModelObject(String string){ - editTextArea.setDefaultModelObject(string); - } - } - -} diff --git a/src/main/java/se/su/dsv/scipro/commentthread/panels/CommentThreadPanel.java b/src/main/java/se/su/dsv/scipro/commentthread/panels/CommentThreadPanel.java index c51c153dc0..49bc7d262f 100644 --- a/src/main/java/se/su/dsv/scipro/commentthread/panels/CommentThreadPanel.java +++ b/src/main/java/se/su/dsv/scipro/commentthread/panels/CommentThreadPanel.java @@ -6,6 +6,8 @@ package se.su.dsv.scipro.commentthread.panels; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.List; +import java.util.Properties; +import java.util.Set; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.AjaxLink; @@ -25,14 +27,20 @@ import org.apache.wicket.spring.injection.annot.SpringBean; import org.odlabs.wiquery.ui.dialog.Dialog; import se.su.dsv.scipro.SciProSession; +import se.su.dsv.scipro.conference.model.SubscriberModel; import se.su.dsv.scipro.data.DomainObjectDetachableModel; +import se.su.dsv.scipro.data.controllers.NotificationController; +import se.su.dsv.scipro.data.controllers.NotificationMessage; import se.su.dsv.scipro.data.dao.interfaces.CommentDao; import se.su.dsv.scipro.data.dao.interfaces.CommentThreadDao; import se.su.dsv.scipro.data.dataobjects.Comment; import se.su.dsv.scipro.data.dataobjects.CommentThread; +import se.su.dsv.scipro.data.dataobjects.User; import se.su.dsv.scipro.data.dataobjects.interfaces.Commentable; +import se.su.dsv.scipro.data.enums.NotificationPriority; import se.su.dsv.scipro.message.panels.CustomPagingNavigator; import se.su.dsv.scipro.security.auth.roles.Roles; +import se.su.dsv.scipro.util.PropsUtils; /** * @author Johan Aschan - aschan@dsv.su.se @@ -41,11 +49,13 @@ import se.su.dsv.scipro.security.auth.roles.Roles; public class CommentThreadPanel extends Panel { private static final long serialVersionUID = 1L; - + @SpringBean private CommentThreadDao commentThreadDao; @SpringBean private CommentDao commentDao; + @SpringBean + private NotificationController notificationController; private WebMarkupContainer webMarkupContainer; @@ -57,23 +67,32 @@ public class CommentThreadPanel extends Panel { private Dialog dialog; private final IModel<CommentThread> threadModel; private final EditCommentForm editCommentForm; + private final Set<SubscriberModel> subscriberModels; + private final String title; + private final Long classId; - public CommentThreadPanel(final String id, final Commentable keyObject, final int numberOfComments) { + public CommentThreadPanel(final String id, final Commentable keyObject, + final int numberOfComments, final Set<SubscriberModel> subscriberModels, + final String title) { super(id); final String className = keyObject.getCommentKey(); - final Long classId = keyObject.getId(); + classId = keyObject.getId(); + this.subscriberModels = subscriberModels; this.numberOfComments = numberOfComments; + this.title = title; CommentThread commentThread = commentThreadDao.getCommentThread(keyObject); if (commentThread == null) { - //TODO rewrite so thread is only created on demand, ie when someone's posted + // TODO rewrite so thread is only created on demand, ie when + // someone's posted CommentThread ct = new CommentThread(keyObject); commentThread = commentThreadDao.save(ct); } - - threadModel = new DomainObjectDetachableModel<CommentThread>(commentThreadDao, commentThread); + + threadModel = new DomainObjectDetachableModel<CommentThread>(commentThreadDao, + commentThread); webMarkupContainer = new WebMarkupContainer("container"); webMarkupContainer.setOutputMarkupId(true); @@ -81,10 +100,10 @@ public class CommentThreadPanel extends Panel { webMarkupContainer.add(commentListView); add(webMarkupContainer); webMarkupContainer.add(customPagingNavigator); - - Comment newComment = new Comment( SciProSession.get().getUser(), commentThread ); + + Comment newComment = new Comment(SciProSession.get().getUser(), commentThread); add(new CommentForm("commentForm", new Model<Comment>(newComment))); - + dialogContainer = new WebMarkupContainer("dialogContainer"); dialog = new Dialog("dialog"); dialog.setModal(true); @@ -94,15 +113,23 @@ public class CommentThreadPanel extends Panel { add(dialog); dialogContainer.setOutputMarkupId(true); - editCommentForm = new EditCommentForm("editCommentForm", new DomainObjectDetachableModel<Comment>(commentDao, new Comment()) ); + editCommentForm = new EditCommentForm("editCommentForm", + new DomainObjectDetachableModel<Comment>(commentDao, new Comment())); dialogContainer.add(editCommentForm); } + public CommentThreadPanel(final String id, final Commentable keyObject, + final int numberOfComments) { + this(id, keyObject, numberOfComments, null, ""); + } + private void generateCommentListView() { - threadModel.detach(); //Forces reinit of model object so collection is attached to session, ugly solution, don't copy.. + threadModel.detach(); // Forces reinit of model object so collection is + // attached to session, ugly solution, don't + // copy.. List<Comment> commentList = threadModel.getObject().getCommentsList(); - + commentListView = new PageableListView<Comment>("comment", commentList, numberOfComments) { private static final long serialVersionUID = 1L; @@ -112,13 +139,14 @@ public class CommentThreadPanel extends Panel { final Comment c = item.getModelObject(); DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm"); item.add(new Label("date", df.format(c.getDateCreated()))); - item.add( c.getCreator().getDisplayComponent("from") ); - item.add(new MultiLineLabel("message", new PropertyModel<String>(item.getDefaultModel(), "comment")).setEnabled(false)); + item.add(c.getCreator().getDisplayComponent("from")); + item.add(new MultiLineLabel("message", new PropertyModel<String>(item + .getDefaultModel(), "comment")).setEnabled(false)); item.add(new CommentDeleteLink("deleteComment", c)); item.add(new CommentEditLink("editComment", c)); }; }; - + customPagingNavigator = new CustomPagingNavigator("navigator", commentListView) { private static final long serialVersionUID = 1L; @@ -137,10 +165,12 @@ public class CommentThreadPanel extends Panel { public CommentForm(final String id, final IModel<Comment> commentModel) { super(id, commentModel); - textArea = new TextArea<String>("textMessage",new PropertyModel<String>(commentModel,"comment")); + textArea = new TextArea<String>("textMessage", new PropertyModel<String>(commentModel, + "comment")); textArea.setOutputMarkupId(true); add(textArea); - AjaxButton ajaxButton = new AjaxButton("submitButton", new Model<String>("Submit Comment")) { + AjaxButton ajaxButton = new AjaxButton("submitButton", new Model<String>( + "Submit Comment")) { private static final long serialVersionUID = 1L; @@ -149,12 +179,19 @@ public class CommentThreadPanel extends Panel { Comment comment = (Comment) form.getDefaultModelObject(); comment = commentDao.save(comment); + System.out.println(subscriberModels); + if (subscriberModels != null) { + for (SubscriberModel sm : subscriberModels) { + createNotification(sm.getUser(), comment.getComment(), + sm.getNotificationPriority(), sm.getAbsolutePath()); + } + } /* - * Do not, on purpose set the forms defaultModelObject to the now persisted object, - * we leave the original object so it can be re reused for any number of submits - * * + * Do not, on purpose set the forms defaultModelObject to + * the now persisted object, we leave the original object so + * it can be re reused for any number of submits * */ - + webMarkupContainer.remove(commentListView); webMarkupContainer.remove(customPagingNavigator); textArea.setDefaultModelObject(""); @@ -186,7 +223,7 @@ public class CommentThreadPanel extends Panel { @Override public boolean isVisible() { SciProSession session = SciProSession.get(); - if( session.authorizedForRole(Roles.ADMIN) ) + if (session.authorizedForRole(Roles.ADMIN)) return true; return false; @@ -194,11 +231,10 @@ public class CommentThreadPanel extends Panel { @Override public void onClick(AjaxRequestTarget target) { - + comment = commentDao.reLoad(comment); comment.getCommentThread().getComments().remove(comment); - commentDao.delete(comment); - + commentDao.delete(comment); webMarkupContainer.remove(commentListView); webMarkupContainer.remove(customPagingNavigator); generateCommentListView(); @@ -222,19 +258,21 @@ public class CommentThreadPanel extends Panel { @Override public boolean isVisible() { SciProSession session = SciProSession.get(); - if( session.authorizedForRole(Roles.ADMIN) ) + if (session.authorizedForRole(Roles.ADMIN)) return true; - + return false; } @Override public void onClick(AjaxRequestTarget target) { - editCommentForm.setDefaultModelObject( comment ); - //editCommentForm.setTextAreaDefaultModelObject( comment.getComment()); + editCommentForm.setDefaultModelObject(comment); + // editCommentForm.setTextAreaDefaultModelObject( + // comment.getComment()); /* - * TODO Investigate bug that occurs when this panel gets hidden and re-shown - * in resources-view, edit-text-area displays text from the wrong model-object. + * TODO Investigate bug that occurs when this panel gets hidden and + * re-shown in resources-view, edit-text-area displays text from the + * wrong model-object. */ dialog.open(target); target.addComponent(dialog); @@ -245,29 +283,35 @@ public class CommentThreadPanel extends Panel { private class EditCommentForm extends Form<Comment> { private static final long serialVersionUID = 1L; - + private final TextArea<String> editTextArea; public EditCommentForm(final String id, final IModel<Comment> commentModel) { - super(id,commentModel); - - editTextArea = new TextArea<String>("editTextMessage",new PropertyModel<String>(commentModel,"comment")); + super(id, commentModel); + + editTextArea = new TextArea<String>("editTextMessage", new PropertyModel<String>( + commentModel, "comment")); editTextArea.setOutputMarkupId(true); add(editTextArea); dialog.setTitle("Edit Comment"); - + AjaxButton ajaxButton = new AjaxButton("submitButton", new Model<String>("Save")) { private static final long serialVersionUID = 1L; @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { - //DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - //Date date = new Date(); - //df.format(date) - //editComment.setComment(((CommentThreadModel) form.getModelObject()).getEditTextMessage() + "\n\nLast edited: " +df.format(date) + " by: " + user.getFirstName() + " " + user.getLastName()) ; - + // DateFormat df = new + // SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + // Date date = new Date(); + // df.format(date) + // editComment.setComment(((CommentThreadModel) + // form.getModelObject()).getEditTextMessage() + + // "\n\nLast edited: " +df.format(date) + " by: " + + // user.getFirstName() + " " + user.getLastName()) ; + /* - * !!! We do not have to explicitly save object! It is currently being persisted by cascade! + * !!! We do not have to explicitly save object! It is + * currently being persisted by cascade! */ webMarkupContainer.remove(commentListView); @@ -282,14 +326,41 @@ public class CommentThreadPanel extends Panel { }; ajaxButton.setOutputMarkupId(true); add(ajaxButton); - + } + /* - * Attempt to fix weird incorrect-updating of text-area content when panel is used in resources-view + * Attempt to fix weird incorrect-updating of text-area content when + * panel is used in resources-view */ - public void setTextAreaDefaultModelObject(String string){ + public void setTextAreaDefaultModelObject(String string) { editTextArea.setDefaultModelObject(string); } } + private void createNotification(final User user, final String message, + final NotificationPriority notificationPriority, final String absolutePath) { + + Properties props = null; + try { + props = PropsUtils.load("notification.properties"); + } catch (Exception e) { + e.printStackTrace(); + } + String mailSubject = props.getProperty("mailSubject"); + String conferenceNotification = props.getProperty("conferenceNotificationComment"); + String twoNewLines = props.getProperty("twoNewLines"); + + String webNotificationMessage = SciProSession.get().getUser() + conferenceNotification + + title; + + String mailMessage = webNotificationMessage + twoNewLines + message; + + NotificationMessage notificationMessage = new NotificationMessage(webNotificationMessage, + mailSubject, mailMessage); + notificationController.processNotification(user, notificationMessage, absolutePath+"&"+classId + , + notificationPriority); + } + } diff --git a/src/main/java/se/su/dsv/scipro/conference/model/SubscriberModel.java b/src/main/java/se/su/dsv/scipro/conference/model/SubscriberModel.java new file mode 100644 index 0000000000..87c3713f81 --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/conference/model/SubscriberModel.java @@ -0,0 +1,73 @@ +/** + * + */ +package se.su.dsv.scipro.conference.model; + +import org.apache.wicket.IClusterable; + +import se.su.dsv.scipro.data.dataobjects.User; +import se.su.dsv.scipro.data.enums.NotificationPriority; + +/** + * @author Johan Aschan <aschan@dsv.su.se> + * + */ +public class SubscriberModel implements IClusterable{ + + + private static final long serialVersionUID = 1L; + private User user; + private String absolutePath; + private NotificationPriority notificationPriority; + + + /** + * @param user + * @param absolutePath + * @param notificationPriority + */ + public SubscriberModel(User user, String absolutePath, NotificationPriority notificationPriority) { + super(); + this.user = user; + this.absolutePath = absolutePath; + this.notificationPriority = notificationPriority; + } + /** + * @return the user + */ + public User getUser() { + return user; + } + /** + * @param user the user to set + */ + public void setUser(User user) { + this.user = user; + } + + + /** + * @return the absolutePath + */ + public String getAbsolutePath() { + return absolutePath; + } + /** + * @param absolutePath the absolutePath to set + */ + public void setAbsolutePath(String absolutePath) { + this.absolutePath = absolutePath; + } + /** + * @return the notificationPriority + */ + public NotificationPriority getNotificationPriority() { + return notificationPriority; + } + /** + * @param notificationPriority the notificationPriority to set + */ + public void setNotificationPriority(NotificationPriority notificationPriority) { + this.notificationPriority = notificationPriority; + } +} diff --git a/src/main/java/se/su/dsv/scipro/conference/pages/ProjectConferencePage.html b/src/main/java/se/su/dsv/scipro/conference/pages/ProjectConferencePage.html new file mode 100644 index 0000000000..2b5898ce86 --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/conference/pages/ProjectConferencePage.html @@ -0,0 +1,11 @@ +<!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:extend> + <div wicket:id="conferencePanel"></div> +</wicket:extend> +</body> +</html> \ No newline at end of file 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 new file mode 100644 index 0000000000..452700e4d1 --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/conference/pages/ProjectConferencePage.java @@ -0,0 +1,172 @@ +/** + * + */ +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.IModel; +import org.apache.wicket.model.LoadableDetachableModel; +import org.apache.wicket.protocol.http.RequestUtils; +import org.apache.wicket.spring.injection.annot.SpringBean; + +import se.su.dsv.scipro.SciProApplication; +import se.su.dsv.scipro.SciProSession; +import se.su.dsv.scipro.conference.model.SubscriberModel; +import se.su.dsv.scipro.conference.panels.ConferencePanel; +import se.su.dsv.scipro.data.dao.interfaces.BoardMessageDao; +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.Project; +import se.su.dsv.scipro.data.dataobjects.ProjectFollower; +import se.su.dsv.scipro.data.dataobjects.Student; +import se.su.dsv.scipro.data.enums.NotificationPriority; +import se.su.dsv.scipro.project.pages.ProjectPage; +import se.su.dsv.scipro.security.auth.Authorization; +import se.su.dsv.scipro.security.auth.roles.Roles; + +/** + * @author Johan Aschan <aschan@dsv.su.se> + * + */ +// TODO for test +@Authorization(authorizedRoles = { Roles.SYSADMIN }) +public class ProjectConferencePage extends ProjectPage { + + @SpringBean + private MessageBoardDao messageBoardDao; + @SpringBean + private BoardMessageDao boardMessageDao; + + private IModel<Project> projectModel; + private IModel<MessageBoard> messageBoardModel; + private MessageBoard messageBoard; + private IModel<BoardMessage> boardMessageModel; + private final static String PROJECTID = "pid"; + + 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(); + } + } + } + } + if (projectId == null && SciProSession.get().getActiveProject() != null) { + projectId = String.valueOf(SciProSession.get().getActiveProject().getId()); + } + if (projectId != null) { + final Project project = projectDao.load(Long.valueOf(projectId)); + if (project == null || !projectDao.isPartOf(SciProSession.get().getUser(), project)) { + failAndRedirect(); + } else { + projectModel = new LoadableDetachableModel<Project>() { + + private static final long serialVersionUID = 1L; + + @Override + protected Project load() { + return projectDao.reLoad(project); + } + }; + + Set<SubscriberModel> subscriberModel = new HashSet<SubscriberModel>(); + if (projectModel.getObject().getHeadSupervisor() != null) { + subscriberModel.add(new SubscriberModel(projectModel.getObject() + .getHeadSupervisor().getUser(), + SupervisorConferencePage + .getAbsoluteForSupervisorConferenceURL(projectModel.getObject() + .getId()), NotificationPriority.LOW)); + } + + for (ProjectFollower projectFollower : projectModel.getObject() + .getProjectFollowers()) { + subscriberModel.add(new SubscriberModel( + projectFollower.getFollower().getUser(), SupervisorConferencePage + .getAbsoluteForSupervisorConferenceURL(projectModel.getObject() + .getId()), NotificationPriority.LOW)); + + } + + for (Student student : projectModel.getObject().getProjectParticipants()) { + // Prod-kod + if (!student.getUser().equals(SciProSession.get().getUser())) + subscriberModel + .add(new SubscriberModel(student.getUser(), + getAbsoluteForProjectConferenceURL(projectModel.getObject() + .getId()), NotificationPriority.LOW)); + // Test-kod + // subscriberModel.add(new + // SubscriberModel(student.getUser(), + // getAbsoluteForProjectConferenceURL(projectModel.getObject().getId()), + // NotificationPriority.LOW)); + + } + + messageBoard = messageBoardDao.getMessageBoard(projectModel.getObject()); + if (messageBoard == null) { + messageBoard = new MessageBoard(projectModel.getObject()); + messageBoard.setTitle(projectModel.getObject().getTitle()); + messageBoard = messageBoardDao.save(messageBoard); + } + messageBoardModel = new LoadableDetachableModel<MessageBoard>() { + private static final long serialVersionUID = 1L; + + @Override + protected MessageBoard load() { + 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>() { + private static final long serialVersionUID = 1L; + + @Override + protected BoardMessage load() { + return boardMessageDao.reLoad(bm); + } + }; + } + } + add(new ConferencePanel("conferencePanel", messageBoardModel, subscriberModel, + boardMessageModel)); + } + } else { + add(new EmptyPanel("conferencePanel")); + } + + } + + private void failAndRedirect() { + throw new RestartResponseException(SciProApplication.get().getApplicationSettings() + .getAccessDeniedPage()); + } + + public static String getAbsoluteForProjectConferenceURL(Long id) { + PageParameters pageParameters = new PageParameters(); + pageParameters.put(PROJECTID, id.toString()); + return RequestUtils.toAbsolutePath(RequestCycle.get() + .urlFor(ProjectConferencePage.class, pageParameters).toString()); + } + +} diff --git a/src/main/java/se/su/dsv/scipro/conference/pages/SupervisorConferencePage.html b/src/main/java/se/su/dsv/scipro/conference/pages/SupervisorConferencePage.html new file mode 100644 index 0000000000..2b5898ce86 --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/conference/pages/SupervisorConferencePage.html @@ -0,0 +1,11 @@ +<!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:extend> + <div wicket:id="conferencePanel"></div> +</wicket:extend> +</body> +</html> \ No newline at end of file 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 new file mode 100644 index 0000000000..2c5d8c5a0a --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/conference/pages/SupervisorConferencePage.java @@ -0,0 +1,166 @@ +/** + * + */ +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.IModel; +import org.apache.wicket.model.LoadableDetachableModel; +import org.apache.wicket.protocol.http.RequestUtils; +import org.apache.wicket.spring.injection.annot.SpringBean; + +import se.su.dsv.scipro.SciProApplication; +import se.su.dsv.scipro.SciProSession; +import se.su.dsv.scipro.conference.model.SubscriberModel; +import se.su.dsv.scipro.conference.panels.ConferencePanel; +import se.su.dsv.scipro.data.dao.interfaces.BoardMessageDao; +import se.su.dsv.scipro.data.dao.interfaces.MessageBoardDao; +import se.su.dsv.scipro.data.dao.interfaces.ProjectDao; +import se.su.dsv.scipro.data.dataobjects.BoardMessage; +import se.su.dsv.scipro.data.dataobjects.MessageBoard; +import se.su.dsv.scipro.data.dataobjects.Project; +import se.su.dsv.scipro.data.dataobjects.ProjectFollower; +import se.su.dsv.scipro.data.dataobjects.Student; +import se.su.dsv.scipro.data.dataobjects.User; +import se.su.dsv.scipro.data.enums.NotificationPriority; +import se.su.dsv.scipro.security.auth.Authorization; +import se.su.dsv.scipro.security.auth.roles.Roles; +import se.su.dsv.scipro.supervisor.pages.AbstractSupervisorPage; + +/** + * @author Johan Aschan <aschan@dsv.su.se> + * + */ +@Authorization(authorizedRoles = { Roles.SYSADMIN }) +public class SupervisorConferencePage extends AbstractSupervisorPage { + + @SpringBean + private MessageBoardDao messageBoardDao; + @SpringBean + protected ProjectDao projectDao; + @SpringBean + protected BoardMessageDao boardMessageDao; + + private IModel<BoardMessage> boardMessageModel; + private IModel<Project> projectModel; + private IModel<MessageBoard> messageBoardModel; + private MessageBoard messageBoard; + private final static String PROJECTID = "pid"; + + 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(); + } + } + } + } + if (projectId == null) { + add(new EmptyPanel("conferencePanel")); + } else { + + final Project project = projectDao.load(Long.valueOf(projectId)); + if (project == null || !projectDao.isPartOf(SciProSession.get().getUser(), project)) { + failAndRedirect(); + } else { + projectModel = new LoadableDetachableModel<Project>() { + + private static final long serialVersionUID = 1L; + + @Override + protected Project load() { + return projectDao.reLoad(project); + } + }; + + Set<SubscriberModel> subscriberModel = new HashSet<SubscriberModel>(); + User user = projectModel.getObject().getHeadSupervisor().getUser(); + if (!user.equals(SciProSession.get().getUser())) { + subscriberModel + .add(new SubscriberModel(user, + getAbsoluteForSupervisorConferenceURL(projectModel.getObject() + .getId()), NotificationPriority.LOW)); + } + + for (ProjectFollower projectFollower : projectModel.getObject() + .getProjectFollowers()) { + if (!user.equals(SciProSession.get().getUser())) { + subscriberModel.add(new SubscriberModel(projectFollower.getFollower() + .getUser(), getAbsoluteForSupervisorConferenceURL(projectModel + .getObject().getId()), NotificationPriority.LOW)); + } + + } + + for (Student student : projectModel.getObject().getProjectParticipants()) { + subscriberModel.add(new SubscriberModel(student.getUser(), + ProjectConferencePage.getAbsoluteForProjectConferenceURL(projectModel + .getObject().getId()), NotificationPriority.LOW)); + + } + + messageBoard = messageBoardDao.getMessageBoard(projectModel.getObject()); + if (messageBoard == null) { + messageBoard = new MessageBoard(projectModel.getObject()); + messageBoard.setTitle(projectModel.getObject().getTitle()); + messageBoard = messageBoardDao.save(messageBoard); + } + messageBoardModel = new LoadableDetachableModel<MessageBoard>() { + private static final long serialVersionUID = 1L; + + @Override + protected MessageBoard load() { + 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>() { + private static final long serialVersionUID = 1L; + + @Override + protected BoardMessage load() { + return boardMessageDao.reLoad(bm); + } + }; + } + } + add(new ConferencePanel("conferencePanel", messageBoardModel, subscriberModel, + boardMessageModel)); + } + } + + } + + private void failAndRedirect() { + throw new RestartResponseException(SciProApplication.get().getApplicationSettings() + .getAccessDeniedPage()); + } + + public static String getAbsoluteForSupervisorConferenceURL(Long id) { + PageParameters pageParameters = new PageParameters(); + pageParameters.add(PROJECTID, id.toString()); + return RequestUtils.toAbsolutePath(RequestCycle.get() + .urlFor(SupervisorConferencePage.class, pageParameters).toString()); + } + +} diff --git a/src/main/java/se/su/dsv/scipro/project/panels/ProjectWallPanel.html b/src/main/java/se/su/dsv/scipro/conference/panels/ConferencePanel.html similarity index 100% rename from src/main/java/se/su/dsv/scipro/project/panels/ProjectWallPanel.html rename to src/main/java/se/su/dsv/scipro/conference/panels/ConferencePanel.html 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 new file mode 100644 index 0000000000..1013d3f969 --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/conference/panels/ConferencePanel.java @@ -0,0 +1,284 @@ +/** + * + */ +package se.su.dsv.scipro.conference.panels; + +import java.text.SimpleDateFormat; +import java.util.Properties; +import java.util.Set; + +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.basic.Label; +import org.apache.wicket.markup.html.form.Form; +import org.apache.wicket.markup.html.form.TextArea; +import org.apache.wicket.markup.html.navigation.paging.PagingNavigator; +import org.apache.wicket.markup.html.panel.Panel; +import org.apache.wicket.markup.repeater.Item; +import org.apache.wicket.markup.repeater.data.DataView; +import org.apache.wicket.markup.repeater.data.IDataProvider; +import org.apache.wicket.model.IModel; +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.commentthread.panels.CommentThreadPanel; +import se.su.dsv.scipro.conference.model.SubscriberModel; +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.dataobjects.BoardMessage; +import se.su.dsv.scipro.data.dataobjects.MessageBoard; +import se.su.dsv.scipro.data.dataobjects.User; +import se.su.dsv.scipro.data.enums.NotificationPriority; +import se.su.dsv.scipro.dataproviders.BoardMessageDataProvider; +import se.su.dsv.scipro.security.auth.roles.Roles; +import se.su.dsv.scipro.util.PropsUtils; + +/** + * @author Johan Aschan - aschan@dsv.su.se + * + */ +public class ConferencePanel extends Panel { + + private static final long serialVersionUID = 1L; + @SpringBean + private BoardMessageDao boardMessageDao; + @SpringBean + private CommentThreadDao commentThreadDao; + + @SpringBean + private NotificationController notificationController; + + private DataView<BoardMessage> dataView; + private WebMarkupContainer webMarkupContainer; + private IModel<MessageBoard> messageBoardModel; + private IModel<BoardMessage> boardMessageModel; + private Set<SubscriberModel> subscriberModels; + + public ConferencePanel(String id, IModel<MessageBoard> messageBoardModel, + Set<SubscriberModel> subscriberModels, IModel<BoardMessage> boardMessageModel) { + super(id); + this.boardMessageModel = boardMessageModel; + this.messageBoardModel = messageBoardModel; + this.subscriberModels = subscriberModels; + initPanel(); + } + + public ConferencePanel(String id, IModel<MessageBoard> messageBoardModel, + Set<SubscriberModel> subscriberModels) { + this(id, messageBoardModel, subscriberModels, null); + } + + private void initPanel() { + add(new SendWallMessageForm("sendForm")); + webMarkupContainer = new WebMarkupContainer("container"); + loadUserDataView(new BoardMessageDataProvider(messageBoardModel)); + webMarkupContainer.add(dataView); + webMarkupContainer.setOutputMarkupId(true); + webMarkupContainer.add(new PagingNavigator("pagingNavigator", dataView)); + add(webMarkupContainer); + } + + public void loadUserDataView(IDataProvider<BoardMessage> boardMessageDataProvider) { + + dataView = new DataView<BoardMessage>("boardMessageDataView", boardMessageDataProvider, 10) { + + private static final long serialVersionUID = 1L; + + @Override + protected void populateItem(Item<BoardMessage> item) { + final BoardMessage bm = item.getModelObject(); + item.add(new Label("messageLabel", bm.getMessage())); + item.add(new Label("messageUser", bm.getFromUser().getFirstName() + " " + + bm.getFromUser().getLastName())); + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + + item.add(new Label("messageDate", simpleDateFormat.format(bm.getDateCreated()))); + item.add(new AjaxLink<Void>("delete") { + + private static final long serialVersionUID = 1L; + + @Override + public void onClick(AjaxRequestTarget target) { + + BoardMessage boardMessageTemp = boardMessageDao.reLoad(bm); + boardMessageDao.delete(boardMessageTemp); + webMarkupContainer.removeAll(); + loadUserDataView(new BoardMessageDataProvider(messageBoardModel)); + webMarkupContainer.add(dataView); + webMarkupContainer.add(new PagingNavigator("pagingNavigator", dataView)); + target.addComponent(webMarkupContainer); + } + + @Override + public boolean isVisible() { + SciProSession session = SciProSession.get(); + if (session.authorizedForRole(Roles.ADMIN)) + return true; + return false; + } + }); + int commentSize = commentThreadDao.getCommentThreadSize(bm); + String comments = " Comments"; + if (commentSize == 1) { + comments = " Comment"; + } + final Label comment = new Label("commentNumber", commentSize + comments); + + comment.setOutputMarkupId(true); + final WebMarkupContainer webMarkupContainer = new WebMarkupContainer( + "commentContainer"); + webMarkupContainer.setOutputMarkupPlaceholderTag(true); + item.add(webMarkupContainer); + + CommentThreadPanel ctp = new CommentThreadPanel("commentThread", bm, 5, + subscriberModels, messageBoardModel.getObject().getTitle()); + ctp.setOutputMarkupPlaceholderTag(true); + webMarkupContainer.add(ctp); + + if (boardMessageModel != null && boardMessageModel.getObject().equals(bm)) { + comment.setDefaultModelObject("Hide comments"); + webMarkupContainer.setVisible(true); + item.add(new AjaxLink<String>("showComments", + new Model<String>("Hide Comments")) { + + private static final long serialVersionUID = 1L; + private boolean clicked = true; + + @Override + public void onClick(AjaxRequestTarget target) { + clicked = !clicked; + if (clicked) { + comment.setDefaultModelObject("Hide comments"); + } else { + + int commentSize = commentThreadDao.getCommentThreadSize(bm); + + String comments = " Comments"; + if (commentSize == 1) { + comments = " Comment"; + } + comment.setDefaultModelObject(commentSize + comments); + } + webMarkupContainer.removeAll(); + webMarkupContainer.add(new CommentThreadPanel("commentThread", + boardMessageDao.reLoad(bm), 5, subscriberModels, + messageBoardModel.getObject().getTitle())); + webMarkupContainer.setVisible(clicked); + target.addComponent(webMarkupContainer); + target.addComponent(comment); + } + + }.add(comment)); + } else { + webMarkupContainer.setVisible(false); + item.add(new AjaxLink<String>("showComments", + new Model<String>("Show Comments")) { + + private static final long serialVersionUID = 1L; + private boolean clicked = false; + + @Override + public void onClick(AjaxRequestTarget target) { + clicked = !clicked; + if (clicked) { + comment.setDefaultModelObject("Hide comments"); + } else { + + int commentSize = commentThreadDao.getCommentThreadSize(bm); + + String comments = " Comments"; + if (commentSize == 1) { + comments = " Comment"; + } + comment.setDefaultModelObject(commentSize + comments); + } + webMarkupContainer.removeAll(); + webMarkupContainer.add(new CommentThreadPanel("commentThread", + boardMessageDao.reLoad(bm), 5, subscriberModels, + messageBoardModel.getObject().getTitle())); + webMarkupContainer.setVisible(clicked); + target.addComponent(webMarkupContainer); + target.addComponent(comment); + } + + }.add(comment)); + } + } + }; + + } + + private class SendWallMessageForm extends Form<String> { + + private static final long serialVersionUID = 1L; + private String message; + + public SendWallMessageForm(String id) { + super(id); + final TextArea<String> messageTextArea = new TextArea<String>("textArea", + new PropertyModel<String>(this, "message")); + messageTextArea.setOutputMarkupId(true); + add(messageTextArea); + AjaxButton button = new AjaxButton("ajaxButton") { + + private static final long serialVersionUID = 1L; + + @Override + protected void onSubmit(AjaxRequestTarget target, Form<?> form) { + + BoardMessage bm = new BoardMessage(); + bm.setMessage(message); + bm.setMessageBoard(messageBoardModel.getObject()); + bm.setFromUser(SciProSession.get().getUser()); + bm = boardMessageDao.save(bm); + + for (SubscriberModel subscriberModel : subscriberModels) { + createNotification(subscriberModel.getUser(), message, + 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); + } + }; + + add(button); + + } + } + + private void createNotification(final User user, final String message, + final NotificationPriority notificationPriority, final String absolutePath) { + + Properties props = null; + try { + props = PropsUtils.load("notification.properties"); + } catch (Exception e) { + e.printStackTrace(); + } + String mailSubject = props.getProperty("mailSubject"); + String conferenceNotification = props.getProperty("conferenceNotification"); + String twoNewLines = props.getProperty("twoNewLines"); + + String webNotificationMessage = SciProSession.get().getUser() + conferenceNotification + + messageBoardModel.getObject().getTitle(); + + String mailMessage = webNotificationMessage + twoNewLines + message; + + NotificationMessage notificationMessage = new NotificationMessage(webNotificationMessage, + mailSubject, mailMessage); + notificationController.processNotification(user, notificationMessage, absolutePath, + notificationPriority); + } +} diff --git a/src/main/java/se/su/dsv/scipro/data/controllers/NotificationController.java b/src/main/java/se/su/dsv/scipro/data/controllers/NotificationController.java index 5540675535..ba1bf5019a 100644 --- a/src/main/java/se/su/dsv/scipro/data/controllers/NotificationController.java +++ b/src/main/java/se/su/dsv/scipro/data/controllers/NotificationController.java @@ -1,21 +1,14 @@ package se.su.dsv.scipro.data.controllers; import se.su.dsv.scipro.data.dataobjects.User; -import se.su.dsv.scipro.data.enums.NotificationEventType; -import se.su.dsv.scipro.security.auth.roles.Roles; +import se.su.dsv.scipro.data.enums.NotificationPriority; /** * * @author Martin Peters - mpeters@dsv.su.se - * + * */ public interface NotificationController { - - public void processSystemNotification( - User usertoNotify, - Roles userRole, - String subject, - String messageBody, - NotificationEventType notificationEvent); + public void processNotification(User usertoNotify, NotificationMessage notificationMessage, String absoluteUrl, NotificationPriority notificationPriority); } diff --git a/src/main/java/se/su/dsv/scipro/data/controllers/NotificationMessage.java b/src/main/java/se/su/dsv/scipro/data/controllers/NotificationMessage.java new file mode 100644 index 0000000000..10fc7ac6ea --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/data/controllers/NotificationMessage.java @@ -0,0 +1,74 @@ +/** + * + */ +package se.su.dsv.scipro.data.controllers; + +/** + * @author Johan Aschan <aschan@dsv.su.se> + * + */ +public class NotificationMessage { + + private String webNotificationMessage = ""; + private String mailSubject = ""; + private String mailMessage = ""; + + /** + * @param webNotificationMessage + * @param mailSubject + * @param mailMessage + */ + public NotificationMessage(String webNotificationMessage, String mailSubject, String mailMessage) { + super(); + this.webNotificationMessage = webNotificationMessage; + this.mailSubject = mailSubject; + this.mailMessage = mailMessage; + } + + + /** + * @return the webNotificationMessage + */ + public String getWebNotificationMessage() { + return webNotificationMessage; + } + + /** + * @param webNotificationMessage + * the webNotificationMessage to set + */ + public void setWebNotificationMessage(String webNotificationMessage) { + this.webNotificationMessage = webNotificationMessage; + } + + /** + * @return the mailSubject + */ + public String getMailSubject() { + return mailSubject; + } + + /** + * @param mailSubject + * the mailSubject to set + */ + public void setMailSubject(String mailSubject) { + this.mailSubject = mailSubject; + } + + /** + * @return the mailMessage + */ + public String getMailMessage() { + return mailMessage; + } + + /** + * @param mailMessage + * the mailMessage to set + */ + public void setMailMessage(String mailMessage) { + this.mailMessage = mailMessage; + } + +} 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 0bb129528e..3159af89f5 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 @@ -6,75 +6,136 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import se.su.dsv.scipro.data.controllers.NotificationController; +import se.su.dsv.scipro.data.controllers.NotificationMessage; +import se.su.dsv.scipro.data.dao.interfaces.GeneralSystemSettingsDao; import se.su.dsv.scipro.data.dao.interfaces.MailEventDao; +import se.su.dsv.scipro.data.dao.interfaces.UserSettingsDao; +import se.su.dsv.scipro.data.dao.interfaces.WebNotificationDao; +import se.su.dsv.scipro.data.dataobjects.GeneralSystemSettings; import se.su.dsv.scipro.data.dataobjects.MailEvent; import se.su.dsv.scipro.data.dataobjects.User; -import se.su.dsv.scipro.data.enums.NotificationEventType; -import se.su.dsv.scipro.security.auth.roles.Roles; +import se.su.dsv.scipro.data.dataobjects.UserSettings; +import se.su.dsv.scipro.data.dataobjects.WebNotification; +import se.su.dsv.scipro.data.enums.NotificationPriority; import se.su.dsv.scipro.util.PropsUtils; + /** - * TODO Think this through and do it properly, this is a rush-job implemented for peer-review + * TODO Think this through and do it properly, this is a rush-job implemented + * for peer-review + * * @author Martin Peters - mpeters@dsv.su.se - * + * */ @Controller public class NotificationControllerImpl implements NotificationController { - + private static final long serialVersionUID = 1L; - - final protected String systemFromName; - final protected String systemFromEmail; - final protected boolean sendMailEnabled; - - public NotificationControllerImpl() { - String systemFromName = null; - String systemFromEmail = null; - boolean sendMailEnabled = false; - try { - Properties props = PropsUtils.load("email.properties"); - systemFromName = props.getProperty("systemFromName"); - systemFromEmail = props.getProperty("systemFromEmail"); - sendMailEnabled = Boolean.parseBoolean(props.getProperty("sendMailEnabled")); - } catch (Exception e) { - systemFromName = "SciPro - Autogenerated message"; - systemFromEmail = "no-reply@thesis.dsv.su.se"; - e.printStackTrace(); - } finally { - this.systemFromName = systemFromName; - this.systemFromEmail = systemFromEmail; - this.sendMailEnabled = sendMailEnabled; - } - - } - + + @Autowired + private WebNotificationDao notificationDao; + + @Autowired + private UserSettingsDao userSettingsDao; + + @Autowired + private GeneralSystemSettingsDao generalSystemSettingsDao; + @Autowired protected MailEventDao mailEventDao; - - /** - * Re-implement to it takes users settings into account - * @param user - * @param notificationEvent - * @return - */ - protected boolean notifyViaMail(User user, Roles userRole, NotificationEventType notificationEvent ) { - return sendMailEnabled; - } @Override - public void processSystemNotification( - User usertoNotify, - Roles userRole, - String subject, - String messageBody, - NotificationEventType notificationEvent) { - /* - * atm bogus-check if the user want to have this kind of notice for this kind of role - */ - if( notifyViaMail(usertoNotify, userRole, notificationEvent) ){ - MailEvent me = new MailEvent(subject, messageBody, usertoNotify, systemFromName, systemFromEmail, notificationEvent); - me = mailEventDao.save(me); + public void processNotification(User usertoNotify, NotificationMessage notificationMessage, + String absoluteUrl, NotificationPriority notificationPriorityForEvent) { + GeneralSystemSettings generalSystemSettings = generalSystemSettingsDao + .getGeneralSystemSettingsInstance(); + String systemFromName = generalSystemSettings.getMailFromName(); + String systemFromEmail = generalSystemSettings.getSystemFromMail(); + boolean sendMailEnabled = generalSystemSettings.isMailNotifications(); + // Mailnotifications + if (sendMailEnabled) { + UserSettings userSettings = userSettingsDao.getUserSettings(usertoNotify); + if (userSettings == null) { + userSettings = new UserSettings(); + userSettings.setUser(usertoNotify); + userSettings = userSettingsDao.save(userSettings); + } + NotificationPriority notificationPriorityForUser = userSettings + .getNotificationPriority(); + + if (notificationPriorityForUser == null) { + notificationPriorityForUser = NotificationPriority.MEDIUM; + userSettings.setNotificationPriority(notificationPriorityForUser); + userSettings = userSettingsDao.save(userSettings); + } + + String mailMessage = generateMail(usertoNotify.getFirstName(), + notificationMessage.getMailMessage(), absoluteUrl); + switch (notificationPriorityForUser) { + case HIGH: + if (notificationPriorityForEvent.equals(NotificationPriority.HIGH)) { + MailEvent me = new MailEvent(notificationMessage.getMailSubject(), mailMessage, + usertoNotify, systemFromName, systemFromEmail); + me = mailEventDao.save(me); + } + break; + case MEDIUM: + if (notificationPriorityForEvent.equals(NotificationPriority.HIGH) + || notificationPriorityForEvent.equals(NotificationPriority.MEDIUM)) { + MailEvent me = new MailEvent(notificationMessage.getMailSubject(), mailMessage, + usertoNotify, systemFromName, systemFromEmail); + me = mailEventDao.save(me); + } + break; + case LOW: + if (notificationPriorityForEvent.equals(NotificationPriority.HIGH) + || notificationPriorityForEvent.equals(NotificationPriority.MEDIUM) + || notificationPriorityForEvent.equals(NotificationPriority.LOW)) { + MailEvent me = new MailEvent(notificationMessage.getMailSubject(), mailMessage, + usertoNotify, systemFromName, systemFromEmail); + me = mailEventDao.save(me); + } + break; + } } - + + // Webnotifications + WebNotification notification = new WebNotification(); + notification.setUser(usertoNotify); + notification.setInfoText(notificationMessage.getWebNotificationMessage()); + notification.setUrl(absoluteUrl); + notificationDao.save(notification); } + private String generateMail(String userFirstName, String addMessage, String absoluteUrl) { + String message = ""; + + Properties props = null; + + try { + props = PropsUtils.load("notification.properties"); + String twoNewLines = props.getProperty("twoNewLines"); + String hello = props.getProperty("hello"); + String autogenerated = props.getProperty("autogenerated"); + String twoNewLinesWithComma = props.getProperty("twoNewLinesWithComma"); + String linkText = props.getProperty("linkText"); + + message += hello; + message += userFirstName; + message += twoNewLinesWithComma; + + message += addMessage; + + message += twoNewLines; + message += linkText; + message += absoluteUrl; + message += twoNewLines; + message += autogenerated; + + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + return message; + } } 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 e5dbd5fb28..3603f8a918 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 @@ -2,10 +2,9 @@ package se.su.dsv.scipro.data.dao.interfaces; import java.util.List; -import org.springframework.stereotype.Repository; - 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 @@ -16,4 +15,6 @@ public interface BoardMessageDao extends Dao<BoardMessage>{ public List<BoardMessage> getBoardMessageList(final MessageBoard mb, final int first, final int count); + public int getBoardMessageListCount(final MessageBoard mb); + } 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 e7f048792f..2d18e06550 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 @@ -3,12 +3,9 @@ */ package se.su.dsv.scipro.data.dao.interfaces; -import java.util.List; - -import org.springframework.stereotype.Repository; - -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; /** * @author Johan Aschan - aschan@dsv.su.se @@ -18,5 +15,6 @@ import se.su.dsv.scipro.data.dataobjects.MessageBoard; public interface MessageBoardDao extends Dao<MessageBoard>{ + public MessageBoard getMessageBoard(Commentable commentableDomainObject); } diff --git a/src/main/java/se/su/dsv/scipro/data/dao/interfaces/MessageDao.java b/src/main/java/se/su/dsv/scipro/data/dao/interfaces/MessageDao.java deleted file mode 100644 index 00c5192700..0000000000 --- a/src/main/java/se/su/dsv/scipro/data/dao/interfaces/MessageDao.java +++ /dev/null @@ -1,18 +0,0 @@ -/** - * - */ -package se.su.dsv.scipro.data.dao.interfaces; - -import org.springframework.stereotype.Repository; - -import se.su.dsv.scipro.data.dataobjects.Message; - -/** - * @author Johan Aschan - aschan@dsv.su.se - * - */ - - -public interface MessageDao extends Dao<Message>{ - -} diff --git a/src/main/java/se/su/dsv/scipro/data/dao/interfaces/SupervisorBoardMessageDao.java b/src/main/java/se/su/dsv/scipro/data/dao/interfaces/SupervisorBoardMessageDao.java deleted file mode 100644 index 41861450ba..0000000000 --- a/src/main/java/se/su/dsv/scipro/data/dao/interfaces/SupervisorBoardMessageDao.java +++ /dev/null @@ -1,19 +0,0 @@ -/** - * - */ -package se.su.dsv.scipro.data.dao.interfaces; - -import org.springframework.stereotype.Repository; - -import se.su.dsv.scipro.data.dataobjects.BoardMessage; -import se.su.dsv.scipro.data.dataobjects.SupervisorBoardMessage; - -/** - * @author Johan Aschan - aschan@dsv.su.se - * - */ - - -public interface SupervisorBoardMessageDao extends Dao<SupervisorBoardMessage>{ - -} diff --git a/src/main/java/se/su/dsv/scipro/data/dao/interfaces/SupervisorMessageBoardDao.java b/src/main/java/se/su/dsv/scipro/data/dao/interfaces/SupervisorMessageBoardDao.java deleted file mode 100644 index e8712379fe..0000000000 --- a/src/main/java/se/su/dsv/scipro/data/dao/interfaces/SupervisorMessageBoardDao.java +++ /dev/null @@ -1,18 +0,0 @@ -/** - * - */ -package se.su.dsv.scipro.data.dao.interfaces; - -import org.springframework.stereotype.Repository; - -import se.su.dsv.scipro.data.dataobjects.SupervisorMessageBoard; - -/** - * @author Johan Aschan - aschan@dsv.su.se - * - */ - - -public interface SupervisorMessageBoardDao extends Dao<SupervisorMessageBoard>{ - -} diff --git a/src/main/java/se/su/dsv/scipro/data/dao/interfaces/UserDao.java b/src/main/java/se/su/dsv/scipro/data/dao/interfaces/UserDao.java index b8b3798bc9..b1bcaa0db3 100644 --- a/src/main/java/se/su/dsv/scipro/data/dao/interfaces/UserDao.java +++ b/src/main/java/se/su/dsv/scipro/data/dao/interfaces/UserDao.java @@ -2,8 +2,12 @@ package se.su.dsv.scipro.data.dao.interfaces; import java.util.List; +import se.su.dsv.scipro.data.dataobjects.MessageBoard; +import se.su.dsv.scipro.data.dataobjects.Project; import se.su.dsv.scipro.data.dataobjects.Role; import se.su.dsv.scipro.data.dataobjects.User; +import se.su.dsv.scipro.data.enums.ProjectStatus; +import se.su.dsv.scipro.data.enums.ProjectTeamMemberRoles; public interface UserDao extends LazyDeleteDao<User> { @@ -20,11 +24,13 @@ public interface UserDao extends LazyDeleteDao<User> { List<User> findUserQuery(String searchQuery, boolean students, boolean supervisors, boolean sysadmins, int limit); List<User> findUserQuery(String searchQuery, int first, - int count, Class<? extends Role> role); + int count, Class<? extends Role> role, final List<User> notIncludeUser); - int findUserQueryCount(String searchQuery, Class<? extends Role> role); + int findUserQueryCount(final String searchQuery, final Class<? extends Role> roleClass, + final List<User> notIncludeList); int findUserQueryCount(String searchQuery); List<User> findUserQuery(String searchQuery, int first, int count); + } diff --git a/src/main/java/se/su/dsv/scipro/data/dao/interfaces/WebNotificationDao.java b/src/main/java/se/su/dsv/scipro/data/dao/interfaces/WebNotificationDao.java new file mode 100644 index 0000000000..dc34568041 --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/data/dao/interfaces/WebNotificationDao.java @@ -0,0 +1,25 @@ +/** + * + */ +package se.su.dsv.scipro.data.dao.interfaces; + + + +import java.util.List; + +import se.su.dsv.scipro.data.dataobjects.WebNotification; +import se.su.dsv.scipro.data.dataobjects.User; + +/** + * @author Johan Aschan - aschan@dsv.su.se + * + */ + + +public interface WebNotificationDao extends Dao<WebNotification>{ + + List<WebNotification> getWebNotifications(final User user); + List<WebNotification> getWebNotifications(final User user,final int first,final int count); + int getCountOfWebNotifications(final User user); + +} 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 763e069c1b..fbf94f58ae 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,6 +19,7 @@ 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 @@ -43,8 +44,9 @@ public class BoardMessageDaoJPAImp extends AbstractDaoJPAImp<BoardMessage> TypedQuery<BoardMessage> query = em .createQuery( "select bm FROM BoardMessage bm, MessageBoard mb " + - "WHERE bm member of mb.boardMessageSet ORDER BY bm.dateCreated DESC", BoardMessage.class); + "WHERE bm member of mb.boardMessageSet AND mb = :mb ORDER BY bm.dateCreated DESC", BoardMessage.class); query.setHint(QueryHints.HINT_CACHEABLE, "true"); + query.setParameter("mb", mb); query.setFirstResult(first); query.setMaxResults(count); try { @@ -56,5 +58,25 @@ public class BoardMessageDaoJPAImp extends AbstractDaoJPAImp<BoardMessage> }); } + @Override + @Transactional(readOnly = true) + public int getBoardMessageListCount(final MessageBoard mb) { + return getJpaTemplate().execute(new JpaCallback<Integer>() { + @Override + public Integer doInJpa(EntityManager em) + throws PersistenceException { + TypedQuery<Long> query = em + .createQuery( + "SELECT COUNT (bm) FROM BoardMessage bm, MessageBoard mb " + + "WHERE bm member of mb.boardMessageSet AND mb = :mb", Long.class); + query.setHint(QueryHints.HINT_CACHEABLE, "true"); + query.setParameter("mb", mb); + return query.getSingleResult().intValue(); + + } + }); + } + + } diff --git a/src/main/java/se/su/dsv/scipro/data/dao/jpa/CommentThreadDaoJPAImp.java b/src/main/java/se/su/dsv/scipro/data/dao/jpa/CommentThreadDaoJPAImp.java index 3313ac8f97..84603322e4 100644 --- a/src/main/java/se/su/dsv/scipro/data/dao/jpa/CommentThreadDaoJPAImp.java +++ b/src/main/java/se/su/dsv/scipro/data/dao/jpa/CommentThreadDaoJPAImp.java @@ -3,8 +3,6 @@ */ package se.su.dsv.scipro.data.dao.jpa; -import java.util.Date; - import javax.persistence.EntityManager; import javax.persistence.NoResultException; import javax.persistence.PersistenceException; diff --git a/src/main/java/se/su/dsv/scipro/data/dao/jpa/EventDaoJPAImp.java b/src/main/java/se/su/dsv/scipro/data/dao/jpa/EventDaoJPAImp.java index dfb95ea232..45d70c26a4 100644 --- a/src/main/java/se/su/dsv/scipro/data/dao/jpa/EventDaoJPAImp.java +++ b/src/main/java/se/su/dsv/scipro/data/dao/jpa/EventDaoJPAImp.java @@ -7,7 +7,6 @@ import java.util.List; import javax.annotation.PostConstruct; import javax.persistence.EntityManager; -import javax.persistence.NoResultException; import javax.persistence.PersistenceException; import javax.persistence.TypedQuery; @@ -64,7 +63,6 @@ public class EventDaoJPAImp extends LazyDeleteAbstractDaoJPAImp<Event> implement events.addAll(d.getEventsByUserAndProject(u, p, fromDate, toDate, limit)); } Collections.sort(events); - System.out.println(events); return events; } 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 0db80506fe..649deda415 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 @@ -3,9 +3,6 @@ */ 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; @@ -17,23 +14,45 @@ 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.Role; import se.su.dsv.scipro.data.dataobjects.User; +import se.su.dsv.scipro.data.dataobjects.interfaces.Commentable; /** * @author Johan Aschan - aschan@dsv.su.se - * + * */ @Repository("messageBoardDao") -public class MessageBoardDaoJPAImp extends AbstractDaoJPAImp<MessageBoard> - implements MessageBoardDao { +public class MessageBoardDaoJPAImp extends AbstractDaoJPAImp<MessageBoard> implements + MessageBoardDao { public MessageBoardDaoJPAImp() { super(MessageBoard.class); } - + + @Override + @Transactional(readOnly = true) + public MessageBoard getMessageBoard(final Commentable commentableDomainObject) { + return getJpaTemplate().execute(new JpaCallback<MessageBoard>() { + public MessageBoard doInJpa(EntityManager em) throws PersistenceException { + final String q = "select t " + + "from MessageBoard t " + + "where t.commentableKey = :commentableKey and t.commentableId = :commentableId "; + + TypedQuery<MessageBoard> query = em.createQuery(q, MessageBoard.class); + query.setParameter("commentableKey", commentableDomainObject.getCommentKey()); + query.setParameter("commentableId", commentableDomainObject.getId()); + + query.setHint(QueryHints.HINT_CACHEABLE, "true"); + try { + return query.getSingleResult(); + } catch (NoResultException e) { + return null; + } + + } + }); + } } diff --git a/src/main/java/se/su/dsv/scipro/data/dao/jpa/MessageDaoJPAImp.java b/src/main/java/se/su/dsv/scipro/data/dao/jpa/MessageDaoJPAImp.java deleted file mode 100644 index 0c83a5ceba..0000000000 --- a/src/main/java/se/su/dsv/scipro/data/dao/jpa/MessageDaoJPAImp.java +++ /dev/null @@ -1,21 +0,0 @@ -package se.su.dsv.scipro.data.dao.jpa; - -import org.springframework.stereotype.Repository; - -import se.su.dsv.scipro.data.dao.interfaces.MessageDao; -import se.su.dsv.scipro.data.dataobjects.Message; - -/** - * @author Johan Aschan - aschan@dsv.su.se - * - */ - -@Repository("messageDao") -public class MessageDaoJPAImp extends AbstractDaoJPAImp<Message> - implements MessageDao { - - public MessageDaoJPAImp() { - super(Message.class); - } -} - diff --git a/src/main/java/se/su/dsv/scipro/data/dao/jpa/PrivateMessageDaoJPAImp.java b/src/main/java/se/su/dsv/scipro/data/dao/jpa/PrivateMessageDaoJPAImp.java index aa3e99376b..a97e890ec3 100644 --- a/src/main/java/se/su/dsv/scipro/data/dao/jpa/PrivateMessageDaoJPAImp.java +++ b/src/main/java/se/su/dsv/scipro/data/dao/jpa/PrivateMessageDaoJPAImp.java @@ -14,7 +14,6 @@ import org.springframework.transaction.annotation.Transactional; import se.su.dsv.scipro.data.dao.interfaces.PrivateMessageDao; import se.su.dsv.scipro.data.dataobjects.PrivateMessage; -import se.su.dsv.scipro.data.dataobjects.Recipient; import se.su.dsv.scipro.data.dataobjects.User; /** diff --git a/src/main/java/se/su/dsv/scipro/data/dao/jpa/ProjectPartnerDaoJPAImp.java b/src/main/java/se/su/dsv/scipro/data/dao/jpa/ProjectPartnerDaoJPAImp.java index 1fa53cbcce..8ccf9c4e78 100644 --- a/src/main/java/se/su/dsv/scipro/data/dao/jpa/ProjectPartnerDaoJPAImp.java +++ b/src/main/java/se/su/dsv/scipro/data/dao/jpa/ProjectPartnerDaoJPAImp.java @@ -16,7 +16,6 @@ import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; import se.su.dsv.scipro.data.dao.interfaces.ProjectPartnerDao; -import se.su.dsv.scipro.data.dataobjects.FinalSeminar; import se.su.dsv.scipro.data.dataobjects.ProjectClass; import se.su.dsv.scipro.data.dataobjects.ProjectPartner; @@ -26,7 +25,7 @@ import se.su.dsv.scipro.data.dataobjects.ProjectPartner; * */ -@Repository("ProjectPartnerDao") +@Repository("projectPartnerDao") public class ProjectPartnerDaoJPAImp extends AbstractDaoJPAImp<ProjectPartner> implements ProjectPartnerDao { @@ -90,7 +89,6 @@ public class ProjectPartnerDaoJPAImp extends AbstractDaoJPAImp<ProjectPartner> if(days > 0){ q+= " and e.dateCreated > :cutOffDate"; } - q+= " order by e.dateCreated desc"; TypedQuery<Long> query = em.createQuery(q, Long.class); diff --git a/src/main/java/se/su/dsv/scipro/data/dao/jpa/SupervisorBoardMessageDaoJPAImp.java b/src/main/java/se/su/dsv/scipro/data/dao/jpa/SupervisorBoardMessageDaoJPAImp.java deleted file mode 100644 index a042aac96b..0000000000 --- a/src/main/java/se/su/dsv/scipro/data/dao/jpa/SupervisorBoardMessageDaoJPAImp.java +++ /dev/null @@ -1,24 +0,0 @@ -/** - * - */ -package se.su.dsv.scipro.data.dao.jpa; - -import org.springframework.stereotype.Repository; - -import se.su.dsv.scipro.data.dao.interfaces.SupervisorBoardMessageDao; -import se.su.dsv.scipro.data.dataobjects.SupervisorBoardMessage; - -/** - * @author Johan Aschan - aschan@dsv.su.se - * - */ - -@Repository("supervisorBoardMessageDao") -public class SupervisorBoardMessageDaoJPAImp extends AbstractDaoJPAImp<SupervisorBoardMessage> - implements SupervisorBoardMessageDao { - - public SupervisorBoardMessageDaoJPAImp() { - super(SupervisorBoardMessage.class); - } - -} diff --git a/src/main/java/se/su/dsv/scipro/data/dao/jpa/SupervisorMessageBoardDaoJPAImp.java b/src/main/java/se/su/dsv/scipro/data/dao/jpa/SupervisorMessageBoardDaoJPAImp.java deleted file mode 100644 index 774d771934..0000000000 --- a/src/main/java/se/su/dsv/scipro/data/dao/jpa/SupervisorMessageBoardDaoJPAImp.java +++ /dev/null @@ -1,25 +0,0 @@ -/** - * - */ -package se.su.dsv.scipro.data.dao.jpa; - -import org.springframework.stereotype.Repository; - -import se.su.dsv.scipro.data.dao.interfaces.SupervisorMessageBoardDao; -import se.su.dsv.scipro.data.dataobjects.SupervisorMessageBoard; - -/** - * @author Johan Aschan - aschan@dsv.su.se - * - */ - -@Repository("supervisorMessageBoardDao") -public class SupervisorMessageBoardDaoJPAImp extends AbstractDaoJPAImp<SupervisorMessageBoard> - implements SupervisorMessageBoardDao { - - public SupervisorMessageBoardDaoJPAImp() { - super(SupervisorMessageBoard.class); - } - -} - diff --git a/src/main/java/se/su/dsv/scipro/data/dao/jpa/UserDaoJPAImp.java b/src/main/java/se/su/dsv/scipro/data/dao/jpa/UserDaoJPAImp.java index 98419e3a4f..8f41ea56c5 100644 --- a/src/main/java/se/su/dsv/scipro/data/dao/jpa/UserDaoJPAImp.java +++ b/src/main/java/se/su/dsv/scipro/data/dao/jpa/UserDaoJPAImp.java @@ -14,6 +14,7 @@ import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; import se.su.dsv.scipro.data.dao.interfaces.UserDao; +import se.su.dsv.scipro.data.dataobjects.MessageBoard; import se.su.dsv.scipro.data.dataobjects.Role; import se.su.dsv.scipro.data.dataobjects.User; @@ -23,8 +24,7 @@ import se.su.dsv.scipro.data.dataobjects.User; * */ @Repository("userDao") -public class UserDaoJPAImp extends LazyDeleteAbstractDaoJPAImp<User> implements -UserDao { +public class UserDaoJPAImp extends LazyDeleteAbstractDaoJPAImp<User> implements UserDao { public UserDaoJPAImp() { super(User.class); @@ -34,10 +34,8 @@ UserDao { public User getUserByIdentifier(final Long identifier) { return getJpaTemplate().execute(new JpaCallback<User>() { public User doInJpa(EntityManager em) throws PersistenceException { - TypedQuery<User> query = em - .createQuery( - "select u FROM User u WHERE u.identifier = :identifier", - User.class); + TypedQuery<User> query = em.createQuery( + "select u FROM User u WHERE u.identifier = :identifier", User.class); query.setParameter("identifier", identifier); try { return query.getSingleResult(); @@ -53,8 +51,7 @@ UserDao { return getJpaTemplate().execute(new JpaCallback<User>() { public User doInJpa(EntityManager em) throws PersistenceException { TypedQuery<User> query = em.createQuery( - "select u FROM User u WHERE u.emailAddress = :email", - User.class); + "select u FROM User u WHERE u.emailAddress = :email", User.class); query.setParameter("email", emailAddress); try { return query.getSingleResult(); @@ -67,16 +64,18 @@ UserDao { @Transactional @Deprecated - public User getUserByUsername(final String username){ - return this.getUserByUsername(username, "DSV.SU.SE"); + public User getUserByUsername(final String username) { + return this.getUserByUsername(username, "DSV.SU.SE"); } - @Transactional( readOnly=true ) - public User getUserByUsername(final String username, final String realm){ - return getJpaTemplate().execute(new JpaCallback<User>() { + @Transactional(readOnly = true) + public User getUserByUsername(final String username, final String realm) { + return getJpaTemplate().execute(new JpaCallback<User>() { public User doInJpa(EntityManager em) throws PersistenceException { - TypedQuery<User> query = em.createQuery( - "SELECT u FROM User u, Username un WHERE un.username = :username AND un.realm = :realm AND un.user = u AND u.deleted = false", User.class); + TypedQuery<User> query = em + .createQuery( + "SELECT u FROM User u, Username un WHERE un.username = :username AND un.realm = :realm AND un.user = u AND u.deleted = false", + User.class); query.setParameter("username", username); query.setParameter("realm", realm); query.setHint(QueryHints.HINT_CACHEABLE, "true"); @@ -89,29 +88,20 @@ UserDao { }); } - @Override @Transactional(readOnly = true) public List<User> findUserQuery(final String searchQuery, final int limit) { return getJpaTemplate().execute(new JpaCallback<List<User>>() { @Override - public List<User> doInJpa(EntityManager em) - throws PersistenceException { - TypedQuery<User> query = em - .createQuery( + public List<User> doInJpa(EntityManager em) throws PersistenceException { + TypedQuery<User> query = em.createQuery( "select distinct u FROM User u, Username un WHERE (lower(un.username) LIKE '" - + searchQuery - + "%' OR " - + "lower(u.firstName) LIKE '" - + searchQuery - + "%' OR lower(u.firstName || ' ' || u.lastName) LIKE '" - + searchQuery - + "%' OR lower(u.lastName) LIKE '" - + searchQuery - + "%' OR lower(u.emailAddress) LIKE '" - + searchQuery + "%') AND " - + "un.user = u ORDER BY u.lastName ASC", - User.class); + + searchQuery + "%' OR " + "lower(u.firstName) LIKE '" + + searchQuery + + "%' OR lower(u.firstName || ' ' || u.lastName) LIKE '" + + searchQuery + "%' OR lower(u.lastName) LIKE '" + searchQuery + + "%' OR lower(u.emailAddress) LIKE '" + searchQuery + "%') AND " + + "un.user = u ORDER BY u.lastName ASC", User.class); query.setMaxResults(limit); query.setHint(QueryHints.HINT_CACHEABLE, "true"); try { @@ -125,28 +115,20 @@ UserDao { @Override @Transactional(readOnly = true) - public List<User> findUserQuery(final String searchQuery, final int first, - final int count) { + public List<User> findUserQuery(final String searchQuery, final int first, final int count) { return getJpaTemplate().execute(new JpaCallback<List<User>>() { @Override - public List<User> doInJpa(EntityManager em) - throws PersistenceException { - TypedQuery<User> query = em - .createQuery( + public List<User> doInJpa(EntityManager em) throws PersistenceException { + TypedQuery<User> query = em.createQuery( "select distinct u FROM User u, Username un WHERE (lower(un.username) LIKE '" - + searchQuery - + "%' OR " - + "lower(u.firstName) LIKE '" - + searchQuery - + "%' OR lower(u.firstName || ' ' || u.lastName) LIKE '" - + searchQuery - + "%' OR lower(u.lastName) LIKE '" - + searchQuery - + "%' OR lower(u.emailAddress) LIKE '" - + searchQuery + "%') AND " - + "un.user = u +" + + + searchQuery + "%' OR " + "lower(u.firstName) LIKE '" + + searchQuery + + "%' OR lower(u.firstName || ' ' || u.lastName) LIKE '" + + searchQuery + "%' OR lower(u.lastName) LIKE '" + searchQuery + + "%' OR lower(u.emailAddress) LIKE '" + searchQuery + "%') AND " + + "un.user = u " + - "ORDER BY u.lastName ASC", User.class); + "ORDER BY u.lastName ASC", User.class); query.setHint(QueryHints.HINT_CACHEABLE, "true"); query.setFirstResult(first); query.setMaxResults(count); @@ -161,12 +143,11 @@ UserDao { @Override @Transactional(readOnly = true) - public List<User> findUserQuery(final String searchQuery, final int first, - final int count, final Class<? extends Role> roleClass) { + public List<User> findUserQuery(final String searchQuery, final int first, final int count, + final Class<? extends Role> roleClass, final List<User> notIncludeList) { return getJpaTemplate().execute(new JpaCallback<List<User>>() { @Override - public List<User> doInJpa(EntityManager em) - throws PersistenceException { + public List<User> doInJpa(EntityManager em) throws PersistenceException { String queryString = "SELECT DISTINCT un.user FROM Username un "; if (roleClass != null) { @@ -175,27 +156,28 @@ UserDao { if (searchQuery == null || searchQuery.equals("")) { queryString += "WHERE 1 = 1 "; } else { - queryString += "WHERE (lower(un.username) LIKE '" - + searchQuery - + "%' OR " - + "lower(un.user.firstName) LIKE '" - + searchQuery - + "%' OR lower(un.user.firstName || ' ' || un.user.lastName) LIKE '" - + searchQuery - + "%' OR lower(un.user.lastName) LIKE '" - + searchQuery - + "%' OR lower(un.user.emailAddress) LIKE '" - + searchQuery + "%') "; + queryString += "WHERE (lower(un.username) LIKE '" + searchQuery + "%' OR " + + "lower(un.user.firstName) LIKE '" + searchQuery + + "%' OR lower(un.user.firstName || ' ' || un.user.lastName) LIKE '" + + searchQuery + "%' OR lower(un.user.lastName) LIKE '" + searchQuery + + "%' OR lower(un.user.emailAddress) LIKE '" + searchQuery + "%') "; } if (roleClass != null) { queryString += "AND un.user = rc.user AND rc.deleted = false"; } + if (notIncludeList != null) { + queryString += " AND un.user NOT IN (:notIncludeList)"; + } queryString += " ORDER BY un.user.lastName ASC"; - TypedQuery<User> query = em - .createQuery(queryString, User.class); + + TypedQuery<User> query = em.createQuery(queryString, User.class); + if (notIncludeList != null) { + query.setParameter("notIncludeList", notIncludeList); + } query.setHint(QueryHints.HINT_CACHEABLE, "true"); query.setFirstResult(first); query.setMaxResults(count); + try { return query.getResultList(); } catch (NoResultException e) { @@ -208,12 +190,12 @@ UserDao { @Override @Transactional(readOnly = true) - public int findUserQueryCount(final String searchQuery,final Class<? extends Role> roleClass) { + public int findUserQueryCount(final String searchQuery, final Class<? extends Role> roleClass, + final List<User> notIncludeList) { return getJpaTemplate().execute(new JpaCallback<Integer>() { @Override - public Integer doInJpa(EntityManager em) - throws PersistenceException { + public Integer doInJpa(EntityManager em) throws PersistenceException { String queryString = "SELECT COUNT (DISTINCT un.user) FROM Username un "; if (roleClass != null) { queryString += ", " + roleClass.getName() + " rc "; @@ -221,26 +203,25 @@ UserDao { if (searchQuery == null || searchQuery.equals("")) { queryString += "WHERE 1 = 1 "; } else { - queryString += "WHERE " - + "(lower(un.username) LIKE '" - + searchQuery - + "%' OR " - + "lower(un.user.firstName) LIKE '" - + searchQuery - + "%' OR lower(un.user.firstName || ' ' || un.user.lastName) LIKE '" - + searchQuery - + "%' OR lower(un.user.lastName) LIKE '" - + searchQuery - + "%' OR lower(un.user.emailAddress) LIKE '" - + searchQuery + "%') "; + queryString += "WHERE " + "(lower(un.username) LIKE '" + searchQuery + "%' OR " + + "lower(un.user.firstName) LIKE '" + searchQuery + + "%' OR lower(un.user.firstName || ' ' || un.user.lastName) LIKE '" + + searchQuery + "%' OR lower(un.user.lastName) LIKE '" + searchQuery + + "%' OR lower(un.user.emailAddress) LIKE '" + searchQuery + "%') "; } if (roleClass != null) { - queryString += "AND un.user = rc.user AND rc.deleted = false"; + queryString += " AND un.user = rc.user AND rc.deleted = false"; } - TypedQuery<Long> query = em - .createQuery(queryString, Long.class); + if (notIncludeList != null) { + queryString += " AND un.user NOT IN (:notIncludeList)"; + } + + TypedQuery<Long> query = em.createQuery(queryString, Long.class); + if (notIncludeList != null) { + query.setParameter("notIncludeList", notIncludeList); + } return (query.getSingleResult()).intValue(); } }); @@ -248,18 +229,16 @@ UserDao { @Override @Transactional(readOnly = true) - public List<User> findUserQuery(final String searchQuery, - final boolean students, final boolean supervisors, - final boolean sysadmins, final int limit) { + public List<User> findUserQuery(final String searchQuery, final boolean students, + final boolean supervisors, final boolean sysadmins, final int limit) { return getJpaTemplate().execute(new JpaCallback<List<User>>() { - public List<User> doInJpa(EntityManager em) - throws PersistenceException { + public List<User> doInJpa(EntityManager em) throws PersistenceException { String selectClause = "select distinct u "; String fromClause = "from User u ";// , Username un "; String conditions = "where (lower(u.firstName) LIKE lower(:q) " - + "OR lower(u.lastName) LIKE lower(:q)) "; + + "OR lower(u.lastName) LIKE lower(:q)) "; // "OR (lower(un.username) LIKE lower(:q) " + // "and un.user = u)) "; @@ -292,8 +271,7 @@ UserDao { String orderClause = "order by u.lastName asc"; - String q = selectClause + fromClause + joinClause + conditions - + orderClause; + String q = selectClause + fromClause + joinClause + conditions + orderClause; TypedQuery<User> query = em.createQuery(q, User.class); query.setParameter("q", searchQuery.trim() + "%"); @@ -317,31 +295,21 @@ UserDao { }); } - @Override @Transactional(readOnly = true) public int findUserQueryCount(final String searchQuery) { return getJpaTemplate().execute(new JpaCallback<Integer>() { @Override - public Integer doInJpa(EntityManager em) - throws PersistenceException { - TypedQuery<Long> query = em - .createQuery( + public Integer doInJpa(EntityManager em) throws PersistenceException { + TypedQuery<Long> query = em.createQuery( "SELECT COUNT (DISTINCT u) FROM User u, Username un WHERE (lower(un.username) LIKE '" - + searchQuery - + "%' OR " - + "lower(u.firstName) LIKE '" - + searchQuery - + "%' OR lower(u.firstName || ' ' || u.lastName) LIKE '" - + searchQuery - + "%' OR lower(u.lastName) LIKE '" - + searchQuery - + "%' OR lower(u.emailAddress) LIKE '" - + searchQuery - + "%') AND " - + "un.user = u ORDER BY u.lastName ASC", - Long.class); + + searchQuery + "%' OR " + "lower(u.firstName) LIKE '" + + searchQuery + + "%' OR lower(u.firstName || ' ' || u.lastName) LIKE '" + + searchQuery + "%' OR lower(u.lastName) LIKE '" + searchQuery + + "%' OR lower(u.emailAddress) LIKE '" + searchQuery + "%') AND " + + "un.user = u ORDER BY u.lastName ASC", Long.class); return (query.getSingleResult()).intValue(); } diff --git a/src/main/java/se/su/dsv/scipro/data/dao/jpa/WebNotificationDaoJPAImp.java b/src/main/java/se/su/dsv/scipro/data/dao/jpa/WebNotificationDaoJPAImp.java new file mode 100644 index 0000000000..061c8caeb2 --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/data/dao/jpa/WebNotificationDaoJPAImp.java @@ -0,0 +1,105 @@ +/** + * + */ +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 org.springframework.transaction.annotation.Transactional; + +import se.su.dsv.scipro.data.dao.interfaces.WebNotificationDao; +import se.su.dsv.scipro.data.dataobjects.WebNotification; +import se.su.dsv.scipro.data.dataobjects.User; + +/** + * @author Johan Aschan - aschan@dsv.su.se + * + */ + +@Repository("notificationDao") +public class WebNotificationDaoJPAImp extends AbstractDaoJPAImp<WebNotification> + implements WebNotificationDao { + + public WebNotificationDaoJPAImp() { + super(WebNotification.class); + } + + @Transactional(readOnly = true) + @Override + public List<WebNotification> getWebNotifications(final User user){ + return getJpaTemplate().execute(new JpaCallback<List<WebNotification>>() { + @Override + public List<WebNotification> doInJpa(EntityManager em) + throws PersistenceException { + String q = "SELECT n FROM WebNotification n " + + "where n.user = :user AND n.readByUser = false ORDER BY n.dateCreated DESC"; + + TypedQuery<WebNotification> query = em.createQuery(q, + WebNotification.class); + query.setParameter("user", user); + query.setHint(QueryHints.HINT_CACHEABLE, "true"); + try { + return query.getResultList(); + } catch (NoResultException e) { + return new ArrayList<WebNotification>(); + } + } + }); + } + + @Transactional(readOnly = true) + @Override + public List<WebNotification> getWebNotifications(final User user,final int first, final int count){ + return getJpaTemplate().execute(new JpaCallback<List<WebNotification>>() { + @Override + public List<WebNotification> doInJpa(EntityManager em) + throws PersistenceException { + String q = "SELECT n FROM WebNotification n " + + "where n.user = :user AND n.readByUser = false ORDER BY n.dateCreated DESC"; + + TypedQuery<WebNotification> query = em.createQuery(q, + WebNotification.class); + query.setParameter("user", user); + query.setHint(QueryHints.HINT_CACHEABLE, "true"); + query.setFirstResult(first); + query.setMaxResults(count); + try { + return query.getResultList(); + } catch (NoResultException e) { + return new ArrayList<WebNotification>(); + } + } + }); + } + + @Transactional(readOnly = true) + @Override + public int getCountOfWebNotifications(final User user){ + return getJpaTemplate().execute(new JpaCallback<Integer>() { + @Override + public Integer doInJpa(EntityManager em) + throws PersistenceException { + String q = "SELECT COUNT (n) FROM WebNotification n " + + "where n.user = :user AND n.readByUser = false "; + + TypedQuery<Long> query = em.createQuery(q, + Long.class); + query.setParameter("user", user); + query.setHint(QueryHints.HINT_CACHEABLE, "true"); + + return query.getSingleResult().intValue(); + } + }); + } +} \ No newline at end of file diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/Board.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/Board.java deleted file mode 100644 index 7025f9efad..0000000000 --- a/src/main/java/se/su/dsv/scipro/data/dataobjects/Board.java +++ /dev/null @@ -1,88 +0,0 @@ -/** - * - */ -package se.su.dsv.scipro.data.dataobjects; - -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.MappedSuperclass; -import javax.persistence.OneToOne; - -/** - * @author Johan Aschan - aschan@dsv.su.se - * - */ - -@MappedSuperclass -public abstract class Board extends DomainObject{ - - @Id - @GeneratedValue - private Long id; - - private String title; - - @OneToOne - private Project project; - - public Long getId() { - return id; - } - - - public String getTitle() { - return title; - } - - - - - public void setTitle(String title) { - this.title = title; - } - - - - - public Project getProject() { - return project; - } - - - - - public void setProject(Project project) { - this.project = project; - } - - - - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((id == null) ? 0 : id.hashCode()); - return result; - } - - - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - Board other = (Board) obj; - if (id == null) { - if (other.id != null) - return false; - } else if (!id.equals(other.id)) - return false; - return true; - } - -} 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 ca516822b5..6dbf3d0161 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,9 +7,14 @@ 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; @@ -26,13 +31,30 @@ import se.su.dsv.scipro.data.dataobjects.interfaces.Commentable; @Table(name="board_message") @Cacheable(true) @Cache(usage= CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) -public class BoardMessage extends Message implements Commentable { +public class BoardMessage extends DomainObject implements Commentable, Comparable<BoardMessage> { + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue + private Long id; + + @Lob + private String message; + + @ManyToOne(optional=false) + private User fromUser; + @OneToMany private List<BoardMessage> replyMessageList = new ArrayList<BoardMessage>(0); @ManyToOne(optional=false) private MessageBoard messageBoard; + + @Override + public Long getId() { + return id; + } public List<BoardMessage> getReplyMessageList() { return replyMessageList; @@ -42,7 +64,6 @@ public class BoardMessage extends Message implements Commentable { this.replyMessageList = replyMessageList; } - /** * @return the messageBoard @@ -62,5 +83,69 @@ public class BoardMessage extends Message implements Commentable { public String getCommentKey() { return BoardMessage.class.getCanonicalName().toString(); } + + + + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public User getFromUser() { + return fromUser; + } + + public void setFromUser(User fromUser) { + this.fromUser = fromUser; + } + + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((id == null) ? 0 : id.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + BoardMessage other = (BoardMessage) obj; + if (id == null) { + if (other.id != null) + return false; + } else if (!id.equals(other.id)) + return false; + return true; + } + + @Override + public int compareTo(BoardMessage o) { + if( this == o ) + return 0; + + if(this.getDateCreated() != null && o.getDateCreated() != null){ + //Reversed from what you might expect, because normally we want to display newest comment first in listviews + return o.getDateCreated().compareTo(this.getDateCreated()); + } + 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/CommentThread.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/CommentThread.java index dbd49960e5..055b1f4679 100644 --- a/src/main/java/se/su/dsv/scipro/data/dataobjects/CommentThread.java +++ b/src/main/java/se/su/dsv/scipro/data/dataobjects/CommentThread.java @@ -40,7 +40,7 @@ import se.su.dsv.scipro.data.dataobjects.interfaces.Commentable; public class CommentThread extends DomainObject{ private static final long serialVersionUID = 1L; - + @Id @GeneratedValue private Long id; diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/FinalSeminar.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/FinalSeminar.java index f1ddce16d3..a9add19e1d 100644 --- a/src/main/java/se/su/dsv/scipro/data/dataobjects/FinalSeminar.java +++ b/src/main/java/se/su/dsv/scipro/data/dataobjects/FinalSeminar.java @@ -24,79 +24,82 @@ import javax.persistence.Table; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; +import se.su.dsv.scipro.data.dataobjects.interfaces.Commentable; import se.su.dsv.scipro.data.enums.FinalSeminarLanguages; /** - * @author Johan Aschan - aschan@dsv.su.se - * + * @author Johan Aschan - aschan@dsv.su.se + * */ @Entity -@Table(name="final_seminar") +@Table(name = "final_seminar") @Cacheable(true) -@Cache(usage= CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) -public class FinalSeminar extends DomainObject{ - +@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) +public class FinalSeminar extends DomainObject implements Commentable { + private static final long serialVersionUID = 1L; @Id @GeneratedValue private Long id; - + @Override public Long getId() { return id; } - - @ManyToOne(optional=false) + + @ManyToOne(optional = false) private Project project; - - @Basic(optional=false) + + @Basic(optional = false) private Date startDate; - - @Basic(optional=false) + + @Basic(optional = false) private Date endDate; - - @Basic(optional=false) + + @Basic(optional = false) private String room; - - @OneToMany(mappedBy="finalSeminar") + + @OneToMany(mappedBy = "finalSeminar") private List<FinalSeminarActiveParticipation> activeParticipations = new ArrayList<FinalSeminarActiveParticipation>(); - - @OneToMany(mappedBy="finalSeminar") + + @OneToMany(mappedBy = "finalSeminar") private List<FinalSeminarOpposition> oppositions = new ArrayList<FinalSeminarOpposition>(); - + /* - * Cascading delete, set document to nul will delete the filedescription - * but not the actual file. Use FinarSeminarUploadController.deleteSeminarReport + * Cascading delete, set document to nul will delete the filedescription but + * not the actual file. Use FinarSeminarUploadController.deleteSeminarReport * to delete the document */ @OneToOne(optional = true, orphanRemoval = true, cascade = CascadeType.ALL) private FileDescription document; - + private Date documentUploadDate; - + private String turnitinId; - - @Basic(optional=false) + + @Basic(optional = false) private boolean checkedForPlagirism = false; - + @ManyToOne(optional = true) private User documentUploader; - + @Basic(optional = false) @Enumerated(EnumType.STRING) private FinalSeminarLanguages presentationLanguage = FinalSeminarLanguages.ENGLISH; - + @Basic(optional = false) @Enumerated(EnumType.STRING) private FinalSeminarLanguages reportLanguage = FinalSeminarLanguages.ENGLISH; + /* - * Make sure that the uploader and uload date will be reset when document is null + * Make sure that the uploader and uload date will be reset when document is + * null */ @PreUpdate - public void checkReport(){ - if(document == null){ + public void checkReport() { + if (document == null) { setDocumentUploader(null); setDocumentUploadDate(null); } @@ -105,13 +108,11 @@ public class FinalSeminar extends DomainObject{ public Project getProject() { return project; } - + public void setProject(Project project) { this.project = project; } - - - + public Date getEndDate() { return endDate; } @@ -123,19 +124,19 @@ public class FinalSeminar extends DomainObject{ public Date getStartDate() { return startDate; } - + public void setStartDate(Date date) { this.startDate = date; } - + public String getRoom() { return room; } - + public void setRoom(String room) { this.room = room; } - + public void setActiveParticipations(List<FinalSeminarActiveParticipation> activeParticipations) { this.activeParticipations = activeParticipations; } @@ -155,23 +156,23 @@ public class FinalSeminar extends DomainObject{ public void setDocument(FileDescription document) { this.document = document; } - + public FileDescription getDocument() { return document; } - + public void setDocumentUploadDate(Date documentUploadDate) { this.documentUploadDate = documentUploadDate; } - + public Date getDocumentUploadDate() { return documentUploadDate; } - + public void setDocumentUploader(User documentUploader) { this.documentUploader = documentUploader; } - + public User getDocumentUploader() { return documentUploader; } @@ -211,11 +212,23 @@ public class FinalSeminar extends DomainObject{ } /** - * @param checkedForPlagirism the checkedForPlagirism to set + * @param checkedForPlagirism + * the checkedForPlagirism to set */ public void setCheckedForPlagirism(boolean checkedForPlagirism) { this.checkedForPlagirism = checkedForPlagirism; } - - + + /* + * (non-Javadoc) + * + * @see + * se.su.dsv.scipro.data.dataobjects.interfaces.Commentable#getCommentKey() + */ + @Override + final public String getCommentKey() { + return FinalSeminar.class.getCanonicalName().toString(); + + } + } \ No newline at end of file diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/GeneralSystemSettings.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/GeneralSystemSettings.java index 496f3c5d79..6b2fba2e07 100644 --- a/src/main/java/se/su/dsv/scipro/data/dataobjects/GeneralSystemSettings.java +++ b/src/main/java/se/su/dsv/scipro/data/dataobjects/GeneralSystemSettings.java @@ -39,6 +39,15 @@ public class GeneralSystemSettings extends DomainObject{ @Basic(optional=false) private int daysBeforeFinalSeminarCanRegisterAsOpponent = 3; + @Basic(optional=false) + private String turnItInUsername = "joha-asc"; + + @Basic(optional=false) + private String turnItInForname = "Johan"; + + @Basic(optional=false) + private String turnItInSurname = "Aschan"; + @Basic(optional=true) private int projectPartnerDaysToLive; @@ -52,6 +61,17 @@ public class GeneralSystemSettings extends DomainObject{ private boolean peerDisplayNumberOfReviewsPerformed = true; @Basic(optional=false) + private boolean mailNotifications = true; + + @Basic(optional=false) + private String mailFromName = "SciPro"; + + @Basic(optional=false) + private String systemFromMail = "no-reply@thesis.dsv.su.se"; + + @Basic(optional=false) + private String smtpServer = "mail.dsv.su.se"; + private boolean peerDisplayLatestReviews = true; @Basic(optional=false) @@ -59,6 +79,7 @@ public class GeneralSystemSettings extends DomainObject{ @Basic(optional=false) private boolean publicReviewsActivated = true; + public GeneralSystemSettings(){ } @@ -125,6 +146,91 @@ public class GeneralSystemSettings extends DomainObject{ public boolean isPeerDisplayNumberOfReviewsPerformed() { return peerDisplayNumberOfReviewsPerformed; } + /** + * @return the turnItInUsername + */ + public String getTurnItInUsername() { + return turnItInUsername; + } + /** + * @param turnItInUsername the turnItInUsername to set + */ + public void setTurnItInUsername(String turnItInUsername) { + this.turnItInUsername = turnItInUsername; + } + /** + * @return the turnItInForname + */ + public String getTurnItInForname() { + return turnItInForname; + } + /** + * @param turnItInForname the turnItInForname to set + */ + public void setTurnItInForname(String turnItInForname) { + this.turnItInForname = turnItInForname; + } + /** + * @return the turnItInSurname + */ + public String getTurnItInSurname() { + return turnItInSurname; + } + /** + * @param turnItInSurname the turnItInSurname to set + */ + public void setTurnItInSurname(String turnItInSurname) { + this.turnItInSurname = turnItInSurname; + } + /** + * @return the mailNotifications + */ + public boolean isMailNotifications() { + return mailNotifications; + } + /** + * @param mailNotifications the mailNotifications to set + */ + public void setMailNotifications(boolean mailNotifications) { + this.mailNotifications = mailNotifications; + } + /** + * @return the mailFromName + */ + public String getMailFromName() { + return mailFromName; + } + /** + * @param mailFromName the mailFromName to set + */ + public void setMailFromName(String mailFromName) { + this.mailFromName = mailFromName; + } + /** + * @return the systemFromMail + */ + public String getSystemFromMail() { + return systemFromMail; + } + /** + * @param systemFromMail the systemFromMail to set + */ + public void setSystemFromMail(String systemFromMail) { + this.systemFromMail = systemFromMail; + } + /** + * @return the smtpServer + */ + public String getSmtpServer() { + return smtpServer; + } + /** + * @param smtpServer the smtpServer to set + */ + public void setSmtpServer(String smtpServer) { + this.smtpServer = smtpServer; + } + public void setPeerDisplayLatestReviews(boolean peerDisplayLatestReviews) { this.peerDisplayLatestReviews = peerDisplayLatestReviews; } @@ -144,5 +250,4 @@ public class GeneralSystemSettings extends DomainObject{ this.publicReviewsActivated = publicReviewsActivated; } - } diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/MailEvent.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/MailEvent.java index d7236eabfd..b70fb0e94d 100644 --- a/src/main/java/se/su/dsv/scipro/data/dataobjects/MailEvent.java +++ b/src/main/java/se/su/dsv/scipro/data/dataobjects/MailEvent.java @@ -33,11 +33,7 @@ public class MailEvent extends DomainObject { @Id @GeneratedValue - private Long id; - - @Basic(optional=true) - @Enumerated(EnumType.STRING) - private NotificationEventType notificationEventType; + private Long id; @JoinTable(name="mail_event_recipients") @ManyToMany(fetch=FetchType.EAGER) @@ -73,9 +69,8 @@ public class MailEvent extends DomainObject { final String messageBody, final User recipient, final String fromName, - final String fromEmail, - final NotificationEventType notificationEventType){ - this(subject,messageBody,recipient,fromName,fromEmail,null,notificationEventType); + final String fromEmail){ + this(subject,messageBody,recipient,fromName,fromEmail,null); } public MailEvent( @@ -83,9 +78,8 @@ public class MailEvent extends DomainObject { final String messageBody, final Collection<User> recipients, final String fromName, - final String fromEmail, - final NotificationEventType notificationEventType){ - this(subject,messageBody,recipients,fromName,fromEmail,null,notificationEventType); + final String fromEmail){ + this(subject,messageBody,recipients,fromName,fromEmail,null); } public MailEvent( @@ -94,16 +88,14 @@ public class MailEvent extends DomainObject { final User recipient, final String fromName, final String fromEmail, - final Collection<User> replyTo, - final NotificationEventType notificationEventType){ + final Collection<User> replyTo){ this.subject = subject; this.messageBody = messageBody; this.recipients.add(recipient); this.fromName = fromName; this.fromEmail = fromEmail; if( replyTo != null ) - this.replyTo.addAll(replyTo); - this.setNotificationEventType(notificationEventType); + this.replyTo.addAll(replyTo); } public MailEvent( @@ -112,8 +104,7 @@ public class MailEvent extends DomainObject { final Collection<User> recipients, final String fromName, final String fromEmail, - final Collection<User> replyTo, - final NotificationEventType notificationEventType + final Collection<User> replyTo ){ this.subject = subject; this.messageBody = messageBody; @@ -121,8 +112,7 @@ public class MailEvent extends DomainObject { this.fromName = fromName; this.fromEmail = fromEmail; if( replyTo != null ) - this.replyTo.addAll(replyTo); - this.setNotificationEventType(notificationEventType); + this.replyTo.addAll(replyTo); } @@ -130,15 +120,6 @@ public class MailEvent extends DomainObject { return id; } - - public void setNotificationEventType(NotificationEventType notificationEventType) { - this.notificationEventType = notificationEventType; - } - - public NotificationEventType getNotificationEventType() { - return notificationEventType; - } - public Set<User> getRecipients() { return recipients; } diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/Message.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/Message.java deleted file mode 100644 index ca62f7fb65..0000000000 --- a/src/main/java/se/su/dsv/scipro/data/dataobjects/Message.java +++ /dev/null @@ -1,109 +0,0 @@ -/** - * - */ -package se.su.dsv.scipro.data.dataobjects; - -import java.util.List; - -import javax.persistence.Cacheable; -import javax.persistence.DiscriminatorColumn; -import javax.persistence.DiscriminatorType; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Inheritance; -import javax.persistence.InheritanceType; -import javax.persistence.Lob; -import javax.persistence.ManyToMany; -import javax.persistence.ManyToOne; -import javax.persistence.MappedSuperclass; -import javax.persistence.OneToMany; -import javax.persistence.Table; -import javax.persistence.UniqueConstraint; - -import org.hibernate.annotations.Cache; -import org.hibernate.annotations.CacheConcurrencyStrategy; - -/** - * @author Johan Aschan - aschan@dsv.su.se - * - */ -@MappedSuperclass -public abstract class Message extends DomainObject implements Comparable<Message> { - - @Id - @GeneratedValue(strategy = GenerationType.TABLE) - private Long id; - - @Lob - private String message; - - - - @ManyToOne(optional=false) - private User fromUser; - - public Long getId() { - return id; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public User getFromUser() { - return fromUser; - } - - public void setFromUser(User fromUser) { - this.fromUser = fromUser; - } - - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((id == null) ? 0 : id.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - Message other = (Message) obj; - if (id == null) { - if (other.id != null) - return false; - } else if (!id.equals(other.id)) - return false; - return true; - } - - @Override - public int compareTo(Message o) { - if( this == o ) - return 0; - - if(this.getDateCreated() != null && o.getDateCreated() != null){ - //Reversed from what you might expect, because normally we want to display newest comment first in listviews - return o.getDateCreated().compareTo(this.getDateCreated()); - } - 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/MessageBoard.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/MessageBoard.java index f55309a2a2..ec7ab1259f 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 @@ -8,10 +8,16 @@ import java.util.List; import java.util.SortedSet; import java.util.TreeSet; +import javax.persistence.Basic; import javax.persistence.Cacheable; import javax.persistence.CascadeType; +import javax.persistence.Column; import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; import javax.persistence.OneToMany; +import javax.persistence.PrePersist; +import javax.persistence.PreUpdate; import javax.persistence.Table; import org.hibernate.annotations.Cache; @@ -19,6 +25,8 @@ import org.hibernate.annotations.CacheConcurrencyStrategy; import org.hibernate.annotations.Sort; import org.hibernate.annotations.SortType; +import se.su.dsv.scipro.data.dataobjects.interfaces.Commentable; + /** * @author Johan Aschan - aschan@dsv.su.se * @@ -28,7 +36,40 @@ import org.hibernate.annotations.SortType; @Table(name="message_board") @Cacheable(true) @Cache(usage= CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) -public class MessageBoard extends Board { +public class MessageBoard extends DomainObject{ + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue + private Long id; + + @Override + public Long getId() { + return id; + } + + @Basic(optional=false) + public String title; + + @Basic(optional=false) + @Column(length=255) + private String commentableKey; + @Basic(optional=false) + private Long commentableId; + + public MessageBoard() { } + public MessageBoard(Commentable commentable){ + this.setCommentableKey(commentable.getCommentKey()); + this.setCommentableId(commentable.getId()); + } + + @PreUpdate + @PrePersist + public void validate(){ + if(getCommentableKey().length() > 255) + throw new IllegalArgumentException("CommentThread-commentableKey may not be longer than 255 characters"); + } @@ -36,7 +77,7 @@ public class MessageBoard extends Board { @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); } @@ -49,5 +90,46 @@ public class MessageBoard extends Board { public void setBoardMessageSet( SortedSet<BoardMessage> boardMessageList) { this.boardMessageSet = boardMessageList; } + /** + * @return the commentableKey + */ + public String getCommentableKey() { + return commentableKey; + } + /** + * @param commentableKey the commentableKey to set + */ + public void setCommentableKey(String commentableKey) { + this.commentableKey = commentableKey; + } + /** + * @return the commentableId + */ + public Long getCommentableId() { + return commentableId; + } + /** + * @param commentableId the commentableId to set + */ + public void setCommentableId(Long commentableId) { + this.commentableId = commentableId; + } + + + /** + * @return the title + */ + public String getTitle() { + return title; + } + /** + * @param title the title to set + */ + public void setTitle(String title) { + this.title = title; + } + /* (non-Javadoc) + * @see se.su.dsv.scipro.data.dataobjects.interfaces.Commentable#getCommentKey() + */ } diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/PrivateMessage.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/PrivateMessage.java index 90d33b6b9d..436de04478 100644 --- a/src/main/java/se/su/dsv/scipro/data/dataobjects/PrivateMessage.java +++ b/src/main/java/se/su/dsv/scipro/data/dataobjects/PrivateMessage.java @@ -29,7 +29,9 @@ import org.hibernate.annotations.CacheConcurrencyStrategy; @Cache(usage= CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) public class PrivateMessage extends LazyDeletableDomainObject{ - + + private static final long serialVersionUID = 1L; + @Id @GeneratedValue private Long id; diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/Project.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/Project.java index 04457a5783..455ff5a680 100644 --- a/src/main/java/se/su/dsv/scipro/data/dataobjects/Project.java +++ b/src/main/java/se/su/dsv/scipro/data/dataobjects/Project.java @@ -73,12 +73,7 @@ public class Project extends DomainObject implements Comparable<Project>, Iconiz @Enumerated(EnumType.STRING) private StateOfMind stateOfMind = StateOfMind.NEUTRAL; - - @OneToOne(mappedBy="project") - private MessageBoard messageBoard; - - @OneToOne(mappedBy="project") - private SupervisorMessageBoard supervisorMessageBoard; + @ManyToOne(optional=false) private ProjectClass projectClass; @@ -173,10 +168,6 @@ public class Project extends DomainObject implements Comparable<Project>, Iconiz return title; } - public MessageBoard getMessageBoard() { - return messageBoard; - } - /** * @param projectClass the projectClass to set */ @@ -192,9 +183,6 @@ public class Project extends DomainObject implements Comparable<Project>, Iconiz this.stateOfMind = stateOfMind; } - public SupervisorMessageBoard getSupervisorMessageBoard() { - return supervisorMessageBoard; - } /** * @return the projectClass diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/Recipient.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/Recipient.java index 77ca9c7d61..2ee36b4bce 100644 --- a/src/main/java/se/su/dsv/scipro/data/dataobjects/Recipient.java +++ b/src/main/java/se/su/dsv/scipro/data/dataobjects/Recipient.java @@ -10,7 +10,6 @@ import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.ManyToOne; -import javax.persistence.OneToOne; import javax.persistence.Table; import org.hibernate.annotations.Cache; @@ -26,6 +25,8 @@ import org.hibernate.annotations.CacheConcurrencyStrategy; @Cache(usage= CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) public class Recipient extends LazyDeletableDomainObject { + private static final long serialVersionUID = 1L; + @Id @GeneratedValue private Long id; diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/SupervisorBoardMessage.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/SupervisorBoardMessage.java deleted file mode 100644 index 85d271e924..0000000000 --- a/src/main/java/se/su/dsv/scipro/data/dataobjects/SupervisorBoardMessage.java +++ /dev/null @@ -1,51 +0,0 @@ -/** - * - */ -package se.su.dsv.scipro.data.dataobjects; - -import java.util.ArrayList; -import java.util.List; - -import javax.persistence.Cacheable; -import javax.persistence.Entity; -import javax.persistence.ManyToOne; -import javax.persistence.OneToMany; -import javax.persistence.Table; - -import org.hibernate.annotations.Cache; -import org.hibernate.annotations.CacheConcurrencyStrategy; - -/** - * @author Johan Aschan - aschan@dsv.su.se - * - */ - -@Entity -@Table(name="supervisor_board_message") -@Cacheable(true) -@Cache(usage= CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) -public class SupervisorBoardMessage extends Message{ - - @ManyToOne(optional=false) - private SupervisorMessageBoard supervisorMessageBoard; - - @OneToMany - private List<SupervisorBoardMessage> replyMessageList = new ArrayList<SupervisorBoardMessage>(); - - public SupervisorMessageBoard getSupervisorMessageBoard() { - return supervisorMessageBoard; - } - - public void setSupervisorMessageBoard( - SupervisorMessageBoard supervisorMessageBoard) { - this.supervisorMessageBoard = supervisorMessageBoard; - } - - public List<SupervisorBoardMessage> getReplyMessageList() { - return replyMessageList; - } - - public void setReplyMessageList(List<SupervisorBoardMessage> replyMessageList) { - this.replyMessageList = replyMessageList; - } -} diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/SupervisorMessageBoard.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/SupervisorMessageBoard.java deleted file mode 100644 index 5c666cb460..0000000000 --- a/src/main/java/se/su/dsv/scipro/data/dataobjects/SupervisorMessageBoard.java +++ /dev/null @@ -1,42 +0,0 @@ -/** - * - */ -package se.su.dsv.scipro.data.dataobjects; - -import java.util.ArrayList; -import java.util.List; - -import javax.persistence.Cacheable; -import javax.persistence.Entity; -import javax.persistence.OneToMany; -import javax.persistence.OneToOne; -import javax.persistence.Table; - -import org.hibernate.annotations.Cache; -import org.hibernate.annotations.CacheConcurrencyStrategy; - -/** - * @author Johan Aschan - aschan@dsv.su.se - * - */ - -@Entity -@Table(name = "supervisor_message_board") -@Cacheable(true) -@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) -public class SupervisorMessageBoard extends Board { - @OneToMany - private List<SupervisorBoardMessage> supervisorBoardMessageList = new ArrayList<SupervisorBoardMessage>(1); - - public List<SupervisorBoardMessage> getSupervisorBoardMessageList() { - return supervisorBoardMessageList; - } - - public void setSupervisorBoardMessageList( - List<SupervisorBoardMessage> supervisorBoardMessageList) { - this.supervisorBoardMessageList = supervisorBoardMessageList; - } - - - -} diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/UserSettings.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/UserSettings.java index 06f928be3b..0d4235ab36 100644 --- a/src/main/java/se/su/dsv/scipro/data/dataobjects/UserSettings.java +++ b/src/main/java/se/su/dsv/scipro/data/dataobjects/UserSettings.java @@ -2,6 +2,8 @@ package se.su.dsv.scipro.data.dataobjects; import javax.persistence.Cacheable; import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Lob; @@ -11,6 +13,8 @@ import javax.persistence.Table; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; + +import se.su.dsv.scipro.data.enums.NotificationPriority; /** * * @author Martin Peters - mpeters@dsv.su.se @@ -38,6 +42,9 @@ public class UserSettings extends DomainObject { private String iPhoneId; private boolean available = false; + @Enumerated(EnumType.STRING) + private NotificationPriority notificationPriority = NotificationPriority.MEDIUM; + @Lob private String statusMessage = ""; @@ -104,4 +111,19 @@ public class UserSettings extends DomainObject { this.activeProject = activeProject; } + /** + * @return the notificationPriority + */ + public NotificationPriority getNotificationPriority() { + return notificationPriority; + } + + /** + * @param notificationPriority the notificationPriority to set + */ + public void setNotificationPriority(NotificationPriority notificationPriority) { + this.notificationPriority = notificationPriority; + } + + } diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/WebNotification.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/WebNotification.java new file mode 100644 index 0000000000..fcc8ca7cef --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/data/dataobjects/WebNotification.java @@ -0,0 +1,116 @@ +/** + * + */ +package se.su.dsv.scipro.data.dataobjects; + +import javax.persistence.Cacheable; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Lob; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; + +/** + * @author Johan Aschan - aschan@dsv.su.se + * + */ + + +@Entity +@Table(name="web_notification") +@Cacheable(true) +@Cache(usage= CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) +public class WebNotification extends DomainObject{ + + private static final long serialVersionUID = 1L; + @Id + @GeneratedValue + private Long id; + + @Lob + private String infoText; + + @Lob + private String url; + + @ManyToOne(optional=false) + private User user; + + private boolean readByUser = false; + + @Override + public Long getId() { + return id; + } + + + /** + * @return the infoText + */ + public String getInfoText() { + return infoText; + } + + + /** + * @param infoText the infoText to set + */ + public void setInfoText(String infoText) { + this.infoText = infoText; + } + + /** + * @return the user + */ + public User getUser() { + return user; + } + + + /** + * @param user the user to set + */ + public void setUser(User user) { + this.user = user; + } + + + + + /** + * @return the readByUser + */ + public boolean isReadByUser() { + return readByUser; + } + + + /** + * @param readByUser the readByUser to set + */ + public void setReadByUser(boolean readByUser) { + this.readByUser = readByUser; + } + + + /** + * @return the url + */ + public String getUrl() { + return url; + } + + + /** + * @param url the url to set + */ + public void setUrl(String url) { + this.url = url; + } + + +} diff --git a/src/main/java/se/su/dsv/scipro/data/enums/NotificationEventType.java b/src/main/java/se/su/dsv/scipro/data/enums/NotificationEventType.java index a4364cb3e5..99bd2a14a3 100644 --- a/src/main/java/se/su/dsv/scipro/data/enums/NotificationEventType.java +++ b/src/main/java/se/su/dsv/scipro/data/enums/NotificationEventType.java @@ -6,6 +6,4 @@ public enum NotificationEventType { PEER_REVIEW_ACCEPTED, PEER_REVIEW_RATED, PEER_REVIEW_GRADED, - - } diff --git a/src/main/java/se/su/dsv/scipro/data/enums/NotificationPriority.java b/src/main/java/se/su/dsv/scipro/data/enums/NotificationPriority.java new file mode 100644 index 0000000000..b61bbd3e08 --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/data/enums/NotificationPriority.java @@ -0,0 +1,23 @@ +/** + * + */ +package se.su.dsv.scipro.data.enums; + +/** + * @author Johan Aschan <aschan@dsv.su.se> + * + */ +public enum NotificationPriority { + HIGH("High"), MEDIUM("Medium"), LOW("Low"); + + private String toString; + + NotificationPriority(String toString){ + this.toString = toString; + } + + @Override + public String toString() { + return toString; + } +} diff --git a/src/main/java/se/su/dsv/scipro/dataproviders/BoardMessageDataProvider.java b/src/main/java/se/su/dsv/scipro/dataproviders/BoardMessageDataProvider.java index 2df52a926b..0fd72b7587 100644 --- a/src/main/java/se/su/dsv/scipro/dataproviders/BoardMessageDataProvider.java +++ b/src/main/java/se/su/dsv/scipro/dataproviders/BoardMessageDataProvider.java @@ -9,39 +9,37 @@ import org.apache.wicket.spring.injection.annot.SpringBean; import se.su.dsv.scipro.data.DomainObjectDetachableModel; import se.su.dsv.scipro.data.dao.interfaces.BoardMessageDao; -import se.su.dsv.scipro.data.dao.interfaces.ProjectDao; import se.su.dsv.scipro.data.dataobjects.BoardMessage; import se.su.dsv.scipro.data.dataobjects.MessageBoard; -import se.su.dsv.scipro.data.dataobjects.Project; public class BoardMessageDataProvider implements IDataProvider<BoardMessage> { private static final long serialVersionUID = 1L; - + @SpringBean private BoardMessageDao boardMessageDao; - - private MessageBoard messageBoard; - - public BoardMessageDataProvider(MessageBoard messageBoard) { + private IModel<MessageBoard> messageBoard; + + public BoardMessageDataProvider(IModel<MessageBoard> messageBoard) { InjectorHolder.getInjector().inject(this); this.messageBoard = messageBoard; } @Override public void detach() { - //Ignore + // Ignore } @Override public Iterator<? extends BoardMessage> iterator(int first, int count) { - return boardMessageDao.getBoardMessageList(messageBoard, first, count).iterator(); + return boardMessageDao.getBoardMessageList(messageBoard.getObject(), first, count) + .iterator(); } @Override public int size() { - return messageBoard.getBoardMessageList().size(); + return boardMessageDao.getBoardMessageListCount(messageBoard.getObject()); } @Override diff --git a/src/main/java/se/su/dsv/scipro/dataproviders/UserSearchDataProvider.java b/src/main/java/se/su/dsv/scipro/dataproviders/UserSearchDataProvider.java index a5d148a278..9d682e9188 100644 --- a/src/main/java/se/su/dsv/scipro/dataproviders/UserSearchDataProvider.java +++ b/src/main/java/se/su/dsv/scipro/dataproviders/UserSearchDataProvider.java @@ -4,6 +4,7 @@ package se.su.dsv.scipro.dataproviders; import java.util.Iterator; +import java.util.List; import org.apache.wicket.injection.web.InjectorHolder; import org.apache.wicket.markup.repeater.data.IDataProvider; @@ -11,9 +12,7 @@ import org.apache.wicket.model.IModel; import org.apache.wicket.spring.injection.annot.SpringBean; import se.su.dsv.scipro.data.DomainObjectDetachableModel; -import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarDao; import se.su.dsv.scipro.data.dao.interfaces.UserDao; -import se.su.dsv.scipro.data.dataobjects.FinalSeminar; import se.su.dsv.scipro.data.dataobjects.Role; import se.su.dsv.scipro.data.dataobjects.User; @@ -23,6 +22,11 @@ import se.su.dsv.scipro.data.dataobjects.User; */ public class UserSearchDataProvider implements IDataProvider<User> { + /** + * + */ + private static final long serialVersionUID = 1L; + /* (non-Javadoc) * @see org.apache.wicket.model.IDetachable#detach() */ @@ -32,6 +36,7 @@ public class UserSearchDataProvider implements IDataProvider<User> { private String userQuery; private Class<? extends Role> role; + private List<User> userList; @Override public void detach() { @@ -44,10 +49,11 @@ public class UserSearchDataProvider implements IDataProvider<User> { /** * @param finalSeminarDao */ - public UserSearchDataProvider(String userQuery, final Class<? extends Role> role) { + public UserSearchDataProvider(String userQuery, final Class<? extends Role> role, List<User> headSupervisor) { InjectorHolder.getInjector().inject(this); this.userQuery = userQuery; this.role = role; + this.userList = headSupervisor; } @@ -58,7 +64,7 @@ public class UserSearchDataProvider implements IDataProvider<User> { @Override public Iterator<? extends User> iterator(int first, int count) { - return userDao.findUserQuery(userQuery, first, count, role).iterator(); + return userDao.findUserQuery(userQuery, first, count, role, userList).iterator(); } @@ -68,7 +74,7 @@ public class UserSearchDataProvider implements IDataProvider<User> { @Override public int size() { - return userDao.findUserQueryCount(userQuery, role); + return userDao.findUserQueryCount(userQuery, role, userList); } /* (non-Javadoc) diff --git a/src/main/java/se/su/dsv/scipro/dataproviders/WebNotificationDataProvider.java b/src/main/java/se/su/dsv/scipro/dataproviders/WebNotificationDataProvider.java new file mode 100644 index 0000000000..8afcd7fec8 --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/dataproviders/WebNotificationDataProvider.java @@ -0,0 +1,69 @@ +/** + * + */ +package se.su.dsv.scipro.dataproviders; + +import java.util.Iterator; + +import org.apache.wicket.injection.web.InjectorHolder; +import org.apache.wicket.markup.repeater.data.IDataProvider; +import org.apache.wicket.model.IModel; +import org.apache.wicket.spring.injection.annot.SpringBean; + +import se.su.dsv.scipro.data.DomainObjectDetachableModel; +import se.su.dsv.scipro.data.dao.interfaces.WebNotificationDao; +import se.su.dsv.scipro.data.dataobjects.User; +import se.su.dsv.scipro.data.dataobjects.WebNotification; + +/** + * @author Johan Aschan - aschan@dsv.su.se + * + */ +public class WebNotificationDataProvider implements IDataProvider<WebNotification> { + + + private static final long serialVersionUID = 1L; + + @SpringBean + private WebNotificationDao webNotificationDao; + + private User user; + + @Override + public void detach() { + // TODO Auto-generated method stub + + } + + public WebNotificationDataProvider(User user) { + InjectorHolder.getInjector().inject(this); + this.user = user; + } + + /* (non-Javadoc) + * @see org.apache.wicket.markup.repeater.data.IDataProvider#iterator(int, int) + */ + @Override + public Iterator<? extends WebNotification> iterator(int first, int count) { + return webNotificationDao.getWebNotifications(user, first, count).iterator(); + } + + /* (non-Javadoc) + * @see org.apache.wicket.markup.repeater.data.IDataProvider#size() + */ + @Override + public int size() { + // TODO Auto-generated method stub + return webNotificationDao.getCountOfWebNotifications(user); + } + + /* (non-Javadoc) + * @see org.apache.wicket.markup.repeater.data.IDataProvider#model(java.lang.Object) + */ + @Override + public IModel<WebNotification> model(WebNotification object) { + // TODO Auto-generated method stub + return new DomainObjectDetachableModel<WebNotification>(webNotificationDao, object); + } + +} diff --git a/src/main/java/se/su/dsv/scipro/json/JsonResponseHandler.java b/src/main/java/se/su/dsv/scipro/json/JsonResponseHandler.java index 68b2add206..cfddb955c7 100644 --- a/src/main/java/se/su/dsv/scipro/json/JsonResponseHandler.java +++ b/src/main/java/se/su/dsv/scipro/json/JsonResponseHandler.java @@ -9,9 +9,7 @@ import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.wicket.spring.injection.annot.SpringBean; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.stereotype.Component; -import org.springframework.transaction.TransactionException; import org.springframework.transaction.TransactionStatus; import se.su.dsv.scipro.ApplicationSettings; diff --git a/src/main/java/se/su/dsv/scipro/json/JsonUserFullResponseHandler.java b/src/main/java/se/su/dsv/scipro/json/JsonUserFullResponseHandler.java index 77adb53a5c..de80a99b99 100644 --- a/src/main/java/se/su/dsv/scipro/json/JsonUserFullResponseHandler.java +++ b/src/main/java/se/su/dsv/scipro/json/JsonUserFullResponseHandler.java @@ -1,11 +1,8 @@ package se.su.dsv.scipro.json; import java.lang.reflect.Type; -import java.util.HashSet; -import java.util.Set; import org.apache.log4j.Level; -import org.springframework.stereotype.Component; import se.su.dsv.scipro.data.dataobjects.User; import se.su.dsv.scipro.data.dataobjects.Username; diff --git a/src/main/java/se/su/dsv/scipro/json/pages/JsonDeletePrivateMessagePage.java b/src/main/java/se/su/dsv/scipro/json/pages/JsonDeletePrivateMessagePage.java index 26bd574b2d..e085e41a4c 100644 --- a/src/main/java/se/su/dsv/scipro/json/pages/JsonDeletePrivateMessagePage.java +++ b/src/main/java/se/su/dsv/scipro/json/pages/JsonDeletePrivateMessagePage.java @@ -9,18 +9,15 @@ import org.apache.wicket.RequestCycle; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.spring.injection.annot.SpringBean; -import se.su.dsv.scipro.SciProSession; import se.su.dsv.scipro.data.dao.interfaces.PrivateMessageDao; import se.su.dsv.scipro.data.dao.interfaces.ProjectDao; import se.su.dsv.scipro.data.dao.interfaces.RecipientDao; import se.su.dsv.scipro.data.dao.interfaces.UserDao; import se.su.dsv.scipro.data.dao.interfaces.UserSettingsDao; import se.su.dsv.scipro.data.dataobjects.PrivateMessage; -import se.su.dsv.scipro.data.dataobjects.Recipient; import se.su.dsv.scipro.data.dataobjects.User; import se.su.dsv.scipro.data.dataobjects.UserSettings; import se.su.dsv.scipro.jsonobjects.JsonDeletePrivateMessage; -import se.su.dsv.scipro.jsonobjects.JsonRecipient; import com.google.gson.Gson; import com.google.gson.JsonObject; diff --git a/src/main/java/se/su/dsv/scipro/json/pages/JsonMessagePage.java b/src/main/java/se/su/dsv/scipro/json/pages/JsonMessagePage.java index ff70b9481f..59d6e03ed1 100644 --- a/src/main/java/se/su/dsv/scipro/json/pages/JsonMessagePage.java +++ b/src/main/java/se/su/dsv/scipro/json/pages/JsonMessagePage.java @@ -10,19 +10,13 @@ import org.apache.wicket.RequestCycle; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.spring.injection.annot.SpringBean; -import se.su.dsv.scipro.ApplicationSettings; import se.su.dsv.scipro.data.dao.interfaces.ProjectDao; import se.su.dsv.scipro.data.dao.interfaces.RecipientDao; import se.su.dsv.scipro.data.dao.interfaces.UserDao; import se.su.dsv.scipro.data.dao.interfaces.UserSettingsDao; -import se.su.dsv.scipro.data.dataobjects.Project; -import se.su.dsv.scipro.data.dataobjects.ProjectFollower; import se.su.dsv.scipro.data.dataobjects.Recipient; -import se.su.dsv.scipro.data.dataobjects.Student; import se.su.dsv.scipro.data.dataobjects.User; import se.su.dsv.scipro.data.dataobjects.UserSettings; -import se.su.dsv.scipro.data.enums.ProjectStatus; -import se.su.dsv.scipro.data.enums.ProjectTeamMemberRoles; import com.google.gson.Gson; import com.google.gson.JsonArray; diff --git a/src/main/java/se/su/dsv/scipro/json/pages/JsonMessagePageCountUnread.java b/src/main/java/se/su/dsv/scipro/json/pages/JsonMessagePageCountUnread.java index 1b2c566c76..7f043b1a35 100644 --- a/src/main/java/se/su/dsv/scipro/json/pages/JsonMessagePageCountUnread.java +++ b/src/main/java/se/su/dsv/scipro/json/pages/JsonMessagePageCountUnread.java @@ -3,10 +3,6 @@ */ package se.su.dsv.scipro.json.pages; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.List; - import org.apache.wicket.IRequestTarget; import org.apache.wicket.PageParameters; import org.apache.wicket.RequestCycle; @@ -17,12 +13,10 @@ import se.su.dsv.scipro.data.dao.interfaces.ProjectDao; import se.su.dsv.scipro.data.dao.interfaces.RecipientDao; import se.su.dsv.scipro.data.dao.interfaces.UserDao; import se.su.dsv.scipro.data.dao.interfaces.UserSettingsDao; -import se.su.dsv.scipro.data.dataobjects.Recipient; import se.su.dsv.scipro.data.dataobjects.User; import se.su.dsv.scipro.data.dataobjects.UserSettings; import com.google.gson.Gson; -import com.google.gson.JsonArray; import com.google.gson.JsonObject; /** diff --git a/src/main/java/se/su/dsv/scipro/json/pages/JsonProjectForSupervisorPage.java b/src/main/java/se/su/dsv/scipro/json/pages/JsonProjectForSupervisorPage.java index cfe43e9cb6..b570bbc21a 100644 --- a/src/main/java/se/su/dsv/scipro/json/pages/JsonProjectForSupervisorPage.java +++ b/src/main/java/se/su/dsv/scipro/json/pages/JsonProjectForSupervisorPage.java @@ -2,21 +2,14 @@ package se.su.dsv.scipro.json.pages; import java.text.DateFormat; import java.text.SimpleDateFormat; -import java.util.Date; import java.util.List; -import javax.swing.text.DateFormatter; - import org.apache.wicket.IRequestTarget; import org.apache.wicket.PageParameters; import org.apache.wicket.RequestCycle; -import org.apache.wicket.datetime.PatternDateConverter; -import org.apache.wicket.datetime.markup.html.basic.DateLabel; import org.apache.wicket.markup.html.WebPage; -import org.apache.wicket.model.Model; import org.apache.wicket.spring.injection.annot.SpringBean; -import se.su.dsv.scipro.ApplicationSettings; import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarDao; import se.su.dsv.scipro.data.dao.interfaces.ProjectDao; import se.su.dsv.scipro.data.dao.interfaces.ProjectEventDao; diff --git a/src/main/java/se/su/dsv/scipro/json/pages/JsonSentMessagePage.java b/src/main/java/se/su/dsv/scipro/json/pages/JsonSentMessagePage.java index 05d74420d0..e2ad178045 100644 --- a/src/main/java/se/su/dsv/scipro/json/pages/JsonSentMessagePage.java +++ b/src/main/java/se/su/dsv/scipro/json/pages/JsonSentMessagePage.java @@ -10,21 +10,15 @@ import org.apache.wicket.RequestCycle; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.spring.injection.annot.SpringBean; -import se.su.dsv.scipro.ApplicationSettings; import se.su.dsv.scipro.data.dao.interfaces.PrivateMessageDao; import se.su.dsv.scipro.data.dao.interfaces.ProjectDao; import se.su.dsv.scipro.data.dao.interfaces.RecipientDao; import se.su.dsv.scipro.data.dao.interfaces.UserDao; import se.su.dsv.scipro.data.dao.interfaces.UserSettingsDao; import se.su.dsv.scipro.data.dataobjects.PrivateMessage; -import se.su.dsv.scipro.data.dataobjects.Project; -import se.su.dsv.scipro.data.dataobjects.ProjectFollower; import se.su.dsv.scipro.data.dataobjects.Recipient; -import se.su.dsv.scipro.data.dataobjects.Student; import se.su.dsv.scipro.data.dataobjects.User; import se.su.dsv.scipro.data.dataobjects.UserSettings; -import se.su.dsv.scipro.data.enums.ProjectStatus; -import se.su.dsv.scipro.data.enums.ProjectTeamMemberRoles; import com.google.gson.Gson; import com.google.gson.JsonArray; diff --git a/src/main/java/se/su/dsv/scipro/json/pages/JsonSetReadPage.java b/src/main/java/se/su/dsv/scipro/json/pages/JsonSetReadPage.java index dd785864b8..c9784d0c82 100644 --- a/src/main/java/se/su/dsv/scipro/json/pages/JsonSetReadPage.java +++ b/src/main/java/se/su/dsv/scipro/json/pages/JsonSetReadPage.java @@ -3,16 +3,7 @@ */ package se.su.dsv.scipro.json.pages; -import java.io.UnsupportedEncodingException; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.text.DateFormat; -import java.text.SimpleDateFormat; import java.util.Date; -import java.util.List; - -import javax.security.auth.login.FailedLoginException; -import javax.security.auth.login.LoginException; import org.apache.wicket.IRequestTarget; import org.apache.wicket.PageParameters; @@ -27,13 +18,9 @@ import se.su.dsv.scipro.data.dao.interfaces.UserSettingsDao; import se.su.dsv.scipro.data.dataobjects.Recipient; import se.su.dsv.scipro.data.dataobjects.User; import se.su.dsv.scipro.data.dataobjects.UserSettings; -import se.su.dsv.scipro.jsonobjects.JsonLogin; import se.su.dsv.scipro.jsonobjects.JsonRecipient; -import se.su.dsv.scipro.security.auth.Authenticator; -import biz.source_code.base64Coder.Base64Coder; import com.google.gson.Gson; -import com.google.gson.JsonArray; import com.google.gson.JsonObject; /** diff --git a/src/main/java/se/su/dsv/scipro/json/pages/JsonSetStatusPage.java b/src/main/java/se/su/dsv/scipro/json/pages/JsonSetStatusPage.java index 5666fb2def..e9b427787a 100644 --- a/src/main/java/se/su/dsv/scipro/json/pages/JsonSetStatusPage.java +++ b/src/main/java/se/su/dsv/scipro/json/pages/JsonSetStatusPage.java @@ -3,10 +3,6 @@ */ package se.su.dsv.scipro.json.pages; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.List; - import org.apache.wicket.IRequestTarget; import org.apache.wicket.PageParameters; import org.apache.wicket.RequestCycle; @@ -17,14 +13,11 @@ import se.su.dsv.scipro.data.dao.interfaces.ProjectDao; import se.su.dsv.scipro.data.dao.interfaces.RecipientDao; import se.su.dsv.scipro.data.dao.interfaces.UserDao; import se.su.dsv.scipro.data.dao.interfaces.UserSettingsDao; -import se.su.dsv.scipro.data.dataobjects.Recipient; import se.su.dsv.scipro.data.dataobjects.User; import se.su.dsv.scipro.data.dataobjects.UserSettings; -import se.su.dsv.scipro.jsonobjects.JsonRecipient; import se.su.dsv.scipro.jsonobjects.JsonStatus; import com.google.gson.Gson; -import com.google.gson.JsonArray; import com.google.gson.JsonObject; /** diff --git a/src/main/java/se/su/dsv/scipro/json/pages/JsonStatusPage.java b/src/main/java/se/su/dsv/scipro/json/pages/JsonStatusPage.java index 857b50c4bb..e90bfafbed 100644 --- a/src/main/java/se/su/dsv/scipro/json/pages/JsonStatusPage.java +++ b/src/main/java/se/su/dsv/scipro/json/pages/JsonStatusPage.java @@ -3,10 +3,6 @@ */ package se.su.dsv.scipro.json.pages; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.List; - import org.apache.wicket.IRequestTarget; import org.apache.wicket.PageParameters; import org.apache.wicket.RequestCycle; @@ -17,12 +13,10 @@ import se.su.dsv.scipro.data.dao.interfaces.ProjectDao; import se.su.dsv.scipro.data.dao.interfaces.RecipientDao; import se.su.dsv.scipro.data.dao.interfaces.UserDao; import se.su.dsv.scipro.data.dao.interfaces.UserSettingsDao; -import se.su.dsv.scipro.data.dataobjects.Recipient; import se.su.dsv.scipro.data.dataobjects.User; import se.su.dsv.scipro.data.dataobjects.UserSettings; import com.google.gson.Gson; -import com.google.gson.JsonArray; import com.google.gson.JsonObject; /** diff --git a/src/main/java/se/su/dsv/scipro/knol/resource/panels/FileResourcePanel.java b/src/main/java/se/su/dsv/scipro/knol/resource/panels/FileResourcePanel.java index 545dfc75e8..f97c12e6fa 100644 --- a/src/main/java/se/su/dsv/scipro/knol/resource/panels/FileResourcePanel.java +++ b/src/main/java/se/su/dsv/scipro/knol/resource/panels/FileResourcePanel.java @@ -6,31 +6,23 @@ import java.util.List; import org.apache.wicket.extensions.ajax.markup.html.form.upload.UploadProgressBar; import org.apache.wicket.markup.html.WebMarkupContainer; -import org.apache.wicket.markup.html.WebResource; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.upload.FileUpload; import org.apache.wicket.markup.html.form.upload.FileUploadField; -import org.apache.wicket.markup.html.link.BookmarkablePageLink; -import org.apache.wicket.markup.html.link.Link; -import org.apache.wicket.markup.html.link.ResourceLink; import org.apache.wicket.markup.html.panel.FeedbackPanel; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.markup.repeater.RepeatingView; -import org.apache.wicket.request.target.resource.ResourceStreamRequestTarget; import org.apache.wicket.spring.injection.annot.SpringBean; import org.apache.wicket.util.lang.Bytes; -import org.apache.wicket.util.resource.IResourceStream; import se.su.dsv.scipro.data.dao.interfaces.UserDao; import se.su.dsv.scipro.data.dataobjects.FileDescription; import se.su.dsv.scipro.data.dataobjects.Resource; -import se.su.dsv.scipro.data.dataobjects.User; import se.su.dsv.scipro.repository.FileRepository; import se.su.dsv.scipro.repository.SortOrder; import se.su.dsv.scipro.repository.components.FileDownloadLink; import se.su.dsv.scipro.repository.components.FileOpenLink; -import se.su.dsv.scipro.repository.pages.RepositoryDownloadPage; public class FileResourcePanel extends Panel{ diff --git a/src/main/java/se/su/dsv/scipro/knol/resource/panels/ResourceBookmarkableCategoryPanel.java b/src/main/java/se/su/dsv/scipro/knol/resource/panels/ResourceBookmarkableCategoryPanel.java index 1ada1f7811..9b01b7c9fc 100644 --- a/src/main/java/se/su/dsv/scipro/knol/resource/panels/ResourceBookmarkableCategoryPanel.java +++ b/src/main/java/se/su/dsv/scipro/knol/resource/panels/ResourceBookmarkableCategoryPanel.java @@ -33,18 +33,21 @@ import se.su.dsv.scipro.knol.resource.page.ResourcePage; */ public class ResourceBookmarkableCategoryPanel extends Panel { + private static final long serialVersionUID = 1L; + @SpringBean private ResourceDao resourceDao; @SpringBean private CategoryDao categoryDao; - private Resource resource; public ResourceBookmarkableCategoryPanel(String id, PageParameters pp) { super(id); add(new AjaxLink<Tag>("showAll") { + private static final long serialVersionUID = 1L; + @Override public void onClick(AjaxRequestTarget target) { diff --git a/src/main/java/se/su/dsv/scipro/knol/resource/panels/ResourceBookmarkablePanel.java b/src/main/java/se/su/dsv/scipro/knol/resource/panels/ResourceBookmarkablePanel.java index 5a2a9dbf76..e3717f09b9 100644 --- a/src/main/java/se/su/dsv/scipro/knol/resource/panels/ResourceBookmarkablePanel.java +++ b/src/main/java/se/su/dsv/scipro/knol/resource/panels/ResourceBookmarkablePanel.java @@ -3,60 +3,18 @@ */ package se.su.dsv.scipro.knol.resource.panels; -import java.text.DateFormat; -import java.text.SimpleDateFormat; import java.util.ArrayList; -import java.util.Date; -import java.util.HashSet; import java.util.List; -import java.util.StringTokenizer; -import org.apache.wicket.IClusterable; import org.apache.wicket.PageParameters; import org.apache.wicket.RestartResponseException; -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.behavior.AttributeAppender; -import org.apache.wicket.markup.html.WebMarkupContainer; -import org.apache.wicket.markup.html.basic.Label; -import org.apache.wicket.markup.html.form.Form; -import org.apache.wicket.markup.html.form.ListMultipleChoice; -import org.apache.wicket.markup.html.form.TextArea; -import org.apache.wicket.markup.html.form.TextField; -import org.apache.wicket.markup.html.link.ExternalLink; -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.CompoundPropertyModel; -import org.apache.wicket.model.Model; import org.apache.wicket.spring.injection.annot.SpringBean; -import org.odlabs.wiquery.ui.dialog.Dialog; import se.su.dsv.scipro.SciProApplication; -import se.su.dsv.scipro.SciProSession; -import se.su.dsv.scipro.commentthread.panels.CommentThreadPanel; -import se.su.dsv.scipro.components.FormFeedbackPanel; -import se.su.dsv.scipro.data.dao.interfaces.CommentThreadDao; -import se.su.dsv.scipro.data.dao.interfaces.RatableDao; -import se.su.dsv.scipro.data.dao.interfaces.RatingDao; import se.su.dsv.scipro.data.dao.interfaces.ResourceDao; -import se.su.dsv.scipro.data.dao.interfaces.TagDao; -import se.su.dsv.scipro.data.dao.interfaces.UserDao; -import se.su.dsv.scipro.data.dataobjects.Rating; -import se.su.dsv.scipro.data.dataobjects.Recipient; import se.su.dsv.scipro.data.dataobjects.Resource; -import se.su.dsv.scipro.data.dataobjects.Tag; -import se.su.dsv.scipro.data.dataobjects.User; -import se.su.dsv.scipro.data.enums.RatingValue; import se.su.dsv.scipro.data.enums.ResourceType; -import se.su.dsv.scipro.knol.resource.model.ResourceModel; -import se.su.dsv.scipro.knol.resource.page.BookmarkableResourcePage; -import se.su.dsv.scipro.knol.resource.page.HtmlWebMarkupContainer; -import se.su.dsv.scipro.knol.resource.page.ResourcePage; -import se.su.dsv.scipro.knol.resource.page.StaticImage; -import se.su.dsv.scipro.security.auth.MetaDataActionStrategy; -import se.su.dsv.scipro.security.auth.roles.Roles; /** * @author Johan Aschan - aschan@dsv.su.se @@ -64,6 +22,7 @@ import se.su.dsv.scipro.security.auth.roles.Roles; */ public class ResourceBookmarkablePanel extends Panel { + private static final long serialVersionUID = 1L; @SpringBean diff --git a/src/main/java/se/su/dsv/scipro/knol/resource/panels/ResourceBookmarkableTagPanel.java b/src/main/java/se/su/dsv/scipro/knol/resource/panels/ResourceBookmarkableTagPanel.java index 96d6f35ff8..8e22e4f518 100644 --- a/src/main/java/se/su/dsv/scipro/knol/resource/panels/ResourceBookmarkableTagPanel.java +++ b/src/main/java/se/su/dsv/scipro/knol/resource/panels/ResourceBookmarkableTagPanel.java @@ -31,18 +31,21 @@ import se.su.dsv.scipro.knol.resource.page.ResourcePage; */ public class ResourceBookmarkableTagPanel extends Panel { + private static final long serialVersionUID = 1L; + @SpringBean private ResourceDao resourceDao; @SpringBean private TagDao tagDao; - private Resource resource; public ResourceBookmarkableTagPanel(String id, PageParameters pp) { super(id); add(new AjaxLink<Tag>("showAll") { + private static final long serialVersionUID = 1L; + @Override public void onClick(AjaxRequestTarget target) { diff --git a/src/main/java/se/su/dsv/scipro/knol/resource/panels/ResourceListPanel.java b/src/main/java/se/su/dsv/scipro/knol/resource/panels/ResourceListPanel.java index 0ad4f94b1f..500b316144 100644 --- a/src/main/java/se/su/dsv/scipro/knol/resource/panels/ResourceListPanel.java +++ b/src/main/java/se/su/dsv/scipro/knol/resource/panels/ResourceListPanel.java @@ -74,6 +74,8 @@ import se.su.dsv.scipro.security.auth.roles.Roles; */ public class ResourceListPanel extends Panel { + private static final long serialVersionUID = 1L; + @SpringBean private RatingDao ratingDao; @@ -113,7 +115,6 @@ public class ResourceListPanel extends Panel { private TextArea<String> infoEmbed; private EditLinkResourceForm editLinkResourceForm; private EditEmbedResourceForm editEmbedResourceForm; - private List<Resource> linkList; private TextArea<String> embedTextArea; private List<Resource> resourcesList; private ResourceType resourceType; @@ -130,6 +131,9 @@ public class ResourceListPanel extends Panel { listContainer.setOutputMarkupId(true); listContainer.add(pagingNavigator = new CustomPagingNavigator( "navigator", linkListView) { + + private static final long serialVersionUID = 1L; + @Override public boolean isVisible() { return linkListView.size() > 0; @@ -180,6 +184,9 @@ public class ResourceListPanel extends Panel { linkListView = new PageableListView<Resource>("link-item", resourceList, 20) { + + private static final long serialVersionUID = 1L; + @Override protected void populateItem(final ListItem<Resource> item) { final Resource resource = resourceDao.reLoad(item @@ -193,6 +200,11 @@ public class ResourceListPanel extends Panel { if (resource.getHeading() == null) { item.add(new ExternalLink("link", resource.getLink(), resource.getLink()) { + /** + * + */ + private static final long serialVersionUID = 1L; + @Override public boolean isVisible() { return resource.getEmbedCode() == null; @@ -201,6 +213,11 @@ public class ResourceListPanel extends Panel { } else { item.add(new ExternalLink("link", resource.getLink(), resource.getHeading()) { + /** + * + */ + private static final long serialVersionUID = 1L; + @Override public boolean isVisible() { return resource.getEmbedCode() == null; @@ -208,6 +225,11 @@ public class ResourceListPanel extends Panel { }); } item.add(new Label("heading", resource.getHeading()) { + /** + * + */ + private static final long serialVersionUID = 1L; + @Override public boolean isVisible() { return resource.getEmbedCode() != null; @@ -215,6 +237,11 @@ public class ResourceListPanel extends Panel { }); item.add(new ExternalLink("linkAddress", resource.getLink(), resource.getLink()) { + /** + * + */ + private static final long serialVersionUID = 1L; + @Override public boolean isVisible() { return resource.getEmbedCode() == null; @@ -257,6 +284,11 @@ public class ResourceListPanel extends Panel { item.add(new ListView<Category>("category-item", resource.getCategoryList()) { + /** + * + */ + private static final long serialVersionUID = 1L; + @Override protected void populateItem(final ListItem<Category> item) { final Category category = item.getModelObject(); @@ -271,6 +303,11 @@ public class ResourceListPanel extends Panel { }); item.add(new ListView<Tag>("tag-item", resource.getTagList()) { + /** + * + */ + private static final long serialVersionUID = 1L; + @Override protected void populateItem(final ListItem<Tag> item) { final Tag tag = item.getModelObject(); @@ -307,6 +344,10 @@ public class ResourceListPanel extends Panel { item.add(new AjaxLink<String>("showComments", new Model<String>("Show Comments")) { + /** + * + */ + private static final long serialVersionUID = 1L; private boolean clicked = false; @Override @@ -337,6 +378,10 @@ public class ResourceListPanel extends Panel { }.add(comment)); item.add(new AjaxLink<Void>("deleteResource") { + /** + * + */ + private static final long serialVersionUID = 1L; @Override public void onClick(AjaxRequestTarget target) { Resource link2 = resourceDao.reLoad(resource); @@ -388,6 +433,11 @@ public class ResourceListPanel extends Panel { item.add(new AjaxLink<Recipient>("editResource") { + /** + * + */ + private static final long serialVersionUID = 1L; + @Override public void onClick(AjaxRequestTarget target) { editResource = resourceDao.reLoad(resource); @@ -433,6 +483,11 @@ public class ResourceListPanel extends Panel { }); item.add(new HtmlWebMarkupContainer("embedCode", resource .getEmbedCode()) { + /** + * + */ + private static final long serialVersionUID = 1L; + @Override public boolean isVisible() { return resource.getEmbedCode() != null; @@ -452,6 +507,10 @@ public class ResourceListPanel extends Panel { private class AddRateButton implements IClusterable { + /** + * + */ + private static final long serialVersionUID = 1L; private AjaxLink<String> ajaxLinkUp, ajaxLinkDown; public AddRateButton(ListItem<Resource> item) { @@ -527,6 +586,11 @@ public class ResourceListPanel extends Panel { pointLabel.setOutputMarkupId(true); ajaxLinkUp = new AjaxLink<String>("upLink", new Model<String>("Up")) { + /** + * + */ + private static final long serialVersionUID = 1L; + @Override public void onClick(AjaxRequestTarget target) { Resource resourc = resourceDao.reLoad(resource); @@ -583,6 +647,11 @@ public class ResourceListPanel extends Panel { ajaxLinkDown = new AjaxLink<String>("downLink", new Model<String>( "Down")) { + /** + * + */ + private static final long serialVersionUID = 1L; + @Override public void onClick(AjaxRequestTarget target) { Resource resourc = resourceDao.reLoad(resource); @@ -652,10 +721,13 @@ public class ResourceListPanel extends Panel { private class EditLinkResourceForm extends Form<ResourceModel> { + /** + * + */ + private static final long serialVersionUID = 1L; private ListView<Tag> tagListView; private List<Tag> tagList; private WebMarkupContainer tagListContainer; - private Collection<Category> selectedCategoryCollection = new ArrayList<Category>(); public EditLinkResourceForm(String name) { super(name, new CompoundPropertyModel<ResourceModel>( @@ -689,6 +761,11 @@ public class ResourceListPanel extends Panel { IChoiceRenderer<Category> choiceRenderer = new IChoiceRenderer<Category>() { + /** + * + */ + private static final long serialVersionUID = 1L; + // Implement dispay here public Object getDisplayValue(Category category) { return category.getCategoryName(); @@ -715,6 +792,11 @@ public class ResourceListPanel extends Panel { add(new AjaxButton("submitButton", new Model<String>( "Save Resource")) { + /** + * + */ + private static final long serialVersionUID = 1L; + @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { editResource = resourceDao.reLoad(editResource); @@ -776,7 +858,7 @@ public class ResourceListPanel extends Panel { @Override protected void onError(final AjaxRequestTarget target, - final Form form) { + final Form<?> form) { target.addComponent(feedbackContainer); } }); @@ -794,6 +876,11 @@ public class ResourceListPanel extends Panel { tagListView = new ListView<Tag>("tag-item", tagList) { + /** + * + */ + private static final long serialVersionUID = 1L; + @Override protected void populateItem(final ListItem<Tag> item) { final Tag tag = item.getModelObject(); @@ -808,6 +895,10 @@ public class ResourceListPanel extends Panel { tagContainer .add(deleteLink = new AjaxLink<Void>("deleteTag") { + /** + * + */ + private static final long serialVersionUID = 1L; @Override public void onClick(AjaxRequestTarget target) { tagList.remove(tag); @@ -842,10 +933,13 @@ public class ResourceListPanel extends Panel { private class EditEmbedResourceForm extends Form<ResourceModel> { + /** + * + */ + private static final long serialVersionUID = 1L; private ListView<Tag> tagListView; private List<Tag> tagList; private WebMarkupContainer tagListContainer; - private Collection<Category> selectedCategoryCollection = new ArrayList<Category>(); public EditEmbedResourceForm(String name) { super(name, new CompoundPropertyModel<ResourceModel>( @@ -872,6 +966,11 @@ public class ResourceListPanel extends Panel { IChoiceRenderer<Category> choiceRenderer = new IChoiceRenderer<Category>() { + /** + * + */ + private static final long serialVersionUID = 1L; + // Implement dispay here public Object getDisplayValue(Category category) { return category.getCategoryName(); @@ -901,6 +1000,11 @@ public class ResourceListPanel extends Panel { add(new AjaxButton("submitButton", new Model<String>( "Save Resource")) { + /** + * + */ + private static final long serialVersionUID = 1L; + @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { editResource = resourceDao.reLoad(editResource); @@ -963,7 +1067,7 @@ public class ResourceListPanel extends Panel { @Override protected void onError(final AjaxRequestTarget target, - final Form form) { + final Form<?> form) { target.addComponent(feedbackContainer); } }); @@ -981,6 +1085,11 @@ public class ResourceListPanel extends Panel { tagListView = new ListView<Tag>("tag-embed-item", tagList) { + /** + * + */ + private static final long serialVersionUID = 1L; + @Override protected void populateItem(final ListItem<Tag> item) { final Tag tag = item.getModelObject(); @@ -990,6 +1099,10 @@ public class ResourceListPanel extends Panel { tagContainer.add(new Label("tagEmbed", tag.getTag())); tagContainer.add(new AjaxLink<Void>("deleteTagEmbed") { + /** + * + */ + private static final long serialVersionUID = 1L; @Override public void onClick(AjaxRequestTarget target) { tagList.remove(tag); diff --git a/src/main/java/se/su/dsv/scipro/knol/resource/panels/ResourcesPanel.java b/src/main/java/se/su/dsv/scipro/knol/resource/panels/ResourcesPanel.java index ad19a38807..02a0fbeb6d 100644 --- a/src/main/java/se/su/dsv/scipro/knol/resource/panels/ResourcesPanel.java +++ b/src/main/java/se/su/dsv/scipro/knol/resource/panels/ResourcesPanel.java @@ -51,6 +51,8 @@ import se.su.dsv.scipro.security.auth.roles.Roles; */ public class ResourcesPanel extends Panel { + private static final long serialVersionUID = 1L; + @SpringBean private TagDao tagDao; @@ -107,6 +109,8 @@ public class ResourcesPanel extends Panel { // editCategoriesDialog.setHeight(340); editCategoriesDialog.setCloseEvent(new JsScopeUiEvent() { + private static final long serialVersionUID = 1L; + @Override protected void execute(JsScopeContext scopeContext) { scopeContext.append("window.location.reload()"); @@ -128,6 +132,8 @@ public class ResourcesPanel extends Panel { // addCategoriesDialog.setHeight(340); addCategoriesDialog.setCloseEvent(new JsScopeUiEvent() { + private static final long serialVersionUID = 1L; + @Override protected void execute(JsScopeContext scopeContext) { scopeContext.append("window.location.reload()"); @@ -142,6 +148,9 @@ public class ResourcesPanel extends Panel { add(new AjaxLink<String>("addLinkResource", new Model<String>( "Add Link Resource")) { + + private static final long serialVersionUID = 1L; + @Override public void onClick(AjaxRequestTarget target) { target.addComponent(linkDialog); @@ -152,6 +161,9 @@ public class ResourcesPanel extends Panel { add(new AjaxLink<String>("addEmbedResource", new Model<String>( "Add Link Resource")) { + + private static final long serialVersionUID = 1L; + @Override public void onClick(AjaxRequestTarget target) { target.addComponent(embedDialog); @@ -166,6 +178,8 @@ public class ResourcesPanel extends Panel { AjaxLink<String> editCategories, addCategories; add(editCategories = new AjaxLink<String>("adminCategories") { + private static final long serialVersionUID = 1L; + @Override public void onClick(AjaxRequestTarget target) { target.addComponent(editCategoriesDialog); @@ -176,6 +190,8 @@ public class ResourcesPanel extends Panel { add(addCategories = new AjaxLink<String>("addCategories") { + private static final long serialVersionUID = 1L; + @Override public void onClick(AjaxRequestTarget target) { target.addComponent(addCategoriesDialog); @@ -187,6 +203,9 @@ public class ResourcesPanel extends Panel { } private class AddLinkResourceForm extends Form<ResourceModel> { + + private static final long serialVersionUID = 1L; + public AddLinkResourceForm(String name) { super(name, new CompoundPropertyModel<ResourceModel>( new ResourceModel())); @@ -215,6 +234,8 @@ public class ResourcesPanel extends Panel { IChoiceRenderer<Category> choiceRenderer = new IChoiceRenderer<Category>() { + private static final long serialVersionUID = 1L; + // Implement dispay here public Object getDisplayValue(Category category) { return category.getCategoryName(); @@ -244,6 +265,9 @@ public class ResourcesPanel extends Panel { add(new AjaxButton("submitButton", new Model<String>( "Save Resource")) { + + private static final long serialVersionUID = 1L; + @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { Resource link = new Resource(); @@ -293,7 +317,7 @@ public class ResourcesPanel extends Panel { @Override protected void onError(final AjaxRequestTarget target, - final Form form) { + final Form<?> form) { target.addComponent(feedbackContainer); } }); @@ -302,12 +326,16 @@ public class ResourcesPanel extends Panel { } private class AddEmbedResourceForm extends Form<ResourceModel> { + + private static final long serialVersionUID = 1L; + public AddEmbedResourceForm(String name) { super(name, new CompoundPropertyModel<ResourceModel>( new ResourceModel())); final WebMarkupContainer feedbackContainer = new WebMarkupContainer( "feedbackContainer"); feedbackContainer.setOutputMarkupId(true); + WebMarkupContainer feedbackPanel = new FormFeedbackPanel<ResourceModel>( "feedbackPanel", this); feedbackContainer.add(feedbackPanel); @@ -327,6 +355,8 @@ public class ResourcesPanel extends Panel { IChoiceRenderer<Category> choiceRenderer = new IChoiceRenderer<Category>() { + private static final long serialVersionUID = 1L; + // Implement dispay here public Object getDisplayValue(Category category) { return category.getCategoryName(); @@ -354,6 +384,9 @@ public class ResourcesPanel extends Panel { add(new AjaxButton("submitButton", new Model<String>( "Save Resource")) { + + private static final long serialVersionUID = 1L; + @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { Resource link; @@ -408,7 +441,7 @@ public class ResourcesPanel extends Panel { @Override protected void onError(final AjaxRequestTarget target, - final Form form) { + final Form<?> form) { target.addComponent(feedbackContainer); } }); @@ -419,8 +452,8 @@ public class ResourcesPanel extends Panel { private class EditCategoriesForm extends Form<CategoryModel> { + private static final long serialVersionUID = 1L; private Category category; - private List<Category> categoryList; public EditCategoriesForm(String name) { super(name, new CompoundPropertyModel<CategoryModel>( @@ -439,6 +472,8 @@ public class ResourcesPanel extends Panel { add(categoryName); IChoiceRenderer<Category> choiceRenderer = new IChoiceRenderer<Category>() { + private static final long serialVersionUID = 1L; + // Implement dispay here public Object getDisplayValue(Category category) { return category.getCategoryName(); @@ -454,6 +489,9 @@ public class ResourcesPanel extends Panel { final ListChoice<Category> categorySelectList = new ListChoice<Category>( "selectedCategory", new ListModel<Category>( categoryDao.findAll()), choiceRenderer) { + + private static final long serialVersionUID = 1L; + @Override protected CharSequence getDefaultChoice(Object selected) { return ""; @@ -482,6 +520,9 @@ public class ResourcesPanel extends Panel { add(new AjaxButton("deleteCategory", new Model<String>( "Delete Category")) { + + private static final long serialVersionUID = 1L; + @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { if (category != null) { @@ -530,7 +571,7 @@ public class ResourcesPanel extends Panel { @Override protected void onError(final AjaxRequestTarget target, - final Form form) { + final Form<?> form) { target.addComponent(feedbackContainer); } }); @@ -539,6 +580,9 @@ public class ResourcesPanel extends Panel { add(new AjaxButton("editButton", new Model<String>("Save Edit")) { + + private static final long serialVersionUID = 1L; + @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { if (category == null) { @@ -565,7 +609,7 @@ public class ResourcesPanel extends Panel { @Override protected void onError(final AjaxRequestTarget target, - final Form form) { + final Form<?> form) { target.addComponent(feedbackContainer); } @@ -573,6 +617,8 @@ public class ResourcesPanel extends Panel { add(new AjaxButton("closeButton", new Model<String>("Close")) { + private static final long serialVersionUID = 1L; + @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { editCategoriesDialog.close(target); @@ -581,7 +627,7 @@ public class ResourcesPanel extends Panel { @Override protected void onError(final AjaxRequestTarget target, - final Form form) { + final Form<?> form) { target.addComponent(feedbackContainer); } }); @@ -591,7 +637,7 @@ public class ResourcesPanel extends Panel { private class AddCategoriesForm extends Form<CategoryModel> { - private Category category; + private static final long serialVersionUID = 1L; public AddCategoriesForm(String name) { super(name, new CompoundPropertyModel<CategoryModel>( @@ -610,6 +656,8 @@ public class ResourcesPanel extends Panel { add(categoryName); IChoiceRenderer<Category> choiceRenderer = new IChoiceRenderer<Category>() { + private static final long serialVersionUID = 1L; + // Implement dispay here public Object getDisplayValue(Category category) { return category.getCategoryName(); @@ -625,6 +673,9 @@ public class ResourcesPanel extends Panel { final ListChoice<Category> categorySelectList = new ListChoice<Category>( "selectedCategory", new ListModel<Category>( categoryDao.findAll()), choiceRenderer) { + + private static final long serialVersionUID = 1L; + @Override protected CharSequence getDefaultChoice(Object selected) { return ""; @@ -638,6 +689,9 @@ public class ResourcesPanel extends Panel { add(new AjaxButton("addButton", new Model<String>("Add Category")) { + + private static final long serialVersionUID = 1L; + @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { CategoryModel categoryModel = (CategoryModel) form @@ -667,13 +721,15 @@ public class ResourcesPanel extends Panel { @Override protected void onError(final AjaxRequestTarget target, - final Form form) { + final Form<?> form) { target.addComponent(feedbackContainer); } }); add(new AjaxButton("closeButton", new Model<String>("Close")) { + private static final long serialVersionUID = 1L; + @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { addCategoriesDialog.close(target); @@ -682,7 +738,7 @@ public class ResourcesPanel extends Panel { @Override protected void onError(final AjaxRequestTarget target, - final Form form) { + final Form<?> form) { target.addComponent(feedbackContainer); } }); diff --git a/src/main/java/se/su/dsv/scipro/message/models/PrivateMessageModel.java b/src/main/java/se/su/dsv/scipro/message/models/PrivateMessageModel.java index 9a46706159..0276bbfce9 100644 --- a/src/main/java/se/su/dsv/scipro/message/models/PrivateMessageModel.java +++ b/src/main/java/se/su/dsv/scipro/message/models/PrivateMessageModel.java @@ -2,19 +2,37 @@ package se.su.dsv.scipro.message.models; import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; +import java.util.Map; +import java.util.Properties; import org.apache.wicket.IClusterable; +import org.apache.wicket.PageParameters; +import org.apache.wicket.Request; +import org.apache.wicket.RequestCycle; import org.apache.wicket.injection.web.InjectorHolder; +import org.apache.wicket.protocol.http.RequestUtils; import org.apache.wicket.spring.injection.annot.SpringBean; import se.su.dsv.scipro.SciProSession; +import se.su.dsv.scipro.conference.pages.SupervisorConferencePage; +import se.su.dsv.scipro.data.controllers.NotificationController; +import se.su.dsv.scipro.data.controllers.NotificationMessage; +import se.su.dsv.scipro.data.dao.interfaces.WebNotificationDao; import se.su.dsv.scipro.data.dao.interfaces.PrivateMessageDao; import se.su.dsv.scipro.data.dao.interfaces.RecipientDao; import se.su.dsv.scipro.data.dao.interfaces.UserDao; +import se.su.dsv.scipro.data.dataobjects.WebNotification; import se.su.dsv.scipro.data.dataobjects.PrivateMessage; import se.su.dsv.scipro.data.dataobjects.Recipient; import se.su.dsv.scipro.data.dataobjects.User; +import se.su.dsv.scipro.data.enums.NotificationEventType; +import se.su.dsv.scipro.data.enums.NotificationPriority; +import se.su.dsv.scipro.message.pages.PrivateMessagesPage; +import se.su.dsv.scipro.security.auth.roles.Roles; +import se.su.dsv.scipro.util.PropsUtils; public class PrivateMessageModel implements IClusterable { @@ -26,6 +44,8 @@ public class PrivateMessageModel implements IClusterable { private PrivateMessageDao privateMessageDao; @SpringBean private RecipientDao recipientDao; + @SpringBean + private NotificationController notificationController; private String subject; private String textMessage; @@ -34,6 +54,8 @@ public class PrivateMessageModel implements IClusterable { private List<User> userFinder = new ArrayList<User>(); private Collection<User> selectedUserList; + private final static String relativePath = "inbox/"; + public PrivateMessageModel() { InjectorHolder.getInjector().inject(this); } @@ -53,6 +75,38 @@ public class PrivateMessageModel implements IClusterable { rec.setPrivateMessage(pm); rec = recipientDao.save(rec); } + for(User user: users){ + createNotification(user, subject +"\n\n" + textMessage); + } } } + + private void createNotification(final User user,final String message){ + Properties props = null; + try { + props = PropsUtils.load("notification.properties"); + } catch (Exception e) { + e.printStackTrace(); + } + String mailSubject = props.getProperty("mailSubject"); + String privateMessageNotification = props.getProperty("privateMessageNotification"); + String twoNewLines = props.getProperty("twoNewLines"); + + + String webNotificationMessage = SciProSession.get() + .getUser() + + privateMessageNotification; + + String mailMessage = webNotificationMessage + twoNewLines + message; + + NotificationMessage notificationMessage = new NotificationMessage(webNotificationMessage, mailSubject, mailMessage); + notificationController.processNotification(user, notificationMessage, + getAbsoluteForPrivateMessageURL(), NotificationPriority.MEDIUM); + + } + + private String getAbsoluteForPrivateMessageURL() { + PageParameters pageParameters = new PageParameters(); + return RequestUtils.toAbsolutePath(RequestCycle.get().urlFor(PrivateMessagesPage.class, pageParameters).toString()); + } } \ No newline at end of file diff --git a/src/main/java/se/su/dsv/scipro/opponent/models/OpponentModel.java b/src/main/java/se/su/dsv/scipro/opponent/models/OpponentModel.java index 86d40d41d9..e1051421e0 100644 --- a/src/main/java/se/su/dsv/scipro/opponent/models/OpponentModel.java +++ b/src/main/java/se/su/dsv/scipro/opponent/models/OpponentModel.java @@ -5,15 +5,12 @@ package se.su.dsv.scipro.opponent.models; import java.util.ArrayList; import java.util.Date; -import java.util.HashMap; import java.util.List; -import java.util.Map; import org.apache.wicket.IClusterable; import se.su.dsv.scipro.data.dataobjects.FinalSeminarActiveParticipation; import se.su.dsv.scipro.data.dataobjects.Project; -import se.su.dsv.scipro.data.dataobjects.User; import se.su.dsv.scipro.data.enums.FinalSeminarLanguages; /** @@ -22,6 +19,7 @@ import se.su.dsv.scipro.data.enums.FinalSeminarLanguages; */ public class OpponentModel implements IClusterable { + private static final long serialVersionUID = 1L; private Project selectedProject; private Date date; private String startHour = "10"; @@ -33,7 +31,6 @@ public class OpponentModel implements IClusterable { private List<FinalSeminarActiveParticipation> activeParticipations = new ArrayList<FinalSeminarActiveParticipation>(); private List<FinalSeminarActiveParticipation> opponentList = new ArrayList<FinalSeminarActiveParticipation>(); private String project; - private String contactsTextArea; private FinalSeminarLanguages presentationLanguage; private FinalSeminarLanguages reportLanguage; @@ -118,6 +115,20 @@ public class OpponentModel implements IClusterable { public FinalSeminarLanguages getReportLanguage() { return reportLanguage; } + + /** + * @return the project + */ + public String getProject() { + return project; + } + + /** + * @param project the project to set + */ + public void setProject(String project) { + this.project = project; + } diff --git a/src/main/java/se/su/dsv/scipro/opponent/panels/AvailableFinalSeminarHelpPanel.java b/src/main/java/se/su/dsv/scipro/opponent/panels/AvailableFinalSeminarHelpPanel.java index 2e5a669cbd..54e72f2776 100644 --- a/src/main/java/se/su/dsv/scipro/opponent/panels/AvailableFinalSeminarHelpPanel.java +++ b/src/main/java/se/su/dsv/scipro/opponent/panels/AvailableFinalSeminarHelpPanel.java @@ -28,8 +28,10 @@ public class AvailableFinalSeminarHelpPanel extends Panel { int maxActiveParticpants = 0; GeneralSystemSettings settings = generalSystemSettingsDao.getGeneralSystemSettingsInstance(); + registerAsActiveParticpant = settings.getDaysBeforeFinalSeminarCanRegisterAsActiveParticipant(); registerAsOpponent = settings.getDaysBeforeFinalSeminarCanRegisterAsOpponent(); + maxActiveParticpants = settings.getFinalSeminarMaxActiveParticipants(); ProjectClassSettings bachelorSettings = projectClassDao.getProjectClass(ProjectClass.BACHELOR).getProjectClassSettings(); diff --git a/src/main/java/se/su/dsv/scipro/opponent/panels/ChangeViewPanel.java b/src/main/java/se/su/dsv/scipro/opponent/panels/ChangeViewPanel.java index adedda6f3f..cf791d6f49 100644 --- a/src/main/java/se/su/dsv/scipro/opponent/panels/ChangeViewPanel.java +++ b/src/main/java/se/su/dsv/scipro/opponent/panels/ChangeViewPanel.java @@ -8,12 +8,10 @@ import java.util.List; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior; -import org.apache.wicket.ajax.markup.html.form.AjaxButton; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.RadioChoice; import org.apache.wicket.markup.html.panel.Panel; -import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; import se.su.dsv.scipro.dataproviders.FinalSeminarAfterNowDataProvider; @@ -25,6 +23,7 @@ import se.su.dsv.scipro.dataproviders.FinalSeminarBeforeNowDataProvider; */ public class ChangeViewPanel extends Panel{ + private static final long serialVersionUID = 1L; private WebMarkupContainer container; private boolean admin; diff --git a/src/main/java/se/su/dsv/scipro/opponent/panels/EditFinalSeminarFormPanel.html b/src/main/java/se/su/dsv/scipro/opponent/panels/EditFinalSeminarFormPanel.html new file mode 100644 index 0000000000..b0e1a73889 --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/opponent/panels/EditFinalSeminarFormPanel.html @@ -0,0 +1,73 @@ +<!DOCTYPE html> +<html + xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd"> +<body> + <wicket:panel> + <form wicket:id="editSeminarForm"> + <div wicket:id="feedbackPanel"></div> + <div class="span-6 last"> + <strong>Project:</strong> + </div> + <div class="span-6 last"> + <input type="text" class="text" wicket:id="project" /> + </div> + <div class="span-6 last"> + <strong>Room (must be booked in Daisy):</strong> + </div> + <div class="span-6 last"> + <input type="text" class="text" wicket:id="room" /> + </div> + <div class="span-6 last"> + <strong>Date:</strong> + </div> + <div class="span-6 last"> + <input type="text" class="text" wicket:id="date" /> + </div> + <div class="span-6 last"> + <strong>Starting Time:</strong> + </div> + <div class="span-8 last"> + Hour: <select wicket:id="startHour"></select> Minute: <select + wicket:id="startMinute"></select> + </div> + <div class="span-6 last"> + <strong>Ending Time:</strong> + </div> + <div class="span-8 last"> + Hour: <select wicket:id="endHour"></select> Minute: <select + wicket:id="endMinute"></select> + </div> + + <div class="span-8 last"> + <strong>Presentation Language: </strong> + </div> + <div class="span-8 last"> + <select wicket:id="presentationLanguage"></select> + </div> + <div class="span-8 last"> + <strong>Thesis/Report Language: </strong> + </div> + <div class="span-8 last"> + <select wicket:id="reportLanguage"></select> + </div> + + <div class="span-6 last"> + <strong>Opponents (optional):</strong> + </div> + <div class="span-6 last" id="opponents"> + <div wicket:id="opponentList"></div> + </div> + <div class="span-6 last"> + <strong>Active Participants (Optional):</strong> + </div> + <div class="span-6 last" id="opponents"> + <div wicket:id="activeParticipations"></div> + </div> + <div class="span-6 last"> + <input type="submit" wicket:id="submitButton" /> + </div> + </form> + + </wicket:panel> +</body> +</html> \ No newline at end of file diff --git a/src/main/java/se/su/dsv/scipro/opponent/panels/EditFinalSeminarFormPanel.java b/src/main/java/se/su/dsv/scipro/opponent/panels/EditFinalSeminarFormPanel.java new file mode 100644 index 0000000000..bb83c178f1 --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/opponent/panels/EditFinalSeminarFormPanel.java @@ -0,0 +1,406 @@ +/** + * + */ +package se.su.dsv.scipro.opponent.panels; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Date; +import java.util.Iterator; +import java.util.List; + +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.ajax.markup.html.form.AjaxButton; +import org.apache.wicket.datetime.DateConverter; +import org.apache.wicket.markup.html.form.DropDownChoice; +import org.apache.wicket.markup.html.form.Form; +import org.apache.wicket.markup.html.form.TextField; +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.Model; +import org.apache.wicket.spring.injection.annot.SpringBean; +import org.apache.wicket.util.convert.IConverter; +import org.joda.time.format.DateTimeFormat; +import org.joda.time.format.DateTimeFormatter; +import org.odlabs.wiquery.ui.datepicker.DatePicker; + +import se.su.dsv.scipro.components.autocomplete.AutoCompletionChoicesProvider; +import se.su.dsv.scipro.components.autocomplete.MultiObjectAutoCompleteObjectConverter; +import se.su.dsv.scipro.components.autocomplete.MultiObjectAutoCompleteRenderer; +import se.su.dsv.scipro.components.autocomplete.UserProjectMultiObjectAutoCompleteBuilder; +import se.su.dsv.scipro.components.autocomplete.UserProjectMultiObjectAutoCompleteField; +import se.su.dsv.scipro.data.controllers.FinalSeminarUploadController; +import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarActiveParticipationDao; +import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarDao; +import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarOppositionDao; +import se.su.dsv.scipro.data.dao.interfaces.RoleDao; +import se.su.dsv.scipro.data.dao.interfaces.UserDao; +import se.su.dsv.scipro.data.dataobjects.FinalSeminar; +import se.su.dsv.scipro.data.dataobjects.FinalSeminarActiveParticipation; +import se.su.dsv.scipro.data.dataobjects.FinalSeminarOpposition; +import se.su.dsv.scipro.data.dataobjects.Project; +import se.su.dsv.scipro.data.dataobjects.Student; +import se.su.dsv.scipro.data.dataobjects.User; +import se.su.dsv.scipro.data.enums.FinalSeminarLanguages; +import se.su.dsv.scipro.opponent.models.OpponentModel; +import se.su.dsv.scipro.supervisor.pages.SupervisorProjectsFinalSeminarPage; + +/** + * @author Johan Aschan <aschan@dsv.su.se> + * + */ +public class EditFinalSeminarFormPanel extends Panel { + + private static final long serialVersionUID = 1L; + @SpringBean + private FinalSeminarUploadController seminarUploadController; + + @SpringBean + private FinalSeminarDao finalSeminarDao; + + @SpringBean + private FinalSeminarOppositionDao finalSeminarOppositionDao; + @SpringBean + private UserDao userDao; + + @SpringBean + private RoleDao roleDao; + + @SpringBean + private FinalSeminarActiveParticipationDao finalSeminarActiveParticipationDao; + + private FeedbackPanel feedbackPanel; + private FinalSeminar editSeminar; + private DatePicker<Date> startDateField; + private DropDownChoice<String> startHour, startMinute, endHour, endMinute; + private UserProjectMultiObjectAutoCompleteField<FinalSeminarActiveParticipation, Long> opponents, + activeListerners; + private TextField<String> room; + private TextField<String> projectLabel; + private DropDownChoice<FinalSeminarLanguages> presentationLanguage; + private DropDownChoice<FinalSeminarLanguages> reportLanguage; + + + + + + public EditFinalSeminarFormPanel(final String id, final FinalSeminar seminar) { + super(id); + + add(new EditSeminarForm("editSeminarForm")); + + FinalSeminar seminar2 = finalSeminarDao.reLoad(seminar); + editSeminar = seminar2; + startDateField.setDefaultModelObject(seminar2.getStartDate()); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(seminar2.getStartDate()); + int hourInt = calendar.get(Calendar.HOUR_OF_DAY); + String hourString = ""; + if (hourInt < 10) { + hourString = "0" + String.valueOf(hourInt); + } else { + hourString = String.valueOf(hourInt); + } + startHour.setDefaultModelObject(hourString); + + int minuteInt = calendar.get(Calendar.MINUTE); + String minuteString = ""; + if (minuteInt < 10) { + minuteString = "0" + String.valueOf(minuteInt); + } else { + minuteString = String.valueOf(minuteInt); + } + + startMinute.setDefaultModelObject(minuteString); + + calendar.setTime(seminar2.getEndDate()); + hourInt = calendar.get(Calendar.HOUR_OF_DAY); + hourString = ""; + if (hourInt < 10) { + hourString = "0" + String.valueOf(hourInt); + } else { + hourString = String.valueOf(hourInt); + } + endHour.setDefaultModelObject(hourString); + + minuteInt = calendar.get(Calendar.MINUTE); + minuteString = ""; + if (minuteInt < 10) { + minuteString = "0" + String.valueOf(minuteInt); + } else { + minuteString = String.valueOf(minuteInt); + } + + endMinute.setDefaultModelObject(minuteString); + + room.setDefaultModelObject(seminar2.getRoom()); + List<FinalSeminarActiveParticipation> userList = new ArrayList<FinalSeminarActiveParticipation>(); + for (FinalSeminarOpposition f : seminar2.getOppositions()) { + FinalSeminarActiveParticipation al = new FinalSeminarActiveParticipation(); + al.setUser(f.getOpponent().getUser()); + al.setProject(f.getProject()); + userList.add(al); + } + presentationLanguage.setDefaultModelObject(seminar.getPresentationLanguage()); + reportLanguage.setDefaultModelObject(seminar.getReportLanguage()); + opponents.setSelectedObjects(userList); + + activeListerners.setSelectedObjects(seminar2.getActiveParticipations()); + projectLabel.setDefaultModelObject(seminar.getProject().getTitle()); + } + + private class EditSeminarForm extends Form<OpponentModel> { + + private static final long serialVersionUID = -5268957422910135323L; + + public EditSeminarForm(String name) { + super(name, new CompoundPropertyModel<OpponentModel>(new OpponentModel())); + add(feedbackPanel = new FeedbackPanel("feedbackPanel")); + feedbackPanel.setOutputMarkupId(true); + + + add(projectLabel = new TextField<String>("project")); + projectLabel.setEnabled(false); + + startDateField = new DatePicker<Date>("date") { + + private static final long serialVersionUID = 1L; + + @Override + public final IConverter getConverter(Class<?> type) { + return new DateConverter(true) { + private static final long serialVersionUID = 1L; + + @Override + public String getDatePattern() { + return "yy-dd-mm"; + } + + @Override + protected DateTimeFormatter getFormat() { + return DateTimeFormat.forPattern("YYYY-MM-dd"); + } + }; + } + }; + startDateField.setDateFormat("yy-mm-dd"); + startDateField.setRequired(true); + + add(room = new TextField<String>("room")); + add(startDateField); + + String[] hours = new String[] { "00", "01", "02", "03", "04", "05", "06", "07", "08", + "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", + "22", "23" }; + String[] minutes = new String[] { "00", "05", "10", "15", "20", "25", "30", "35", "40", + "45", "50", "55" }; + + startHour = new DropDownChoice<String>("startHour", Arrays.asList(hours)); + add(startHour); + startHour.setRequired(false); + startMinute = new DropDownChoice<String>("startMinute", Arrays.asList(minutes)); + add(startMinute); + + endHour = new DropDownChoice<String>("endHour", Arrays.asList(hours)); + add(endHour); + endHour.setRequired(false); + endMinute = new DropDownChoice<String>("endMinute", Arrays.asList(minutes)); + add(endMinute); + + List<FinalSeminarLanguages> languageOptions = new ArrayList<FinalSeminarLanguages>( + Arrays.asList(FinalSeminarLanguages.values())); + + presentationLanguage = new DropDownChoice<FinalSeminarLanguages>( + "presentationLanguage", languageOptions); + add(presentationLanguage); + presentationLanguage.setRequired(true); + + reportLanguage = new DropDownChoice<FinalSeminarLanguages>("reportLanguage", + languageOptions); + + add(reportLanguage); + reportLanguage.setRequired(true); + + room.setRequired(true); + + AutoCompletionChoicesProvider<FinalSeminarActiveParticipation> choiceProvider = new AutoCompletionChoicesProvider<FinalSeminarActiveParticipation>() { + + private static final long serialVersionUID = 1L; + + @Override + public Iterator<FinalSeminarActiveParticipation> getChoices(String input) { + // TODO Auto-generated method stub + List<FinalSeminarActiveParticipation> active = new ArrayList<FinalSeminarActiveParticipation>(); + for (User user : userDao.findUserQuery(input, 10)) { + FinalSeminarActiveParticipation ac = new FinalSeminarActiveParticipation(); + ac.setUser(user); + active.add(ac); + } + return active.iterator(); + } + }; + + UserProjectMultiObjectAutoCompleteBuilder<FinalSeminarActiveParticipation, Long> moac = new UserProjectMultiObjectAutoCompleteBuilder<FinalSeminarActiveParticipation, Long>( + choiceProvider); + moac.idType(Long.class); + moac.autoCompleteRenderer(new MultiObjectAutoCompleteRenderer<FinalSeminarActiveParticipation>() { + + private static final long serialVersionUID = 1L; + + @Override + public String getTextValue(FinalSeminarActiveParticipation al) { + User u = al.getUser(); + return u.getFirstName() + " " + u.getLastName() + " <" + u.getEmailAddress() + + ">"; + } + + protected String getIdValue(FinalSeminarActiveParticipation al) { + User u = al.getUser(); + return u.getId().toString(); + } + }); + + moac.objectConverter(new MultiObjectAutoCompleteObjectConverter<Long, FinalSeminarActiveParticipation>() { + + private static final long serialVersionUID = 1L; + + @Override + public FinalSeminarActiveParticipation convertToObject(Long id) { + FinalSeminarActiveParticipation ac = new FinalSeminarActiveParticipation(); + ac.setUser(userDao.load(id)); + return ac; + } + }); + + opponents = moac.build("opponentList", null, getModelObject()); + activeListerners = moac.build("activeParticipations", null, getModelObject()); + add(opponents); + add(activeListerners); + + add(new AjaxButton("submitButton", new Model<String>("Save")) { + + private static final long serialVersionUID = 1L; + + @Override + protected void onSubmit(AjaxRequestTarget target, Form<?> form) { + editSeminar = finalSeminarDao.reLoad(editSeminar); + OpponentModel opponentModel = (OpponentModel) form.getDefaultModelObject(); + boolean notSameProject = true; + boolean error = false; + Project project = editSeminar.getProject(); + for (Student student : project.getProjectParticipants()) { + if (!notSameProject) + break; + for (FinalSeminarActiveParticipation al : opponentModel.getOpponentList()) { + if (student.getUser().equals(al.getUser()) && !al.isPreDeleted()) { + notSameProject = false; + break; + } + } + for (FinalSeminarActiveParticipation al : opponentModel + .getActiveParticipations()) { + if (student.getUser().equals(al.getUser()) && !al.isPreDeleted()) { + notSameProject = false; + break; + } + } + } + for (FinalSeminarActiveParticipation al : opponentModel.getOpponentList()) { + if (al.getProject() == null && !al.isPreDeleted()) { + error = true; + break; + } + } + if (!error) { + for (FinalSeminarActiveParticipation al : opponentModel + .getActiveParticipations()) { + if (al.getProject() == null && !al.isPreDeleted()) { + error = true; + break; + } + } + } + + if (notSameProject && !error) { + + Date date = opponentModel.getDate(); + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + cal.set(Calendar.HOUR_OF_DAY, Integer.valueOf(opponentModel.getStartHour())); + cal.set(Calendar.MINUTE, Integer.valueOf(opponentModel.getStartMinute())); + + editSeminar.setStartDate(cal.getTime()); + + cal.set(Calendar.HOUR_OF_DAY, Integer.valueOf(opponentModel.getEndHour())); + cal.set(Calendar.MINUTE, Integer.valueOf(opponentModel.getEndMinute())); + editSeminar.setEndDate(cal.getTime()); + + editSeminar.setProject(project); + editSeminar.setRoom(opponentModel.getRoom()); + + editSeminar + .setPresentationLanguage(opponentModel.getPresentationLanguage()); + editSeminar.setReportLanguage(opponentModel.getReportLanguage()); + + editSeminar = finalSeminarDao.save(editSeminar); + + for (FinalSeminarActiveParticipation al : opponentModel.getOpponentList()) { + + if (!al.isPreDeleted()) { + FinalSeminarOpposition opposition1 = new FinalSeminarOpposition(); + opposition1.setOpponent(roleDao.makeStudent(al.getUser())); + opposition1.setProject(al.getProject()); + opposition1.setFinalSeminar(editSeminar); + opposition1 = finalSeminarOppositionDao.save(opposition1); + } else if (al.isPreDeleted()) { + List<FinalSeminarOpposition> finalSeminar = finalSeminarOppositionDao + .findOppositionsByUserAndProject(al.getUser(), + al.getProject(), editSeminar); + for (FinalSeminarOpposition fso : finalSeminar) { + seminarUploadController.deleteOpponentFiles(fso); + finalSeminarOppositionDao.delete(fso); + } + } + + } + + for (FinalSeminarActiveParticipation al : opponentModel + .getActiveParticipations()) { + editSeminar = finalSeminarDao.reLoad(editSeminar); + List<FinalSeminarActiveParticipation> allList = editSeminar + .getActiveParticipations(); + if (!allList.contains(al) && !al.isPreDeleted()) { + al.setFinalSeminar(editSeminar); + finalSeminarActiveParticipationDao.save(al); + + } else if (al.isPreDeleted() && allList.contains(al)) { + finalSeminarActiveParticipationDao + .delete(finalSeminarActiveParticipationDao.reLoad(al)); + } + + } + + setResponsePage(SupervisorProjectsFinalSeminarPage.class); + } else if (!notSameProject && error) { + error("Opponent/Active participant is an author in the final seminar"); + error("Must select a Project for the Opponent/Active participant"); + } else if (notSameProject && error) { + error("Must select a Project for the Opponent/Active participant"); + } else { + error("Opponent/Active participant is an author in the final seminar"); + } + } + + @Override + protected void onError(final AjaxRequestTarget target, final Form<?> form) { + target.addComponent(feedbackPanel); + } + }); + + } + } + + +} diff --git a/src/main/java/se/su/dsv/scipro/opponent/panels/FinalSeminarDetailsPanel.java b/src/main/java/se/su/dsv/scipro/opponent/panels/FinalSeminarDetailsPanel.java index adf66b70f5..172fa064a5 100644 --- a/src/main/java/se/su/dsv/scipro/opponent/panels/FinalSeminarDetailsPanel.java +++ b/src/main/java/se/su/dsv/scipro/opponent/panels/FinalSeminarDetailsPanel.java @@ -1,15 +1,10 @@ package se.su.dsv.scipro.opponent.panels; import java.util.ArrayList; -import java.util.Date; import java.util.List; -import org.apache.wicket.datetime.PatternDateConverter; -import org.apache.wicket.datetime.markup.html.basic.DateLabel; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; -import org.apache.wicket.markup.html.form.Form; -import org.apache.wicket.markup.html.form.SubmitLink; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.markup.html.panel.EmptyPanel; @@ -26,7 +21,6 @@ import se.su.dsv.scipro.data.dataobjects.ProjectFollower; import se.su.dsv.scipro.data.dataobjects.Student; import se.su.dsv.scipro.data.dataobjects.User; import se.su.dsv.scipro.data.enums.ProjectTeamMemberRoles; -import se.su.dsv.scipro.project.pages.ProjectStartPage; import se.su.dsv.scipro.repository.components.FileDownloadLink; import se.su.dsv.scipro.repository.components.FileOpenLink; @@ -37,23 +31,25 @@ public class FinalSeminarDetailsPanel extends Panel { @SpringBean private FinalSeminarDao finalSeminarDao; - public FinalSeminarDetailsPanel(final String id, - final FinalSeminar seminar2, final boolean details) { + public FinalSeminarDetailsPanel(final String id, final FinalSeminar seminar2, + final boolean details) { super(id); final FinalSeminar seminar = finalSeminarDao.reLoad(seminar2); final Project project = seminar.getProject(); - WebMarkupContainer titleContainer = new WebMarkupContainer( - "titleContainer") { + WebMarkupContainer titleContainer = new WebMarkupContainer("titleContainer") { + + private static final long serialVersionUID = 1L; + @Override public boolean isVisible() { - // TODO Auto-generated method stub return details; } }; - titleContainer.add(new Label("projectTitle", seminar.getProject() - .getTitle()) { + titleContainer.add(new Label("projectTitle", seminar.getProject().getTitle()) { + + private static final long serialVersionUID = 1L; }); titleContainer.add(new Label("room", seminar.getRoom())); add(titleContainer); @@ -63,15 +59,13 @@ public class FinalSeminarDetailsPanel extends Panel { @Override protected void populateItem(ListItem<Student> item) { - item.add(item.getModelObject().getUser() - .getDisplayComponent("author", true)); + item.add(item.getModelObject().getUser().getDisplayComponent("author", true)); add(item); } }); if (project.getHeadSupervisor() != null) { - add(project.getHeadSupervisor().getUser() - .getDisplayComponent("headSupervisor", true)); + add(project.getHeadSupervisor().getUser().getDisplayComponent("headSupervisor", true)); } else { add(new EmptyPanel("headSupervisor")); } @@ -92,8 +86,7 @@ public class FinalSeminarDetailsPanel extends Panel { @Override protected void populateItem(ListItem<User> item) { - item.add(item.getModelObject().getDisplayComponent( - "coSupervisor", true)); + item.add(item.getModelObject().getDisplayComponent("coSupervisor", true)); add(item); } }); @@ -103,24 +96,23 @@ public class FinalSeminarDetailsPanel extends Panel { @Override protected void populateItem(ListItem<User> item) { - item.add(item.getModelObject().getDisplayComponent("reviewer", - true)); + item.add(item.getModelObject().getDisplayComponent("reviewer", true)); add(item); } }); - WebMarkupContainer detailsContainer = new WebMarkupContainer( - "detailsContainer") { + WebMarkupContainer detailsContainer = new WebMarkupContainer("detailsContainer") { + + private static final long serialVersionUID = 1L; @Override public boolean isVisible() { - // TODO Auto-generated method stub return details; } }; - detailsContainer.add(new ListView<FinalSeminarOpposition>("opponentsList", - seminar.getOppositions()) { + detailsContainer.add(new ListView<FinalSeminarOpposition>("opponentsList", seminar + .getOppositions()) { private static final long serialVersionUID = 1L; @Override @@ -136,8 +128,7 @@ public class FinalSeminarDetailsPanel extends Panel { private static final long serialVersionUID = 1L; @Override - protected void populateItem( - ListItem<FinalSeminarActiveParticipation> item) { + protected void populateItem(ListItem<FinalSeminarActiveParticipation> item) { item.add(item.getModelObject().getUser() .getDisplayComponent("activeParticipant", true)); add(item); @@ -145,24 +136,20 @@ public class FinalSeminarDetailsPanel extends Panel { }); - detailsContainer.add(new Label("seminarLanguage", seminar - .getPresentationLanguage().toString())); - detailsContainer.add(new Label("thesisLanguage", seminar - .getReportLanguage().toString())); - detailsContainer.add(new Label("seminarReportTitle", - new Model<String>() { - private static final long serialVersionUID = 1L; + detailsContainer.add(new Label("seminarLanguage", seminar.getPresentationLanguage() + .toString())); + detailsContainer.add(new Label("thesisLanguage", seminar.getReportLanguage().toString())); + detailsContainer.add(new Label("seminarReportTitle", new Model<String>() { + private static final long serialVersionUID = 1L; - @Override - public String getObject() { - return seminar.getDocument() == null ? "No thesis/report uploaded" - : seminar.getDocument().getName(); - } - })); - final PatternDateConverter pdc = new PatternDateConverter( - "yyyy-MM-dd HH:mm", false); - final WebMarkupContainer uploadInfoContainer = new WebMarkupContainer( - "uploadInfoContainer") { + @Override + public String getObject() { + return seminar.getDocument() == null ? "No thesis/report uploaded" : seminar + .getDocument().getName(); + } + })); + + final WebMarkupContainer uploadInfoContainer = new WebMarkupContainer("uploadInfoContainer") { private static final long serialVersionUID = 1L; @Override @@ -171,10 +158,8 @@ public class FinalSeminarDetailsPanel extends Panel { } }; - uploadInfoContainer.add(new FileDownloadLink("download", seminar - .getDocument())); - uploadInfoContainer - .add(new FileOpenLink("open", seminar.getDocument())); + uploadInfoContainer.add(new FileDownloadLink("download", seminar.getDocument())); + uploadInfoContainer.add(new FileOpenLink("open", seminar.getDocument())); detailsContainer.add(uploadInfoContainer); add(detailsContainer); diff --git a/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentListViewPanel.html b/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentListViewPanel.html index cc7a43e3b8..e1b8c0eed1 100644 --- a/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentListViewPanel.html +++ b/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentListViewPanel.html @@ -1,114 +1,80 @@ <!DOCTYPE html> -<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd"> +<html + xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd"> <body> -<wicket:panel> + <wicket:panel> -<div class="span-22 prepend-top last"> - <table class="rounded-table seminar-table even-rows"> - <tr> - <th>Date</th> - <th>Level</th> - <th>Title</th> - <th>Author(s)</th> - <th>Head Supervisor</th> - <th>Reviewer</th> - <th title="Opponents" class="shortened-table-header">Opp.</th> - <th title="Active Participants" class="shortened-table-header">A.P.</th> - <th title="Total Attendees" class="shortened-table-header">Tot.A.</th> - <th></th> - <th></th> - <th></th> - </tr> - <tr wicket:id="seminar-item"> - <td><span wicket:id="date" class="span-2"></span></td> - <td><span wicket:id="projectClass"></span></td> - <td><span wicket:id="title"></span></td> - <td><span wicket:id="authors"></span></td> - <td><span wicket:id="headSupervisor"></span></td> - <td><span wicket:id="reviewer"></span></td> - <td><span wicket:id="opponents"></span></td> - <td><span wicket:id="activeParticipants"></span></td> - <td><span wicket:id="totalAttendees"></span></td> - <td><form wicket:id="contactsForm"><input type="submit" wicket:id="contacts" /></form></td> - <td><form wicket:id="editForm"><input type="submit" wicket:id="edit" /></form></td> - <td><a href="#" wicket:id="delete"><img src="images/icons/delete_16x16.png" alt="Delete" title="Delete"/></a></td> - </tr> - <tr> - <td colspan="12"></td> - </tr> - </table> - <div wicket:id="pagingNavigator"></div> - - <div wicket:id="dialog"> - <div wicket:id="dialogContainer"> - <form wicket:id="editSeminarForm"> - <div wicket:id="feedbackPanel"></div> - <div class ="span-6 last"> - <strong>Project:</strong> - </div> - <div class ="span-6 last"> - <input type="text" class="text" wicket:id="project" /> - </div> - <div class ="span-6 last"> - <strong>Room (must be booked in Daisy):</strong> - </div> - <div class ="span-6 last"> - <input type="text" class="text" wicket:id="room" /> - </div> - <div class ="span-6 last"> - <strong>Date:</strong> - </div> - <div class ="span-6 last"> - <input type="text" class="text" wicket:id="date" /> - </div> - <div class ="span-6 last"> - <strong>Starting Time:</strong> - </div> - <div class ="span-8 last">Hour: <select wicket:id="startHour"></select> Minute: <select wicket:id="startMinute"></select> - </div> - <div class ="span-6 last"> - <strong>Ending Time:</strong> - </div> - <div class ="span-8 last">Hour: <select wicket:id="endHour"></select> Minute: <select wicket:id="endMinute"></select> - </div> - <div class ="span-8 last"> - <strong>Presentation Language: </strong> - </div> - <div class ="span-8 last"> - <select wicket:id="presentationLanguage"></select> - </div> - <div class ="span-8 last"> - <strong>Thesis/Report Language: </strong> - </div> - <div class ="span-8 last"> - <select wicket:id="reportLanguage"></select> - </div> - <div class ="span-6 last"> - <strong>Opponents (optional):</strong> - </div> - <div class ="span-6 last" id="opponents"> - <div wicket:id="opponentList"></div> - </div> - <div class ="span-6 last"> - <strong>Active Participants (Optional):</strong> - </div> - <div class ="span-6 last" id="opponents"> - <div wicket:id="activeParticipations"></div> - </div> - <div class ="span-6 last"><input type="submit" wicket:id="submitButton" /> </div> - </form> - </div> - </div> -</div> -<div wicket:id="contactsDialog"> - <div wicket:id="contactsDialogContainer"> - <form wicket:id="contactsSeminarForm"> + <div class="span-22 prepend-top last"> + <table class="rounded-table seminar-table even-rows"> + <tr> + <th>Date</th> + <th>Level</th> + <th>Title</th> + <th>Author(s)</th> + <th>Head Supervisor</th> + <th>Reviewer</th> + <th title="Opponents" class="shortened-table-header">Opp.</th> + <th title="Active Participants" class="shortened-table-header">A.P.</th> + <th title="Total Attendees" class="shortened-table-header">Tot.A.</th> + <th></th> + <th></th> + <th></th> + </tr> + <tr wicket:id="seminar-item"> + <td><span wicket:id="date" class="span-2"></span> + </td> + <td><span wicket:id="projectClass"></span> + </td> + <td><span wicket:id="title"></span> + </td> + <td><span wicket:id="authors"></span> + </td> + <td><span wicket:id="headSupervisor"></span> + </td> + <td><span wicket:id="reviewer"></span> + </td> + <td><span wicket:id="opponents"></span> + </td> + <td><span wicket:id="activeParticipants"></span> + </td> + <td><span wicket:id="totalAttendees"></span> + </td> + <td><form wicket:id="contactsForm"> + <input type="submit" wicket:id="contacts" /> + </form> + </td> + <td><form wicket:id="editForm"> + <input type="submit" wicket:id="edit" /> + </form> + </td> + <td><a href="#" wicket:id="delete"><img + src="images/icons/delete_16x16.png" alt="Delete" title="Delete" /> + </a> + </td> + </tr> + <tr> + <td colspan="12"></td> + </tr> + </table> + <div wicket:id="pagingNavigator"></div> - <div wicket:id="finalSeminarAttendees" ></div> + <div wicket:id="dialog"> + <div wicket:id="dialogContainer"> + <form wicket:id="editSeminarForm"> + <div wicket:id="editSeminarDetails"></div> + </form> + </div> + </div> + </div> + <div wicket:id="contactsDialog"> + <div wicket:id="contactsDialogContainer"> + <form wicket:id="contactsSeminarForm"> - </form> - </div> -</div> -</wicket:panel> + <div wicket:id="finalSeminarAttendees"></div> + + </form> + </div> + </div> + </wicket:panel> </body> </html> \ No newline at end of file diff --git a/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentListViewPanel.java b/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentListViewPanel.java index 02f5c05781..0fd5668934 100644 --- a/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentListViewPanel.java +++ b/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentListViewPanel.java @@ -5,26 +5,15 @@ package se.su.dsv.scipro.opponent.panels; import java.text.DateFormat; import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Calendar; -import java.util.Date; -import java.util.Iterator; -import java.util.List; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.IAjaxCallDecorator; import org.apache.wicket.ajax.calldecorator.AjaxCallDecorator; import org.apache.wicket.ajax.markup.html.AjaxLink; import org.apache.wicket.ajax.markup.html.form.AjaxButton; -import org.apache.wicket.datetime.DateConverter; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; -import org.apache.wicket.markup.html.basic.MultiLineLabel; -import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.markup.html.form.Form; -import org.apache.wicket.markup.html.form.ListChoice; -import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.html.navigation.paging.PagingNavigator; import org.apache.wicket.markup.html.panel.EmptyPanel; import org.apache.wicket.markup.html.panel.FeedbackPanel; @@ -35,33 +24,19 @@ import org.apache.wicket.markup.repeater.data.IDataProvider; import org.apache.wicket.model.CompoundPropertyModel; import org.apache.wicket.model.Model; import org.apache.wicket.spring.injection.annot.SpringBean; -import org.apache.wicket.util.convert.IConverter; -import org.joda.time.format.DateTimeFormat; -import org.joda.time.format.DateTimeFormatter; -import org.odlabs.wiquery.ui.datepicker.DatePicker; import org.odlabs.wiquery.ui.dialog.Dialog; import se.su.dsv.scipro.admin.pages.AdminFinalSeminarPage; -import se.su.dsv.scipro.components.autocomplete.AutoCompletionChoicesProvider; -import se.su.dsv.scipro.components.autocomplete.MultiObjectAutoCompleteObjectConverter; -import se.su.dsv.scipro.components.autocomplete.MultiObjectAutoCompleteRenderer; -import se.su.dsv.scipro.components.autocomplete.UserProjectMultiObjectAutoCompleteBuilder; -import se.su.dsv.scipro.components.autocomplete.UserProjectMultiObjectAutoCompleteField; import se.su.dsv.scipro.data.controllers.FinalSeminarUploadController; import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarActiveParticipationDao; import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarDao; import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarOppositionDao; -import se.su.dsv.scipro.data.dao.interfaces.ProjectDao; -import se.su.dsv.scipro.data.dao.interfaces.RoleDao; -import se.su.dsv.scipro.data.dao.interfaces.UserDao; import se.su.dsv.scipro.data.dataobjects.FinalSeminar; import se.su.dsv.scipro.data.dataobjects.FinalSeminarActiveParticipation; import se.su.dsv.scipro.data.dataobjects.FinalSeminarOpposition; -import se.su.dsv.scipro.data.dataobjects.Project; import se.su.dsv.scipro.data.dataobjects.ProjectFollower; import se.su.dsv.scipro.data.dataobjects.Student; import se.su.dsv.scipro.data.dataobjects.User; -import se.su.dsv.scipro.data.enums.FinalSeminarLanguages; import se.su.dsv.scipro.data.enums.ProjectTeamMemberRoles; import se.su.dsv.scipro.opponent.models.OpponentModel; @@ -79,15 +54,6 @@ public class OpponentListViewPanel extends Panel { @SpringBean private FinalSeminarDao finalSeminarDao; - @SpringBean - private UserDao userDao; - - @SpringBean - private ProjectDao projectDao; - - @SpringBean - private RoleDao roleDao; - @SpringBean private FinalSeminarActiveParticipationDao finalSeminarActiveParticipationDao; @@ -101,27 +67,14 @@ public class OpponentListViewPanel extends Panel { private FeedbackPanel feedbackPanel; private WebMarkupContainer editSeminarDialogContainer, contactsDialogContainer; private Dialog editSeminarDialog, contactsSeminarDialog; - private FinalSeminar editSeminar; - private ListChoice<Project> projectSelectList; - private DatePicker<Date> startDateField; - private DatePicker<Date> endDateField; - private DropDownChoice<String> startHour, startMinute, endHour, endMinute; - private UserProjectMultiObjectAutoCompleteField<FinalSeminarActiveParticipation, Long> moacf, - activeListerners; - private TextField<String> room; - private TextField<String> projectLabel; - private MultiLineLabel contactsTextArea; - private IDataProvider<FinalSeminar> seminarList; + private EditSeminarForm editSeminarForm; private ContactsSeminarForm contactsSeminarForm; - private DropDownChoice<FinalSeminarLanguages> presentationLanguage, reportLanguage; - private boolean adminView, past; + private boolean adminView; public OpponentListViewPanel(String id, IDataProvider<FinalSeminar> seminarList, boolean adminView, boolean past) { super(id); - this.seminarList = seminarList; this.adminView = adminView; - this.past = past; loadListView(seminarList); editSeminarDialogContainer = new WebMarkupContainer("dialogContainer"); editSeminarDialog = new Dialog("dialog"); @@ -131,7 +84,8 @@ public class OpponentListViewPanel extends Panel { editSeminarDialog.add(editSeminarDialogContainer); add(editSeminarDialog); editSeminarDialogContainer.setOutputMarkupId(true); - editSeminarDialogContainer.add(new EditSeminarForm("editSeminarForm")); + editSeminarDialogContainer.add(editSeminarForm = new EditSeminarForm("editSeminarForm")); + editSeminarForm.setOutputMarkupId(true); contactsDialogContainer = new WebMarkupContainer("contactsDialogContainer"); contactsSeminarDialog = new Dialog("contactsDialog"); @@ -220,9 +174,10 @@ public class OpponentListViewPanel extends Panel { item.add(new Label("totalAttendees", String.valueOf(totalAttendees))); item.add(new EditForm("editForm", seminar) { + private static final long serialVersionUID = 1L; + @Override public boolean isVisible() { - // TODO Auto-generated method stub return adminView; } @@ -254,7 +209,6 @@ public class OpponentListViewPanel extends Panel { @Override public boolean isVisible() { - // TODO Auto-generated method stub return adminView; } @@ -285,6 +239,21 @@ public class OpponentListViewPanel extends Panel { }; } + + private class EditSeminarForm extends Form<OpponentModel> { + + /** + * + */ + private static final long serialVersionUID = -5004827722926732419L; + + public EditSeminarForm(String name) { + super(name, new CompoundPropertyModel<OpponentModel>(new OpponentModel())); + editSeminarDialog.setTitle("Edit Seminar"); + add(new EmptyPanel("editSeminarDetails")); + } + } + private class EditForm extends Form<Void> { /** @@ -302,64 +271,9 @@ public class OpponentListViewPanel extends Panel { @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { FinalSeminar seminar2 = finalSeminarDao.reLoad(seminar); - editSeminar = seminar2; - startDateField.setDefaultModelObject(seminar2.getStartDate()); - Calendar calendar = Calendar.getInstance(); - calendar.setTime(seminar2.getStartDate()); - int hourInt = calendar.get(Calendar.HOUR_OF_DAY); - String hourString = ""; - if (hourInt < 10) { - hourString = "0" + String.valueOf(hourInt); - } else { - hourString = String.valueOf(hourInt); - } - startHour.setDefaultModelObject(hourString); - - int minuteInt = calendar.get(Calendar.MINUTE); - String minuteString = ""; - if (minuteInt < 10) { - minuteString = "0" + String.valueOf(minuteInt); - } else { - minuteString = String.valueOf(minuteInt); - } - - startMinute.setDefaultModelObject(minuteString); - - calendar.setTime(seminar2.getEndDate()); - hourInt = calendar.get(Calendar.HOUR_OF_DAY); - hourString = ""; - if (hourInt < 10) { - hourString = "0" + String.valueOf(hourInt); - } else { - hourString = String.valueOf(hourInt); - } - endHour.setDefaultModelObject(hourString); - - minuteInt = calendar.get(Calendar.MINUTE); - minuteString = ""; - if (minuteInt < 10) { - minuteString = "0" + String.valueOf(minuteInt); - } else { - minuteString = String.valueOf(minuteInt); - } - - endMinute.setDefaultModelObject(minuteString); - - room.setDefaultModelObject(seminar2.getRoom()); - List<FinalSeminarActiveParticipation> userList = new ArrayList<FinalSeminarActiveParticipation>(); - for (FinalSeminarOpposition f : seminar2.getOppositions()) { - FinalSeminarActiveParticipation al = new FinalSeminarActiveParticipation(); - al.setUser(f.getOpponent().getUser()); - al.setProject(f.getProject()); - userList.add(al); - } - presentationLanguage.setDefaultModelObject(seminar.getPresentationLanguage()); - reportLanguage.setDefaultModelObject(seminar.getReportLanguage()); - moacf.setSelectedObjects(userList); - - activeListerners.setSelectedObjects(seminar2.getActiveParticipations()); - projectLabel.setDefaultModelObject(seminar.getProject().getTitle()); - target.addComponent(editSeminarDialog); + editSeminarForm.removeAll(); + editSeminarForm.add(new EditFinalSeminarFormPanel("editSeminarDetails", seminar2)); + target.addComponent(editSeminarForm); editSeminarDialog.open(target); } @@ -373,264 +287,6 @@ public class OpponentListViewPanel extends Panel { } } - private class EditSeminarForm extends Form<OpponentModel> { - - private static final long serialVersionUID = -5268957422910135323L; - - public EditSeminarForm(String name) { - super(name, new CompoundPropertyModel<OpponentModel>(new OpponentModel())); - // final WebMarkupContainer feedbackContainer = new - // WebMarkupContainer( - // "feedbackContainer"); - // feedbackContainer.setOutputMarkupId(true); - // WebMarkupContainer feedbackPanel = new - // FormFeedbackPanel<OpponentModel>( - // "feedbackPanel", this); - // feedbackContainer.add(feedbackPanel); - // add(feedbackContainer); - - List<FinalSeminarLanguages> languageOptions = new ArrayList<FinalSeminarLanguages>( - Arrays.asList(FinalSeminarLanguages.values())); - presentationLanguage = new DropDownChoice<FinalSeminarLanguages>( - "presentationLanguage", languageOptions); - add(presentationLanguage); - presentationLanguage.setRequired(true); - - reportLanguage = new DropDownChoice<FinalSeminarLanguages>("reportLanguage", - languageOptions); - add(reportLanguage); - reportLanguage.setRequired(true); - - add(feedbackPanel = new FeedbackPanel("feedbackPanel")); - feedbackPanel.setOutputMarkupId(true); - editSeminarDialog.setTitle("Edit final seminar"); - - add(projectLabel = new TextField<String>("project")); - projectLabel.setEnabled(false); - - startDateField = new DatePicker<Date>("date") { - - private static final long serialVersionUID = 1L; - - @Override - public final IConverter getConverter(Class<?> type) { - return new DateConverter(true) { - private static final long serialVersionUID = 1L; - - @Override - public String getDatePattern() { - return "yy-dd-mm"; - } - - @Override - protected DateTimeFormatter getFormat() { - return DateTimeFormat.forPattern("YYYY-MM-dd"); - } - }; - } - }; - startDateField.setDateFormat("yy-mm-dd"); - startDateField.setRequired(true); - // startDateField.setShowOn(ShowOnEnum.BOTH); - // startDateField.setButtonText("<div class=\"ui-icon ui-icon-calendar\"></div>"); - add(room = new TextField<String>("room")); - add(startDateField); - - startHour = new DropDownChoice<String>("startHour", Arrays.asList(new String[] { "00", - "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", - "14", "15", "16", "17", "18", "19", "20", "21", "22", "23" })); - add(startHour); - startHour.setRequired(false); - startMinute = new DropDownChoice<String>("startMinute", Arrays.asList(new String[] { - "00", "05", "10", "15", "20", "25", "30", "35", "40", "45", "50", "55" })); - add(startMinute); - - endHour = new DropDownChoice<String>("endHour", Arrays.asList(new String[] { "00", - "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", - "14", "15", "16", "17", "18", "19", "20", "21", "22", "23" })); - add(endHour); - endHour.setRequired(false); - endMinute = new DropDownChoice<String>("endMinute", Arrays.asList(new String[] { "00", - "05", "10", "15", "20", "25", "30", "35", "40", "45", "50", "55" })); - add(endMinute); - - room.setRequired(true); - - AutoCompletionChoicesProvider<FinalSeminarActiveParticipation> choiceProvider = new AutoCompletionChoicesProvider<FinalSeminarActiveParticipation>() { - - @Override - public Iterator<FinalSeminarActiveParticipation> getChoices(String input) { - // TODO Auto-generated method stub - List<FinalSeminarActiveParticipation> active = new ArrayList<FinalSeminarActiveParticipation>(); - for (User user : userDao.findUserQuery(input, 10)) { - FinalSeminarActiveParticipation ac = new FinalSeminarActiveParticipation(); - ac.setUser(user); - active.add(ac); - } - return active.iterator(); - } - }; - - UserProjectMultiObjectAutoCompleteBuilder<FinalSeminarActiveParticipation, Long> moac = new UserProjectMultiObjectAutoCompleteBuilder<FinalSeminarActiveParticipation, Long>( - choiceProvider); - moac.idType(Long.class); - moac.autoCompleteRenderer(new MultiObjectAutoCompleteRenderer<FinalSeminarActiveParticipation>() { - public String getTextValue(FinalSeminarActiveParticipation al) { - User u = al.getUser(); - return u.getFirstName() + " " + u.getLastName() + " <" + u.getEmailAddress() - + ">"; - } - - protected String getIdValue(FinalSeminarActiveParticipation al) { - User u = al.getUser(); - return u.getId().toString(); - } - }); - - moac.objectConverter(new MultiObjectAutoCompleteObjectConverter<Long, FinalSeminarActiveParticipation>() { - - @Override - public FinalSeminarActiveParticipation convertToObject(Long id) { - FinalSeminarActiveParticipation ac = new FinalSeminarActiveParticipation(); - ac.setUser(userDao.load(id)); - return ac; - } - }); - - moacf = moac.build("opponentList", null, getModelObject()); - activeListerners = moac.build("activeParticipations", null, getModelObject()); - add(moacf); - add(activeListerners); - - add(new AjaxButton("submitButton", new Model<String>("Save")) { - - @Override - protected void onSubmit(AjaxRequestTarget target, Form<?> form) { - editSeminar = finalSeminarDao.reLoad(editSeminar); - OpponentModel opponentModel = (OpponentModel) form.getDefaultModelObject(); - boolean notSameProject = true; - boolean error = false; - Project project = editSeminar.getProject(); - for (Student student : project.getProjectParticipants()) { - if (!notSameProject) - break; - for (FinalSeminarActiveParticipation al : opponentModel.getOpponentList()) { - if (student.getUser().equals(al.getUser()) && !al.isPreDeleted()) { - notSameProject = false; - break; - } - } - for (FinalSeminarActiveParticipation al : opponentModel - .getActiveParticipations()) { - if (student.getUser().equals(al.getUser()) && !al.isPreDeleted()) { - notSameProject = false; - break; - } - } - } - for (FinalSeminarActiveParticipation al : opponentModel.getOpponentList()) { - if (al.getProject() == null && !al.isPreDeleted()) { - error = true; - break; - } - } - if (!error) { - for (FinalSeminarActiveParticipation al : opponentModel - .getActiveParticipations()) { - if (al.getProject() == null && !al.isPreDeleted()) { - error = true; - break; - } - } - } - if (notSameProject && !error) { - - Date date = opponentModel.getDate(); - Calendar cal = Calendar.getInstance(); - cal.setTime(date); - cal.set(Calendar.HOUR_OF_DAY, Integer.valueOf(opponentModel.getStartHour())); - cal.set(Calendar.MINUTE, Integer.valueOf(opponentModel.getStartMinute())); - - editSeminar.setStartDate(cal.getTime()); - - cal.set(Calendar.HOUR_OF_DAY, Integer.valueOf(opponentModel.getEndHour())); - cal.set(Calendar.MINUTE, Integer.valueOf(opponentModel.getEndMinute())); - editSeminar - .setPresentationLanguage(opponentModel.getPresentationLanguage()); - editSeminar.setReportLanguage(opponentModel.getReportLanguage()); - editSeminar.setEndDate(cal.getTime()); - - editSeminar.setProject(project); - editSeminar.setRoom(opponentModel.getRoom()); - - editSeminar = finalSeminarDao.save(editSeminar); - - for (FinalSeminarActiveParticipation al : opponentModel.getOpponentList()) { - FinalSeminarOpposition opposition1 = new FinalSeminarOpposition(); - - boolean go = true; - - for (FinalSeminarOpposition fso : editSeminar.getOppositions()) { - if (fso.getOpponent().getUser().equals(al.getUser()) - && fso.getProject().equals(editSeminar.getProject())) { - go = false; - } else if(fso.getOpponent().getUser().equals(al.getUser())){ - opposition1 = finalSeminarOppositionDao.reLoad(fso); - } - } - if (!al.isPreDeleted() && go) { - - opposition1.setOpponent(roleDao.makeStudent(al.getUser())); - opposition1.setProject(al.getProject()); - opposition1.setFinalSeminar(editSeminar); - opposition1 = finalSeminarOppositionDao.save(opposition1); - } else if (al.isPreDeleted()) { - List<FinalSeminarOpposition> finalSeminar = finalSeminarOppositionDao - .findOppositionsByUserAndProject(al.getUser(), - al.getProject(), editSeminar); - for (FinalSeminarOpposition fso : finalSeminar) { - seminarUploadController.deleteOpponentFiles(fso); - finalSeminarOppositionDao.delete(fso); - } - } - - } - - for (FinalSeminarActiveParticipation al : opponentModel - .getActiveParticipations()) { - editSeminar = finalSeminarDao.reLoad(editSeminar); - List<FinalSeminarActiveParticipation> allList = editSeminar - .getActiveParticipations(); - if (!allList.contains(al) && !al.isPreDeleted()) { - al.setFinalSeminar(editSeminar); - finalSeminarActiveParticipationDao.save(al); - } else if (al.isPreDeleted() && allList.contains(al)) { - finalSeminarActiveParticipationDao - .delete(finalSeminarActiveParticipationDao.reLoad(al)); - } - - } - - setResponsePage(AdminFinalSeminarPage.class); - } else if (!notSameProject && error) { - error("Opponent/Active participant is an author in the final seminar"); - error("Must select a Project for the Opponent/Active participant"); - } else if (notSameProject && error) { - error("Must select a Project for the Opponent/Active participant"); - } else { - error("Opponent/Active participant is an author in the final seminar"); - } - } - - @Override - protected void onError(final AjaxRequestTarget target, final Form form) { - target.addComponent(feedbackPanel); - } - }); - - } - } - private class ContactsSeminarForm extends Form<OpponentModel> { /** diff --git a/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentPanel.java b/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentPanel.java index fef4634e17..c2a3b5d437 100644 --- a/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentPanel.java +++ b/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentPanel.java @@ -6,7 +6,6 @@ package se.su.dsv.scipro.opponent.panels; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; -import java.util.Collection; import java.util.Date; import java.util.Iterator; import java.util.List; @@ -128,56 +127,18 @@ public class OpponentPanel extends Panel { "feedbackContainer"); project = projectDao.reLoad(project); feedbackContainer.setOutputMarkupId(true); - WebMarkupContainer feedbackPanel = new FormFeedbackPanel<OpponentModel>( - "feedbackPanel", this); + + //ComponentFeedbackPanel fungerade inte + WebMarkupContainer feedbackPanel = new FormFeedbackPanel<OpponentModel>("feedbackPanel", this); feedbackContainer.add(feedbackPanel); add(feedbackContainer); - List<User> userList = new ArrayList<User>(); + addSeminarDialog.setTitle("Create Seminar"); TextField<String> projectLabel; add(projectLabel = new TextField<String>("project")); projectLabel.setEnabled(false); projectLabel.setDefaultModelObject(project.getTitle(30)); - // IChoiceRenderer<Project> choiceRenderer = new - // IChoiceRenderer<Project>() { - // - // // Implement dispay here - // public Object getDisplayValue(Project project) { - // return project.getTitle(); - // } - // - // @Override - // public String getIdValue(Project project, int arg1) { - // return project.getId().toString(); - // } - // - // }; - // List<Project> projectList = - // projectDao.getProjectsByHeadSupervisor( - // SciProSession.get().getUser(), ProjectStatus.ACTIVE); - // - // for (Seminar s : seminarDao.getSeminarForSupervisor(SciProSession - // .get().getUser())) { - // if (projectList.contains(s.getProject())) { - // projectList.remove(s.getProject()); - // } - // } - // - // // The offical one - // final ListChoice<Project> projectSelectList = new - // ListChoice<Project>( - // "selectedProject", new ListModel<Project>(projectList), - // choiceRenderer) { - // @Override - // protected CharSequence getDefaultChoice(Object selected) { - // return ""; - // } - // - // }; - // - // projectSelectList.setRequired(true); - // projectSelectList.setOutputMarkupId(true); - // add(projectSelectList); + DatePicker<Date> startDateField = new DatePicker<Date>("date") { private static final long serialVersionUID = 1L; @@ -201,38 +162,36 @@ public class OpponentPanel extends Panel { }; startDateField.setDateFormat("yy-mm-dd"); startDateField.setRequired(true); - // startDateField.setShowOn(ShowOnEnum.BOTH); - // startDateField.setButtonText("<div class=\"ui-icon ui-icon-calendar\"></div>"); + final TextField<String> room; add(room = new TextField<String>("room")); room.setRequired(true); add(startDateField); + + String[] hourArray = new String[] { "00", "01", "02", "03", "04", + "05", "06", "07", "08", "09", "10", "11", "12", + "13", "14", "15", "16", "17", "18", "19", "20", + "21", "22", "23" }; + + String[] minuteArray = new String[] { "00", "05", "10", + "15", "20", "25", "30", "35", "40", "45", "50", + "55" }; DropDownChoice<String> hour = new DropDownChoice<String>("startHour", - Arrays.asList(new String[] { "00", "01", "02", "03", "04", - "05", "06", "07", "08", "09", "10", "11", "12", - "13", "14", "15", "16", "17", "18", "19", "20", - "21", "22", "23" })); + Arrays.asList(hourArray)); add(hour); hour.setRequired(false); DropDownChoice<String> minute = new DropDownChoice<String>( - "startMinute", Arrays.asList(new String[] { "00", "05", "10", - "15", "20", "25", "30", "35", "40", "45", "50", - "55" })); + "startMinute", Arrays.asList(minuteArray)); add(minute); minute.setRequired(false); DropDownChoice<String> endHour = new DropDownChoice<String>("endHour", - Arrays.asList(new String[] { "00", "01", "02", "03", "04", - "05", "06", "07", "08", "09", "10", "11", "12", - "13", "14", "15", "16", "17", "18", "19", "20", - "21", "22", "23" })); + Arrays.asList(hourArray)); add(endHour); endHour.setRequired(false); DropDownChoice<String> endMinute = new DropDownChoice<String>( - "endMinute", Arrays.asList(new String[] { "00", "05", "10", - "15", "20", "25", "30", "35", "40", "45", "50", - "55" })); + "endMinute", Arrays.asList(minuteArray)); add(endMinute); endMinute.setRequired(false); @@ -406,7 +365,7 @@ public class OpponentPanel extends Panel { @Override protected void onError(final AjaxRequestTarget target, - final Form form) { + final Form<?> form) { target.addComponent(feedbackContainer); } }); diff --git a/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentStudentViewListPanel.java b/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentStudentViewListPanel.java index 139215641b..dfcaaa57d4 100644 --- a/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentStudentViewListPanel.java +++ b/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentStudentViewListPanel.java @@ -6,16 +6,13 @@ package se.su.dsv.scipro.opponent.panels; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; -import java.util.List; -import org.apache.commons.logging.impl.AvalonLogger; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.IAjaxCallDecorator; import org.apache.wicket.ajax.calldecorator.AjaxCallDecorator; import org.apache.wicket.ajax.markup.html.form.AjaxButton; import org.apache.wicket.markup.html.WebMarkupContainer; 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.navigation.paging.PagingNavigator; import org.apache.wicket.markup.html.panel.EmptyPanel; @@ -26,7 +23,6 @@ import org.apache.wicket.markup.repeater.data.DataView; import org.apache.wicket.markup.repeater.data.IDataProvider; import org.apache.wicket.model.CompoundPropertyModel; import org.apache.wicket.model.Model; -import org.apache.wicket.protocol.http.request.WebRequestCodingStrategy.Settings; import org.apache.wicket.spring.injection.annot.SpringBean; import org.joda.time.DateTime; import org.odlabs.wiquery.ui.dialog.Dialog; @@ -36,20 +32,14 @@ import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarActiveParticipationDao; import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarDao; import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarOppositionDao; import se.su.dsv.scipro.data.dao.interfaces.GeneralSystemSettingsDao; -import se.su.dsv.scipro.data.dao.interfaces.ProjectClassDao; -import se.su.dsv.scipro.data.dao.interfaces.ProjectClassSettingsDao; -import se.su.dsv.scipro.data.dao.interfaces.ProjectDao; import se.su.dsv.scipro.data.dao.interfaces.RoleDao; import se.su.dsv.scipro.data.dataobjects.FinalSeminar; import se.su.dsv.scipro.data.dataobjects.FinalSeminarActiveParticipation; import se.su.dsv.scipro.data.dataobjects.FinalSeminarOpposition; import se.su.dsv.scipro.data.dataobjects.GeneralSystemSettings; import se.su.dsv.scipro.data.dataobjects.Project; -import se.su.dsv.scipro.data.dataobjects.ProjectClassSettings; import se.su.dsv.scipro.data.dataobjects.Student; import se.su.dsv.scipro.data.dataobjects.User; -import se.su.dsv.scipro.data.enums.ProjectStatus; -import se.su.dsv.scipro.icons.HelpIconDialog; import se.su.dsv.scipro.opponent.models.OpponentModel; import se.su.dsv.scipro.project.pages.ProjectOppositionPage; @@ -64,35 +54,23 @@ public abstract class OpponentStudentViewListPanel extends Panel { @SpringBean private FinalSeminarDao finalSeminarDao; - @SpringBean - private ProjectDao projectDao; - @SpringBean private FinalSeminarActiveParticipationDao finalSeminarActiveParticipationDao; @SpringBean private FinalSeminarOppositionDao finalSeminarOppositionDao; - @SpringBean - private ProjectClassDao projectClassDao; - @SpringBean private GeneralSystemSettingsDao generalSystemSettingsDao; - @SpringBean - private ProjectClassSettingsDao projectClassSettingsDao; - @SpringBean private RoleDao roleDao; - private WebMarkupContainer editSeminarDialogContainer, - contactsDialogContainer; - private Dialog editSeminarDialog, contactsSeminarDialog; + private WebMarkupContainer contactsDialogContainer; + private Dialog contactsSeminarDialog; private DataView<FinalSeminar> linkListView; - private FeedbackPanel feedbackPanel, feedbackPanel2; - private IDataProvider<FinalSeminar> seminarList; - private int visibles; + private FeedbackPanel feedbackPanel; private ContactsSeminarForm contactsSeminarForm; protected abstract FeedbackPanel getFeedbackPanel(); @@ -100,7 +78,6 @@ public abstract class OpponentStudentViewListPanel extends Panel { public OpponentStudentViewListPanel(String id, IDataProvider<FinalSeminar> seminarList) { super(id); - this.seminarList = seminarList; loadListView(seminarList); feedbackPanel = getFeedbackPanel(); feedbackPanel.setOutputMarkupId(true); diff --git a/src/main/java/se/su/dsv/scipro/opponent/panels/ProjectActiveParticipationsPanel.java b/src/main/java/se/su/dsv/scipro/opponent/panels/ProjectActiveParticipationsPanel.java index af25599724..7babfc5d8a 100644 --- a/src/main/java/se/su/dsv/scipro/opponent/panels/ProjectActiveParticipationsPanel.java +++ b/src/main/java/se/su/dsv/scipro/opponent/panels/ProjectActiveParticipationsPanel.java @@ -9,7 +9,6 @@ import org.apache.wicket.datetime.markup.html.basic.DateLabel; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.ListView; -import org.apache.wicket.markup.html.panel.EmptyPanel; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.Model; import org.apache.wicket.spring.injection.annot.SpringBean; diff --git a/src/main/java/se/su/dsv/scipro/opponent/panels/ProjectFinalSeminarPanel.html b/src/main/java/se/su/dsv/scipro/opponent/panels/ProjectFinalSeminarPanel.html index 897bd6cdbd..4dd0fc048a 100644 --- a/src/main/java/se/su/dsv/scipro/opponent/panels/ProjectFinalSeminarPanel.html +++ b/src/main/java/se/su/dsv/scipro/opponent/panels/ProjectFinalSeminarPanel.html @@ -24,12 +24,6 @@ <span wicket:id="feedbackPanel"></span> <div wicket:id="uploadInfoContainer" class="span-10 last"> - <strong><span wicket:id="checkPlagarism"></span> </strong> <span - wicket:id="plagiarismLabel"></span> - <div> - <a href="#" target="_blank" wicket:id="turnItInLink">Go to - Turnitin</a> - </div> <table> <tr> <td wicket:id="uploader"></td> @@ -47,6 +41,12 @@ </td> </tr> </table> + <strong><span wicket:id="checkPlagarism"></span> </strong> <span + wicket:id="plagiarismLabel"></span> + <div> + <a href="#" target="_blank" wicket:id="turnItInLink">Go to + Turnitin</a> + </div> </div> <div wicket:id="uploadClosedContainer"> <img wicket:id="uploadClosedIcon" /><i> <span @@ -134,68 +134,7 @@ <div wicket:id="dialog"> <div wicket:id="dialogContainer"> <form wicket:id="editSeminarForm"> - <div wicket:id="feedbackPanel"></div> - <div class="span-6 last"> - <strong>Project:</strong> - </div> - <div class="span-6 last"> - <input type="text" class="text" wicket:id="project" /> - </div> - <div class="span-6 last"> - <strong>Room (must be booked in Daisy):</strong> - </div> - <div class="span-6 last"> - <input type="text" class="text" wicket:id="room" /> - </div> - <div class="span-6 last"> - <strong>Date:</strong> - </div> - <div class="span-6 last"> - <input type="text" class="text" wicket:id="date" /> - </div> - <div class="span-6 last"> - <strong>Starting Time:</strong> - </div> - <div class="span-8 last"> - Hour: <select wicket:id="startHour"></select> Minute: <select - wicket:id="startMinute"></select> - </div> - <div class="span-6 last"> - <strong>Ending Time:</strong> - </div> - <div class="span-8 last"> - Hour: <select wicket:id="endHour"></select> Minute: <select - wicket:id="endMinute"></select> - </div> - - <div class="span-8 last"> - <strong>Presentation Language: </strong> - </div> - <div class="span-8 last"> - <select wicket:id="presentationLanguage"></select> - </div> - <div class="span-8 last"> - <strong>Thesis/Report Language: </strong> - </div> - <div class="span-8 last"> - <select wicket:id="reportLanguage"></select> - </div> - - <div class="span-6 last"> - <strong>Opponents (optional):</strong> - </div> - <div class="span-6 last" id="opponents"> - <div wicket:id="opponentList"></div> - </div> - <div class="span-6 last"> - <strong>Active Participants (Optional):</strong> - </div> - <div class="span-6 last" id="opponents"> - <div wicket:id="activeParticipations"></div> - </div> - <div class="span-6 last"> - <input type="submit" wicket:id="submitButton" /> - </div> + <div wicket:id="editSeminarDetails"></div> </form> </div> </div> diff --git a/src/main/java/se/su/dsv/scipro/opponent/panels/ProjectFinalSeminarPanel.java b/src/main/java/se/su/dsv/scipro/opponent/panels/ProjectFinalSeminarPanel.java index 887d4318ee..da03218eb8 100644 --- a/src/main/java/se/su/dsv/scipro/opponent/panels/ProjectFinalSeminarPanel.java +++ b/src/main/java/se/su/dsv/scipro/opponent/panels/ProjectFinalSeminarPanel.java @@ -1,26 +1,19 @@ package se.su.dsv.scipro.opponent.panels; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Calendar; import java.util.Date; -import java.util.Iterator; import java.util.List; 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.datetime.DateConverter; import org.apache.wicket.datetime.PatternDateConverter; import org.apache.wicket.datetime.markup.html.basic.DateLabel; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; -import org.apache.wicket.markup.html.basic.MultiLineLabel; import org.apache.wicket.markup.html.form.Button; -import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.SubmitLink; -import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.html.form.upload.FileUpload; import org.apache.wicket.markup.html.form.upload.FileUploadField; import org.apache.wicket.markup.html.link.Link; @@ -34,42 +27,24 @@ import org.apache.wicket.model.CompoundPropertyModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.spring.injection.annot.SpringBean; -import org.apache.wicket.util.convert.IConverter; import org.joda.time.DateTime; -import org.joda.time.format.DateTimeFormat; -import org.joda.time.format.DateTimeFormatter; -import org.odlabs.wiquery.ui.datepicker.DatePicker; import org.odlabs.wiquery.ui.dialog.Dialog; import se.su.dsv.scipro.SciProSession; -import se.su.dsv.scipro.components.autocomplete.AutoCompletionChoicesProvider; -import se.su.dsv.scipro.components.autocomplete.MultiObjectAutoCompleteObjectConverter; -import se.su.dsv.scipro.components.autocomplete.MultiObjectAutoCompleteRenderer; -import se.su.dsv.scipro.components.autocomplete.UserProjectMultiObjectAutoCompleteBuilder; -import se.su.dsv.scipro.components.autocomplete.UserProjectMultiObjectAutoCompleteField; import se.su.dsv.scipro.data.controllers.FinalSeminarUploadController; -import se.su.dsv.scipro.data.dao.interfaces.CheckPlagiarismEventDao; -import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarActiveParticipationDao; import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarDao; -import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarOppositionDao; import se.su.dsv.scipro.data.dao.interfaces.GeneralSystemSettingsDao; -import se.su.dsv.scipro.data.dao.interfaces.RoleDao; -import se.su.dsv.scipro.data.dao.interfaces.UserDao; import se.su.dsv.scipro.data.dataobjects.FileDescription; import se.su.dsv.scipro.data.dataobjects.FinalSeminar; import se.su.dsv.scipro.data.dataobjects.FinalSeminarActiveParticipation; import se.su.dsv.scipro.data.dataobjects.FinalSeminarOpposition; -import se.su.dsv.scipro.data.dataobjects.Project; -import se.su.dsv.scipro.data.dataobjects.Student; import se.su.dsv.scipro.data.dataobjects.User; -import se.su.dsv.scipro.data.enums.FinalSeminarLanguages; import se.su.dsv.scipro.icons.ImageIcon; import se.su.dsv.scipro.opponent.models.OpponentModel; import se.su.dsv.scipro.opponent.pages.TurnitinPopupPage; import se.su.dsv.scipro.project.pages.ProjectStartPage; import se.su.dsv.scipro.repository.components.FileDownloadLink; import se.su.dsv.scipro.repository.components.FileOpenLink; -import se.su.dsv.scipro.supervisor.pages.SupervisorProjectsFinalSeminarPage; import se.su.dsv.scipro.util.TurnitinComponent; public class ProjectFinalSeminarPanel extends Panel { @@ -80,66 +55,51 @@ public class ProjectFinalSeminarPanel extends Panel { @SpringBean private FinalSeminarDao finalSeminarDao; - @SpringBean - private FinalSeminarOppositionDao finalSeminarOppositionDao; - @SpringBean - private UserDao userDao; - - @SpringBean - private CheckPlagiarismEventDao checkPlagiarismEventDao; - @SpringBean private GeneralSystemSettingsDao generalSystemSettingsDao; - @SpringBean - private RoleDao roleDao; - - @SpringBean - private FinalSeminarActiveParticipationDao finalSeminarActiveParticipationDao; - private static final long serialVersionUID = 1L; private Date finalSubmissionDate; private FeedbackPanel feedbackPanel; - private WebMarkupContainer editSeminarDialogContainer, contactsDialogContainer; - private Dialog editSeminarDialog, contactsSeminarDialog; - private FinalSeminar editSeminar; - private DatePicker<Date> startDateField; - private DropDownChoice<String> startHour, startMinute, endHour, endMinute; - private UserProjectMultiObjectAutoCompleteField<FinalSeminarActiveParticipation, Long> moacf, - activeListerners; - private TextField<String> room; - private TextField<String> projectLabel; - private MultiLineLabel contactsTextArea; - private DropDownChoice<FinalSeminarLanguages> presentationLanguage; - private DropDownChoice<FinalSeminarLanguages> reportLanguage; + private WebMarkupContainer editSeminarDialogContainer; + private Dialog editSeminarDialog; + private EditSeminarForm editSeminarForm; - public ProjectFinalSeminarPanel(final String id, - final FinalSeminar seminar, final boolean isSupervisorView) { + public ProjectFinalSeminarPanel(final String id, final FinalSeminar seminar, + final boolean isSupervisorView) { super(id); setVersioned(false); - final PatternDateConverter pdc = new PatternDateConverter( - "yyyy-MM-dd HH:mm", false); + final PatternDateConverter pdc = new PatternDateConverter("yyyy-MM-dd HH:mm", false); EditForm editForm; add(editForm = new EditForm("editForm", seminar)); - + + editSeminarDialogContainer = new WebMarkupContainer("dialogContainer"); + editSeminarDialog = new Dialog("dialog"); + editSeminarDialog.setModal(true); + editSeminarDialog.setAutoOpen(false); + editSeminarDialog.setWidth(470); + editSeminarDialog.add(editSeminarDialogContainer); + add(editSeminarDialog); + editSeminarDialogContainer.setOutputMarkupId(true); + editSeminarDialogContainer.add(editSeminarForm = new EditSeminarForm("editSeminarForm")); + editSeminarForm.setOutputMarkupId(true); add(new Label("seminarLocation", seminar.getRoom())); - add(new Label("projectClass", seminar.getProject().getProjectClass() - .getName())); - add(new Label("seminarLanguage", seminar.getPresentationLanguage() - .toString())); + add(new Label("projectClass", seminar.getProject().getProjectClass().getName())); + add(new Label("seminarLanguage", seminar.getPresentationLanguage().toString())); add(new Label("thesisLanguage", seminar.getReportLanguage().toString())); if (!isSupervisorView) { editForm.setVisible(false); } - + Label pdfLabel = new Label("mustBePdf", " (PDF required)"); pdfLabel.setOutputMarkupPlaceholderTag(true); - pdfLabel.setVisible(generalSystemSettingsDao.getGeneralSystemSettingsInstance().isFinalSeminarThesisMustBeAPDF() &&!isSupervisorView); + pdfLabel.setVisible(generalSystemSettingsDao.getGeneralSystemSettingsInstance() + .isFinalSeminarThesisMustBeAPDF() && !isSupervisorView); add(pdfLabel); int totalAttendees = 1; totalAttendees += seminar.getActiveParticipations().size(); @@ -159,12 +119,9 @@ public class ProjectFinalSeminarPanel extends Panel { attendeesDialog.add(attendeesDialogContainer); add(attendeesDialog); + add(new FinalSeminarDetailsPanel("finalSeminarDetailsPanel", seminar, false)); - add(new FinalSeminarDetailsPanel("finalSeminarDetailsPanel", seminar, - false)); - - final AjaxLink<Void> totalAttendeesLink = new AjaxLink<Void>( - "totalAttendeesLink") { + final AjaxLink<Void> totalAttendeesLink = new AjaxLink<Void>("totalAttendeesLink") { private static final long serialVersionUID = 1L; @Override @@ -181,29 +138,17 @@ public class ProjectFinalSeminarPanel extends Panel { add(new Label("totalAttendees", String.valueOf(totalAttendees))); - // add(totalAttendeesLink); + add(new DateLabel("seminarDate", new Model<Date>(seminar.getStartDate()), pdc)); - add(new DateLabel("seminarDate", - new Model<Date>(seminar.getStartDate()), pdc)); - - add(new DateLabel("seminarEndDate", new Model<Date>( - seminar.getEndDate()), new PatternDateConverter("HH:mm", false))); + add(new DateLabel("seminarEndDate", new Model<Date>(seminar.getEndDate()), + new PatternDateConverter("HH:mm", false))); /* * Deadline -7 days removed, deadline is now the start-date of the * seminar */ - finalSubmissionDate = new DateTime(seminar.getStartDate()).minusDays(7) - .toDate(); + finalSubmissionDate = new DateTime(seminar.getStartDate()).minusDays(7).toDate(); + - editSeminarDialogContainer = new WebMarkupContainer("dialogContainer"); - editSeminarDialog = new Dialog("dialog"); - editSeminarDialog.setModal(true); - editSeminarDialog.setAutoOpen(false); - editSeminarDialog.setWidth(470); - editSeminarDialog.add(editSeminarDialogContainer); - add(editSeminarDialog); - editSeminarDialogContainer.setOutputMarkupId(true); - editSeminarDialogContainer.add(new EditSeminarForm("editSeminarForm")); add(new Label("seminarReportTitle", new Model<String>() { private static final long serialVersionUID = 1L; @@ -211,13 +156,11 @@ public class ProjectFinalSeminarPanel extends Panel { @Override public String getObject() { - return seminar.getDocument() == null ? "" : seminar - .getDocument().getName(); + return seminar.getDocument() == null ? "" : seminar.getDocument().getName(); } })); - final WebMarkupContainer uploadInfoContainer = new WebMarkupContainer( - "uploadInfoContainer") { + final WebMarkupContainer uploadInfoContainer = new WebMarkupContainer("uploadInfoContainer") { private static final long serialVersionUID = 1L; @Override @@ -226,12 +169,11 @@ public class ProjectFinalSeminarPanel extends Panel { } }; - uploadInfoContainer.add(new DateLabel("uploadDate", new Model<Date>( - seminar.getDocumentUploadDate()), pdc)); + uploadInfoContainer.add(new DateLabel("uploadDate", new Model<Date>(seminar + .getDocumentUploadDate()), pdc)); if (seminar.getDocumentUploader() != null) { - uploadInfoContainer.add(seminar.getDocumentUploader() - .getDisplayComponent("uploader")); + uploadInfoContainer.add(seminar.getDocumentUploader().getDisplayComponent("uploader")); } else { uploadInfoContainer.add(new EmptyPanel("uploader")); } @@ -250,7 +192,7 @@ public class ProjectFinalSeminarPanel extends Panel { public void onClick() { TurnitinComponent turnitin = new TurnitinComponent(); String url = turnitin.returnReport(seminar.getTurnitinId()); - if(url != null){ + if (url != null) { seminar.setCheckedForPlagirism(true); finalSeminarDao.save(seminar); } @@ -266,10 +208,8 @@ public class ProjectFinalSeminarPanel extends Panel { turnItLink.setVisible(isSupervisorView); } - uploadInfoContainer.add(new FileDownloadLink("download", seminar - .getDocument())); - uploadInfoContainer - .add(new FileOpenLink("open", seminar.getDocument())); + uploadInfoContainer.add(new FileDownloadLink("download", seminar.getDocument())); + uploadInfoContainer.add(new FileOpenLink("open", seminar.getDocument())); uploadInfoContainer.add(plagiarismLabel); uploadInfoContainer.add(turnItLink); uploadInfoContainer.add(checkPlagiarismLabel); @@ -280,9 +220,8 @@ public class ProjectFinalSeminarPanel extends Panel { @Override public boolean isVisible() { - return !isSupervisorView - && seminar.getActiveParticipations().isEmpty() - && seminar.getOppositions().isEmpty(); + return !isSupervisorView && seminar.getActiveParticipations().isEmpty() + && seminar.getOppositions().isEmpty() && seminar.getTurnitinId() != null; } @Override @@ -325,18 +264,13 @@ public class ProjectFinalSeminarPanel extends Panel { private static final long serialVersionUID = 1L; @Override + protected void populateItem(final ListItem<FileDescription> fileItem) { + fileItem.add(new Label("fileName", fileItem.getModelObject().getName())); + fileItem.add(new DateLabel("uploadDate", new Model<Date>(o + .getDateReported()), pdc)); - protected void populateItem( - final ListItem<FileDescription> fileItem) { - fileItem.add(new Label("fileName", fileItem - .getModelObject().getName())); - fileItem.add(new DateLabel("uploadDate", - new Model<Date>(o.getDateReported()), pdc)); - - fileItem.add(new FileDownloadLink("download", fileItem - .getModel())); - fileItem.add(new FileOpenLink("open", fileItem - .getModel())); + fileItem.add(new FileDownloadLink("download", fileItem.getModel())); + fileItem.add(new FileOpenLink("open", fileItem.getModel())); } }); @@ -354,13 +288,12 @@ public class ProjectFinalSeminarPanel extends Panel { } }); - add(new ListView<FinalSeminarActiveParticipation>( - "activeParticipantsList", seminar.getActiveParticipations()) { + add(new ListView<FinalSeminarActiveParticipation>("activeParticipantsList", + seminar.getActiveParticipations()) { private static final long serialVersionUID = 1L; @Override - protected void populateItem( - ListItem<FinalSeminarActiveParticipation> item) { + protected void populateItem(ListItem<FinalSeminarActiveParticipation> item) { item.add(item.getModelObject().getUser() .getDisplayComponent("activeParticipant", true)); add(item); @@ -432,8 +365,7 @@ public class ProjectFinalSeminarPanel extends Panel { * TODO Fix so that feedback shows up correctly */ - public SeminarDocumentUploadForm(final String id, - final FinalSeminar seminar) { + public SeminarDocumentUploadForm(final String id, final FinalSeminar seminar) { super(id); setMultiPart(true); @@ -463,6 +395,20 @@ public class ProjectFinalSeminarPanel extends Panel { } } + private class EditSeminarForm extends Form<OpponentModel> { + + /** + * + */ + private static final long serialVersionUID = -5004827722926732419L; + + public EditSeminarForm(String name) { + super(name, new CompoundPropertyModel<OpponentModel>(new OpponentModel())); + editSeminarDialog.setTitle("Edit Seminar"); + add(new EmptyPanel("editSeminarDetails")); + } + } + private class EditForm extends Form<Void> { /** @@ -480,69 +426,9 @@ public class ProjectFinalSeminarPanel extends Panel { @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { FinalSeminar seminar2 = finalSeminarDao.reLoad(seminar); - editSeminar = seminar2; - startDateField.setDefaultModelObject(seminar2 - .getStartDate()); - Calendar calendar = Calendar.getInstance(); - calendar.setTime(seminar2.getStartDate()); - int hourInt = calendar.get(Calendar.HOUR_OF_DAY); - String hourString = ""; - if (hourInt < 10) { - hourString = "0" + String.valueOf(hourInt); - } else { - hourString = String.valueOf(hourInt); - } - startHour.setDefaultModelObject(hourString); - - int minuteInt = calendar.get(Calendar.MINUTE); - String minuteString = ""; - if (minuteInt < 10) { - minuteString = "0" + String.valueOf(minuteInt); - } else { - minuteString = String.valueOf(minuteInt); - } - - startMinute.setDefaultModelObject(minuteString); - - calendar.setTime(seminar2.getEndDate()); - hourInt = calendar.get(Calendar.HOUR_OF_DAY); - hourString = ""; - if (hourInt < 10) { - hourString = "0" + String.valueOf(hourInt); - } else { - hourString = String.valueOf(hourInt); - } - endHour.setDefaultModelObject(hourString); - - minuteInt = calendar.get(Calendar.MINUTE); - minuteString = ""; - if (minuteInt < 10) { - minuteString = "0" + String.valueOf(minuteInt); - } else { - minuteString = String.valueOf(minuteInt); - } - - endMinute.setDefaultModelObject(minuteString); - room.setDefaultModelObject(seminar2.getRoom()); - List<FinalSeminarActiveParticipation> userList = new ArrayList<FinalSeminarActiveParticipation>(); - for (FinalSeminarOpposition f : seminar2.getOppositions()) { - FinalSeminarActiveParticipation al = new FinalSeminarActiveParticipation(); - al.setUser(f.getOpponent().getUser()); - al.setProject(f.getProject()); - userList.add(al); - } - - - presentationLanguage.setDefaultModelObject(seminar - .getPresentationLanguage()); - reportLanguage.setDefaultModelObject(seminar - .getReportLanguage()); - - moacf.setSelectedObjects(userList); - - activeListerners.setSelectedObjects(seminar2.getActiveParticipations()); - projectLabel.setDefaultModelObject(seminar.getProject().getTitle()); - target.addComponent(editSeminarDialog); + editSeminarForm.removeAll(); + editSeminarForm.add(new EditFinalSeminarFormPanel("editSeminarDetails", seminar2)); + target.addComponent(editSeminarForm); editSeminarDialog.open(target); } @@ -556,267 +442,6 @@ public class ProjectFinalSeminarPanel extends Panel { } } - private class EditSeminarForm extends Form<OpponentModel> { - - private static final long serialVersionUID = -5268957422910135323L; - - public EditSeminarForm(String name) { - super(name, new CompoundPropertyModel<OpponentModel>(new OpponentModel())); - // final WebMarkupContainer feedbackContainer = new - // WebMarkupContainer( - // "feedbackContainer"); - // feedbackContainer.setOutputMarkupId(true); - // WebMarkupContainer feedbackPanel = new - // FormFeedbackPanel<OpponentModel>( - // "feedbackPanel", this); - // feedbackContainer.add(feedbackPanel); - // add(feedbackContainer); - add(feedbackPanel = new FeedbackPanel("feedbackPanel")); - feedbackPanel.setOutputMarkupId(true); - editSeminarDialog.setTitle("Edit Seminar"); - - add(projectLabel = new TextField<String>("project")); - projectLabel.setEnabled(false); - - startDateField = new DatePicker<Date>("date") { - - private static final long serialVersionUID = 1L; - - @Override - public final IConverter getConverter(Class<?> type) { - return new DateConverter(true) { - private static final long serialVersionUID = 1L; - - @Override - public String getDatePattern() { - return "yy-dd-mm"; - } - - @Override - protected DateTimeFormatter getFormat() { - return DateTimeFormat.forPattern("YYYY-MM-dd"); - } - }; - } - }; - startDateField.setDateFormat("yy-mm-dd"); - startDateField.setRequired(true); - // startDateField.setShowOn(ShowOnEnum.BOTH); - // startDateField.setButtonText("<div class=\"ui-icon ui-icon-calendar\"></div>"); - add(room = new TextField<String>("room")); - add(startDateField); - - startHour = new DropDownChoice<String>("startHour", Arrays.asList(new String[] { "00", - "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", - "14", "15", "16", "17", "18", "19", "20", "21", "22", "23" })); - add(startHour); - startHour.setRequired(false); - startMinute = new DropDownChoice<String>("startMinute", Arrays.asList(new String[] { - "00", "05", "10", "15", "20", "25", "30", "35", "40", "45", "50", "55" })); - add(startMinute); - - endHour = new DropDownChoice<String>("endHour", Arrays.asList(new String[] { "00", - "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", - "14", "15", "16", "17", "18", "19", "20", "21", "22", "23" })); - add(endHour); - endHour.setRequired(false); - endMinute = new DropDownChoice<String>("endMinute", Arrays.asList(new String[] { "00", - "05", "10", "15", "20", "25", "30", "35", "40", "45", "50", "55" })); - add(endMinute); - - List<FinalSeminarLanguages> languageOptions = new ArrayList<FinalSeminarLanguages>( - Arrays.asList(FinalSeminarLanguages.values())); - - presentationLanguage = new DropDownChoice<FinalSeminarLanguages>( - "presentationLanguage", languageOptions); - add(presentationLanguage); - presentationLanguage.setRequired(true); - - - reportLanguage = new DropDownChoice<FinalSeminarLanguages>( - "reportLanguage", languageOptions); - - add(reportLanguage); - reportLanguage.setRequired(true); - - room.setRequired(true); - - AutoCompletionChoicesProvider<FinalSeminarActiveParticipation> choiceProvider = new AutoCompletionChoicesProvider<FinalSeminarActiveParticipation>() { - - @Override - public Iterator<FinalSeminarActiveParticipation> getChoices( - String input) { - // TODO Auto-generated method stub - List<FinalSeminarActiveParticipation> active = new ArrayList<FinalSeminarActiveParticipation>(); - for (User user : userDao.findUserQuery(input, 10)) { - FinalSeminarActiveParticipation ac = new FinalSeminarActiveParticipation(); - ac.setUser(user); - active.add(ac); - } - return active.iterator(); - } - }; - - UserProjectMultiObjectAutoCompleteBuilder<FinalSeminarActiveParticipation, Long> moac = new UserProjectMultiObjectAutoCompleteBuilder<FinalSeminarActiveParticipation, Long>( - choiceProvider); - moac.idType(Long.class); - moac.autoCompleteRenderer(new MultiObjectAutoCompleteRenderer<FinalSeminarActiveParticipation>() { - @Override - public String getTextValue(FinalSeminarActiveParticipation al) { - User u = al.getUser(); - return u.getFirstName() + " " + u.getLastName() + " <" + u.getEmailAddress() - + ">"; - } - - protected String getIdValue(FinalSeminarActiveParticipation al) { - User u = al.getUser(); - return u.getId().toString(); - } - }); - - moac.objectConverter(new MultiObjectAutoCompleteObjectConverter<Long, FinalSeminarActiveParticipation>() { - - @Override - public FinalSeminarActiveParticipation convertToObject(Long id) { - FinalSeminarActiveParticipation ac = new FinalSeminarActiveParticipation(); - ac.setUser(userDao.load(id)); - return ac; - } - }); - - moacf = moac.build("opponentList", null, getModelObject()); - activeListerners = moac.build("activeParticipations", null, getModelObject()); - add(moacf); - add(activeListerners); - - add(new AjaxButton("submitButton", new Model<String>("Save")) { - - @Override - protected void onSubmit(AjaxRequestTarget target, Form<?> form) { - editSeminar = finalSeminarDao.reLoad(editSeminar); - OpponentModel opponentModel = (OpponentModel) form.getDefaultModelObject(); - boolean notSameProject = true; - boolean error = false; - Project project = editSeminar.getProject(); - for (Student student : project.getProjectParticipants()) { - if (!notSameProject) - break; - for (FinalSeminarActiveParticipation al : opponentModel.getOpponentList()) { - if (student.getUser().equals(al.getUser()) && !al.isPreDeleted()) { - notSameProject = false; - break; - } - } - for (FinalSeminarActiveParticipation al : opponentModel - .getActiveParticipations()) { - if (student.getUser().equals(al.getUser()) && !al.isPreDeleted()) { - notSameProject = false; - break; - } - } - } - for (FinalSeminarActiveParticipation al : opponentModel - .getOpponentList()) { - if (al.getProject() == null && !al.isPreDeleted()) { - error = true; - break; - } - } - if (!error) { - for (FinalSeminarActiveParticipation al : opponentModel - .getActiveParticipations()) { - if (al.getProject() == null && !al.isPreDeleted()) { - error = true; - break; - } - } - } - - if (notSameProject && !error) { - - Date date = opponentModel.getDate(); - Calendar cal = Calendar.getInstance(); - cal.setTime(date); - cal.set(Calendar.HOUR_OF_DAY, Integer.valueOf(opponentModel.getStartHour())); - cal.set(Calendar.MINUTE, Integer.valueOf(opponentModel.getStartMinute())); - - editSeminar.setStartDate(cal.getTime()); - - cal.set(Calendar.HOUR_OF_DAY, Integer.valueOf(opponentModel.getEndHour())); - cal.set(Calendar.MINUTE, Integer.valueOf(opponentModel.getEndMinute())); - editSeminar.setEndDate(cal.getTime()); - - editSeminar.setProject(project); - editSeminar.setRoom(opponentModel.getRoom()); - - - editSeminar.setPresentationLanguage(opponentModel - .getPresentationLanguage()); - editSeminar.setReportLanguage(opponentModel - .getReportLanguage()); - - editSeminar = finalSeminarDao.save(editSeminar); - - for (FinalSeminarActiveParticipation al : opponentModel - .getOpponentList()) { - - if (!al.isPreDeleted()) { - FinalSeminarOpposition opposition1 = new FinalSeminarOpposition(); - opposition1.setOpponent(roleDao.makeStudent(al - .getUser())); - opposition1.setProject(al.getProject()); - opposition1.setFinalSeminar(editSeminar); - opposition1 = finalSeminarOppositionDao - .save(opposition1); - } else if (al.isPreDeleted()) { - List<FinalSeminarOpposition> finalSeminar = finalSeminarOppositionDao - .findOppositionsByUserAndProject( - al.getUser(), al.getProject(), - editSeminar); - for (FinalSeminarOpposition fso : finalSeminar) { - seminarUploadController.deleteOpponentFiles(fso); - finalSeminarOppositionDao.delete(fso); - } - } - - } - - for (FinalSeminarActiveParticipation al : opponentModel - .getActiveParticipations()) { - editSeminar = finalSeminarDao.reLoad(editSeminar); - List<FinalSeminarActiveParticipation> allList = editSeminar - .getActiveParticipations(); - if (!allList.contains(al) && !al.isPreDeleted()) { - al.setFinalSeminar(editSeminar); - finalSeminarActiveParticipationDao.save(al); - - } else if (al.isPreDeleted() - && allList.contains(al)) { - finalSeminarActiveParticipationDao - .delete(finalSeminarActiveParticipationDao - .reLoad(al)); - } - - } - - setResponsePage(SupervisorProjectsFinalSeminarPage.class); - } else if (!notSameProject && error) { - error("Opponent/Active participant is an author in the final seminar"); - error("Must select a Project for the Opponent/Active participant"); - } else if (notSameProject && error) { - error("Must select a Project for the Opponent/Active participant"); - } else { - error("Opponent/Active participant is an author in the final seminar"); - } - } - - @Override - protected void onError(final AjaxRequestTarget target, final Form form) { - target.addComponent(feedbackPanel); - } - }); - - } - } + } diff --git a/src/main/java/se/su/dsv/scipro/opponent/panels/ProjectOppositionsPanel.java b/src/main/java/se/su/dsv/scipro/opponent/panels/ProjectOppositionsPanel.java index ff89049097..bdfb4bd17d 100644 --- a/src/main/java/se/su/dsv/scipro/opponent/panels/ProjectOppositionsPanel.java +++ b/src/main/java/se/su/dsv/scipro/opponent/panels/ProjectOppositionsPanel.java @@ -30,7 +30,6 @@ import se.su.dsv.scipro.data.dataobjects.Project; import se.su.dsv.scipro.data.dataobjects.Student; import se.su.dsv.scipro.data.dataobjects.User; import se.su.dsv.scipro.project.pages.ProjectOppositionPage; -import se.su.dsv.scipro.repository.FileRepository; import se.su.dsv.scipro.repository.components.FileDownloadLink; import se.su.dsv.scipro.repository.components.FileOpenLink; @@ -41,9 +40,6 @@ public class ProjectOppositionsPanel extends Panel { @SpringBean private FinalSeminarOppositionDao finalSeminarOppositionDao; - @SpringBean - private FileRepository fileRepository; - @SpringBean private FinalSeminarUploadController seminarUploadController; diff --git a/src/main/java/se/su/dsv/scipro/opponent/panels/StudentOppositionStatsPanel.java b/src/main/java/se/su/dsv/scipro/opponent/panels/StudentOppositionStatsPanel.java index a3fb56954d..4b5cc75f00 100644 --- a/src/main/java/se/su/dsv/scipro/opponent/panels/StudentOppositionStatsPanel.java +++ b/src/main/java/se/su/dsv/scipro/opponent/panels/StudentOppositionStatsPanel.java @@ -24,7 +24,6 @@ import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarActiveParticipationDao; import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarOppositionDao; import se.su.dsv.scipro.data.dao.interfaces.ProjectDao; import se.su.dsv.scipro.data.dataobjects.Employee; -import se.su.dsv.scipro.data.dataobjects.FinalSeminarOpposition; import se.su.dsv.scipro.data.dataobjects.Project; import se.su.dsv.scipro.data.dataobjects.Student; import se.su.dsv.scipro.data.dataobjects.User; diff --git a/src/main/java/se/su/dsv/scipro/peer/data/dao/controllers/PeerPortalControllerImpl.java b/src/main/java/se/su/dsv/scipro/peer/data/dao/controllers/PeerPortalControllerImpl.java index 181b0f1b05..717f91afc0 100644 --- a/src/main/java/se/su/dsv/scipro/peer/data/dao/controllers/PeerPortalControllerImpl.java +++ b/src/main/java/se/su/dsv/scipro/peer/data/dao/controllers/PeerPortalControllerImpl.java @@ -5,6 +5,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.List; +import java.util.Properties; import org.apache.log4j.Level; import org.apache.log4j.Logger; @@ -17,7 +18,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.transaction.annotation.Transactional; +import se.su.dsv.scipro.conference.pages.SupervisorConferencePage; import se.su.dsv.scipro.data.controllers.NotificationController; +import se.su.dsv.scipro.data.controllers.NotificationMessage; import se.su.dsv.scipro.data.dao.interfaces.FileDescriptionDao; import se.su.dsv.scipro.data.dao.interfaces.ProjectDao; import se.su.dsv.scipro.data.dataobjects.FileDescription; @@ -27,6 +30,7 @@ import se.su.dsv.scipro.data.dataobjects.ProjectClassSettings; import se.su.dsv.scipro.data.dataobjects.Student; import se.su.dsv.scipro.data.dataobjects.User; import se.su.dsv.scipro.data.enums.NotificationEventType; +import se.su.dsv.scipro.data.enums.NotificationPriority; import se.su.dsv.scipro.exceptions.UpdatedSincePageLoadException; import se.su.dsv.scipro.peer.data.dao.interfaces.PeerRequestDao; import se.su.dsv.scipro.peer.data.dao.interfaces.PeerReviewDao; @@ -34,309 +38,381 @@ import se.su.dsv.scipro.peer.data.dataobjects.PeerRequest; import se.su.dsv.scipro.peer.data.dataobjects.PeerReview; import se.su.dsv.scipro.peer.enums.RequestStatus; import se.su.dsv.scipro.peer.pages.ProjectPeerReviewPage; +import se.su.dsv.scipro.peer.pages.ProjectPeerStatsPage; import se.su.dsv.scipro.peer.pages.SupervisorPeerReviewPage; import se.su.dsv.scipro.repository.FileRepository; import se.su.dsv.scipro.repository.util.FileStorageException; import se.su.dsv.scipro.security.auth.roles.Roles; +import se.su.dsv.scipro.util.PropsUtils; + /** * * @author Martin Peters - mpeters@dsv.su.se - * + * */ @Controller("peerPortalController") public class PeerPortalControllerImpl implements PeerPortalController { private static final long serialVersionUID = 1L; - + public static final String PEER_FILE_PATH = "peer/"; public static final String PEER_REQUEST_PATH = PEER_FILE_PATH + "request/"; public static final String PEER_REVIEW_PATH = PEER_FILE_PATH + "review/"; - + @Autowired private PeerRequestDao peerRequestDao; - + @Autowired private PeerReviewDao peerReviewDao; - + @Autowired private FileRepository fileRepository; - + @Autowired private FileDescriptionDao fileDescriptionDao; - + @Autowired private ProjectDao projectDao; - + @Autowired private NotificationController notificationController; - + /** - * Gets a list of PeerRequests and if it is reviewable by the combination of Student + Project. All input parameters are optional - * @param projectClass may be null. - * @param project may be null. - * @param student may be null. + * Gets a list of PeerRequests and if it is reviewable by the combination of + * Student + Project. All input parameters are optional + * + * @param projectClass + * may be null. + * @param project + * may be null. + * @param student + * may be null. * @return */ @Override @Transactional - public List<Tuple> getPeerRequests(final ProjectClass projectClass, final Project project, final Student student){ - //TODO how to handle project with ProjectClass = UNKNOWN? - - List<PeerRequest> temp = peerRequestDao.getPeerRequests(RequestStatus.WAITING, projectClass ); + public List<Tuple> getPeerRequests(final ProjectClass projectClass, final Project project, + final Student student) { + // TODO how to handle project with ProjectClass = UNKNOWN? + + List<PeerRequest> temp = peerRequestDao + .getPeerRequests(RequestStatus.WAITING, projectClass); List<Tuple> result = new ArrayList<Tuple>(temp.size()); - + ProjectClassSettings settings = projectClass.getProjectClassSettings(); - Date priorityDate = new DateTime().minusDays( settings.getNumDaysBeforePeerRequestPriority() ).toDate(); + Date priorityDate = new DateTime() + .minusDays(settings.getNumDaysBeforePeerRequestPriority()).toDate(); boolean foundExpiredPriorityDate = false; - - for(PeerRequest peerRequest : temp){ + + for (PeerRequest peerRequest : temp) { Student requestingStudent = peerRequest.getRequester(); Project requestingProject = peerRequest.getProject(); int given = peerReviewDao.countReviewsGiven(requestingStudent, requestingProject); int received = peerReviewDao.countReviewsReceived(requestingStudent, requestingProject); - Pair<Boolean,NotReviewableReason> pair = this.isReviewableTo(peerRequest, student, project); //Checks basics reviewable rules + Pair<Boolean, NotReviewableReason> pair = this.isReviewableTo(peerRequest, student, + project); // Checks basics reviewable rules NotReviewableReason notReviewableReason = pair.tail; boolean isReviewable = pair.head; - if( isReviewable ){ //If it's reviewable at all do following: + if (isReviewable) { // If it's reviewable at all do following: /* - * Reviews come sorted, oldest first. If it's older than priorityDate, flag that we've found - * one that's "expired". + * Reviews come sorted, oldest first. If it's older than + * priorityDate, flag that we've found one that's "expired". */ - boolean reviewOlderThanPriorityDate = priorityDate.compareTo( peerRequest.getDateCreated() ) > 0; - if( reviewOlderThanPriorityDate ) { + boolean reviewOlderThanPriorityDate = priorityDate.compareTo(peerRequest + .getDateCreated()) > 0; + if (reviewOlderThanPriorityDate) { foundExpiredPriorityDate = true; } - if( foundExpiredPriorityDate ){ + if (foundExpiredPriorityDate) { /* - * If we've found something expired, make only those also older than expiration-date - * reviewable. + * If we've found something expired, make only those also + * older than expiration-date reviewable. */ isReviewable = reviewOlderThanPriorityDate; notReviewableReason = NotReviewableReason.OTHERS_PAST_PRIORITY_AGE; } - if( (given - received > 0) ) { + if ((given - received > 0)) { /* - * ..except those with good ratio, they are reviewable any time + * ..except those with good ratio, they are reviewable any + * time */ isReviewable = true; notReviewableReason = null; } } - result.add(new Tuple(peerRequest, isReviewable , given, received, notReviewableReason)); + result.add(new Tuple(peerRequest, isReviewable, given, received, notReviewableReason)); } - + Collections.sort(result, new Comparator<Tuple>() { @Override public int compare(Tuple t1, Tuple t2) { - if( t1.isReviewable == t2.isReviewable ) //If equal, present oldest first - return t1.peerRequest.getDateCreated().compareTo( t2.peerRequest.getDateCreated() ); - if( t1.isReviewable ) //If unequal, present those that are reviewable first + if (t1.isReviewable == t2.isReviewable) // If equal, present + // oldest first + return t1.peerRequest.getDateCreated().compareTo( + t2.peerRequest.getDateCreated()); + if (t1.isReviewable) // If unequal, present those that are + // reviewable first return -1; else return 1; - } + } }); - + return result; } /** - * Checks for "basic reviewability". Does not take into account the more complex rule that looks at all other available requests + * Checks for "basic reviewability". Does not take into account the more + * complex rule that looks at all other available requests */ @Override @Transactional - public Pair<Boolean,NotReviewableReason> isReviewableTo(final PeerRequest peerRequest, final Student student, final Project activeProject){ - if( student == null || activeProject == null || peerRequest == null ) - return new Pair<Boolean,NotReviewableReason>(false,NotReviewableReason.YOU_ARE_SUPERVISOR); + public Pair<Boolean, NotReviewableReason> isReviewableTo(final PeerRequest peerRequest, + final Student student, final Project activeProject) { + if (student == null || activeProject == null || peerRequest == null) + return new Pair<Boolean, NotReviewableReason>(false, + NotReviewableReason.YOU_ARE_SUPERVISOR); final Project requestingProject = peerRequest.getProject(); final ProjectClass requestingProjectClass = requestingProject.getProjectClass(); final ProjectClass reviewingProjectClass = activeProject.getProjectClass(); /* - * You may not review something in a different ProjectClass, current page design prevents this from - * happening but it's a cheap safeguard. + * You may not review something in a different ProjectClass, current + * page design prevents this from happening but it's a cheap safeguard. */ - if( !requestingProjectClass.equals(reviewingProjectClass) ) - return new Pair<Boolean,NotReviewableReason>(false,NotReviewableReason.DIFFERENT_PROJECTCLASS); - //You may not review something you're part of! - if( projectDao.isPartOf(student.getUser(), requestingProject ) ) - return new Pair<Boolean,NotReviewableReason>(false,NotReviewableReason.PART_OF_PROJECT); - + if (!requestingProjectClass.equals(reviewingProjectClass)) + return new Pair<Boolean, NotReviewableReason>(false, + NotReviewableReason.DIFFERENT_PROJECTCLASS); + // You may not review something you're part of! + if (projectDao.isPartOf(student.getUser(), requestingProject)) + return new Pair<Boolean, NotReviewableReason>(false, + NotReviewableReason.PART_OF_PROJECT); + /* - * This last section handles reviews performed previously by the student on the same - * requesting project and makes sure you cannot accept reviews within a certain time frame - * after having done one. + * This last section handles reviews performed previously by the student + * on the same requesting project and makes sure you cannot accept + * reviews within a certain time frame after having done one. * - * Using getLastModified is potentially "risky" since this might get updated for reasons other - * than one's that should prohibit re-reviewing, thus preventing reviews that should be allowed. + * Using getLastModified is potentially "risky" since this might get + * updated for reasons other than one's that should prohibit + * re-reviewing, thus preventing reviews that should be allowed. */ ProjectClassSettings settings = requestingProjectClass.getProjectClassSettings(); int daysBetweenReviewsOnSameProject = settings.getNumDaysBetweenPeerReviewsOnSameProject(); DateTime earliestPermissibleDateSinceReview = new DateTime(); - earliestPermissibleDateSinceReview = earliestPermissibleDateSinceReview.minusDays(daysBetweenReviewsOnSameProject); - - List<PeerReview> performedReviews = peerReviewDao.findPeerReviewsByStudentAndProject(student, activeProject); - for(PeerReview pr : performedReviews){ + earliestPermissibleDateSinceReview = earliestPermissibleDateSinceReview + .minusDays(daysBetweenReviewsOnSameProject); + + List<PeerReview> performedReviews = peerReviewDao.findPeerReviewsByStudentAndProject( + student, activeProject); + for (PeerReview pr : performedReviews) { boolean sameProject = pr.getPeerRequest().getProject().equals(requestingProject); - if( sameProject ){ - boolean reviewPerformedBeforeLimit = pr.getLastModified().compareTo( earliestPermissibleDateSinceReview.toDate() ) > 0; - if( reviewPerformedBeforeLimit ){ - return new Pair<Boolean,NotReviewableReason>(false,NotReviewableReason.RECENTLY_REVIEWED); + if (sameProject) { + boolean reviewPerformedBeforeLimit = pr.getLastModified().compareTo( + earliestPermissibleDateSinceReview.toDate()) > 0; + if (reviewPerformedBeforeLimit) { + return new Pair<Boolean, NotReviewableReason>(false, + NotReviewableReason.RECENTLY_REVIEWED); } } - } - - return new Pair<Boolean,NotReviewableReason>(true,null); + } + + return new Pair<Boolean, NotReviewableReason>(true, null); } - + @Override @Transactional - public PeerReview acceptReview(PeerRequest request, Student student, Project project) throws Exception, UpdatedSincePageLoadException { - + public PeerReview acceptReview(PeerRequest request, Student student, Project project) + throws Exception, UpdatedSincePageLoadException { + request = peerRequestDao.reLoad(request); - - if(request.getStatus() != RequestStatus.WAITING){ + + if (request.getStatus() != RequestStatus.WAITING) { throw new UpdatedSincePageLoadException("Peer request taken since page loaded"); } - + PeerReview review = new PeerReview(); - + try { - //Save the review + // Save the review review.setPeerRequest(request); review.setProject(project); review.setReviewer(student); review = peerReviewDao.save(review); - - //Update request status + + // Update request status request.setStatus(RequestStatus.TAKEN); request = peerRequestDao.save(request); - - //Notify the requester + + // Notify the requester notifyAcceptOfReview(request, student, project); - + return review; - } catch (Exception e){ - Logger.getRootLogger().log(Level.ERROR, "Error while accepting peer request: " + e.getMessage()); - if(review.getId() != null){ - //Something must have gone wrong while updating request status + } catch (Exception e) { + Logger.getRootLogger().log(Level.ERROR, + "Error while accepting peer request: " + e.getMessage()); + if (review.getId() != null) { + // Something must have gone wrong while updating request status review = peerReviewDao.reLoad(review); peerReviewDao.delete(review); } - if(request.getStatus() != RequestStatus.WAITING){ - //reset status + if (request.getStatus() != RequestStatus.WAITING) { + // reset status request.setStatus(RequestStatus.WAITING); peerRequestDao.save(request); } throw e; } } - + /** * TODO Rewrite using template engine of some sort + * * @param request * @param student * @param project */ - protected void notifyAcceptOfReview(PeerRequest request, Student student, Project project){ - try{ + protected void notifyAcceptOfReview(PeerRequest request, Student student, Project project) { + try { + Properties props = null; + + props = PropsUtils.load("notification.properties"); + + String mailSubject = props.getProperty("acceptPeerReviewSubject"); + String requestAccepted = props.getProperty("requestAccepted"); + String heShe = props.getProperty("heShe"); + String complete = props.getProperty("complete"); + User requestingUser = request.getRequester().getUser(); + + String messageBody = requestAccepted + + student.getUser().toString() + + heShe + + project.getProjectClass().getProjectClassSettings() + .getNumDaysToSubmitPeerReview() + complete; - String subject = "Your request for peer-review has been accepted"; - - String messageBody = "Hello "+requestingUser.getFirstName()+",\n\n"+ - "Your request was accepted by "+student.getUser().toString()+", he/she now has "+ - project.getProjectClass().getProjectClassSettings().getNumDaysToSubmitPeerReview()+" days to complete a review."+ - "\n\nThis is an auto-generated message from SciPro"; - - notificationController.processSystemNotification(requestingUser, Roles.STUDENT, subject, messageBody, NotificationEventType.PEER_REVIEW_ACCEPTED); - } - catch( Exception e ){ + String webNotificationMessage = requestAccepted + student.getUser().toString(); + + NotificationMessage notificationMessage = new NotificationMessage(webNotificationMessage, + mailSubject, messageBody); + + PageParameters pp = new PageParameters(); + + String peerStatsUrl = RequestUtils.toAbsolutePath(RequestCycle.get() + .urlFor(ProjectPeerStatsPage.class, pp).toString()); + + notificationController.processNotification(requestingUser, notificationMessage, + peerStatsUrl, NotificationPriority.MEDIUM); + } catch (Exception e) { e.printStackTrace(); } } + /** * TODO Rewrite + * * @param review */ public void notifyCompletionOfReview(PeerReview review) { - try{ + try { + + Properties props = null; + props = PropsUtils.load("notification.properties"); + String mailSubject = props.getProperty("completedReviewSubject"); + String requestReviewed = props.getProperty("requestReviewed"); + String supervisorMessageBody = props.getProperty("supervisorMessageBody"); + String supervisorMessageBody2 = props.getProperty("supervisorMessageBody2"); + String supervisorMessageBody3 = props.getProperty("supervisorMessageBody3"); + String commaWithLinebreak = props.getProperty("commaWithLinebreak"); + String inProject = props.getProperty("inProject"); + String hasPerformed = props.getProperty("hasPerformed"); PeerRequest peerRequest = review.getPeerRequest(); User requestingUser = peerRequest.getRequester().getUser(); - - String messageFooter = "\n\nThis is an auto-generated message from SciPro"; - + PageParameters pp = new PageParameters(); pp.add(PeerReview.PP_PEER_REVIEW_ID, review.getId().toString()); - String projectReviewUrl = RequestUtils.toAbsolutePath( - RequestCycle.get().urlFor(ProjectPeerReviewPage.class, pp).toString()); - String supervisorReviewUrl = RequestUtils.toAbsolutePath( - RequestCycle.get().urlFor(SupervisorPeerReviewPage.class, pp).toString()); + + String reviewUrl = RequestUtils.toAbsolutePath(RequestCycle.get() + .urlFor(ProjectPeerReviewPage.class, pp).toString()); + String supervisorReviewUrl = RequestUtils.toAbsolutePath(RequestCycle.get() + .urlFor(SupervisorPeerReviewPage.class, pp).toString()); + + //Message for student when his/her review request is completed. + String messageBody = requestReviewed; + + NotificationMessage notificationMessage = new NotificationMessage(messageBody, + mailSubject, messageBody); + + notificationController.processNotification(requestingUser, notificationMessage, + reviewUrl, NotificationPriority.MEDIUM); - - String subject = "A peer review has been completed!"; - - String messageBody = "Hello "+requestingUser.getFirstName()+",\n\n"+ - "Your request has now been reviewed and is available here:\n"+ - projectReviewUrl+ - messageFooter; - - notificationController.processSystemNotification(requestingUser, Roles.STUDENT, subject, messageBody, NotificationEventType.PEER_REVIEW_RATED); - - messageBody = "Hello "+peerRequest.getProject().getHeadSupervisor().getUser().getFirstName()+",\n\n"+ - "You're getting this message because you are supervisor of \""+peerRequest.getProject().getTitle()+"\"."+ - "\nA peer review on this project has been completed and is available for you to read here:\n"+ - supervisorReviewUrl+ - messageFooter; + //Message for supervisor of the project with a completed review. + messageBody = + supervisorMessageBody + + peerRequest.getProject().getTitle() + + supervisorMessageBody2; User requestSupervisor = peerRequest.getProject().getHeadSupervisor().getUser(); - notificationController.processSystemNotification(requestSupervisor, Roles.EMPLOYEE, subject, messageBody, NotificationEventType.PEER_REVIEW_RATED); + + NotificationMessage notificationMessageSupervisorOfProject = new NotificationMessage(messageBody, + mailSubject, messageBody); - messageBody = "Hello "+review.getProject().getHeadSupervisor().getUser().getFirstName()+",\n\n"+ - "You receive this message because you are supervisor of \""+review.getProject().getTitle()+"\".\n"+ - review.getReviewer().getUser().toString()+" has performed a peer review on someone elses work which is available for you to read here:\n"+ - supervisorReviewUrl+ - messageFooter; + notificationController.processNotification(requestSupervisor, + notificationMessageSupervisorOfProject, supervisorReviewUrl, NotificationPriority.MEDIUM); + + //Message for supervisor of the reviewer that have made a review for another project. + + String webNotificationMessage = review.getReviewer().getUser().toString() + inProject + review.getProject().getTitle() + hasPerformed; + + messageBody = supervisorMessageBody + + review.getProject().getTitle() + + commaWithLinebreak + review.getReviewer().getUser().toString() + + supervisorMessageBody3; + User reviewSupervisor = review.getProject().getHeadSupervisor().getUser(); - notificationController.processSystemNotification(reviewSupervisor, Roles.EMPLOYEE, subject, messageBody, NotificationEventType.PEER_REVIEW_RATED); + NotificationMessage notificationMessageSupervisorOfReviewer = new NotificationMessage(webNotificationMessage, + mailSubject, messageBody); - } - catch( Exception e ){ + notificationController.processNotification(reviewSupervisor, notificationMessageSupervisorOfReviewer, supervisorReviewUrl, NotificationPriority.MEDIUM); + + } catch (Exception e) { e.printStackTrace(); } } + /** * TODO Rewrite + * * @param review */ public void notifyOfReviewRating(PeerReview review) { - try{ + try { + Properties props = null; + props = PropsUtils.load("notification.properties"); + String mailSubject = props.getProperty("reviewRatedSubject"); + String reviewRatedBody = props.getProperty("reviewRatedBody"); User reviewingUser = review.getReviewer().getUser(); - - String messageFooter = "\n\nThis is an auto-generated message from SciPro"; - + PageParameters pp = new PageParameters(); pp.add(PeerReview.PP_PEER_REVIEW_ID, review.getId().toString()); - String projectReviewUrl = RequestUtils.toAbsolutePath( - RequestCycle.get().urlFor(ProjectPeerReviewPage.class, pp).toString()); + String projectReviewUrl = RequestUtils.toAbsolutePath(RequestCycle.get() + .urlFor(ProjectPeerReviewPage.class, pp).toString()); + + + String messageBody = reviewRatedBody; - String subject = "You've received a rating for a review you've done!"; - - String messageBody = "Hello "+reviewingUser.getFirstName()+",\n\n"+ - "Your review has been rated." + - " If you want to see the rating or add a comment to the review, the review is available here:\n"+ - projectReviewUrl+ - messageFooter; - - notificationController.processSystemNotification(reviewingUser, Roles.STUDENT, subject, messageBody, NotificationEventType.PEER_REVIEW_GRADED); - - } - catch( Exception e ){ + NotificationMessage notificationMessage = new NotificationMessage(messageBody, + mailSubject, messageBody); + + notificationController.processNotification(reviewingUser, notificationMessage, + projectReviewUrl, NotificationPriority.MEDIUM); + + } catch (Exception e) { e.printStackTrace(); } } - + /** * Store file to a pre-populated PeerRequest * @@ -346,92 +422,100 @@ public class PeerPortalControllerImpl implements PeerPortalController { * @throws Exception */ @Transactional - public PeerRequest storePeerRequest(final FileUpload upload, PeerRequest request) - throws Exception { + public PeerRequest storePeerRequest(final FileUpload upload, PeerRequest request) + throws Exception { String path = null; try { request = peerRequestDao.save(request); - - if(request.getId() == null){ + + if (request.getId() == null) { throw new NullPointerException("Peer request id is null after save"); } - + path = getAbsolutePeerRequestPath(request); - + fileRepository.storeFile(upload, path); List<FileDescription> fdesc = fileRepository.searchFiles(path); - if(fdesc.size() == 0){ + if (fdesc.size() == 0) { throw new FileStorageException(path, null); } else { FileDescription fd = fileDescriptionDao.save(fdesc.get(0)); request.setFile(fd); return peerRequestDao.save(request); } - } catch (Exception e){ - Logger.getRootLogger().log(Level.ERROR, "Error while storing Peer Request: " + e.getMessage()); - if(request.getId() != null){ + } catch (Exception e) { + Logger.getRootLogger().log(Level.ERROR, + "Error while storing Peer Request: " + e.getMessage()); + if (request.getId() != null) { peerRequestDao.delete(request); } - if(path != null){ + if (path != null) { fileRepository.delete(path); } throw e; } } - + /** - * Stores a file to the repository and populates the file-attribute on the PeerReview object. - * Note: the file description is not persisted, saving the peer review object will cascade - * to the file description. + * Stores a file to the repository and populates the file-attribute on the + * PeerReview object. Note: the file description is not persisted, saving + * the peer review object will cascade to the file description. * - * @param upload the fileupload to store - * @param review the review to store the fileupload to + * @param upload + * the fileupload to store + * @param review + * the review to store the fileupload to * @return true on success, false otherwise */ @Transactional public boolean storePeerReviewFileUpload(final FileUpload upload, PeerReview review) { - - //Return true there is no file upload - if ( upload == null ){ + + // Return true there is no file upload + if (upload == null) { return true; } - + String path = null; try { path = getAbsolutePeerReviewPath(review); fileRepository.storeFile(upload, path); List<FileDescription> fdesc = fileRepository.searchFiles(path); - if(fdesc.size() == 0){ + if (fdesc.size() == 0) { throw new FileStorageException(path, null); } review.setFile(fdesc.get(0)); return true; } catch (Exception e) { - Logger.getRootLogger().log(Level.ERROR, "Error while storing file for peer review: " + e.getMessage()); - if(review.getFile() != null){ - //Clean up the repository + Logger.getRootLogger().log(Level.ERROR, + "Error while storing file for peer review: " + e.getMessage()); + if (review.getFile() != null) { + // Clean up the repository fileRepository.delete(path); - //reset the file attribute + // reset the file attribute review.setFile(null); } return false; } } - + @Transactional - private String getAbsolutePeerRequestPath(final PeerRequest request){ - if(request.getId() == null){ - throw new NullPointerException("Trying to get file repository path for PeerRequest with id null"); + private String getAbsolutePeerRequestPath(final PeerRequest request) { + if (request.getId() == null) { + throw new NullPointerException( + "Trying to get file repository path for PeerRequest with id null"); } - return fileRepository.getProjectRootPath(request.getProject().getId()) + PEER_REQUEST_PATH + request.getId(); + return fileRepository.getProjectRootPath(request.getProject().getId()) + PEER_REQUEST_PATH + + request.getId(); } - + @Transactional - private String getAbsolutePeerReviewPath(final PeerReview review){ - if(review.getId() == null){ - throw new NullPointerException("Trying to get file repository path for PeerReview with id null"); + private String getAbsolutePeerReviewPath(final PeerReview review) { + if (review.getId() == null) { + throw new NullPointerException( + "Trying to get file repository path for PeerReview with id null"); } - return fileRepository.getProjectRootPath(review.getProject().getId()) + PEER_REVIEW_PATH + review.getId(); + return fileRepository.getProjectRootPath(review.getProject().getId()) + PEER_REVIEW_PATH + + review.getId(); } - + } diff --git a/src/main/java/se/su/dsv/scipro/project/pages/ProjectPartnerPage.java b/src/main/java/se/su/dsv/scipro/project/pages/ProjectPartnerPage.java index 1d41eee02b..2f738710b4 100644 --- a/src/main/java/se/su/dsv/scipro/project/pages/ProjectPartnerPage.java +++ b/src/main/java/se/su/dsv/scipro/project/pages/ProjectPartnerPage.java @@ -119,7 +119,6 @@ public class ProjectPartnerPage extends ProjectPage { wmc.add(dataView); wmc.setOutputMarkupId(true); pagingNavigator = new PagingNavigator("navigator", dataView); - System.out.println(dataView.size()); wmc.add(pagingNavigator); add(wmc); diff --git a/src/main/java/se/su/dsv/scipro/project/pages/ProjectStartPage.html b/src/main/java/se/su/dsv/scipro/project/pages/ProjectStartPage.html index 90ac285c34..51fdf83389 100644 --- a/src/main/java/se/su/dsv/scipro/project/pages/ProjectStartPage.html +++ b/src/main/java/se/su/dsv/scipro/project/pages/ProjectStartPage.html @@ -8,6 +8,10 @@ <div class="span-22 last"> <!-- Left column --> <div class="span-11 colborder" wicket:id="leftColumn"> + <div class="append-bottom"> + <h5 class="peer-title">Notifications</h5> + <div wicket:id="notificationPanel"></div> + </div> <div class="append-bottom"> <h5 class="peer-title">State of mind</h5> <div wicket:id="stateOfMindPanel"></div> @@ -23,9 +27,8 @@ <h5 class="peer-title">Peer reviews on project</h5> <div wicket:id="peerRequests"></div> </div> - <div class="append-bottom"> - <h5 class="peer-title">Wall</h5> - <div wicket:id="projectWallPanel"></div> + <div class="span-10 last"> + <div wicket:id="upcomingEventPanel"></div> </div> </div> <!-- Right column --> @@ -34,9 +37,6 @@ <h5 class="peer-title">Final seminar for this project</h5> <div wicket:id="projectSeminarPanel"></div> </div> - <div class="span-10 last"> - <div wicket:id="upcomingEventPanel"></div> - </div> <!-- <div class="span-10 last">--> <!-- <h5 class="peer-title">Oppositions & Active participations</h5>--> <!-- <div wicket:id="oppositionStatsPanel"></div>--> diff --git a/src/main/java/se/su/dsv/scipro/project/pages/ProjectStartPage.java b/src/main/java/se/su/dsv/scipro/project/pages/ProjectStartPage.java index 445e9b57c7..5b43713ca7 100644 --- a/src/main/java/se/su/dsv/scipro/project/pages/ProjectStartPage.java +++ b/src/main/java/se/su/dsv/scipro/project/pages/ProjectStartPage.java @@ -10,7 +10,7 @@ import se.su.dsv.scipro.data.dataobjects.Project; import se.su.dsv.scipro.opponent.panels.ProjectFinalSeminarContainerPanel; import se.su.dsv.scipro.peer.pages.ProjectPeerReviewPage; import se.su.dsv.scipro.peer.panels.StudentPeerInfoRequestsPanel; -import se.su.dsv.scipro.project.panels.ProjectWallPanel; +import se.su.dsv.scipro.project.panels.NotificationsPanel; import se.su.dsv.scipro.project.panels.StateOfMindPanel; import se.su.dsv.scipro.project.panels.UpcomingEventPanel; import se.su.dsv.scipro.schedule.panels.ProjectProgressPanel; @@ -35,7 +35,7 @@ public class ProjectStartPage extends ProjectPage { add(new FeedbackPanel("feedback")); add(new ProjectFinalSeminarContainerPanel("projectSeminarPanel", activeProject)); //add(new StudentOppositionStatsPanel("oppositionStatsPanel", activeProject)); - add(new UpcomingEventPanel("upcomingEventPanel", activeProject, 3)); + leftColumn.add(new UpcomingEventPanel("upcomingEventPanel", activeProject, 3)); leftColumn.add(new StudentPeerInfoRequestsPanel("peerRequests", null, activeProject){ private static final long serialVersionUID = 1L; @@ -47,9 +47,10 @@ public class ProjectStartPage extends ProjectPage { ProjectProgressPanel progressPanel = new ProjectProgressPanel("progress", activeProject); leftColumn.add(progressPanel.getHelpIcon("progressHelp")); leftColumn.add(progressPanel); - //leftColumn.add(new UpcomingEventPanel("upcomingEventPanel", activeProject)); - leftColumn.add(new ProjectWallPanel("projectWallPanel", activeProject)); - + + + leftColumn.add(new NotificationsPanel("notificationPanel")); + } diff --git a/src/main/java/se/su/dsv/scipro/project/panels/NotificationsPanel.html b/src/main/java/se/su/dsv/scipro/project/panels/NotificationsPanel.html new file mode 100644 index 0000000000..8e2429c059 --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/project/panels/NotificationsPanel.html @@ -0,0 +1,21 @@ +<!DOCTYPE html> +<html + xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd"> +<body> + <wicket:panel> + <div wicket:id="container"> + <div class="margin"> + <h3><span wicket:id="newNotifications"></span> new notifications</h3> + <a href="#" wicket:id="readAllNotification">Set all read</a> + </div> + + <div wicket:id="notificationsListView" class="rounded-border-notification"> + <div wicket:id="infoText"></div> + <a href="#" wicket:id="readNotification">Set read</a> + <a href="#" wicket:id="bookmarkLink">Go to</a> + </div> + <div wicket:id="paging"></div> + </div> + </wicket:panel> +</body> +</html> \ No newline at end of file diff --git a/src/main/java/se/su/dsv/scipro/project/panels/NotificationsPanel.java b/src/main/java/se/su/dsv/scipro/project/panels/NotificationsPanel.java new file mode 100644 index 0000000000..bb01f46130 --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/project/panels/NotificationsPanel.java @@ -0,0 +1,143 @@ +/** + * + */ +package se.su.dsv.scipro.project.panels; + +import org.apache.wicket.RequestCycle; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.ajax.markup.html.AjaxLink; +import org.apache.wicket.markup.html.WebMarkupContainer; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.html.link.Link; +import org.apache.wicket.markup.html.navigation.paging.PagingNavigator; +import org.apache.wicket.markup.html.panel.Panel; +import org.apache.wicket.markup.repeater.Item; +import org.apache.wicket.markup.repeater.data.DataView; +import org.apache.wicket.model.IModel; +import org.apache.wicket.model.LoadableDetachableModel; +import org.apache.wicket.request.target.basic.RedirectRequestTarget; +import org.apache.wicket.spring.injection.annot.SpringBean; + +import se.su.dsv.scipro.SciProSession; +import se.su.dsv.scipro.data.dao.interfaces.WebNotificationDao; +import se.su.dsv.scipro.data.dataobjects.WebNotification; +import se.su.dsv.scipro.dataproviders.WebNotificationDataProvider; +import se.su.dsv.scipro.security.auth.Authorization; +import se.su.dsv.scipro.security.auth.roles.Roles; + +/** + * @author Johan Aschan <aschan@dsv.su.se> + * + */ +@Authorization(authorizedRoles = { Roles.SYSADMIN }) +public class NotificationsPanel extends Panel { + + private static final long serialVersionUID = 1L; + + @SpringBean + private WebNotificationDao webNotificationDao; + + private int countOfNotifications = 0; + + /** + * @param id + */ + public NotificationsPanel(String id) { + super(id); + + final IModel<Integer> numberOfNotificationsModel = new LoadableDetachableModel<Integer>() { + + private static final long serialVersionUID = 1L; + + @Override + protected Integer load() { + return webNotificationDao.getCountOfWebNotifications(SciProSession.get().getUser()); + } + }; + + countOfNotifications = numberOfNotificationsModel.getObject(); + + Label newNotifications = new Label("newNotifications", numberOfNotificationsModel); + + final WebMarkupContainer webMarkupContainer = new WebMarkupContainer("container"); + webMarkupContainer.setOutputMarkupId(true); + add(webMarkupContainer); + webMarkupContainer.add(newNotifications); + + WebNotificationDataProvider webNotificationDataProvider = new WebNotificationDataProvider( + SciProSession.get().getUser()); + DataView<WebNotification> notifications = new DataView<WebNotification>( + "notificationsListView", webNotificationDataProvider, 5) { + + private static final long serialVersionUID = 1L; + + @Override + protected void populateItem(final Item<WebNotification> item) { + item.add(new Label("infoText", item.getModel().getObject().getInfoText())); + item.add(new Link<Void>("bookmarkLink") { + + private static final long serialVersionUID = 1L; + + @Override + public void onClick() { + + WebNotification notification = item.getModelObject(); + notification.setReadByUser(true); + notification = webNotificationDao.save(notification); + + RequestCycle.get().setRequestTarget( + new RedirectRequestTarget(notification.getUrl())); + } + }); + item.add(new AjaxLink<Void>("readNotification") { + + private static final long serialVersionUID = 1L; + + @Override + public void onClick(AjaxRequestTarget target) { + WebNotification notification = item.getModelObject(); + notification.setReadByUser(true); + webNotificationDao.save(notification); + target.addComponent(webMarkupContainer); + countOfNotifications = numberOfNotificationsModel.getObject(); + } + }); + + } + + }; + webMarkupContainer.add(new AjaxLink<Void>("readAllNotification") { + + private static final long serialVersionUID = 1L; + + @Override + public void onClick(AjaxRequestTarget target) { + for (WebNotification webnotification : webNotificationDao + .getWebNotifications(SciProSession.get().getUser())) { + webnotification.setReadByUser(true); + webNotificationDao.save(webnotification); + } + target.addComponent(webMarkupContainer); + } + + @Override + public boolean isVisible() { + return countOfNotifications > 0; + }; + }.setOutputMarkupPlaceholderTag(true)); + + PagingNavigator pagingNavigator = new PagingNavigator("paging", notifications){ + + private static final long serialVersionUID = 1L; + + @Override + public boolean isVisible() { + return countOfNotifications > 0; + }; + }; + pagingNavigator.setOutputMarkupPlaceholderTag(true); + webMarkupContainer.add(pagingNavigator); + webMarkupContainer.add(notifications); + } + +} 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 fd21d6111c..b351cbd3c9 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 @@ -7,6 +7,7 @@ import org.apache.wicket.Page; import se.su.dsv.scipro.SciProSession; import se.su.dsv.scipro.components.AbstractMenuPanel; +import se.su.dsv.scipro.conference.pages.ProjectConferencePage; import se.su.dsv.scipro.data.dataobjects.Project; import se.su.dsv.scipro.peer.pages.ProjectPeerPortalPage; import se.su.dsv.scipro.project.pages.FinalSeminarProjectListPage; @@ -45,6 +46,7 @@ public class ProjectTabMenuPanel extends AbstractMenuPanel { itemList.add(new MenuItem("Opposition & Active participation", ProjectOppositionPage.class)); itemList.add(new MenuItem("Peer review", ProjectPeerPortalPage.class)); itemList.add(new MenuItem("All Final Seminars", FinalSeminarProjectListPage.class)); + itemList.add(new MenuItem("Conference", ProjectConferencePage.class)); } else { itemList.add(new MenuItem("No active project!", NoActiveProjectPage.class)); itemList.add(new MenuItem("Project Partner", ProjectPartnerPage.class)); diff --git a/src/main/java/se/su/dsv/scipro/project/panels/ProjectWallPanel.java b/src/main/java/se/su/dsv/scipro/project/panels/ProjectWallPanel.java deleted file mode 100644 index bfa50d8b97..0000000000 --- a/src/main/java/se/su/dsv/scipro/project/panels/ProjectWallPanel.java +++ /dev/null @@ -1,216 +0,0 @@ -/** - * - */ -package se.su.dsv.scipro.project.panels; - -import java.text.SimpleDateFormat; -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.basic.Label; -import org.apache.wicket.markup.html.form.Form; -import org.apache.wicket.markup.html.form.TextArea; -import org.apache.wicket.markup.html.navigation.paging.PagingNavigator; -import org.apache.wicket.markup.html.panel.Panel; -import org.apache.wicket.markup.repeater.Item; -import org.apache.wicket.markup.repeater.data.DataView; -import org.apache.wicket.markup.repeater.data.IDataProvider; -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.commentthread.panels.CommentThreadPanel; -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.dao.interfaces.ProjectDao; -import se.su.dsv.scipro.data.dataobjects.BoardMessage; -import se.su.dsv.scipro.data.dataobjects.CommentThread; -import se.su.dsv.scipro.data.dataobjects.MessageBoard; -import se.su.dsv.scipro.data.dataobjects.Project; -import se.su.dsv.scipro.dataproviders.BoardMessageDataProvider; -import se.su.dsv.scipro.security.auth.roles.Roles; - -/** - * @author Johan Aschan - aschan@dsv.su.se - * - */ -public class ProjectWallPanel extends Panel { - - @SpringBean - private BoardMessageDao boardMessageDao; - @SpringBean - private MessageBoardDao messageBoardDao; - @SpringBean - private CommentThreadDao commentThreadDao; - - private MessageBoard messageBoard; - private DataView<BoardMessage> dataView; - private WebMarkupContainer webMarkupContainer; - - public ProjectWallPanel(String id, Project project) { - super(id); - SendWallMessageForm sendWallMessageForm; - add(sendWallMessageForm = new SendWallMessageForm("sendForm")); - if (project != null) { - messageBoard = project.getMessageBoard(); - if (messageBoard == null) { - messageBoard = new MessageBoard(); - messageBoard.setProject(project); - messageBoard = messageBoardDao.save(messageBoard); - } - } - webMarkupContainer = new WebMarkupContainer("container"); - - loadUserDataView(new BoardMessageDataProvider(messageBoard)); - webMarkupContainer.add(dataView); - webMarkupContainer.setOutputMarkupId(true); - webMarkupContainer - .add(new PagingNavigator("pagingNavigator", dataView)); - - add(webMarkupContainer); - - if(project == null){ - webMarkupContainer.setVisible(false); - sendWallMessageForm.setVisible(false); - } - - } - - public void loadUserDataView( - IDataProvider<BoardMessage> boardMessageDataProvider) { - - dataView = new DataView<BoardMessage>("boardMessageDataView", - boardMessageDataProvider, 10) { - - @Override - protected void populateItem(Item<BoardMessage> item) { - final BoardMessage bm = item.getModelObject(); - item.add(new Label("messageLabel", bm.getMessage())); - item.add(new Label("messageUser", bm.getFromUser() - .getFirstName() + " " + bm.getFromUser().getLastName())); - SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm"); - - item.add(new Label("messageDate", simpleDateFormat.format(bm.getDateCreated()))); - item.add(new AjaxLink("delete") { - - @Override - public void onClick(AjaxRequestTarget target) { - - BoardMessage boardMessageTemp = boardMessageDao.reLoad(bm); - boardMessageDao.delete(boardMessageTemp); - webMarkupContainer.removeAll(); - loadUserDataView(new BoardMessageDataProvider( - messageBoardDao.reLoad(messageBoard))); - webMarkupContainer.add(dataView); - webMarkupContainer.add(new PagingNavigator( - "pagingNavigator", dataView)); - target.addComponent(webMarkupContainer); - } - - @Override - public boolean isVisible() { - SciProSession session = SciProSession.get(); - if (session.authorizedForRole(Roles.ADMIN)) - return true; - if (session.getUser().equals(bm.getFromUser())) - return true; - return false; - } - }); - int commentSize = commentThreadDao.getCommentThreadSize(bm); - String comments = " Comments"; - if (commentSize == 1) { - comments = " Comment"; - } - final Label comment = new Label("commentNumber", commentSize - + comments); - - comment.setOutputMarkupId(true); - final WebMarkupContainer webMarkupContainer = new WebMarkupContainer( - "commentContainer"); - webMarkupContainer.setOutputMarkupPlaceholderTag(true); - item.add(webMarkupContainer); - - CommentThreadPanel ctp = new CommentThreadPanel( - "commentThread", bm, 5); - ctp.setOutputMarkupPlaceholderTag(true); - webMarkupContainer.add(ctp); - - webMarkupContainer.setVisible(false); - - item.add(new AjaxLink<String>("showComments", - new Model<String>("Show Comments")) { - - private boolean clicked = false; - - @Override - public void onClick(AjaxRequestTarget target) { - clicked = !clicked; - if (clicked) { - comment.setDefaultModelObject("Hide comments"); - } else { - - int commentSize = commentThreadDao - .getCommentThreadSize(bm); - - String comments = " Comments"; - if (commentSize == 1) { - comments = " Comment"; - } - comment.setDefaultModelObject(commentSize - + comments); - } - webMarkupContainer.removeAll(); - webMarkupContainer.add(new CommentThreadPanel( - "commentThread", boardMessageDao.reLoad(bm), 5)); - webMarkupContainer.setVisible(clicked); - target.addComponent(webMarkupContainer); - target.addComponent(comment); - } - - }.add(comment)); - } - }; - - } - - private class SendWallMessageForm extends Form<String> { - - private String message; - - public SendWallMessageForm(String id) { - super(id); - final TextArea<String> messageTextArea = new TextArea<String>( - "textArea", new PropertyModel<String>(this, "message")); - add(messageTextArea); - AjaxButton button = new AjaxButton("ajaxButton") { - - @Override - protected void onSubmit(AjaxRequestTarget target, Form<?> form) { - BoardMessage bm = new BoardMessage(); - bm.setMessage(message); - bm.setMessageBoard(messageBoardDao.reLoad(messageBoard)); - bm.setFromUser(SciProSession.get().getUser()); - bm = boardMessageDao.save(bm); - webMarkupContainer.removeAll(); - loadUserDataView(new BoardMessageDataProvider( - messageBoardDao.reLoad(messageBoard))); - webMarkupContainer.add(dataView); - webMarkupContainer.add(new PagingNavigator( - "pagingNavigator", dataView)); - target.addComponent(webMarkupContainer); - } - }; - - add(button); - - } - - } -} diff --git a/src/main/java/se/su/dsv/scipro/project/panels/StateOfMindPanel.java b/src/main/java/se/su/dsv/scipro/project/panels/StateOfMindPanel.java index 6bf8c82a6e..1727e059e0 100644 --- a/src/main/java/se/su/dsv/scipro/project/panels/StateOfMindPanel.java +++ b/src/main/java/se/su/dsv/scipro/project/panels/StateOfMindPanel.java @@ -3,9 +3,6 @@ */ package se.su.dsv.scipro.project.panels; -import java.lang.reflect.Array; -import java.util.ArrayList; - import org.apache.wicket.AttributeModifier; import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior; import org.apache.wicket.ajax.AjaxRequestTarget; @@ -26,15 +23,12 @@ import org.apache.wicket.spring.injection.annot.SpringBean; import org.odlabs.wiquery.ui.core.DefaultJsScopeUiEvent; import org.odlabs.wiquery.ui.slider.Slider; -import edu.emory.mathcs.backport.java.util.Arrays; - import se.su.dsv.scipro.SciProSession; import se.su.dsv.scipro.data.dao.interfaces.ProjectDao; import se.su.dsv.scipro.data.dataobjects.Project; import se.su.dsv.scipro.data.enums.StateOfMind; import se.su.dsv.scipro.knol.resource.page.StaticImage; - -import java.util.List; +import edu.emory.mathcs.backport.java.util.Arrays; /** * @author Johan Aschan - aschan@dsv.su.se diff --git a/src/main/java/se/su/dsv/scipro/repository/panels/AbstractFilePanel.java b/src/main/java/se/su/dsv/scipro/repository/panels/AbstractFilePanel.java index 8da9987f44..038c32e308 100644 --- a/src/main/java/se/su/dsv/scipro/repository/panels/AbstractFilePanel.java +++ b/src/main/java/se/su/dsv/scipro/repository/panels/AbstractFilePanel.java @@ -23,30 +23,23 @@ import org.apache.wicket.markup.html.link.ResourceLink; import org.apache.wicket.markup.html.panel.FeedbackPanel; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.markup.repeater.RepeatingView; -import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.spring.injection.annot.SpringBean; import org.apache.wicket.util.lang.Bytes; import org.apache.wicket.util.resource.IResourceStream; import org.odlabs.wiquery.core.effects.EffectSpeed; -import se.su.dsv.scipro.SciProSession; import se.su.dsv.scipro.data.dao.interfaces.FileDescriptionDao; import se.su.dsv.scipro.data.dao.interfaces.UserDao; import se.su.dsv.scipro.data.dataobjects.FileDescription; import se.su.dsv.scipro.data.dataobjects.User; -import se.su.dsv.scipro.icons.ExpandContractActionIcon; import se.su.dsv.scipro.repository.FilePanelContainer; import se.su.dsv.scipro.repository.FileRepository; import se.su.dsv.scipro.repository.FolderDescription; import se.su.dsv.scipro.repository.SortOrder; -import se.su.dsv.scipro.repository.components.FileDownloadLink; -import se.su.dsv.scipro.repository.components.FileOpenLink; import se.su.dsv.scipro.repository.icons.FileIcon; import se.su.dsv.scipro.repository.pages.RepositoryDownloadPage; import se.su.dsv.scipro.repository.util.FileStorageException; -import se.su.dsv.scipro.security.auth.MetaDataActionStrategy; -import se.su.dsv.scipro.security.auth.roles.Roles; import se.su.dsv.scipro.util.JavascriptEventConfirmation; import se.su.dsv.scipro.util.WiQueryCoreEffectsHelper; diff --git a/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorProjectDetailsPage.html b/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorProjectDetailsPage.html index c3a9f90b1d..2469dff3f1 100644 --- a/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorProjectDetailsPage.html +++ b/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorProjectDetailsPage.html @@ -9,10 +9,6 @@ <h5 class="peer-title">Project progress</h5> <div wicket:id="projectProgress"></div> </div> - <div class="span-10 last"> - <h5 class="peer-title">Wall</h5> - <div wicket:id="projectWallPanel"></div> - </div> </div> <!-- Right column --> <div class="span-10 last"> diff --git a/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorProjectDetailsPage.java b/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorProjectDetailsPage.java index 0596926267..16847ebf82 100644 --- a/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorProjectDetailsPage.java +++ b/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorProjectDetailsPage.java @@ -1,28 +1,31 @@ package se.su.dsv.scipro.supervisor.pages; import org.apache.wicket.PageParameters; +import org.apache.wicket.markup.html.panel.EmptyPanel; import se.su.dsv.scipro.SciProSession; +import se.su.dsv.scipro.conference.panels.ConferencePanel; import se.su.dsv.scipro.events.panels.SupervisorFeedbackTasksPanel; -import se.su.dsv.scipro.project.panels.ProjectWallPanel; import se.su.dsv.scipro.schedule.panels.ProjectProgressPanel; import se.su.dsv.scipro.security.auth.Authorization; import se.su.dsv.scipro.security.auth.roles.Roles; + /** * * @author Martin Peters - mpeters@dsv.su.se - * + * */ -@Authorization(authorizedRoles={Roles.SYSADMIN}) //TODO Hidden for initial deployment +@Authorization(authorizedRoles = { Roles.SYSADMIN }) +// TODO Hidden for initial deployment public class SupervisorProjectDetailsPage extends AbstractSupervisorProjectDetailsPage { - + public SupervisorProjectDetailsPage(PageParameters pp) { super(pp); - add(new SupervisorFeedbackTasksPanel("feedbackTasks", SciProSession.get().getUser(), projectModel.getObject())); + add(new SupervisorFeedbackTasksPanel("feedbackTasks", SciProSession.get().getUser(), + projectModel.getObject())); add(new ProjectProgressPanel("projectProgress", projectModel.getObject())); - add(new ProjectWallPanel("projectWallPanel", projectModel.getObject())); + } - } diff --git a/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorStartPage.html b/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorStartPage.html index c134aa5543..2eef4ae585 100644 --- a/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorStartPage.html +++ b/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorStartPage.html @@ -1,27 +1,32 @@ <!DOCTYPE html> -<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd"> +<html + xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd"> <body> -<wicket:extend> - <div class="span-22 last"> - <div wicket:id="projectsOverviewPanel"></div> - </div> - <div class="span-22 last" wicket:id="temporaryHideContainer"> - <!-- Left column --> - <div class="span-10 colborder"> + <wicket:extend> + <div class="span-22 last"> + <div wicket:id="projectsOverviewPanel"></div> + </div> + <div class="span-22 last" wicket:id="temporaryHideContainer"> + <!-- Left column --> + <div class="span-22 last"> + <h5 class="peer-title">Notifications</h5> + <div wicket:id="notificationsPanel"></div> + </div> + <div class="span-10 colborder"> + <div class="span-10 last"> + <h5 class="peer-title">Upcoming group events</h5> + <div wicket:id="groupEvents"></div> + </div> + </div> + <!-- Right column --> <div class="span-10 last"> - <h5 class="peer-title">Upcoming group events</h5> - <div wicket:id="groupEvents"></div> + <div class="span-10 last"> + <h5 class="peer-title">Feedback tasks</h5> + <div wicket:id="feedbackTasks"></div> + </div> </div> </div> - <!-- Right column --> - <div class="span-10 last"> - <div class="span-10 last"> - <h5 class="peer-title">Feedback tasks</h5> - <div wicket:id="feedbackTasks"></div> - </div> - </div> - </div> - -</wicket:extend> + + </wicket:extend> </body> </html> \ No newline at end of file diff --git a/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorStartPage.java b/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorStartPage.java index 5c4ddb7eff..a997336c1f 100644 --- a/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorStartPage.java +++ b/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorStartPage.java @@ -7,6 +7,7 @@ import se.su.dsv.scipro.SciProSession; import se.su.dsv.scipro.data.dataobjects.User; import se.su.dsv.scipro.events.panels.SupervisorFeedbackTasksPanel; import se.su.dsv.scipro.events.panels.SupervisorGroupEventsPanel; +import se.su.dsv.scipro.project.panels.NotificationsPanel; import se.su.dsv.scipro.security.auth.roles.Roles; import se.su.dsv.scipro.supervisor.panels.SupervisorProjectsOverviewPanel; @@ -21,6 +22,7 @@ public class SupervisorStartPage extends AbstractSupervisorPage { add(temporaryHideContainer); final User user = SciProSession.get().getUser(); add(new SupervisorProjectsOverviewPanel("projectsOverviewPanel")); + temporaryHideContainer.add(new NotificationsPanel("notificationsPanel")); temporaryHideContainer.add(new SupervisorGroupEventsPanel("groupEvents", user)); temporaryHideContainer.add(new SupervisorFeedbackTasksPanel("feedbackTasks", user)); } diff --git a/src/main/java/se/su/dsv/scipro/supervisor/panels/SupervisorProjectSelectionPanel.java b/src/main/java/se/su/dsv/scipro/supervisor/panels/SupervisorProjectSelectionPanel.java index 18006ede6e..b658520db7 100644 --- a/src/main/java/se/su/dsv/scipro/supervisor/panels/SupervisorProjectSelectionPanel.java +++ b/src/main/java/se/su/dsv/scipro/supervisor/panels/SupervisorProjectSelectionPanel.java @@ -46,6 +46,7 @@ public class SupervisorProjectSelectionPanel extends Panel { protected void onUpdate(AjaxRequestTarget target) { if(model.getObject() != null) { + System.out.println(model.getObject().getTitle()); setRedirect(true); setResponsePage(getPage().getClass(), new PageParameters(Project.PP_PROJECT_ID+"="+model.getObject().getId())); } diff --git a/src/main/java/se/su/dsv/scipro/supervisor/panels/SupervisorTabMenuPanel.java b/src/main/java/se/su/dsv/scipro/supervisor/panels/SupervisorTabMenuPanel.java index bd0ead6500..d54701397a 100644 --- a/src/main/java/se/su/dsv/scipro/supervisor/panels/SupervisorTabMenuPanel.java +++ b/src/main/java/se/su/dsv/scipro/supervisor/panels/SupervisorTabMenuPanel.java @@ -6,6 +6,7 @@ import java.util.List; import org.apache.wicket.Page; import se.su.dsv.scipro.components.AbstractMenuPanel; +import se.su.dsv.scipro.conference.pages.SupervisorConferencePage; import se.su.dsv.scipro.peer.pages.SupervisorPeerPortalPage; import se.su.dsv.scipro.supervisor.pages.AbstractSupervisorPage; import se.su.dsv.scipro.supervisor.pages.SupervisorProjectDetailsPage; @@ -34,6 +35,7 @@ public class SupervisorTabMenuPanel extends AbstractMenuPanel { items.add(new MenuItem("Schedule templates", SupervisorScheduleTemplatesPage.class)); items.add(new MenuItem("Peer portal", SupervisorPeerPortalPage.class)); items.add(new MenuItem("Final Seminars", SupervisorProjectsFinalSeminarPage.class)); + items.add(new MenuItem("Conferences", SupervisorConferencePage.class)); return items; } diff --git a/src/main/java/se/su/dsv/scipro/util/Mail.java b/src/main/java/se/su/dsv/scipro/util/Mail.java index b9c65d1457..4202c5a724 100644 --- a/src/main/java/se/su/dsv/scipro/util/Mail.java +++ b/src/main/java/se/su/dsv/scipro/util/Mail.java @@ -10,13 +10,23 @@ import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import se.su.dsv.scipro.data.dao.interfaces.GeneralSystemSettingsDao; + +@Component public class Mail { - private Mail() {} + @Autowired + GeneralSystemSettingsDao generalSystemSettingsDao; - public static void mail(String fromName, String fromEmail, String recipients[], String replyTo[], String subject, String message, Properties props, boolean debug) throws MessagingException, UnsupportedEncodingException{ + public void mail(String fromName, String fromEmail, String recipients[], String replyTo[], String subject, String message, boolean debug) throws MessagingException, UnsupportedEncodingException{ - Session session = Session.getDefaultInstance(props,null); + Properties p = new Properties(); + p.put("mail.smtp.host", generalSystemSettingsDao.getGeneralSystemSettingsInstance().getSmtpServer()); + + Session session = Session.getDefaultInstance(p,null); session.setDebug(debug); diff --git a/src/main/java/se/su/dsv/scipro/util/PushApple.java b/src/main/java/se/su/dsv/scipro/util/PushApple.java index 9ccf7720cc..561aa45b0d 100644 --- a/src/main/java/se/su/dsv/scipro/util/PushApple.java +++ b/src/main/java/se/su/dsv/scipro/util/PushApple.java @@ -1,5 +1,8 @@ package se.su.dsv.scipro.util; +import se.su.dsv.scipro.data.enums.NotificationPriority; +import edu.emory.mathcs.backport.java.util.Arrays; + public class PushApple { @@ -7,6 +10,4 @@ public class PushApple { String message) { } - - } \ No newline at end of file diff --git a/src/main/java/se/su/dsv/scipro/util/TurnitinComponent.java b/src/main/java/se/su/dsv/scipro/util/TurnitinComponent.java index 16032167a4..8dd52f0f66 100644 --- a/src/main/java/se/su/dsv/scipro/util/TurnitinComponent.java +++ b/src/main/java/se/su/dsv/scipro/util/TurnitinComponent.java @@ -4,11 +4,8 @@ package se.su.dsv.scipro.util; import java.io.BufferedReader; -import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; @@ -17,14 +14,11 @@ import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.text.SimpleDateFormat; -import java.util.ArrayList; import java.util.Date; -import java.util.List; import java.util.TimeZone; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; import org.apache.commons.httpclient.Header; import org.apache.commons.httpclient.HttpClient; @@ -37,23 +31,19 @@ import org.apache.commons.httpclient.methods.multipart.PartSource; import org.apache.commons.httpclient.methods.multipart.StringPart; import org.apache.log4j.Level; import org.apache.log4j.Logger; -import org.apache.wicket.injection.web.InjectorHolder; -import org.apache.wicket.spring.injection.annot.SpringBean; import org.apache.wicket.util.resource.IResourceStream; import org.apache.wicket.util.resource.ResourceStreamNotFoundException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.w3c.dom.DOMException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; -import org.xml.sax.SAXException; -import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarDao; +import se.su.dsv.scipro.data.dao.interfaces.GeneralSystemSettingsDao; import se.su.dsv.scipro.data.dataobjects.FileDescription; -import se.su.dsv.scipro.data.dataobjects.FinalSeminar; +import se.su.dsv.scipro.data.dataobjects.GeneralSystemSettings; import se.su.dsv.scipro.repository.FileRepository; /** @@ -77,14 +67,19 @@ public class TurnitinComponent { private String utp = "2"; private String sharedKey = "thi9eaJ6"; private String ptype = "2"; - private final static String apiAdress = "https://api.turnitin.com/"; + private String apiAdress = "https://api.turnitin.com/"; @Autowired private FileRepository fileRepository; + @Autowired + private GeneralSystemSettingsDao generalSystemSettingsDao; public String returnReport(String oid) { PostMethod filePost = new PostMethod(apiAdress + "/api.asp"); - + GeneralSystemSettings generalSystemSettings = generalSystemSettingsDao.getGeneralSystemSettingsInstance(); + uem = generalSystemSettings.getTurnItInUsername(); + ufn = generalSystemSettings.getTurnItInForname(); + uln = generalSystemSettings.getTurnItInSurname(); fcmd = "1"; fid = "6"; String md5 = null; @@ -98,11 +93,9 @@ public class TurnitinComponent { try { md5 = MD5(hash); } catch (NoSuchAlgorithmException e1) { - // TODO Auto-generated catch block Logger.getLogger(this.getClass()).log(Level.ERROR, "Error with MD5 generation: " + e1.getMessage()); } catch (UnsupportedEncodingException e1) { - // TODO Auto-generated catch block Logger.getLogger(this.getClass()).log(Level.ERROR, "Error with MD5 generation: " + e1.getMessage()); } @@ -148,7 +141,10 @@ public class TurnitinComponent { final String ptl) throws Exception{ final IResourceStream stream = fileRepository.getFileStream(fd); PostMethod filePost = new PostMethod("https://api.turnitin.com/api.asp"); - + GeneralSystemSettings generalSystemSettings = generalSystemSettingsDao.getGeneralSystemSettingsInstance(); + uem = generalSystemSettings.getTurnItInUsername(); + ufn = generalSystemSettings.getTurnItInForname(); + uln = generalSystemSettings.getTurnItInSurname(); fcmd = "2"; fid = "5"; String md5 = null; @@ -315,46 +311,4 @@ public class TurnitinComponent { is.close(); return bytes; } - - public static void parseXml(String string) { - - try { - DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); - DocumentBuilder db = dbf.newDocumentBuilder(); - - Document doc = db.parse(new InputSource(new StringReader(string))); - doc.getDocumentElement().normalize(); - System.out.println("Root element " - + doc.getDocumentElement().getNodeName()); - NodeList nodeList = doc - .getElementsByTagName("student_paper_overlap"); - Element studentPaperOverlapElement = (Element) nodeList.item(0); - NodeList studentPaperOverlap = studentPaperOverlapElement - .getChildNodes(); - System.out.println("Student Paper Overlap: " - + ((Node) studentPaperOverlap.item(0)).getNodeValue()); - - nodeList = doc.getElementsByTagName("web_overlap"); - Element webOverlapElement = (Element) nodeList.item(0); - NodeList webPaperOverlap = webOverlapElement.getChildNodes(); - System.out.println("Web Overlap: " - + ((Node) webPaperOverlap.item(0)).getNodeValue()); - - nodeList = doc.getElementsByTagName("publication_overlap"); - Element publicationOverlapElement = (Element) nodeList.item(0); - NodeList publicationOverlap = publicationOverlapElement - .getChildNodes(); - System.out.println("Publication Overlap: " - + ((Node) publicationOverlap.item(0)).getNodeValue()); - - nodeList = doc.getElementsByTagName("originalityscore"); - Element originalityElement = (Element) nodeList.item(0); - NodeList originality = originalityElement.getChildNodes(); - System.out.println("Originality Score: " - + ((Node) originality.item(0)).getNodeValue()); - - } catch (Exception e) { - e.printStackTrace(); - } - } } diff --git a/src/main/java/se/su/dsv/scipro/workerthreads/MailEventWorker.java b/src/main/java/se/su/dsv/scipro/workerthreads/MailEventWorker.java index c15d0ce6b4..edc840bb91 100644 --- a/src/main/java/se/su/dsv/scipro/workerthreads/MailEventWorker.java +++ b/src/main/java/se/su/dsv/scipro/workerthreads/MailEventWorker.java @@ -8,7 +8,9 @@ import java.util.Set; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import se.su.dsv.scipro.data.dao.interfaces.GeneralSystemSettingsDao; import se.su.dsv.scipro.data.dao.interfaces.MailEventDao; +import se.su.dsv.scipro.data.dataobjects.GeneralSystemSettings; import se.su.dsv.scipro.data.dataobjects.MailEvent; import se.su.dsv.scipro.data.dataobjects.User; import se.su.dsv.scipro.util.Mail; @@ -19,20 +21,16 @@ public class MailEventWorker extends AbstractWorker { @Autowired private MailEventDao mailEventDao; + @Autowired + private GeneralSystemSettingsDao generalSystemSettingsDao; + @Autowired + private Mail mail; public MailEventWorker(){ } @Override protected void doManualTransactionWork(){ - Properties props; - try { - props = PropsUtils.load("email.properties"); - } catch (Exception e1) { - e1.printStackTrace(); - throw new RuntimeException(e1); - } - List<MailEvent> mailEvents = new ArrayList<MailEvent>(); this.beginTransaction(); @@ -65,9 +63,8 @@ public class MailEventWorker extends AbstractWorker { //TODO test- //String[] tmp = new String[]{"mpeters@dsv.su.se"}; - boolean sendMailEnabled = Boolean.parseBoolean(props.getProperty("sendMailEnabled")); - if( sendMailEnabled ){ //If false, mail-events "vanish" - Mail.mail(fromName, fromEmail, recipientsEmails /* tmp */, replyToEmails, subject, messageBody, props, false); + if( generalSystemSettingsDao.getGeneralSystemSettingsInstance().isMailNotifications() ){ //If false, mail-events "vanish" + mail.mail(fromName, fromEmail, recipientsEmails /* tmp */, replyToEmails, subject, messageBody, false); } mailEvent = mailEventDao.reLoad(mailEvent); //Re-attach to session so delete works mailEventDao.delete(mailEvent); diff --git a/src/main/resources/META-INF/persistence.xml b/src/main/resources/META-INF/persistence.xml index b00912755d..cea9c530c7 100644 --- a/src/main/resources/META-INF/persistence.xml +++ b/src/main/resources/META-INF/persistence.xml @@ -29,11 +29,7 @@ <class>se.su.dsv.scipro.data.dataobjects.ProjectSchedule</class> <class>se.su.dsv.scipro.data.dataobjects.ProjectFollower</class> <class>se.su.dsv.scipro.data.dataobjects.ProjectTeamMember</class> - <class>se.su.dsv.scipro.data.dataobjects.Board</class> <class>se.su.dsv.scipro.data.dataobjects.BoardMessage</class> - <class>se.su.dsv.scipro.data.dataobjects.SupervisorBoardMessage</class> - <class>se.su.dsv.scipro.data.dataobjects.SupervisorMessageBoard</class> - <class>se.su.dsv.scipro.data.dataobjects.Message</class> <class>se.su.dsv.scipro.data.dataobjects.MessageBoard</class> <class>se.su.dsv.scipro.data.dataobjects.PrivateMessage</class> <class>se.su.dsv.scipro.data.dataobjects.Recipient</class> @@ -70,6 +66,7 @@ <class>se.su.dsv.scipro.data.dataobjects.MailEvent</class> <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> <properties> @@ -81,7 +78,9 @@ <property name="hibernate.generate_statistics" value="false" /> <!-- DEVELOPMENT VARIABLE, REMOVE FOR PRODUCTION USE --> + <property name="hibernate.hbm2ddl.auto" value="update" /> + <!-- production settings database --> @@ -134,11 +133,7 @@ <class>se.su.dsv.scipro.data.dataobjects.ProjectSchedule</class> <class>se.su.dsv.scipro.data.dataobjects.ProjectFollower</class> <class>se.su.dsv.scipro.data.dataobjects.ProjectTeamMember</class> - <class>se.su.dsv.scipro.data.dataobjects.Board</class> <class>se.su.dsv.scipro.data.dataobjects.BoardMessage</class> - <class>se.su.dsv.scipro.data.dataobjects.SupervisorBoardMessage</class> - <class>se.su.dsv.scipro.data.dataobjects.SupervisorMessageBoard</class> - <class>se.su.dsv.scipro.data.dataobjects.Message</class> <class>se.su.dsv.scipro.data.dataobjects.MessageBoard</class> <class>se.su.dsv.scipro.data.dataobjects.PrivateMessage</class> <class>se.su.dsv.scipro.data.dataobjects.Recipient</class> @@ -175,6 +170,7 @@ <class>se.su.dsv.scipro.data.dataobjects.MailEvent</class> <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> <properties> diff --git a/src/main/resources/email.properties b/src/main/resources/email.properties deleted file mode 100644 index 77ff4d9f72..0000000000 --- a/src/main/resources/email.properties +++ /dev/null @@ -1,4 +0,0 @@ -mail.smtp.host=mail.dsv.su.se -systemFromName=[TEST] SciPro-mailer -sendMailEnabled=true -systemFromEmail=no-reply@thesis.dsv.su.se diff --git a/src/main/resources/notification.properties b/src/main/resources/notification.properties new file mode 100644 index 0000000000..6b8344dfbf --- /dev/null +++ b/src/main/resources/notification.properties @@ -0,0 +1,33 @@ +#General +twoNewLines=\n\n +twoNewLinesWithComma=,\n\n +linkText = Click on the link to see it in SciPro:\n +mailSubject=Notification for SciPro +hello=Hello +autogenerated=This is an auto-generated message from SciPro +colon=: +#Conference +conferenceNotification=\ posted on conference +conferenceNotificationComment=\ commented on conference +#Private message +privateMessageNotification=\ wrote a private message to you. +#Peer accepted +acceptPeerReviewSubject=Your request for peer-review has been accepted +requestAccepted=Your peer request was accepted by +heShe=, he/she now has +complete=\ days to complete a review. +#Peer completed +completedReviewSubject=A peer review has been completed! +requestReviewed=Your peer request has now been reviewed and is available. +supervisorMessageBody=You are getting this message because you are supervisor of " +#Peer completed supervisor of project +supervisorMessageBody2=".\nA peer review on this project has been completed and is available for you. +#Peer completed supervisor of reviewer +supervisorMessageBody3=\ has performed a peer review on someone elses work which is available for you. +#Peer completed webnotification +inProject=in project: +hasPerformed=\ has performed a peer review. +commaWithLinebreak=".\n +#Peer rated +reviewRatedSubject=You have received a rating for a review you have done! +reviewRatedBody=Your review has been rated. diff --git a/src/main/webapp/css/scipro.css b/src/main/webapp/css/scipro.css index bd86a24b31..39719404a2 100644 --- a/src/main/webapp/css/scipro.css +++ b/src/main/webapp/css/scipro.css @@ -140,6 +140,16 @@ img.department-logotype { border: 1px solid #777A91; } +.rounded-border-notification { + padding:0.7em; + margin-bottom:0.5em; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + overflow: hidden; + border: 1px solid #777A91; +} + .rounded-border h5 { background-color: #d7e0eb; margin: -1.5em -1.5em 0.4em -1.5em; diff --git a/src/test/java/se/su/dsv/scipro/dao/jpa/TestBoardMessageDaoJPA-context.xml b/src/test/java/se/su/dsv/scipro/dao/jpa/TestBoardMessageDaoJPA-context.xml index d04ffe7131..4526009fc0 100644 --- a/src/test/java/se/su/dsv/scipro/dao/jpa/TestBoardMessageDaoJPA-context.xml +++ b/src/test/java/se/su/dsv/scipro/dao/jpa/TestBoardMessageDaoJPA-context.xml @@ -32,5 +32,17 @@ <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean> + <bean id="projectDao" class="se.su.dsv.scipro.data.dao.jpa.ProjectDaoJPAImp"> + <property name="entityManagerFactory" ref="entityManagerFactory" /> + </bean> + + <bean id="roleDao" class="se.su.dsv.scipro.data.dao.jpa.RoleDaoJPAImp"> + <property name="entityManagerFactory" ref="entityManagerFactory" /> + </bean> + + + <bean id="projectClassDao" class="se.su.dsv.scipro.data.dao.jpa.ProjectClassDaoJPAImp"> + <property name="entityManagerFactory" ref="entityManagerFactory" /> + </bean> </beans> \ No newline at end of file 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 bb6e895d6e..8b4ed74aa2 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 @@ -3,10 +3,8 @@ */ package se.su.dsv.scipro.dao.jpa; -import java.util.ArrayList; -import java.util.List; -import java.util.SortedSet; -import java.util.TreeSet; +import java.util.HashSet; +import java.util.Set; import org.junit.Assert; import org.junit.Before; @@ -20,9 +18,16 @@ import org.springframework.transaction.annotation.Transactional; import se.su.dsv.scipro.data.dao.interfaces.BoardMessageDao; import se.su.dsv.scipro.data.dao.interfaces.MessageBoardDao; +import se.su.dsv.scipro.data.dao.interfaces.ProjectClassDao; +import se.su.dsv.scipro.data.dao.interfaces.ProjectDao; +import se.su.dsv.scipro.data.dao.interfaces.RoleDao; import se.su.dsv.scipro.data.dao.interfaces.UserDao; import se.su.dsv.scipro.data.dataobjects.BoardMessage; +import se.su.dsv.scipro.data.dataobjects.Employee; import se.su.dsv.scipro.data.dataobjects.MessageBoard; +import se.su.dsv.scipro.data.dataobjects.Project; +import se.su.dsv.scipro.data.dataobjects.ProjectClass; +import se.su.dsv.scipro.data.dataobjects.Student; import se.su.dsv.scipro.data.dataobjects.User; /** @@ -42,6 +47,16 @@ public class TestBoardMessageDaoJPA { @Autowired private MessageBoardDao messageBoardDao; + + @Autowired + private ProjectClassDao projectClassDao; + + @Autowired + private RoleDao roleDao; + + @Autowired + private ProjectDao projectDao; + private User user; private BoardMessage boardMessage; private MessageBoard messageBoard; @@ -55,18 +70,42 @@ public class TestBoardMessageDaoJPA { user.setFirstName("Test"); user.setLastName("Person"); user = userDao.save(user); - - + ProjectClass projectClass = new ProjectClass(); + projectClass.setName("Master"); + projectClass.setCode(ProjectClass.MASTER); + projectClass = projectClassDao.save(projectClass); - messageBoard = new MessageBoard(); + User presenter = new User(); + presenter.setFirstName("Presenter"); + presenter = userDao.save(presenter); + + Student presenterRole = roleDao.makeStudent(presenter); + + Employee opponentProjectSupervisorRole = roleDao.makeEmployee(presenter); + + + Project presenterProject = new Project(); + presenterProject.setTitle("Presenter Project"); + presenterProject.setHeadSupervisor(opponentProjectSupervisorRole); + presenterProject.setProjectClass(projectClass); + presenterProject.addProjectParticipant(presenterRole); + presenterProject = projectDao.save(presenterProject); + + 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); + } @@ -76,6 +115,13 @@ public class TestBoardMessageDaoJPA { public void testGetBoardMessageList() { Assert.assertEquals(1, boardMessageDao.getBoardMessageList(messageBoard, 0, 1).size()); } + + @Test + @Transactional + @Rollback + public void testGetBoardMessageListCount() { + Assert.assertEquals(1, boardMessageDao.getBoardMessageListCount(messageBoard)); + } } diff --git a/src/test/java/se/su/dsv/scipro/dao/jpa/TestCommentThreadDaoJpa.java b/src/test/java/se/su/dsv/scipro/dao/jpa/TestCommentThreadDaoJPA.java similarity index 97% rename from src/test/java/se/su/dsv/scipro/dao/jpa/TestCommentThreadDaoJpa.java rename to src/test/java/se/su/dsv/scipro/dao/jpa/TestCommentThreadDaoJPA.java index 6e2c200381..a7ad4ab9c4 100644 --- a/src/test/java/se/su/dsv/scipro/dao/jpa/TestCommentThreadDaoJpa.java +++ b/src/test/java/se/su/dsv/scipro/dao/jpa/TestCommentThreadDaoJPA.java @@ -8,7 +8,6 @@ import java.util.TreeSet; import org.junit.Assert; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -33,10 +32,10 @@ import se.su.dsv.scipro.data.dataobjects.User; * @author Johan Aschan - aschan@dsv.su.se * */ -@Ignore + @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration -public class TestCommentThreadDaoJpa { +public class TestCommentThreadDaoJPA { @Autowired private CommentDao commentDao; diff --git a/src/test/java/se/su/dsv/scipro/dao/jpa/TestMessageBoardDaoJPA-context.xml b/src/test/java/se/su/dsv/scipro/dao/jpa/TestMessageBoardDaoJPA-context.xml new file mode 100644 index 0000000000..38e51dd0cf --- /dev/null +++ b/src/test/java/se/su/dsv/scipro/dao/jpa/TestMessageBoardDaoJPA-context.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="UTF-8"?> +<beans xmlns="http://www.springframework.org/schema/beans" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd + http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd" + default-autowire="byName"> + + <bean id="entityManagerFactory" + class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> + <property name="persistenceUnitName" value="testPersistenceUnit" /> + </bean> + + <!-- + enable the configuration of transactional behavior based on + annotations + --> + <tx:annotation-driven transaction-manager="transactionManager" /> + + <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> + <property name="entityManagerFactory" ref="entityManagerFactory" /> + </bean> + + <bean id="userDao" class="se.su.dsv.scipro.data.dao.jpa.UserDaoJPAImp"> + <property name="entityManagerFactory" ref="entityManagerFactory" /> + </bean> + + <bean id="messageBoardDao" class="se.su.dsv.scipro.data.dao.jpa.MessageBoardDaoJPAImp"> + <property name="entityManagerFactory" ref="entityManagerFactory" /> + </bean> + + <bean id="projectDao" class="se.su.dsv.scipro.data.dao.jpa.ProjectDaoJPAImp"> + <property name="entityManagerFactory" ref="entityManagerFactory" /> + </bean> + + <bean id="roleDao" class="se.su.dsv.scipro.data.dao.jpa.RoleDaoJPAImp"> + <property name="entityManagerFactory" ref="entityManagerFactory" /> + </bean> + + + <bean id="projectClassDao" class="se.su.dsv.scipro.data.dao.jpa.ProjectClassDaoJPAImp"> + <property name="entityManagerFactory" ref="entityManagerFactory" /> + </bean> + +</beans> \ No newline at end of file diff --git a/src/test/java/se/su/dsv/scipro/dao/jpa/TestMessageBoardDaoJPA.java b/src/test/java/se/su/dsv/scipro/dao/jpa/TestMessageBoardDaoJPA.java new file mode 100644 index 0000000000..0380c558c9 --- /dev/null +++ b/src/test/java/se/su/dsv/scipro/dao/jpa/TestMessageBoardDaoJPA.java @@ -0,0 +1,109 @@ +/** + * + */ +package se.su.dsv.scipro.dao.jpa; + +import java.util.HashSet; +import java.util.Set; + +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.BoardMessageDao; +import se.su.dsv.scipro.data.dao.interfaces.MessageBoardDao; +import se.su.dsv.scipro.data.dao.interfaces.ProjectClassDao; +import se.su.dsv.scipro.data.dao.interfaces.ProjectDao; +import se.su.dsv.scipro.data.dao.interfaces.RoleDao; +import se.su.dsv.scipro.data.dao.interfaces.UserDao; +import se.su.dsv.scipro.data.dataobjects.BoardMessage; +import se.su.dsv.scipro.data.dataobjects.Employee; +import se.su.dsv.scipro.data.dataobjects.MessageBoard; +import se.su.dsv.scipro.data.dataobjects.Project; +import se.su.dsv.scipro.data.dataobjects.ProjectClass; +import se.su.dsv.scipro.data.dataobjects.Student; +import se.su.dsv.scipro.data.dataobjects.User; + +/** + * @author Johan Aschan - aschan@dsv.su.se + * + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration +public class TestMessageBoardDaoJPA { + + @Autowired + private UserDao userDao; + + @Autowired + private MessageBoardDao messageBoardDao; + + + @Autowired + private ProjectClassDao projectClassDao; + + @Autowired + private RoleDao roleDao; + + @Autowired + private ProjectDao projectDao; + + private User user; + + private MessageBoard messageBoard; + private Project presenterProject; + + @Before + public void startTransaction() + { + user = new User(); + user.setEmailAddress("test@dsv.su.se"); + user.setIdentifier(new Long(666)); + user.setFirstName("Test"); + user.setLastName("Person"); + user = userDao.save(user); + + ProjectClass projectClass = new ProjectClass(); + projectClass.setName("Master"); + projectClass.setCode(ProjectClass.MASTER); + projectClass = projectClassDao.save(projectClass); + + User presenter = new User(); + presenter.setFirstName("Presenter"); + presenter = userDao.save(presenter); + + Student presenterRole = roleDao.makeStudent(presenter); + + Employee opponentProjectSupervisorRole = roleDao.makeEmployee(presenter); + + + presenterProject = new Project(); + presenterProject.setTitle("Presenter Project"); + presenterProject.setHeadSupervisor(opponentProjectSupervisorRole); + presenterProject.setProjectClass(projectClass); + presenterProject.addProjectParticipant(presenterRole); + presenterProject = projectDao.save(presenterProject); + + Set<User> subscribers = new HashSet<User>(); + subscribers.add(user); + messageBoard = new MessageBoard(presenterProject); + messageBoard.setTitle("test"); + messageBoard = messageBoardDao.save(messageBoard); + + } + + @Test + @Transactional + @Rollback + public void testGetBoardMessageList() { + Assert.assertEquals(messageBoard, messageBoardDao.getMessageBoard(presenterProject)); + } + + +} diff --git a/src/test/java/se/su/dsv/scipro/dao/jpa/TestPrivateMessageDaoJPA.java b/src/test/java/se/su/dsv/scipro/dao/jpa/TestPrivateMessageDaoJPA.java index c2e5086636..e346c70c59 100644 --- a/src/test/java/se/su/dsv/scipro/dao/jpa/TestPrivateMessageDaoJPA.java +++ b/src/test/java/se/su/dsv/scipro/dao/jpa/TestPrivateMessageDaoJPA.java @@ -3,11 +3,6 @@ */ package se.su.dsv.scipro.dao.jpa; -import java.util.ArrayList; -import java.util.List; -import java.util.SortedSet; -import java.util.TreeSet; - import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -18,12 +13,8 @@ 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.BoardMessageDao; -import se.su.dsv.scipro.data.dao.interfaces.MessageBoardDao; import se.su.dsv.scipro.data.dao.interfaces.PrivateMessageDao; import se.su.dsv.scipro.data.dao.interfaces.UserDao; -import se.su.dsv.scipro.data.dataobjects.BoardMessage; -import se.su.dsv.scipro.data.dataobjects.MessageBoard; import se.su.dsv.scipro.data.dataobjects.PrivateMessage; import se.su.dsv.scipro.data.dataobjects.User; diff --git a/src/test/java/se/su/dsv/scipro/dao/jpa/TestProjectPartnerDaoJPA.java b/src/test/java/se/su/dsv/scipro/dao/jpa/TestProjectPartnerDaoJPA.java index 04e4eb6b7c..020fb62cdb 100644 --- a/src/test/java/se/su/dsv/scipro/dao/jpa/TestProjectPartnerDaoJPA.java +++ b/src/test/java/se/su/dsv/scipro/dao/jpa/TestProjectPartnerDaoJPA.java @@ -1,7 +1,6 @@ package se.su.dsv.scipro.dao.jpa; import org.junit.Assert; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -17,7 +16,6 @@ import se.su.dsv.scipro.data.dataobjects.ProjectClass; import se.su.dsv.scipro.data.dataobjects.ProjectPartner; import se.su.dsv.scipro.data.dataobjects.User; -@Ignore @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration public class TestProjectPartnerDaoJPA { diff --git a/src/test/java/se/su/dsv/scipro/dao/jpa/TestRecipientDaoJPA.java b/src/test/java/se/su/dsv/scipro/dao/jpa/TestRecipientDaoJPA.java index 60c29b3b02..0ffb2832b4 100644 --- a/src/test/java/se/su/dsv/scipro/dao/jpa/TestRecipientDaoJPA.java +++ b/src/test/java/se/su/dsv/scipro/dao/jpa/TestRecipientDaoJPA.java @@ -3,11 +3,6 @@ */ package se.su.dsv.scipro.dao.jpa; -import java.util.ArrayList; -import java.util.List; -import java.util.SortedSet; -import java.util.TreeSet; - import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -18,13 +13,9 @@ 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.BoardMessageDao; -import se.su.dsv.scipro.data.dao.interfaces.MessageBoardDao; import se.su.dsv.scipro.data.dao.interfaces.PrivateMessageDao; import se.su.dsv.scipro.data.dao.interfaces.RecipientDao; import se.su.dsv.scipro.data.dao.interfaces.UserDao; -import se.su.dsv.scipro.data.dataobjects.BoardMessage; -import se.su.dsv.scipro.data.dataobjects.MessageBoard; import se.su.dsv.scipro.data.dataobjects.PrivateMessage; import se.su.dsv.scipro.data.dataobjects.Recipient; import se.su.dsv.scipro.data.dataobjects.User; diff --git a/src/test/java/se/su/dsv/scipro/dao/jpa/TestResourceDaoJPA.java b/src/test/java/se/su/dsv/scipro/dao/jpa/TestResourceDaoJPA.java index 1ce8d7e947..8150366333 100644 --- a/src/test/java/se/su/dsv/scipro/dao/jpa/TestResourceDaoJPA.java +++ b/src/test/java/se/su/dsv/scipro/dao/jpa/TestResourceDaoJPA.java @@ -6,7 +6,6 @@ import java.util.List; import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import org.junit.experimental.categories.Categories; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.Rollback; diff --git a/src/test/java/se/su/dsv/scipro/dao/jpa/TestRoleDaoJPA.java b/src/test/java/se/su/dsv/scipro/dao/jpa/TestRoleDaoJPA.java index d2a368bb50..66af6df332 100644 --- a/src/test/java/se/su/dsv/scipro/dao/jpa/TestRoleDaoJPA.java +++ b/src/test/java/se/su/dsv/scipro/dao/jpa/TestRoleDaoJPA.java @@ -1,9 +1,6 @@ package se.su.dsv.scipro.dao.jpa; -import java.util.ArrayList; -import java.util.List; - import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -17,8 +14,9 @@ import org.springframework.transaction.annotation.Transactional; import se.su.dsv.scipro.data.dao.interfaces.RoleDao; import se.su.dsv.scipro.data.dao.interfaces.UserDao; import se.su.dsv.scipro.data.dataobjects.Admin; -import se.su.dsv.scipro.data.dataobjects.Student; -import se.su.dsv.scipro.data.dataobjects.*; +import se.su.dsv.scipro.data.dataobjects.Employee; +import se.su.dsv.scipro.data.dataobjects.SysAdmin; +import se.su.dsv.scipro.data.dataobjects.User; /** * diff --git a/src/test/java/se/su/dsv/scipro/dao/jpa/TestStringResourceDaoJPA.java b/src/test/java/se/su/dsv/scipro/dao/jpa/TestStringResourceDaoJPA.java index 7fcddeb2d9..678ef3ab14 100644 --- a/src/test/java/se/su/dsv/scipro/dao/jpa/TestStringResourceDaoJPA.java +++ b/src/test/java/se/su/dsv/scipro/dao/jpa/TestStringResourceDaoJPA.java @@ -1,10 +1,6 @@ package se.su.dsv.scipro.dao.jpa; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -15,11 +11,7 @@ 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.EventDao; -import se.su.dsv.scipro.data.dao.interfaces.ProjectScheduleDao; import se.su.dsv.scipro.data.dao.interfaces.StringResourceDao; -import se.su.dsv.scipro.data.dataobjects.Event; -import se.su.dsv.scipro.data.dataobjects.ProjectSchedule; import se.su.dsv.scipro.data.dataobjects.StringResource; /** diff --git a/src/test/java/se/su/dsv/scipro/dao/jpa/TestUserDaoJPA-context.xml b/src/test/java/se/su/dsv/scipro/dao/jpa/TestUserDaoJPA-context.xml index 061e25ce06..2ae9d67473 100644 --- a/src/test/java/se/su/dsv/scipro/dao/jpa/TestUserDaoJPA-context.xml +++ b/src/test/java/se/su/dsv/scipro/dao/jpa/TestUserDaoJPA-context.xml @@ -25,10 +25,12 @@ <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean> - <bean id="usernameDao" class="se.su.dsv.scipro.data.dao.jpa.UserNameDaoJPAImp"> + <bean id="usernameDao" class="se.su.dsv.scipro.data.dao.jpa.UserNameDaoJPAImp"> <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean> - + <bean id="roleDao" class="se.su.dsv.scipro.data.dao.jpa.RoleDaoJPAImp"> + <property name="entityManagerFactory" ref="entityManagerFactory" /> + </bean> </beans> diff --git a/src/test/java/se/su/dsv/scipro/dao/jpa/TestUserDaoJPA.java b/src/test/java/se/su/dsv/scipro/dao/jpa/TestUserDaoJPA.java index f68db5c2ac..7f497a4669 100644 --- a/src/test/java/se/su/dsv/scipro/dao/jpa/TestUserDaoJPA.java +++ b/src/test/java/se/su/dsv/scipro/dao/jpa/TestUserDaoJPA.java @@ -14,8 +14,10 @@ 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.RoleDao; import se.su.dsv.scipro.data.dao.interfaces.UserDao; import se.su.dsv.scipro.data.dao.interfaces.UsernameDao; +import se.su.dsv.scipro.data.dataobjects.Employee; import se.su.dsv.scipro.data.dataobjects.User; import se.su.dsv.scipro.data.dataobjects.Username; @@ -33,6 +35,9 @@ public class TestUserDaoJPA { @Autowired private UsernameDao userNameDao; + + @Autowired + private RoleDao roleDao; protected User user; @@ -143,12 +148,41 @@ public class TestUserDaoJPA { @Test @Transactional @Rollback - public void findUserQueryCount() { + public void findUserQueryCount1() { Username username = new Username(); username.setUser(user); username.setUserName("test"); username.setRealm("test"); userNameDao.save(username); - Assert.assertEquals(1, userDao.findUserQueryCount(null, null)); + + roleDao.makeEmployee(user); + + List<User> notIncludeList = new ArrayList<User>(); + notIncludeList.add(user); + Assert.assertEquals(0, userDao.findUserQueryCount("test", Employee.class, notIncludeList)); } + + @Test @Transactional + @Rollback + public void findUserQuery1() { + Username username = new Username(); + username.setUser(user); + username.setUserName("test"); + username.setRealm("test"); + userNameDao.save(username); + Assert.assertEquals(user, userDao.findUserQuery("test", 2).get(0)); + } + + @Test @Transactional + @Rollback + public void findUserQuery2() { + Username username = new Username(); + username.setUser(user); + username.setUserName("test"); + username.setRealm("test"); + userNameDao.save(username); + Assert.assertEquals(user, userDao.findUserQuery("test", 0, 2).get(0)); + } + + } diff --git a/src/test/java/se/su/dsv/scipro/dao/jpa/TestWebNotificationDaoJPA-context.xml b/src/test/java/se/su/dsv/scipro/dao/jpa/TestWebNotificationDaoJPA-context.xml new file mode 100644 index 0000000000..b82ffca1cb --- /dev/null +++ b/src/test/java/se/su/dsv/scipro/dao/jpa/TestWebNotificationDaoJPA-context.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<beans xmlns="http://www.springframework.org/schema/beans" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd + http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd" + default-autowire="byName"> + + <bean id="entityManagerFactory" + class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> + <property name="persistenceUnitName" value="testPersistenceUnit" /> + </bean> + + <!-- + enable the configuration of transactional behavior based on + annotations + --> + <tx:annotation-driven transaction-manager="transactionManager" /> + + <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> + <property name="entityManagerFactory" ref="entityManagerFactory" /> + </bean> + + <bean id="userDao" class="se.su.dsv.scipro.data.dao.jpa.UserDaoJPAImp"> + <property name="entityManagerFactory" ref="entityManagerFactory" /> + </bean> + + <bean id="notificationDao" class="se.su.dsv.scipro.data.dao.jpa.WebNotificationDaoJPAImp"> + <property name="entityManagerFactory" ref="entityManagerFactory" /> + </bean> + +</beans> \ No newline at end of file diff --git a/src/test/java/se/su/dsv/scipro/dao/jpa/TestWebNotificationDaoJPA.java b/src/test/java/se/su/dsv/scipro/dao/jpa/TestWebNotificationDaoJPA.java new file mode 100644 index 0000000000..04ab158a39 --- /dev/null +++ b/src/test/java/se/su/dsv/scipro/dao/jpa/TestWebNotificationDaoJPA.java @@ -0,0 +1,81 @@ +/** + * + */ +package se.su.dsv.scipro.dao.jpa; + +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.WebNotificationDao; +import se.su.dsv.scipro.data.dao.interfaces.UserDao; +import se.su.dsv.scipro.data.dataobjects.WebNotification; +import se.su.dsv.scipro.data.dataobjects.User; + +/** + * @author Johan Aschan - aschan@dsv.su.se + * + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration +public class TestWebNotificationDaoJPA { + + @Autowired + private UserDao userDao; + + @Autowired + private WebNotificationDao notificationDao; + + + private User user; + + + + @Before + public void startTransaction() + { + user = new User(); + user.setEmailAddress("test@dsv.su.se"); + user.setIdentifier(new Long(666)); + user.setFirstName("Test"); + user.setLastName("Person"); + user = userDao.save(user); + + WebNotification notification = new WebNotification(); + notification.setInfoText("Test"); + notification.setUrl("/test/"); + notification.setUser(user); + notificationDao.save(notification); + + + } + + @Test + @Transactional + @Rollback + public void testGetNotifications() { + Assert.assertEquals(1, notificationDao.getWebNotifications(user).size()); + } + + @Test + @Transactional + @Rollback + public void testGetNotificationsFirstCount() { + Assert.assertEquals(1, notificationDao.getWebNotifications(user, 0, 1).size()); + } + + @Test + @Transactional + @Rollback + public void testGetNumberOfNotifications() { + Assert.assertEquals(1, notificationDao.getCountOfWebNotifications(user)); + } + + +} diff --git a/src/test/java/se/su/dsv/scipro/wicket/BaseWicketTest.java b/src/test/java/se/su/dsv/scipro/wicket/BaseWicketTest.java index 39bead90e1..f245abf959 100644 --- a/src/test/java/se/su/dsv/scipro/wicket/BaseWicketTest.java +++ b/src/test/java/se/su/dsv/scipro/wicket/BaseWicketTest.java @@ -21,6 +21,7 @@ import org.springframework.orm.jpa.LocalEntityManagerFactoryBean; import se.su.dsv.scipro.ApplicationSettings; import se.su.dsv.scipro.SciProApplication; import se.su.dsv.scipro.data.controllers.FinalSeminarUploadController; +import se.su.dsv.scipro.data.controllers.NotificationController; import se.su.dsv.scipro.data.dao.interfaces.BoardMessageDao; import se.su.dsv.scipro.data.dao.interfaces.CommentDao; import se.su.dsv.scipro.data.dao.interfaces.CommentThreadDao; @@ -44,6 +45,7 @@ import se.su.dsv.scipro.data.dao.interfaces.ScheduleTemplateDao; import se.su.dsv.scipro.data.dao.interfaces.StringResourceDao; import se.su.dsv.scipro.data.dao.interfaces.UserDao; import se.su.dsv.scipro.data.dao.interfaces.UserSettingsDao; +import se.su.dsv.scipro.data.dao.interfaces.WebNotificationDao; import se.su.dsv.scipro.data.dao.interfaces.WorkerDataDao; import se.su.dsv.scipro.data.dataobjects.GeneralSystemSettings; import se.su.dsv.scipro.data.dataobjects.Project; @@ -100,6 +102,8 @@ public class BaseWicketTest { @Mock HandInActivityDao handInActivityDao; @Mock ScheduleTemplateDao scheduleTemplateDao; @Mock ProjectPartnerDao projectPartnerDao; + @Mock WebNotificationDao webNotificationDao; + @Mock NotificationController notificationController; @Mock ApplicationSettings applicationSettings; diff --git a/src/test/java/se/su/dsv/scipro/wicket/TestWicketPages.java b/src/test/java/se/su/dsv/scipro/wicket/TestWicketPages.java index 1598642fd7..61b0886b8f 100644 --- a/src/test/java/se/su/dsv/scipro/wicket/TestWicketPages.java +++ b/src/test/java/se/su/dsv/scipro/wicket/TestWicketPages.java @@ -9,6 +9,8 @@ import se.su.dsv.scipro.HomePage; import se.su.dsv.scipro.admin.pages.AdminProjectPartnerPage; import se.su.dsv.scipro.admin.pages.SystemMaintenancePage; import se.su.dsv.scipro.admin.pages.settings.AdminServerEnvironmentSettingsPage; +import se.su.dsv.scipro.conference.pages.ProjectConferencePage; +import se.su.dsv.scipro.conference.pages.SupervisorConferencePage; import se.su.dsv.scipro.data.dataobjects.GeneralSystemSettings; import se.su.dsv.scipro.data.dataobjects.Project; import se.su.dsv.scipro.data.dataobjects.ProjectClass; @@ -16,10 +18,12 @@ import se.su.dsv.scipro.data.dataobjects.User; import se.su.dsv.scipro.loginlogout.pages.LoginPage; import se.su.dsv.scipro.loginlogout.pages.LogoutPage; import se.su.dsv.scipro.project.pages.FinalSeminarProjectListPage; +import se.su.dsv.scipro.project.pages.NoActiveProjectPage; import se.su.dsv.scipro.project.pages.ProjectFilePage; import se.su.dsv.scipro.project.pages.ProjectOppositionPage; 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.supervisor.pages.SupervisorFinalSeminarListingPage; import se.su.dsv.scipro.supervisor.pages.SupervisorProjectDetailsPage; import se.su.dsv.scipro.supervisor.pages.SupervisorScheduleTemplatesPage; @@ -86,14 +90,14 @@ public class TestWicketPages extends BaseWicketTest { * Project/author/student pages */ @Test - public void testProjectStartPage() { - //tester.startPage(ProjectStartPage.class); - //tester.assertRenderedPage(NoActiveProjectPage.class); + public void testProjectStartPage(){ + tester.startPage(ProjectStartPage.class); + tester.assertRenderedPage(NoActiveProjectPage.class); //TODO: Set an active project so that the following test works - - //tester.startPage(ProjectStartPage.class); - //tester.assertRenderedPage(ProjectStartPage.class); + this.setActiveProject(activeProject); + tester.startPage(ProjectStartPage.class); + tester.assertRenderedPage(ProjectStartPage.class); } @Test @@ -129,12 +133,14 @@ public class TestWicketPages extends BaseWicketTest { tester.assertRenderedPage(ProjectFilePage.class); } + /* * Supervisor pages */ @Test public void testSupervisorStartPage(){ MockSciProSession.currentSession.setLoggedInAsEmployee(); + tester.startPage(SupervisorStartPage.class); tester.assertRenderedPage(SupervisorStartPage.class); } @@ -160,6 +166,12 @@ public class TestWicketPages extends BaseWicketTest { tester.assertRenderedPage(SupervisorScheduleTemplatesPage.class); } + @Test + public void testSupervisorConferencePage(){ + tester.startPage(SupervisorConferencePage.class); + tester.assertRenderedPage(SupervisorConferencePage.class); + } + /* * Admin pages */ @@ -190,6 +202,7 @@ public class TestWicketPages extends BaseWicketTest { public void testAdminServerEnvironmentSettingsPage(){ tester.startPage(AdminServerEnvironmentSettingsPage.class); } + }