commentthread

This commit is contained in:
joha-asc 2011-07-21 15:49:28 +02:00
commit a3e43b7a89
132 changed files with 4102 additions and 3017 deletions
src/main/java/se/su/dsv/scipro
SciProApplication.java
admin
basepanels
commentthread
conference
data
dataproviders
json
knol/resource/panels
message/models
opponent
peer/data/dao/controllers
project

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

@ -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>

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

@ -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>

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

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

@ -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>

@ -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

@ -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>

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

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

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

@ -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>

@ -0,0 +1,174 @@
/**
*
*/
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.Employee;
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.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());
}
}

@ -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>

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

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

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

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

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

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

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

@ -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>{
}

@ -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>{
}

@ -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>{
}

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

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

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

@ -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;

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

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

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

@ -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;
/**

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

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

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

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

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

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

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

@ -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;

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

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

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

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

@ -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()
*/
}

@ -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;

@ -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

@ -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;

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

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

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

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

@ -6,6 +6,4 @@ public enum NotificationEventType {
PEER_REVIEW_ACCEPTED,
PEER_REVIEW_RATED,
PEER_REVIEW_GRADED,
}

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

@ -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

@ -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)

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

@ -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;

@ -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;

@ -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;

@ -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;

@ -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;
/**

@ -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;

@ -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;

@ -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;
/**

@ -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;
/**

@ -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;
/**

@ -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{

@ -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) {

@ -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

@ -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) {

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

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

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

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

@ -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();

@ -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;

@ -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>

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

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

@ -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>

@ -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> {
/**

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

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

@ -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;

@ -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>

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

@ -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;

@ -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;

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

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

@ -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,10 +27,7 @@
<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>
</div>
<!-- Right column -->
<div class="span-10 last">

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

@ -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>

@ -0,0 +1,140 @@
/**
*
*/
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;
/**
* @author Johan Aschan <aschan@dsv.su.se>
*
*/
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);
}
}

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

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

@ -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

Some files were not shown because too many files have changed in this diff Show More