Merge branch 'develop' of git.dsv.su.se:/git/scipro/scipro into develop

This commit is contained in:
Niklas Herder 2012-04-02 12:31:32 +02:00
commit 5620dd7221
10 changed files with 253 additions and 91 deletions

@ -24,11 +24,6 @@
<name>Spring Maven MILESTONE Repository</name> <name>Spring Maven MILESTONE Repository</name>
<url>http://repo.springsource.org/libs-milestone</url> <url>http://repo.springsource.org/libs-milestone</url>
</repository> </repository>
<repository>
<id>spring-roo-repository</id>
<name>Spring Roo Repository</name>
<url>http://spring-roo-repository.springsource.org/release</url>
</repository>
</repositories> </repositories>
<dependencies> <dependencies>
<!-- WICKET DEPENDENCIES --> <!-- WICKET DEPENDENCIES -->

@ -12,6 +12,7 @@ import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel; import org.apache.wicket.model.IModel;
import org.apache.wicket.spring.injection.annot.SpringBean; import org.apache.wicket.spring.injection.annot.SpringBean;
import org.apache.wicket.util.string.Strings;
import se.su.dsv.scipro.SciProSession; import se.su.dsv.scipro.SciProSession;
import se.su.dsv.scipro.admin.pages.match.AdminManageProjectIdeaPage; import se.su.dsv.scipro.admin.pages.match.AdminManageProjectIdeaPage;
import se.su.dsv.scipro.data.dataobjects.Employee; import se.su.dsv.scipro.data.dataobjects.Employee;
@ -56,16 +57,19 @@ public class ManualMatchPanel extends Panel {
add(currentFragment.setOutputMarkupId(true)); add(currentFragment.setOutputMarkupId(true));
} }
private String createNameAndEmailOutput(Employee employee) {
private String createNameAndEmail(Employee employee) {
return employee.getNameAsString() + " <" + employee.getEmailAsString()+">"; return employee.getNameAsString() + " <" + employee.getEmailAsString()+">";
} }
private String createNameAndEmailAutoComplete(Employee employee) {
return employee.getNameAsString() + " &lt;" + employee.getEmailAsString()+"&gt;";
}
private boolean testACInputString(EmployeeAutoComplete autoCompleteObjectField) { private boolean testACInputString(EmployeeAutoComplete autoCompleteObjectField) {
return autoCompleteObjectField.getModelObject() == null || return autoCompleteObjectField.getModelObject() == null ||
autoCompleteObjectField.getInput() == null || autoCompleteObjectField.getInput() == null ||
autoCompleteObjectField.getInput().isEmpty() || autoCompleteObjectField.getInput().isEmpty() ||
!autoCompleteObjectField.getInput().equals(createNameAndEmail(autoCompleteObjectField.getModelObject())); !autoCompleteObjectField.getInput().equals(autoCompleteObjectField.getModelObject().getNameAsString());
} }
private ConfirmerAjaxSubmitLink createSubmitLink(final IModel<Match> matchModel, final Component feedbackPanel, final Match.Status status, private ConfirmerAjaxSubmitLink createSubmitLink(final IModel<Match> matchModel, final Component feedbackPanel, final Match.Status status,
@ -81,7 +85,7 @@ public class ManualMatchPanel extends Panel {
matchModel.getObject().setSupervisor(autoCompleteObjectField.getModelObject() != null ? autoCompleteObjectField.getModelObject():null); matchModel.getObject().setSupervisor(autoCompleteObjectField.getModelObject() != null ? autoCompleteObjectField.getModelObject():null);
matchModel.getObject().setStatus(status); matchModel.getObject().setStatus(status);
matchDao.changeStatus(SciProSession.get().getUser(), matchModel.getObject(), null); matchDao.changeStatus(SciProSession.get().getUser(), matchModel.getObject(), null);
Session.get().info(createMatchMessage(createNameAndEmail(autoCompleteObjectField.getModelObject()), matchModel.getObject().getProjectIdea().getTitle(), status)); Session.get().info(createMatchMessage(autoCompleteObjectField.getModelObject(), matchModel.getObject().getProjectIdea().getTitle(), status));
setResponsePage(AdminManageProjectIdeaPage.class); setResponsePage(AdminManageProjectIdeaPage.class);
target.addComponent(feedbackPanel); target.addComponent(feedbackPanel);
} }
@ -197,19 +201,14 @@ public class ManualMatchPanel extends Panel {
private static final long serialVersionUID = 7734889540424308421L; private static final long serialVersionUID = 7734889540424308421L;
@Override @Override
public void action(AjaxRequestTarget pTarget, Employee newSelection) { public void action(AjaxRequestTarget pTarget, Employee newSelection) {
// these checks have already been performed when action is called final String declineMessage = createDeclineMessage(newSelection, projectIdea, status);
// if (newSelection != null) { if(declineMessage != null && !declineMessage.isEmpty()) {
// if (pTarget != null) { saveButton.setMessageContentHTML(declineMessage);
final String declineMessage = createDeclineMessage(newSelection, projectIdea, status); pTarget.addComponent(saveButton);
if(declineMessage != null && !declineMessage.isEmpty()) { } else {
saveButton.setMessageContentHTML(declineMessage); saveButton.setMessageContentHTML(createConfirmationMessage(newSelection, status));
pTarget.addComponent(saveButton); pTarget.addComponent(saveButton);
} else { }
saveButton.setMessageContentHTML(createConfirmationMessage(newSelection, status));
pTarget.addComponent(saveButton);
}
// }
// }
} }
}; };
} }
@ -217,20 +216,20 @@ public class ManualMatchPanel extends Panel {
/** /**
* *
* This method is used to return a match message that the employee was matched or suggested to supervise the project idea . * This method is used to return a match message that the employee was matched or suggested to supervise the project idea .
* @param nameAndEmail the name and email of the employee * @param employee the employee that is confirmed or suggested to supervise
* @param projectIdeaTitle the title of the project idea * @param projectIdeaTitle the title of the project idea
* @param status the status of the match * @param status the status of the match
* @return String the match message * @return String the match message
*/ */
private String createMatchMessage(final String nameAndEmail, final String projectIdeaTitle, Match.Status status) { private String createMatchMessage(final Employee employee, final String projectIdeaTitle, Match.Status status) {
StringBuilder messageStr = new StringBuilder(); StringBuilder messageStr = new StringBuilder();
messageStr.append(nameAndEmail != null ? nameAndEmail : "" ); messageStr.append(createNameAndEmailOutput(employee));
if(status.equals(Match.Status.CONFIRMED)) { if(status.equals(Match.Status.CONFIRMED)) {
messageStr.append(" was accepted "); messageStr.append(" was accepted ");
} else if (status.equals(Match.Status.PUBLISHED)) { } else if (status.equals(Match.Status.PUBLISHED)) {
messageStr.append(" was suggested "); messageStr.append(" was suggested ");
} }
messageStr.append("as supervisor to The project idea "); messageStr.append("as supervisor for The project idea ");
messageStr.append(projectIdeaTitle != null ? projectIdeaTitle : ""); messageStr.append(projectIdeaTitle != null ? projectIdeaTitle : "");
messageStr.append("."); messageStr.append(".");
return messageStr.toString(); return messageStr.toString();
@ -250,7 +249,7 @@ public class ManualMatchPanel extends Panel {
StringBuilder stringBuilder = new StringBuilder(); StringBuilder stringBuilder = new StringBuilder();
if(declineMessage != null && !declineMessage.isEmpty()) { if(declineMessage != null && !declineMessage.isEmpty()) {
stringBuilder.append("The project idea has already been rejected by "); stringBuilder.append("The project idea has already been rejected by ");
stringBuilder.append(createNameAndEmail(supervisor)); stringBuilder.append(createNameAndEmailAutoComplete(supervisor));
stringBuilder.append(". The decline message was: '"); stringBuilder.append(". The decline message was: '");
stringBuilder.append(declineMessage); stringBuilder.append(declineMessage);
if(status.equals(Match.Status.CONFIRMED)) { if(status.equals(Match.Status.CONFIRMED)) {
@ -280,7 +279,7 @@ public class ManualMatchPanel extends Panel {
} else if (status.equals(Match.Status.PUBLISHED)) { } else if (status.equals(Match.Status.PUBLISHED)) {
stringBuilder.append("suggest "); stringBuilder.append("suggest ");
} }
stringBuilder.append(createNameAndEmail(supervisor)); stringBuilder.append(createNameAndEmailAutoComplete(supervisor));
stringBuilder.append(" as supervisor for the project idea."); stringBuilder.append(" as supervisor for the project idea.");
return stringBuilder.toString(); return stringBuilder.toString();
} }

@ -46,16 +46,20 @@ public class ManualSetReviewerPanel extends Panel {
add(currentFragment); add(currentFragment);
} }
private String createNameAndEmailOutput(Employee employee) {
private String createNameAndEmail(EmployeeAutoComplete autoCompleteObjectField) { return employee.getNameAsString() + " <" + employee.getEmailAsString()+">";
return autoCompleteObjectField.getModelObject().getNameAsString() + " <" + autoCompleteObjectField.getModelObject().getEmailAsString()+">";
} }
private String createNameAndEmailAutoComplete(Employee employee) {
return employee.getNameAsString() + " &lt;" + employee.getEmailAsString()+"&gt;";
}
private boolean testACInputString(EmployeeAutoComplete autoCompleteObjectField) { private boolean testACInputString(EmployeeAutoComplete autoCompleteObjectField) {
return autoCompleteObjectField.getModelObject() == null || return autoCompleteObjectField.getModelObject() == null ||
autoCompleteObjectField.getInput() == null || autoCompleteObjectField.getInput() == null ||
autoCompleteObjectField.getInput().isEmpty() || autoCompleteObjectField.getInput().isEmpty() ||
!autoCompleteObjectField.getInput().equals(createNameAndEmail(autoCompleteObjectField)); !autoCompleteObjectField.getInput().equals(autoCompleteObjectField.getModelObject().getNameAsString());
} }
private ConfirmerAjaxSubmitLink createSubmitLink(final IModel<ProjectIdea> projectIdeaModel, final Component feedbackPanel, private ConfirmerAjaxSubmitLink createSubmitLink(final IModel<ProjectIdea> projectIdeaModel, final Component feedbackPanel,
@ -73,7 +77,7 @@ public class ManualSetReviewerPanel extends Panel {
ProjectIdea projectIdea = projectIdeaModel.getObject(); ProjectIdea projectIdea = projectIdeaModel.getObject();
projectIdea.setSuggestedReviewer(autocompleteReviewerField.getModelObject()); projectIdea.setSuggestedReviewer(autocompleteReviewerField.getModelObject());
projectIdeaDao.save(projectIdea); projectIdeaDao.save(projectIdea);
Session.get().info(getInfoMessage(projectIdea.getTitle(), createNameAndEmail(autocompleteReviewerField))); Session.get().info(getInfoMessage(projectIdea.getTitle(), autocompleteReviewerField.getModelObject()));
setResponsePage(AdminManageProjectIdeaPage.class); setResponsePage(AdminManageProjectIdeaPage.class);
target.addComponent(feedbackPanel); target.addComponent(feedbackPanel);
} }
@ -81,7 +85,7 @@ public class ManualSetReviewerPanel extends Panel {
@Override //Listener method invoked on form submit with errors @Override //Listener method invoked on form submit with errors
protected void onError(AjaxRequestTarget target, Form<?> form) { protected void onError(AjaxRequestTarget target, Form<?> form) {
Session.get().error(getErrorMessage(projectIdeaModel.getObject().getTitle(), autocompleteReviewerField.getModelObject().getNameAsString())); Session.get().error(getErrorMessage(projectIdeaModel.getObject().getTitle(), autocompleteReviewerField.getModelObject()));
super.onError(target, form); super.onError(target, form);
setResponsePage(AdminManageProjectIdeaPage.class); setResponsePage(AdminManageProjectIdeaPage.class);
target.addComponent(feedbackPanel); // is only activated on "this" target.addComponent(feedbackPanel); // is only activated on "this"
@ -165,13 +169,8 @@ public class ManualSetReviewerPanel extends Panel {
@Override @Override
public void action(AjaxRequestTarget pTarget, Employee newSelection) { public void action(AjaxRequestTarget pTarget, Employee newSelection) {
// these checks have already been performed when action is called saveButton.setMessageContentHTML(getConfirmMessage(newSelection));
// if (newSelection != null) { pTarget.addComponent(saveButton);
// if (pTarget != null) {
saveButton.setMessageContentHTML(getConfirmMessage(newSelection.getNameAsString(), projectIdea.getTitle()));
pTarget.addComponent(saveButton);
// }
// }
} }
}; };
} }
@ -179,31 +178,30 @@ public class ManualSetReviewerPanel extends Panel {
/** /**
* *
* This method is used to return an confirmation message (is shown in a confirmation dialog) * This method is used to return an confirmation message (is shown in a confirmation dialog)
* to the administrator, that the employee really should be suggested as a reviewer for the project idea. * to the administrator, that the employee really should be suggested as reviewer for the project idea.
* @param projectIdeaTitle the title of the project idea * @param reviewer the suggested reviewer
* @param reviewerName the name of the suggested reviewer
* @return String the confirmation message * @return String the confirmation message
*/ */
private String getConfirmMessage(final String reviewerName, final String projectIdeaTitle) { private String getConfirmMessage(final Employee reviewer) {
StringBuilder stringBuilder = new StringBuilder(); StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("Confirm that you want to suggest "); stringBuilder.append("Confirm that you want to suggest ");
stringBuilder.append(reviewerName); stringBuilder.append(createNameAndEmailAutoComplete(reviewer));
stringBuilder.append(" as a reviewer for the project idea."); stringBuilder.append(" as reviewer for the project idea.");
return stringBuilder.toString(); return stringBuilder.toString();
} }
/** /**
* *
* This method is used to return an information message that the employee was suggested as a reviewer for the project idea. * This method is used to return an information message that the employee was suggested as reviewer for the project idea.
* @param projectIdeaTitle the title of the project idea * @param projectIdeaTitle the title of the project idea
* @param reviewerName the name of the suggested reviewer * @param reviewer the suggested reviewer
* @return String the information message * @return String the information message
*/ */
private String getInfoMessage(final String projectIdeaTitle, final String reviewerName) { private String getInfoMessage(final String projectIdeaTitle, final Employee reviewer) {
StringBuilder stringBuilder = new StringBuilder(); StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(reviewerName); stringBuilder.append(createNameAndEmailOutput(reviewer));
stringBuilder.append(" was suggested reviewer for the project idea "); stringBuilder.append(" was suggested as reviewer for the project idea ");
stringBuilder.append(projectIdeaTitle); stringBuilder.append(projectIdeaTitle);
stringBuilder.append("."); stringBuilder.append(".");
return stringBuilder.toString(); return stringBuilder.toString();
@ -213,13 +211,13 @@ public class ManualSetReviewerPanel extends Panel {
* *
* This method is used to return an error message which is shown in case of an unforeseen error. * This method is used to return an error message which is shown in case of an unforeseen error.
* @param projectIdeaTitle the title of the project idea * @param projectIdeaTitle the title of the project idea
* @param reviewerName the name of the presumed reviewer * @param reviewer the presumed reviewer
* @return String the error message * @return String the error message
*/ */
private String getErrorMessage(String projectIdeaTitle, String reviewerName) { private String getErrorMessage(final String projectIdeaTitle, final Employee reviewer) {
StringBuilder stringBuilder = new StringBuilder(); StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("An error occurred when suggesting "); stringBuilder.append("An error occurred when suggesting ");
stringBuilder.append(reviewerName); stringBuilder.append(createNameAndEmailAutoComplete(reviewer));
stringBuilder.append(" as reviewer for the project idea "); stringBuilder.append(" as reviewer for the project idea ");
stringBuilder.append(projectIdeaTitle); stringBuilder.append(projectIdeaTitle);
stringBuilder.append("."); stringBuilder.append(".");

@ -18,7 +18,11 @@
<table wicket:id="table" class="rounded-corner"> <table wicket:id="table" class="rounded-corner">
<thead> <thead>
<tr> <tr>
<th class="rounded-left-top"><a href="#" wicket:id="nameSortLink">Name</a></th><th>Research Areas</th><th class="rounded-right-top">Regular keywords</th> <th class="rounded-left-top"><a href="#" wicket:id="nameSortLink">Name</a></th>
<th>Research Areas</th>
<th class="rounded-right-top">
<a href="#" wicket:id="numberOfRegularsSortLink">Regular keywords</a>
</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>

@ -1,7 +1,6 @@
package se.su.dsv.scipro.admin.panels.match; package se.su.dsv.scipro.admin.panels.match;
import java.util.List; import java.util.List;
import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink; import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.ajax.markup.html.form.AjaxButton; import org.apache.wicket.ajax.markup.html.form.AjaxButton;
@ -9,21 +8,22 @@ import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.EmptyPanel; import org.apache.wicket.markup.html.panel.EmptyPanel;
import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.markup.repeater.data.DataView;
import org.apache.wicket.model.Model; import org.apache.wicket.model.Model;
import org.apache.wicket.spring.injection.annot.SpringBean; import org.apache.wicket.spring.injection.annot.SpringBean;
import org.odlabs.wiquery.ui.dialog.Dialog; import org.odlabs.wiquery.ui.dialog.Dialog;
import se.su.dsv.scipro.data.dao.interfaces.Dao.SortableParams.Sort; import se.su.dsv.scipro.data.dao.interfaces.Dao.SortableParams.Sort;
import se.su.dsv.scipro.data.dataobjects.Employee; import se.su.dsv.scipro.data.dataobjects.Employee;
import se.su.dsv.scipro.dataproviders.QueryableDataProvider;
import se.su.dsv.scipro.match.dao.interfaces.KeywordTypeDao; import se.su.dsv.scipro.match.dao.interfaces.KeywordTypeDao;
import se.su.dsv.scipro.match.dao.interfaces.SupervisorDao; import se.su.dsv.scipro.match.dao.interfaces.SupervisorDao;
import se.su.dsv.scipro.match.dao.interfaces.SupervisorDaoParams; import se.su.dsv.scipro.match.dao.interfaces.SupervisorDaoParams;
import se.su.dsv.scipro.match.dataobject.Keyword; import se.su.dsv.scipro.match.dataobject.Keyword;
import se.su.dsv.scipro.springdata.services.SupervisorService;
public class AdminSupervisorKeywordPanel extends Panel { public class AdminSupervisorKeywordPanel extends Panel {
@ -32,6 +32,9 @@ public class AdminSupervisorKeywordPanel extends Panel {
@SpringBean @SpringBean
private SupervisorDao supervisorDao; private SupervisorDao supervisorDao;
@SpringBean
private SupervisorService supervisorService;
public AdminSupervisorKeywordPanel(String str) { public AdminSupervisorKeywordPanel(String str) {
super(str); super(str);
Dialog dialog = new Dialog("detailsDialog"); Dialog dialog = new Dialog("detailsDialog");
@ -39,10 +42,12 @@ public class AdminSupervisorKeywordPanel extends Panel {
WebMarkupContainer tableContainer = new WebMarkupContainer("table"); WebMarkupContainer tableContainer = new WebMarkupContainer("table");
SupervisorDaoParams params = new SupervisorDaoParams(); SupervisorDaoParams params = new SupervisorDaoParams();
params.setSortOn("user.lastName", Sort.ASCENDING); params.setSortOn("user.lastName", Sort.ASCENDING);
params.setSortOn("keywords.size()", Sort.ASCENDING);
TextField<String> supervisorField = new TextField<String>("supervisorField", new Model<String>()); TextField<String> supervisorField = new TextField<String>("supervisorField", new Model<String>());
setUpTable(dialog, tableContainer, params); setUpTable(dialog, tableContainer, params);
setUpFiltering(tableContainer, params, supervisorField); setUpFiltering(tableContainer, params, supervisorField);
} //addSortLink("numberOfRegulars", "keywords.size()", tableContainer, params);
}
private void setUpFiltering(WebMarkupContainer tableContainer, SupervisorDaoParams params, TextField<String> supervisorField) { private void setUpFiltering(WebMarkupContainer tableContainer, SupervisorDaoParams params, TextField<String> supervisorField) {
FilterForm form = new FilterForm(tableContainer, params, supervisorField); FilterForm form = new FilterForm(tableContainer, params, supervisorField);
@ -58,15 +63,46 @@ public class AdminSupervisorKeywordPanel extends Panel {
dialog.add(new EmptyPanel("dialogContent")); dialog.add(new EmptyPanel("dialogContent"));
add(dialog.setOutputMarkupId(true)); add(dialog.setOutputMarkupId(true));
} }
private void addSortLink(String markup, final String sortField, final WebMarkupContainer allContainer, final SupervisorDaoParams params) {
final AjaxLink<Void> sortLink = new AjaxLink<Void>(markup + "SortLink") {
private static final long serialVersionUID = -8463105615994034854L;
@Override
public void onClick(AjaxRequestTarget target) {
if (params.getDirection().equals(Sort.ASCENDING)) {
params.setSortOn(sortField, Sort.DESCENDING);
} else {
params.setSortOn(sortField, Sort.ASCENDING);
}
target.addComponent(allContainer);
}
};
allContainer.add(sortLink);
}
private void setUpTable(final Dialog dialog, final WebMarkupContainer tableContainer, final SupervisorDaoParams params) { private void setUpTable(final Dialog dialog, final WebMarkupContainer tableContainer, final SupervisorDaoParams params) {
QueryableDataProvider<Employee, SupervisorDaoParams> provider = new QueryableDataProvider<Employee, SupervisorDaoParams>(supervisorDao, params); final StringBuffer definedSortOrder = new StringBuffer();
DataView<Employee> dataView = new DataView<Employee>("supervisorList", provider, 1000) { definedSortOrder.append("user.firstName");
final StringBuffer definedSortDirection = new StringBuffer();
definedSortDirection.append("ASC");
final ListView<Employee> dataView = new ListView<Employee>("supervisorList", new LoadableDetachableModel<List<Employee>>() {
private static final long serialVersionUID = -2395796971679213814L;
@Override
protected List<Employee> load() {
return supervisorService.findAllEmployees(new org.springframework.data.domain.Sort(definedSortOrder.toString()));
}
}) {
private static final long serialVersionUID = 3572766096237883198L; private static final long serialVersionUID = 3572766096237883198L;
@Override @Override
protected void populateItem(Item<Employee> item) { protected void populateItem(ListItem<Employee> item) {
final Employee supervisor = item.getModelObject(); final Employee supervisor = item.getModelObject();
List<Keyword> areaKeywords = supervisor.getKeywords().getFiltered(KeywordTypeDao.TYPE.RESEARCH_AREA.toDbName()); List<Keyword> areaKeywords = supervisor.getKeywords().getFiltered(KeywordTypeDao.TYPE.RESEARCH_AREA.toDbName());
List<Keyword> regularKeywords = supervisor.getKeywords().getFiltered(KeywordTypeDao.TYPE.REGULAR.toDbName()); List<Keyword> regularKeywords = supervisor.getKeywords().getFiltered(KeywordTypeDao.TYPE.REGULAR.toDbName());
@ -98,20 +134,40 @@ public class AdminSupervisorKeywordPanel extends Panel {
} }
}; };
final AjaxLink<Void> nameSortLink = new AjaxLink<Void>("nameSortLink") { final AjaxLink<Void> nameSortLink = new AjaxLink<Void>("nameSortLink") {
private static final long serialVersionUID = -6459164267551936706L; private static final long serialVersionUID = -6459164267551936706L;
@Override @Override
public void onClick(AjaxRequestTarget target) { public void onClick(AjaxRequestTarget target) {
if(params.getDirection().equals(Sort.ASCENDING)) { org.springframework.data.domain.Sort sortOrder;
params.setSortOn("user.lastName", Sort.DESCENDING); if(definedSortDirection.toString().equals("ASC")) {
sortOrder = new org.springframework.data.domain.Sort(org.springframework.data.domain.Sort.Direction.DESC, "user.lastName");
definedSortDirection.delete(0, definedSortDirection.length()-1);
definedSortDirection.append("DESC");
} else { } else {
params.setSortOn("user.lastName", Sort.ASCENDING); sortOrder = new org.springframework.data.domain.Sort(org.springframework.data.domain.Sort.Direction.ASC, "user.lastName");
definedSortDirection.delete(0, definedSortDirection.length()-1);
definedSortDirection.append("ASC");
} }
dataView.setDefaultModelObject(supervisorService.findAllEmployees(sortOrder));
target.addComponent(tableContainer); target.addComponent(tableContainer);
} }
}; };
tableContainer.add(nameSortLink); tableContainer.add(nameSortLink);
final AjaxLink<Void> numberOfRegularsSortLink = new AjaxLink<Void>("numberOfRegularsSortLink") {
private static final long serialVersionUID = 5809993580126828318L;
@Override
public void onClick(AjaxRequestTarget target) {
if(params.getDirection().equals(Sort.ASCENDING)) {
params.setSortOn("keywords.size", Sort.DESCENDING);
} else {
params.setSortOn("keywords.size", Sort.ASCENDING);
}
target.addComponent(tableContainer);
}
};
tableContainer.add(numberOfRegularsSortLink);
tableContainer.add(dataView); tableContainer.add(dataView);
add(tableContainer.setOutputMarkupId(true)); add(tableContainer.setOutputMarkupId(true));
} }

@ -47,7 +47,9 @@ public abstract class AbstractRoleAutoCompleteComponent<T extends Role> extends
@Override @Override
protected Renderer<T> getListItemRenderer() { protected Renderer<T> getListItemRenderer() {
return new Renderer<T>() { return new Renderer<T>() {
@Override private static final long serialVersionUID = -7256889096575950095L;
@Override
protected String getHeader(T item) { protected String getHeader(T item) {
return item.getNameAsString(); return item.getNameAsString();
} }

@ -27,8 +27,8 @@ public class SupervisorServiceImpl extends AbstractQueryService<Employee, Long>
} }
@Override @Override
public List<Employee> findAllEmployees() { public List<Employee> findAllEmployees(org.springframework.data.domain.Sort orders) {
return supervisorRepo.findAll(); return supervisorRepo.findAll(orders);
} }
} }

@ -8,5 +8,5 @@ import java.util.List;
* date: 2012 03 26 * date: 2012 03 26
*/ */
public interface SupervisorService extends CrudService<Employee,Long>, QueryService<Employee, Long> { public interface SupervisorService extends CrudService<Employee,Long>, QueryService<Employee, Long> {
public List<Employee> findAllEmployees(); public List<Employee> findAllEmployees(org.springframework.data.domain.Sort orders);
} }

@ -7,13 +7,12 @@ import java.util.Set;
import javax.mail.Address; import javax.mail.Address;
import javax.mail.MessagingException; import javax.mail.MessagingException;
import javax.mail.SendFailedException;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import com.sun.mail.smtp.SMTPSendFailedException;
import se.su.dsv.scipro.data.dao.interfaces.GeneralSystemSettingsDao; 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.MailEventDao;
import se.su.dsv.scipro.data.dataobjects.MailEvent; import se.su.dsv.scipro.data.dataobjects.MailEvent;
@ -65,7 +64,7 @@ public class MailEventWorker extends AbstractWorker {
replyToEmails[i] = u.getEmailAddress(); replyToEmails[i] = u.getEmailAddress();
i++; i++;
} }
if( generalSystemSettingsDao.getGeneralSystemSettingsInstance().isMailNotifications() ){ //If false, mail-events "vanish" if( generalSystemSettingsDao.getGeneralSystemSettingsInstance().isMailNotifications() ){ //If false, mail-events "vanish"
logger.debug("Sending mail notification to: "+recipients); logger.debug("Sending mail notification to: "+recipients);
mail.mail(fromName, fromEmail, recipientsEmails, replyToEmails, subject, messageBody, false); mail.mail(fromName, fromEmail, recipientsEmails, replyToEmails, subject, messageBody, false);
@ -75,19 +74,26 @@ public class MailEventWorker extends AbstractWorker {
this.commitTransaction(); this.commitTransaction();
} catch(SMTPSendFailedException e){ } catch(SendFailedException e){
// We need to catch this exception for the use case when one or // We need to catch this exception for the use case when one or
// more of the recipients are invalid, to make sure we still // more of the recipients are invalid, to make sure we still
// send the mail to the valid recipients, and delete the mail // send the mail to the valid recipients, and delete the mail
// event to prevent spamming. // event to prevent spamming.
logger.info("Could not send mail to all of the recipients, more info:");
if(e.getInvalidAddresses()!=null){
for(Address a : e.getInvalidAddresses()) { for(Address a : e.getInvalidAddresses()) {
logger.info("Message could not be sent to the following invalid address: "+a.toString()); logger.info("Message could not be sent to the following invalid address: "+a.toString());
}
} }
if(e.getValidSentAddresses()!=null){
for(Address a : e.getValidSentAddresses()){ for(Address a : e.getValidSentAddresses()){
logger.info("Message have been sent to the following valid address: "+a.toString()); logger.info("Message have been sent to the following valid address: "+a.toString());
} }
}
if(e.getValidUnsentAddresses()!=null){
for(Address a : e.getValidUnsentAddresses()){ for(Address a : e.getValidUnsentAddresses()){
logger.info("Message have not been sent to the following valid address: "+a.toString()); logger.info("Message have not been sent to the following valid address: "+a.toString());
}
} }
mailEvent = mailEventDao.reLoad(mailEvent); mailEvent = mailEventDao.reLoad(mailEvent);
mailEventDao.delete(mailEvent); mailEventDao.delete(mailEvent);

@ -5,15 +5,19 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.test.annotation.Rollback; import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import se.su.dsv.scipro.data.dao.interfaces.UserDao; import se.su.dsv.scipro.data.dao.interfaces.UserDao;
import se.su.dsv.scipro.data.dao.interfaces.UsernameDao;
import se.su.dsv.scipro.data.dataobjects.Employee; import se.su.dsv.scipro.data.dataobjects.Employee;
import se.su.dsv.scipro.data.dataobjects.User; import se.su.dsv.scipro.data.dataobjects.User;
import se.su.dsv.scipro.data.dataobjects.Username; import se.su.dsv.scipro.match.Weights;
import se.su.dsv.scipro.match.dao.interfaces.KeywordDao;
import se.su.dsv.scipro.match.dao.interfaces.KeywordTypeDao;
import se.su.dsv.scipro.match.dataobject.Keyword;
import se.su.dsv.scipro.match.dataobject.KeywordType;
import se.su.dsv.scipro.springdata.services.SupervisorService; import se.su.dsv.scipro.springdata.services.SupervisorService;
import java.util.ArrayList; import java.util.ArrayList;
@ -24,6 +28,7 @@ import static org.junit.Assert.*;
@ContextConfiguration(inheritLocations = false, locations = { @ContextConfiguration(inheritLocations = false, locations = {
"classpath:test-applicationContext.xml" "classpath:test-applicationContext.xml"
}) })
public class TestSupervisor { public class TestSupervisor {
@Autowired @Autowired
@ -32,11 +37,57 @@ public class TestSupervisor {
@Autowired @Autowired
private UserDao userDao; private UserDao userDao;
@Autowired
private KeywordDao keywordDao;
@Autowired
private KeywordTypeDao keywordTypeDao;
private KeywordType keywordTypeArea;
private KeywordType keywordTypeWord;
private Weights weights;
@SuppressWarnings("EmptyMethod") @SuppressWarnings("EmptyMethod")
@Before @Before
public void startTransaction() throws Exception { public void startTransaction() throws Exception {
keywordTypeArea = keywordTypeDao.save(new KeywordType("Area"));
keywordTypeWord = keywordTypeDao.save(new KeywordType("Word"));
weights = createWeights();
} }
private Weights createWeights() {
Weights weights = new Weights();
weights.setKeywordPoints(3); // "Word" + "Unit"??
weights.setResearchAreaPoints(5); // "Area"
weights.setPreferredSupervisorPoints(10);
return weights;
}
private Employee getEmployee(final String firstName, final String lastName, final String email) {
User user = new User();
user.setFirstName(firstName);
user.setLastName(lastName);
user.setEmailAddress(email);
user = userDao.save(user);
assertNotNull(user);
Employee employee = new Employee();
employee.setUser(user);
return supervisorService.save(employee);
}
private Keyword createKeyword(final KeywordType keyWordType , final String keyWordName, final boolean deleted) {
Keyword keyword = keywordDao.getKeywordByNameAndType(keyWordName, keyWordType);
if(keyword == null) {
keyword = new Keyword();
keyword.setType(keyWordType);
keyword.setKeyword(keyWordName);
keyword.setDeleted(deleted);
return keywordDao.save(keyword);
} else {
return keyword;
}
}
/** /**
* Test for implementing a supervisorService with Spring Data * Test for implementing a supervisorService with Spring Data
@ -44,18 +95,69 @@ public class TestSupervisor {
@Test @Test
@Transactional @Transactional
@Rollback @Rollback
public void findAllSupervisorsWithSpringData() { public void findSupervisorLastName() {
List<Employee> employeeList = new ArrayList<Employee>(); List<Employee> employeeList = new ArrayList<Employee>();
User davidH = new User(); Employee larsson = getEmployee("Ken", "Larsson", "kenlars@dsv.su.se");
davidH.setFirstName("David"); Employee hallberg = getEmployee("David", "Hallberg", "dhallb@dsv.su.se");
davidH.setLastName("Hallberg"); Employee tholerus = getEmployee("Torgny", "Tholerus", "torgny@dsv.su.se");
davidH.setEmailAddress("dhallb@dsv.su.se"); Employee moattar = getEmployee("Golrokh", "Moattar", "goli@dsv.su.se");
davidH = userDao.save(davidH); Employee friis = getEmployee("Fredrik", "Friis", "fre-fri@dsv.su.se");
Employee herder = getEmployee("Niklas", "Herder", "herder@dsv.su.se");
Sort sortOrder = new Sort("user.lastName");
employeeList.addAll(supervisorService.findAllEmployees(sortOrder));
assertFalse(employeeList.isEmpty());
assertTrue(employeeList.get(0).equals(friis));
assertTrue(employeeList.get(5).equals(tholerus));
}
Employee supervisor = new Employee(); /**
supervisor.setUser(davidH); * Test for implementing a supervisorService with Spring Data
supervisorService.save(supervisor); */
// employeeList.addAll(supervisorService.findAllEmployees()); @Test
// assertTrue(employeeList.size() == 1); @Transactional
@Rollback
public void findSupervisorFirstName() {
List<Employee> employeeList = new ArrayList<Employee>();
Employee larsson = getEmployee("Ken", "Larsson", "kenlars@dsv.su.se");
Employee hallberg = getEmployee("David", "Hallberg", "dhallb@dsv.su.se");
Employee tholerus = getEmployee("Torgny", "Tholerus", "torgny@dsv.su.se");
Employee moattar = getEmployee("Golrokh", "Moattar", "goli@dsv.su.se");
Employee friis = getEmployee("Fredrik", "Friis", "fre-fri@dsv.su.se");
Employee herder = getEmployee("Niklas", "Herder", "herder@dsv.su.se");
Sort sortOrder = new Sort("user.firstName");
employeeList.addAll(supervisorService.findAllEmployees(sortOrder));
assertFalse(employeeList.isEmpty());
assertTrue(employeeList.get(0).equals(hallberg));
assertTrue(employeeList.get(5).equals(tholerus));
}
/**
* Test for implementing a supervisorService with Spring Data
*/
@Test
@Transactional
@Rollback
public void findSupervisorKeywords() {
List<Employee> employeeList = new ArrayList<Employee>();
Employee larsson = getEmployee("Ken", "Larsson", "kenlars@dsv.su.se");
Employee hallberg = getEmployee("David", "Hallberg", "dhallb@dsv.su.se");
Employee tholerus = getEmployee("Torgny", "Tholerus", "torgny@dsv.su.se");
Employee herder = getEmployee("Niklas", "Herder", "herder@dsv.su.se");
Employee moattar = getEmployee("Golrokh", "Moattar", "goli@dsv.su.se");
Employee friis = getEmployee("Fredrik", "Friis", "fre-fri@dsv.su.se");
Keyword keyword = createKeyword(keywordTypeWord, "JUnit", false);
herder.getKeywords().getAll().add(keyword);
keyword = createKeyword(keywordTypeWord, "Maven", false);
herder.getKeywords().getAll().add(keyword);
herder = supervisorService.save(herder);
/* Sort sortOrder = new Sort("keywords.getAll().size");
employeeList.addAll(supervisorService.findAllEmployees(sortOrder));
assertFalse(employeeList.isEmpty());
assertTrue(employeeList.get(0).equals(herder));*/
//assertTrue(employeeList.get(5).equals(tholerus));
} }
} }