Merge remote-tracking branch 'origin/develop' into develop

Conflicts:
	src/main/java/se/su/dsv/scipro/admin/pages/AbstractAdminStatisticsPage.java
	src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorProjectIdeaPage.java
	src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorUnmatchedProjectIdeaPage.java
	src/main/java/se/su/dsv/scipro/supervisor/panels/SupervisorTabMenuPanel.java
This commit is contained in:
Tom Vahlman 2012-03-26 11:37:04 +02:00
commit 158c53ef7a
42 changed files with 1049 additions and 621 deletions

@ -1 +1,8 @@
ALTER TABLE general_system_settings ADD supervisorsCanAcceptDeclinePIs bit(1) NOT NULL
CREATE TABLE `projectIdea_Employee` (
`projectIdea_id` bigint(20) NOT NULL,
`supervisorInterest_id` bigint(20) NOT NULL,
KEY `FK485C987D4E31D7A1` (`projectIdea_id`),
KEY `FK485C987DBB2259FB` (`supervisorInterest_id`),
CONSTRAINT `FK485C987DBB2259FB` FOREIGN KEY (`supervisorInterest_id`) REFERENCES `role` (`id`),
CONSTRAINT `FK485C987D4E31D7A1` FOREIGN KEY (`projectIdea_id`) REFERENCES `projectIdea` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

@ -0,0 +1 @@
ALTER TABLE general_system_settings ADD supervisorsCanAcceptDeclinePIs bit(1) NOT NULL

@ -3,13 +3,33 @@
xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
<body>
<wicket:extend>
<div class="span-22 last">
<div wicket:id="feedbackPanel"></div>
<div class="span-5 append-1" wicket:id="menuPanel"></div>
<div class="span-15 last">
<wicket:child />
</div>
</div>
<!--<div class="span-22 last">-->
<!--<div wicket:id="feedbackPanel"></div>-->
<!--<div class="span-5 append-1" wicket:id="menuPanel"></div>-->
<!--<div class="span-15 last">-->
<!--<wicket:child />-->
<!--</div>-->
<!--</div>-->
<div class="span-22 last append-bottom">
<div wicket:id="menuPanel"></div>
</div>
<div class="span-22 last">
<div wicket:id="feedbackPanel"></div>
<wicket:child />
</div>
</wicket:extend>
</body>
</html>
</html>

@ -1,44 +1,43 @@
package se.su.dsv.scipro.admin.pages;
import java.util.ArrayList;
import java.util.List;
import org.apache.wicket.Component;
import org.apache.wicket.PageParameters;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import se.su.dsv.scipro.admin.pages.match.AdminSupervisorKeywordsPage;
import se.su.dsv.scipro.components.AbstractMenuPanel;
import se.su.dsv.scipro.security.auth.Authorization;
import se.su.dsv.scipro.security.auth.roles.Roles;
@Authorization(authorizedRoles = { Roles.ADMIN })
public abstract class AbstractAdminStatisticsPage extends AbstractAdminPage {
private Component feedBackPanel;
public Component getFeedBackPanel() {
return feedBackPanel;
}
public AbstractAdminStatisticsPage(PageParameters pp) {
super(pp);
add(feedBackPanel = new FeedbackPanel("feedbackPanel").setOutputMarkupId(true));
add(new AbstractMenuPanel("menuPanel", AbstractAdminStatisticsPage.class, this.getClass()){
private static final long serialVersionUID = 1L;
@Override
protected List<MenuItem> getItemList() {
final List<MenuItem> items = new ArrayList<MenuItem>();
items.add(new MenuItem("Supervisor keywords", AdminSupervisorKeywordsPage.class));
items.add(new MenuItem("Project ideas", AdminProjectIdeaStatisticPage.class));
return items;
}
@Override
protected MenuType getMenuType() {
return MenuType.VERTICAL;
}
});
}
package se.su.dsv.scipro.admin.pages;
import org.apache.wicket.Component;
import org.apache.wicket.PageParameters;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import se.su.dsv.scipro.admin.pages.match.AdminSupervisorKeywordsPage;
import se.su.dsv.scipro.components.AbstractMenuPanel;
import se.su.dsv.scipro.security.auth.Authorization;
import se.su.dsv.scipro.security.auth.roles.Roles;
import java.util.ArrayList;
import java.util.List;
@Authorization(authorizedRoles = { Roles.ADMIN })
public abstract class AbstractAdminStatisticsPage extends AbstractAdminPage {
private Component feedBackPanel;
public Component getFeedBackPanel() {
return feedBackPanel;
}
public AbstractAdminStatisticsPage(PageParameters pp) {
super(pp);
add(feedBackPanel = new FeedbackPanel("feedbackPanel").setOutputMarkupId(true));
add(new AbstractMenuPanel("menuPanel", AbstractAdminStatisticsPage.class, this.getClass()){
private static final long serialVersionUID = 1L;
@Override
protected List<MenuItem> getItemList() {
final List<MenuItem> items = new ArrayList<MenuItem>();
items.add(new MenuItem("Supervisor keywords", AdminSupervisorKeywordsPage.class));
items.add(new MenuItem("Application periods", AdminProjectIdeaStatisticPage.class));
return items;
}
@Override
protected MenuType getMenuType() {
return MenuType.HORIZONTAL;
}
});
}
}

@ -4,7 +4,7 @@
<body>
<wicket:extend>
<h5 class="peer-title">Statistics</h5>
Available statistics can be found in the menu to the left.
Available statistics can be found in the menu.
<div wicket:id="statisticsPanel" class="prepend-top"></div>
</wicket:extend>
</body>

@ -6,11 +6,9 @@ import org.apache.wicket.ajax.form.OnChangeAjaxBehavior;
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.form.Button;
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;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.data.DataView;
@ -19,6 +17,7 @@ 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.data.dao.interfaces.Dao.SortableParams;
import se.su.dsv.scipro.dataproviders.QueryableDataProvider;
import se.su.dsv.scipro.icons.ImageObject;
import se.su.dsv.scipro.match.dao.interfaces.ExemptionDao;
@ -34,19 +33,18 @@ public class AdminExemptionPanel extends Panel {
private DataView<Exemption> dataView;
private WebMarkupContainer container;
@SpringBean
private ExemptionDao exemptionDao;
public AdminExemptionPanel(String id) {
@SpringBean
private ExemptionDao exemptionDao;
public AdminExemptionPanel(String id) {
super(id);
TextField<String> searchField =
TextField<String> searchField =
new TextField<String>("searchField", new PropertyModel<String>(
this, "userSearch"));
container = new WebMarkupContainer("container");
container.setOutputMarkupId(true);
OnChangeAjaxBehavior userSearchTextBehaviour =
new OnChangeAjaxBehavior() {
OnChangeAjaxBehavior userSearchTextBehaviour = new OnChangeAjaxBehavior() {
private static final long serialVersionUID =
-3243439315735164519L;
@ -54,13 +52,12 @@ public class AdminExemptionPanel extends Panel {
@Override
protected void onUpdate(AjaxRequestTarget target) {
updateListView(container);
container.add(dataView);
container.add(new PagingNavigator("pagingNavigator",
container.add(dataView);
container.add(new PagingNavigator("pagingNavigator",
dataView));
target.addComponent(container);
}
};
};
final Dialog dialog = new Dialog("dialog");
dialog.setModal(true);
dialog.setAutoOpen(false);
@ -87,53 +84,50 @@ public class AdminExemptionPanel extends Panel {
searchField.add(userSearchTextBehaviour);
add(searchField);
updateListView(container);
container.add(dataView);
container.add(dataView);
container.add(new PagingNavigator("pagingNavigator", dataView));
add(container);
container.add(new PagingNavigator("pagingNavigator", dataView));
}
}
private void updateListView(final WebMarkupContainer container) {
container.removeAll();
ExemptionDaoParams exemptionDaoParams = new ExemptionDaoParams();
if (userSearch != null) {
ExemptionDaoParams exemptionDaoParams = new ExemptionDaoParams();
exemptionDaoParams.setSortOn("dateCreated", SortableParams.Sort.DESCENDING);
if (userSearch != null) {
if (userSearch.length() >= 3) {
exemptionDaoParams.setAuthorNameLike(userSearch);
}
}
loadUserDataView(new QueryableDataProvider<Exemption, ExemptionDaoParams>(
exemptionDao, exemptionDaoParams));
loadUserDataView(new QueryableDataProvider<Exemption, ExemptionDaoParams>(
exemptionDao,exemptionDaoParams));
}
};
public void loadUserDataView(IDataProvider<Exemption> exemptionDataProvider) {
dataView = new DataView<Exemption>("listView", exemptionDataProvider, 10) {
public void loadUserDataView(IDataProvider<Exemption> exemptionDataProvider) {
dataView = new DataView<Exemption>("listView", exemptionDataProvider, 8){
private static final long serialVersionUID =
2828792237574112923L;
@Override
protected void populateItem(Item<Exemption> item) {
final Exemption excemption = item.getModelObject();
item.add(new Label("name", excemption.getAuthor().getUser()
protected void populateItem(final Item<Exemption> item) {
final Exemption exemption = item.getModelObject();
item.add(new Label("name", exemption.getAuthor().getUser()
.getFullName()));
item.add(new Label("mail", excemption.getAuthor().getUser().getEmailAddress()));
item.add(new Label("level", excemption.getProjectClass()
item.add(new Label("mail", exemption.getAuthor().getUser().getEmailAddress()));
item.add(new Label("level", exemption.getProjectClass()
.getName()));
item.add(new Label("comment", excemption.getComment()));
item.add(new Label("grantedBy", excemption.getGrantedBy()
item.add(new Label("comment", exemption.getComment()));
item.add(new Label("grantedBy", exemption.getGrantedBy()
.getFullName()));
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
item.add(new Label("dateOfGranting", formatter.format(excemption.getDateCreated())));
item.add(new Label("dateOfGranting", formatter.format(exemption.getDateCreated())));
AjaxLink<Void> removeLink = new AjaxLink<Void>("removeLink"){
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
exemptionDao.delete(exemptionDao.reLoad(excemption));
exemptionDao.delete(exemptionDao.reLoad(exemption));
info("Revoked exemption");
target.addComponent(container);
target.addComponent(getPage().get("feedbackPanel"));
@ -142,10 +136,7 @@ public class AdminExemptionPanel extends Panel {
item.add(removeLink);
removeLink.add(new ImageObject("removeIcon", ImageObject.SIXTEEN + ImageObject.DELETE));
removeLink.add(new JavascriptEventConfirmation("onclick", "Are you sure you want to remove this?"));
}
};
}
};
}
}

@ -87,6 +87,10 @@ public abstract class AdminEditProject extends Panel {
public void action(AjaxRequestTarget pTarget, Employee newSelection) {
//do nothing
}
@Override
protected String getName(Employee item) {
return item.getNameAsString();
}
});
headsupervisorField.setModelObject(model.getObject().getHeadSupervisor());

@ -7,7 +7,7 @@
<table class="rounded-corner">
<thead>
<tr>
<th class="rounded-left-top">Application period</th><th>End date</th><th>Number of students</th>
<th class="rounded-left-top">Application period</th><th>End date</th><th>Number of students</th><th>Number of project ideas</th>
</tr>
</thead>
<tbody>
@ -16,11 +16,12 @@
<td wicket:id="applicationPeriodName"></td>
<td wicket:id="applicationPeriodEndDate"></td>
<td wicket:id="numberOfStudents"></td>
<td wicket:id="numberOfPIs"></td>
</tr>
</tbody>
<tfoot>
<tr>
<td colspan="5" class="rounded-foot">&nbsp;</td>
<td colspan="6" class="rounded-foot">&nbsp;</td>
</tr>
</tfoot>
</table>

@ -1,7 +1,5 @@
package se.su.dsv.scipro.admin.panels;
import java.util.List;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.navigation.paging.PagingNavigator;
@ -9,12 +7,13 @@ 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.spring.injection.annot.SpringBean;
import se.su.dsv.scipro.match.dao.interfaces.ApplicationPeriodDao;
import se.su.dsv.scipro.match.dataobject.ApplicationPeriod;
import se.su.dsv.scipro.match.dataobject.ProjectIdea;
import se.su.dsv.scipro.match.dataprovider.ProjectIdeaStatisticDataProvider;
import java.util.List;
public class AdminProjectIdeaStatisticPanel extends Panel {
private static final long serialVersionUID = 1L;
@ -61,13 +60,15 @@ public class AdminProjectIdeaStatisticPanel extends Panel {
protected void populateItem(Item<ApplicationPeriod> item) {
List<ProjectIdea> projectIdeas = applicationPeriodDao.getProjectIdeas(item.getModelObject());
int students = 0;
int projectIdeasNo = 0;
for (ProjectIdea pi : projectIdeas){
students += pi.getAuthors().size();
projectIdeasNo ++;
}
item.add(new Label("applicationPeriodName", ""+item.getModelObject().getName()));
item.add(new Label("applicationPeriodEndDate", ""+item.getModelObject().getEndDate()));
item.add(new Label("numberOfStudents", ""+students));
item.add(new Label("numberOfPIs", ""+projectIdeasNo));
}
};

@ -41,32 +41,40 @@ public class ManualMatchPanel extends Panel {
private Fragment currentFragment;
private Fragment alternateFragment;
private AutoCompleteObjectField<Employee, Long> autoCompleteObjectField;
private final ConfirmerAjaxSubmitLink saveButton;
public ManualMatchPanel(String id, final IModel<Match> matchModel, final Component feedbackPanel, final Match.Status status) {
super(id);
Component localFeedback = new FeedbackPanel("localFeedback");
ConfirmerAjaxSubmitLink saveButton = createSubmitLink(matchModel, feedbackPanel, status, localFeedback);
autoCompleteObjectField = createDsvAutocompleteComponent(matchModel.getObject().getProjectIdea(), status, saveButton);
AutoCompleteObjectField<Employee, Long> autoCompleteObjectField =
createDsvAutocompleteComponent(matchModel.getObject().getProjectIdea(), status);
autoCompleteObjectField.setOutputMarkupId(true);
saveButton = createSubmitLink(matchModel, feedbackPanel, status, localFeedback, autoCompleteObjectField);
saveButton.setOutputMarkupId(true);
setOutputMarkupPlaceholderTag(true);
Form<Employee> matchForm = new Form<Employee>("matchForm");
currentFragment = createButtonFragment(status, matchForm);
currentFragment = createButtonFragment(status, matchForm, autoCompleteObjectField);
currentFragment.setOutputMarkupId(true);
alternateFragment = createMatchFragment(saveButton, matchForm, localFeedback);
alternateFragment = createMatchFragment(matchForm, localFeedback, autoCompleteObjectField);
alternateFragment.setOutputMarkupId(true);
add(currentFragment);
}
private boolean testACInputString(AutoCompleteObjectField<Employee, Long> autocompleteReviewerField) {
return autocompleteReviewerField.getModelObject() == null ||
autocompleteReviewerField.getInput() == null ||
autocompleteReviewerField.getInput().isEmpty() ||
!autocompleteReviewerField.getInput().equals(autocompleteReviewerField.getModelObject().getNameAsString());
}
private ConfirmerAjaxSubmitLink createSubmitLink(final IModel<Match> matchModel, final Component feedbackPanel, final Match.Status status, final Component localFeedback) {
private ConfirmerAjaxSubmitLink createSubmitLink(final IModel<Match> matchModel, final Component feedbackPanel, final Match.Status status,
final Component localFeedback, final AutoCompleteObjectField<Employee, Long> autoCompleteObjectField) {
return new ConfirmerAjaxSubmitLink("saveButton") {
private static final long serialVersionUID = -1820883998549197409L;
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
if(autoCompleteObjectField.getModelObject() == null) {
Session.get().info("No match could be created because the supervisor was incorrect.");
if(testACInputString(autoCompleteObjectField)) {
Session.get().error("No match could be created because the input was invalid.");
target.addComponent(localFeedback);
} else {
matchModel.getObject().setSupervisor(autoCompleteObjectField.getModelObject() != null ? autoCompleteObjectField.getModelObject():null);
@ -84,10 +92,16 @@ public class ManualMatchPanel extends Panel {
super.onError(target, form);
target.addComponent(feedbackPanel); // is only activated on "this"
}
@Override
protected boolean isDisplayConfirmation() {
return saveButton.getMessageContentHTML() != null && !saveButton.getMessageContentHTML().isEmpty();
}
};
}
private Fragment createButtonFragment(final Match.Status status, final Form<Employee> matchForm) {
private Fragment createButtonFragment(final Match.Status status, final Form<Employee> matchForm,
final AutoCompleteObjectField<Employee, Long> autoCompleteObjectField) {
Fragment buttonFragment = new Fragment("main", "buttonFragment", this) {
private static final long serialVersionUID = 2699118307386334814L;
@ -105,9 +119,7 @@ public class ManualMatchPanel extends Panel {
@Override
public void onClick(AjaxRequestTarget target) {
swapFragment();
if (target != null) {
target.addComponent(currentFragment);
}
clearInputAndAddToTarget(target, autoCompleteObjectField);
}
@Override
public boolean isVisible() {
@ -121,9 +133,7 @@ public class ManualMatchPanel extends Panel {
@Override
public void onClick(AjaxRequestTarget target) {
swapFragment();
if (target != null) {
target.addComponent(currentFragment);
}
clearInputAndAddToTarget(target, autoCompleteObjectField);
}
@Override
public boolean isVisible() {
@ -135,7 +145,25 @@ public class ManualMatchPanel extends Panel {
return buttonFragment;
}
private Fragment createMatchFragment(final ConfirmerAjaxSubmitLink saveButton, final Form<Employee> matchForm, Component localFeedback) {
private void clearInputAndAddToTarget(AjaxRequestTarget target, final AutoCompleteObjectField autoCompleteObjectField) {
//noinspection unchecked
autoCompleteObjectField.setModelObject(null);
autoCompleteObjectField.clearInput();
saveButton.setMessageContentHTML(null);
target.addComponent(currentFragment);
target.addComponent(autoCompleteObjectField);
target.addComponent(saveButton);
}
private void swapFragment() {
Fragment tempFragment = currentFragment;
currentFragment.replaceWith(alternateFragment);
currentFragment = alternateFragment;
alternateFragment = tempFragment;
}
private Fragment createMatchFragment(final Form<Employee> matchForm, Component localFeedback, final AutoCompleteObjectField<Employee, Long> autoCompleteObjectField ) {
Fragment matchFragment = new Fragment("main", "matchFragment", this) {
private static final long serialVersionUID = -7770434904843562942L;
@ -146,22 +174,16 @@ public class ManualMatchPanel extends Panel {
}
};
autoCompleteObjectField.setModelObject(null);
saveButton.setOutputMarkupId(true);
localFeedback.setOutputMarkupId(true);
matchForm.add(localFeedback);
matchForm.add(autoCompleteObjectField);
matchForm.add(saveButton);
matchForm.add(new AjaxFallbackLink<Object>("cancelButton") {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
swapFragment();
if (target != null) {
target.addComponent(currentFragment);
}
clearInputAndAddToTarget(target, autoCompleteObjectField);
}
});
matchFragment.add(matchForm);
@ -169,7 +191,7 @@ public class ManualMatchPanel extends Panel {
return matchFragment;
}
public AutoCompleteObjectField<Employee, Long> createDsvAutocompleteComponent(final ProjectIdea projectIdea, final Match.Status status, final ConfirmerAjaxSubmitLink saveButton) {
AutoCompleteObjectField<Employee, Long> createDsvAutocompleteComponent(final ProjectIdea projectIdea, final Match.Status status) {
return new AutoCompleteObjectField<Employee, Long>("autoComplete", Employee.class) {
private static final long serialVersionUID = 7734889540424308421L;
@ -210,7 +232,6 @@ public class ManualMatchPanel extends Panel {
super.onNewSelection(pTarget, newSelection);
if (newSelection != null) {
if (pTarget != null) {
final String declineMessage = createDeclineMessage(newSelection.getUser(), projectIdea, status);
if(declineMessage != null && !declineMessage.isEmpty()) {
saveButton.setMessageContentHTML(declineMessage);
@ -225,20 +246,13 @@ public class ManualMatchPanel extends Panel {
};
}
private void swapFragment() {
Fragment tempFragment = currentFragment;
currentFragment.replaceWith(alternateFragment);
currentFragment = alternateFragment;
alternateFragment = tempFragment;
}
/**
*
* This method is used to return a match message that an employee was matched or suggested to a project idea .
* @param employeeName the employee
* @param projectIdeaTitle from which we get the match history
* @param status the status
* @return String the confirmation message
* This method is used to return a match message that the employee was matched or suggested to supervise the project idea .
* @param employeeName the name of the employee
* @param projectIdeaTitle the title of the project idea
* @param status the status of the match
* @return String the match message
*/
private String createMatchMessage(final String employeeName, final String projectIdeaTitle, Match.Status status) {
StringBuilder messageStr = new StringBuilder();
@ -256,10 +270,10 @@ public class ManualMatchPanel extends Panel {
/**
*
* This method is used to return a decline message if an employee already has declined a Match between the employee and a specific project idea .
* This method is used to return a decline message if an employee already has declined to supervise the project idea .
* @param supervisor the employee
* @param projectIdea from which we get the match history
* @param status the status
* @param projectIdea the project idea (from which we get the match history)
* @param status the status of the match
* @return String the decline message
*/
private String createDeclineMessage(User supervisor, ProjectIdea projectIdea, Match.Status status) {
@ -285,10 +299,10 @@ public class ManualMatchPanel extends Panel {
/**
*
* This method is used to return a confirmation message that you want to create a match between the employee and a specific project idea .
* This method is used to return a confirmation message (is shown in a confirmation dialog) for a match between the employee and the project idea .
* @param supervisor the employee
* @param status the status
* @return String the decline message
* @param status the status of the match
* @return String the confirmation message
*/
private String createConfirmationMessage(User supervisor, Match.Status status) {
StringBuilder stringBuilder = new StringBuilder();

@ -32,28 +32,39 @@ public class ManualSetReviewerPanel extends Panel {
private Fragment currentFragment;
private Fragment alternateFragment;
private AutoCompleteObjectField<Employee, Long> autocompleteReviewerField;
private final ConfirmerAjaxSubmitLink saveButton;
public ManualSetReviewerPanel(String id, IModel<ProjectIdea> projectIdeaModel, Component feedbackPanel) {
super(id);
Component localFeedback = new FeedbackPanel("localFeedback");
ConfirmerAjaxSubmitLink saveButton = createSubmitLink(projectIdeaModel, feedbackPanel, localFeedback);
autocompleteReviewerField = createDsvAutocompleteComponent(projectIdeaModel.getObject(), saveButton);
setOutputMarkupPlaceholderTag(true);
Component localFeedback = new FeedbackPanel("localFeedback");
AutoCompleteObjectField<Employee, Long> autocompleteReviewerField = createDsvAutocompleteComponent(projectIdeaModel.getObject());
autocompleteReviewerField.setOutputMarkupId(true);
saveButton = createSubmitLink(projectIdeaModel, feedbackPanel, localFeedback, autocompleteReviewerField);
saveButton.setOutputMarkupId(true);
Form<Employee> reviewerForm = new Form<Employee>("reviewerForm");
currentFragment = createButtonFragment(reviewerForm);
alternateFragment = createReviewerFragment(saveButton, reviewerForm, localFeedback);
currentFragment = createButtonFragment(reviewerForm, autocompleteReviewerField);
alternateFragment = createReviewerFragment(reviewerForm, localFeedback, autocompleteReviewerField );
add(currentFragment);
}
private ConfirmerAjaxSubmitLink createSubmitLink(final IModel<ProjectIdea> projectIdeaModel, final Component feedbackPanel, final Component localFeedback) {
private boolean testACInputString(AutoCompleteObjectField<Employee, Long> autocompleteReviewerField) {
return autocompleteReviewerField.getModelObject() == null ||
autocompleteReviewerField.getInput() == null ||
autocompleteReviewerField.getInput().isEmpty() ||
!autocompleteReviewerField.getInput().equals(autocompleteReviewerField.getModelObject().getNameAsString());
}
private ConfirmerAjaxSubmitLink createSubmitLink(final IModel<ProjectIdea> projectIdeaModel, final Component feedbackPanel,
final Component localFeedback, final AutoCompleteObjectField<Employee, Long> autocompleteReviewerField) {
return new ConfirmerAjaxSubmitLink("saveButton") {
private static final long serialVersionUID = -1852298712407811714L;
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
if(autocompleteReviewerField.getModelObject() == null) {
Session.get().info("No match could be created because the reviewer was incorrect.");
if(testACInputString(autocompleteReviewerField) ) {
Session.get().error("No reviewer could be selected because the input was invalid.");
target.addComponent(localFeedback);
} else {
ProjectIdea projectIdea = projectIdeaModel.getObject();
@ -67,17 +78,22 @@ public class ManualSetReviewerPanel extends Panel {
@Override //Listener method invoked on form submit with errors
protected void onError(AjaxRequestTarget target, Form<?> form) {
error(getErrorMessage(projectIdeaModel.getObject().getTitle(), autocompleteReviewerField.getModelObject().getNameAsString()));
Session.get().error(getErrorMessage(projectIdeaModel.getObject().getTitle(), autocompleteReviewerField.getModelObject().getNameAsString()));
super.onError(target, form);
setResponsePage(AdminManageProjectIdeaPage.class);
target.addComponent(feedbackPanel); // is only activated on "this"
}
@Override
protected boolean isDisplayConfirmation() {
return saveButton.getMessageContentHTML() != null && !saveButton.getMessageContentHTML().isEmpty();
}
};
}
private Fragment createButtonFragment(final Form<Employee> reviewerForm) {
private Fragment createButtonFragment(final Form<Employee> reviewerForm, final AutoCompleteObjectField<Employee, Long> autocompleteReviewerField) {
Fragment buttonFragment = new Fragment("main", "buttonFragment", this) {
private static final long serialVersionUID = 2383077895140299047L;
@ -88,22 +104,28 @@ public class ManualSetReviewerPanel extends Panel {
}
};
buttonFragment.add(new AjaxFallbackLink<Object>("manualSetReviewerButton") {
private static final long serialVersionUID = 5843396419011530582L;
@Override
public void onClick(AjaxRequestTarget target) {
swapFragment();
if (target != null) {
target.addComponent(currentFragment);
}
clearInputAndAddToTarget(target, autocompleteReviewerField);
}
});
buttonFragment.setOutputMarkupPlaceholderTag(true);
return buttonFragment;
}
private Fragment createReviewerFragment(ConfirmerAjaxSubmitLink saveButton, final Form<Employee> reviewerForm, Component localFeedback) {
private void clearInputAndAddToTarget(AjaxRequestTarget target, final AutoCompleteObjectField autoCompleteObjectField) {
//noinspection unchecked
autoCompleteObjectField.setModelObject(null);
autoCompleteObjectField.clearInput();
saveButton.setMessageContentHTML(null);
target.addComponent(currentFragment);
target.addComponent(autoCompleteObjectField);
target.addComponent(saveButton);
}
private Fragment createReviewerFragment(final Form<Employee> reviewerForm, Component localFeedback, final AutoCompleteObjectField<Employee, Long> autocompleteReviewerField) {
Fragment reviewerFragment = new Fragment("main", "reviewerFragment", this) {
private static final long serialVersionUID = -1831632235479216987L;
@ -115,23 +137,18 @@ public class ManualSetReviewerPanel extends Panel {
}
};
autocompleteReviewerField.setModelObject(null);
reviewerForm.add(autocompleteReviewerField);
saveButton.setOutputMarkupId(true);
localFeedback.setOutputMarkupId(true);
reviewerForm.add(localFeedback);
reviewerForm.add(saveButton);
reviewerForm.add(new AjaxFallbackLink<Object>("cancelButton") {
private static final long serialVersionUID = 5413209640805412939L;
@Override
public void onClick(AjaxRequestTarget target) {
swapFragment();
if (target != null) {
target.addComponent(currentFragment);
}
clearInputAndAddToTarget(target, autocompleteReviewerField);
}
});
reviewerFragment.add(reviewerForm);
@ -139,7 +156,7 @@ public class ManualSetReviewerPanel extends Panel {
return reviewerFragment;
}
public AutoCompleteObjectField<Employee, Long> createDsvAutocompleteComponent(final ProjectIdea projectIdea, final ConfirmerAjaxSubmitLink saveButton) {
AutoCompleteObjectField<Employee, Long> createDsvAutocompleteComponent(final ProjectIdea projectIdea) {
return new AutoCompleteObjectField<Employee, Long>("reviewerTextField", Employee.class) {
private static final long serialVersionUID = 8639430940925886127L;
@ -187,31 +204,56 @@ public class ManualSetReviewerPanel extends Panel {
}
};
}
private String getConfirmMessage(String employeeName, String projectIdeaTitle) {
/**
*
* 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.
* @param projectIdeaTitle the title of the project idea
* @param reviewerName the name of the suggested reviewer
* @return String the confirmation message
*/
private String getConfirmMessage(final String projectIdeaTitle, final String reviewerName) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("Are you sure that you want to suggest ");
stringBuilder.append(employeeName);
stringBuilder.append(reviewerName);
stringBuilder.append(" as reviewer for the project idea ");
stringBuilder.append(projectIdeaTitle);
stringBuilder.append("?");
return stringBuilder.toString();
}
private String getInfoMessage(String projectIdeaTitle, String reviewerName) {
/**
*
* This method is used to return an information message that the employee was suggested as a reviewer for the project idea.
* @param projectIdeaTitle the title of the project idea
* @param reviewerName the name of the suggested reviewer
* @return String the information message
*/
private String getInfoMessage(final String projectIdeaTitle, final String reviewerName) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(reviewerName);
stringBuilder.append(" was suggested reviewer for the project idea ");
stringBuilder.append(projectIdeaTitle);
stringBuilder.append(".");
return stringBuilder.toString();
}
/**
*
* 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 reviewerName the name of the presumed reviewer
* @return String the error message
*/
private String getErrorMessage(String projectIdeaTitle, String reviewerName) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("An error occurred when suggesting ");
stringBuilder.append(reviewerName);
stringBuilder.append(" as reviewer for the project idea ");
stringBuilder.append(projectIdeaTitle);
stringBuilder.append(".");
return stringBuilder.toString();
}

@ -1,11 +1,11 @@
package se.su.dsv.scipro.components;
import java.util.Arrays;
import java.util.List;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.model.Model;
import java.util.Arrays;
import java.util.List;
public class ItemsPerPageChoice extends DropDownChoice<Integer> {
@ -19,7 +19,7 @@ public class ItemsPerPageChoice extends DropDownChoice<Integer> {
private void initChoices() {
List<Integer> choices = Arrays.asList(new Integer[]{10, 25, 50, 100});
List<Integer> choices = Arrays.asList(new Integer[]{10, 25, 50, 100, 1000});
setChoices(choices);
setNullValid(false);
setRequired(true);

@ -465,7 +465,7 @@ public class ExternalImporterDaisyImpl implements ExternalImporter {
final Set<ProjectParticipantDTO> fetchedOtherParticipants = fetchParticipants(new HashMap<String, String>(), HttpRequestSender.REQUEST_TYPE.GET, new UrlProcessor(){
@Override
String process(String url){
return(url+"/thesis/"+projectDTO.id+"/supervisor");
return(url+"/thesis/"+projectDTO.id+"/contributor");
}
});
combinedSet.addAll(fetchedOtherParticipants);

@ -18,9 +18,10 @@ public interface KeywordDao extends LazyDeleteDao<Keyword>{
* Returns the keyword if it is found
* @param keywordType the keyword can be of a specific type i.e. regular, research area or unit, is never NULL
* @param keywordName the search term, can only be a part of the keyword name, but must start with the same characters
* @param includeDeleted if deleted keywords should be included the search
* @return List<Keyword> the keyword list
*/
public List<Keyword> getAutoCompleteCapableSupervisors(final KeywordType keywordType, final String keywordName);
public List<Keyword> getAutoCompleteCapableSupervisors(final KeywordType keywordType, final String keywordName, boolean includeDeleted);
public List<Keyword> findAllFromType(KeywordType kt, boolean includeDeleted);

@ -52,6 +52,16 @@ public interface ProjectIdeaDao extends Dao<ProjectIdea> {
private Collection<Keyword> keywords;
private boolean includeDeleted = false;
public boolean isIncludeDeleted() {
return includeDeleted;
}
public void setIncludeDeleted(boolean includeDeleted) {
this.includeDeleted = includeDeleted;
}
public Collection<Keyword> getKeywords() {
return keywords;
}

@ -11,7 +11,7 @@ import org.springframework.orm.jpa.JpaCallback;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import se.su.dsv.scipro.data.dao.jpa.AbstractQuerySet;
import se.su.dsv.scipro.data.dao.jpa.AbstractSortableQuerySet;
import se.su.dsv.scipro.data.dao.jpa.Query;
import se.su.dsv.scipro.data.dataobjects.ProjectClass;
import se.su.dsv.scipro.data.dataobjects.Student;
@ -47,11 +47,11 @@ public class ExemptionDaoJPAImp extends QueryableDaoJPAImp<Exemption, ExemptionD
});
}
public AbstractQuerySet<Exemption> createQuerySet(ExemptionDaoParams exemptionDaoParams) {
return new QuerySet().authorNameLike(exemptionDaoParams.getAuthorNameLike());
public AbstractSortableQuerySet<Exemption> createQuerySet(ExemptionDaoParams exemptionDaoParams) {
return new QuerySet().authorNameLike(exemptionDaoParams.getAuthorNameLike()).sort(exemptionDaoParams);
}
public static class QuerySet extends AbstractQuerySet<Exemption> {
public static class QuerySet extends AbstractSortableQuerySet<Exemption> {
public QuerySet() {
super(Exemption.class);

@ -138,14 +138,22 @@ public class KeywordDaoJPAImp extends LazyDeleteAbstractDaoJPAImp<Keyword> imple
}
@Override
// TODO should be improved so that it is possible to search on "mining" and find "data mining"
public List<Keyword> getAutoCompleteCapableSupervisors(final KeywordType keywordType, final String keywordName) {
public List<Keyword> getAutoCompleteCapableSupervisors(final KeywordType keywordType, final String keywordName, final boolean includeDeleted) {
return getJpaTemplate().execute(new JpaCallback<List<Keyword>>() {
public List<Keyword> doInJpa(EntityManager em) throws PersistenceException {
TypedQuery<Keyword> query;
query = em.createQuery("SELECT x FROM "+domainClassString+" x WHERE x.type = :type AND x.keyword LIKE :keywordName ORDER BY keyword", domainClass);
StringBuilder sqlBuilder = new StringBuilder();
sqlBuilder.append("SELECT x FROM ").append(domainClassString).append(" x ")
.append("WHERE x.type = :type AND x.keyword LIKE :keywordName AND ");
if(includeDeleted) {
sqlBuilder.append("(x.deleted = 1 OR x.deleted = 0) ");
} else {
sqlBuilder.append("x.deleted = 0 ");
}
sqlBuilder.append("ORDER BY keyword ");
query = em.createQuery(sqlBuilder.toString(), domainClass);
query.setParameter("type", keywordType);
String keyWordNameString = keywordName + "%";
String keyWordNameString = "%" + keywordName + "%";
query.setParameter("keywordName", keyWordNameString);
query.setHint(QueryHints.HINT_CACHEABLE, "true");
return query.getResultList();

@ -16,6 +16,7 @@ import se.su.dsv.scipro.data.dataobjects.Employee;
import se.su.dsv.scipro.data.dataobjects.ProjectClass;
import se.su.dsv.scipro.data.dataobjects.Student;
import se.su.dsv.scipro.match.dao.interfaces.ProjectIdeaDao;
import se.su.dsv.scipro.match.dataobject.Keyword;
import se.su.dsv.scipro.match.dataobject.Match;
import se.su.dsv.scipro.match.dataobject.Match.Status;
import se.su.dsv.scipro.match.dataobject.ProjectIdea;
@ -120,6 +121,7 @@ public class ProjectIdeaDaoJPAImp extends AbstractDaoJPAImp<ProjectIdea>
.author(params.getAuthor())
.supervisor(params.getSupervisor())
.reviewer(params.getReviewer())
.keywords(params.getKeywords())
.sortAndPaginate(params);
}
@ -217,6 +219,15 @@ public class ProjectIdeaDaoJPAImp extends AbstractDaoJPAImp<ProjectIdea>
return this;
}
public QuerySet keywords(Collection<Keyword> keywords) {
if (keywords != null && !keywords.isEmpty()) {
getQuery().combine(
new Query().join("_.keywords.keywords k").where("k in (:keywords)").parameter(
"keywords", keywords)).distinct();
}
return this;
}
public QuerySet statuses(Collection<Match.Status> statuses) {
List<Match.Status> filterStatuses = new ArrayList<Match.Status>();
boolean hasUnmatched = false;

@ -122,13 +122,15 @@ public class SupervisorDaoJPAImp extends QueryableDaoJPAImp<Employee, Supervisor
}
public QuerySet keywords(Collection<Keyword> keywords) {
if (keywords != null) {
if (keywords != null && !keywords.isEmpty()) {
getQuery().combine(
new Query().join("_.keywords.keywords k").where("k in (:keywords)").parameter(
"keywords", keywords)).distinct();
}
return this;
}
public QuerySet keyword(Keyword keyword) {
if (keyword != null) {

@ -1,26 +1,11 @@
package se.su.dsv.scipro.match.dataobject;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.persistence.Cacheable;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.OrderBy;
import javax.persistence.Table;
import javax.persistence.*;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
@ -44,6 +29,11 @@ public class ProjectIdea extends DomainObject {
@SortableField
private ProjectClass projectClass;
@Embedded
@AssociationOverride(name="supervisorInterest", joinTable=@JoinTable(name="projectIdea_Employee"))
private SupervisorInterest supervisorInterest; // the object is set in the application code
@ManyToMany
private List<Student> authors = new ArrayList<Student>();
@ -88,6 +78,14 @@ public class ProjectIdea extends DomainObject {
return id;
}
public SupervisorInterest getSupervisorInterest() {
return supervisorInterest;
}
public void setSupervisorInterest(SupervisorInterest supervisorInterest) {
this.supervisorInterest = supervisorInterest;
}
public ApplicationPeriod getApplicationPeriod() {
return applicationPeriod;
}
@ -178,7 +176,7 @@ public class ProjectIdea extends DomainObject {
@Override
public String toString() {
return "ProjectIdea [id=" + (id != null ? id : "") + ", projectClass=" + (projectClass != null ? projectClass : "")
return "ProjectIdea [id=" + (id != null ? id : "") + ", projectClass=" + (projectClass != null ? projectClass : "") + ", supervisorInterest=" + (supervisorInterest != null ? supervisorInterest : "")
+ ", authors=" + (authors != null ? authors : "") + ", preferredSupervisor=" + (preferredSupervisor != null ? preferredSupervisor : "")
+ ", externalSupervisorInfo=" + (externalSupervisorInfo != null ? externalSupervisorInfo : "") + ", keywords=" + (keywords != null ? keywords : "")
+ ", title="+ (title != null ? title : "") + ", watson=" + (watson != null ? watson : "")
@ -208,6 +206,9 @@ public class ProjectIdea extends DomainObject {
result =
prime * result
+ ((projectClass == null) ? 0 : projectClass.hashCode());
result =
prime * result
+ ((supervisorInterest == null) ? 0 : supervisorInterest.hashCode());
result = prime * result + ((title == null) ? 0 : title.hashCode());
result = prime * result + ((watson == null) ? 0 : watson.hashCode());
return result;
@ -256,6 +257,11 @@ public class ProjectIdea extends DomainObject {
return false;
} else if (!projectClass.equals(other.projectClass))
return false;
if (supervisorInterest == null) {
if (other.supervisorInterest != null)
return false;
} else if (!supervisorInterest.equals(other.supervisorInterest))
return false;
if (title == null) {
if (other.title != null)
return false;
@ -294,110 +300,6 @@ public class ProjectIdea extends DomainObject {
return match.getStatus().toString();
}
@Embeddable
public static class Watson implements Serializable {
private static final long serialVersionUID = 6425139094214449167L;
// Watson-box-data
@Column(nullable = false, length = 1024)
private String what = "";
@Column(nullable = false, length = 1024)
private String why = "";
@Column(nullable = false, length = 1024)
private String theoryHow = "";
@Column(nullable = false, length = 1024)
private String practicalHow = "";
public String getWhat() {
return what;
}
public void setWhat(String what) {
this.what = what;
}
public String getWhy() {
return why;
}
public void setWhy(String why) {
this.why = why;
}
public String getTheoryHow() {
return theoryHow;
}
public void setTheoryHow(String theoryHow) {
this.theoryHow = theoryHow;
}
public String getPracticalHow() {
return practicalHow;
}
public void setPracticalHow(String practicalHow) {
this.practicalHow = practicalHow;
}
@Override
public String toString() {
return "Watson [what=" + what + ", why=" + why + ", theoryHow="
+ theoryHow + ", practicalHow=" + practicalHow + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result =
prime * result
+ ((practicalHow == null) ? 0 : practicalHow.hashCode());
result =
prime * result
+ ((theoryHow == null) ? 0 : theoryHow.hashCode());
result = prime * result + ((what == null) ? 0 : what.hashCode());
result = prime * result + ((why == null) ? 0 : why.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;
Watson other = (Watson) obj;
if (practicalHow == null) {
if (other.practicalHow != null)
return false;
} else if (!practicalHow.equals(other.practicalHow))
return false;
if (theoryHow == null) {
if (other.theoryHow != null)
return false;
} else if (!theoryHow.equals(other.theoryHow))
return false;
if (what == null) {
if (other.what != null)
return false;
} else if (!what.equals(other.what))
return false;
if (why == null) {
if (other.why != null)
return false;
} else if (!why.equals(other.why))
return false;
return true;
}
}
public void addMatch(Match match) {
match.setProjectIdea(this);
this.match = match;

@ -0,0 +1,52 @@
package se.su.dsv.scipro.match.dataobject;
import se.su.dsv.scipro.data.dataobjects.Employee;
import javax.persistence.CascadeType;
import javax.persistence.Embeddable;
import javax.persistence.FetchType;
import javax.persistence.ManyToMany;
import java.io.Serializable;
import java.util.*;
@Embeddable
public class SupervisorInterest implements Serializable {
private static final long serialVersionUID = 6019515679819483607L;
@ManyToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER)
private List<Employee> supervisorInterest = new ArrayList<Employee>();
public List<Employee> getSupervisorInterest() {
return supervisorInterest;
}
public void setSupervisorInterest(List<Employee> supervisorInterest) {
this.supervisorInterest = supervisorInterest;
}
@Override
public String toString() {
return "SupervisorInterest{" +
"supervisorInterest=" + supervisorInterest +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
SupervisorInterest that = (SupervisorInterest) o;
if (supervisorInterest != null ? !supervisorInterest.equals(that.supervisorInterest) : that.supervisorInterest != null)
return false;
return true;
}
@Override
public int hashCode() {
return supervisorInterest != null ? supervisorInterest.hashCode() : 0;
}
}

@ -0,0 +1,106 @@
package se.su.dsv.scipro.match.dataobject;
import javax.persistence.*;
import java.io.Serializable;
@Embeddable
public class Watson implements Serializable {
private static final long serialVersionUID = 8028674038959771277L;
// Watson-box-data
@Column(nullable = false, length = 1024)
private String what = "";
@Column(nullable = false, length = 1024)
private String why = "";
@Column(nullable = false, length = 1024)
private String theoryHow = "";
@Column(nullable = false, length = 1024)
private String practicalHow = "";
public String getWhat() {
return what;
}
public void setWhat(String what) {
this.what = what;
}
public String getWhy() {
return why;
}
public void setWhy(String why) {
this.why = why;
}
public String getTheoryHow() {
return theoryHow;
}
public void setTheoryHow(String theoryHow) {
this.theoryHow = theoryHow;
}
public String getPracticalHow() {
return practicalHow;
}
public void setPracticalHow(String practicalHow) {
this.practicalHow = practicalHow;
}
@Override
public String toString() {
return "Watson [what=" + what + ", why=" + why + ", theoryHow="
+ theoryHow + ", practicalHow=" + practicalHow + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result =
prime * result
+ ((practicalHow == null) ? 0 : practicalHow.hashCode());
result =
prime * result
+ ((theoryHow == null) ? 0 : theoryHow.hashCode());
result = prime * result + ((what == null) ? 0 : what.hashCode());
result = prime * result + ((why == null) ? 0 : why.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;
Watson other = (Watson) obj;
if (practicalHow == null) {
if (other.practicalHow != null)
return false;
} else if (!practicalHow.equals(other.practicalHow))
return false;
if (theoryHow == null) {
if (other.theoryHow != null)
return false;
} else if (!theoryHow.equals(other.theoryHow))
return false;
if (what == null) {
if (other.what != null)
return false;
} else if (!what.equals(other.what))
return false;
if (why == null) {
if (other.why != null)
return false;
} else if (!why.equals(other.why))
return false;
return true;
}
}

@ -1,71 +1,73 @@
package se.su.dsv.scipro.match.dataprovider;
import java.util.Iterator;
import org.apache.wicket.spring.injection.annot.SpringBean;
import se.su.dsv.scipro.data.dao.interfaces.Dao;
import se.su.dsv.scipro.dataproviders.SortSpecifier;
import se.su.dsv.scipro.dataproviders.SortableDataProvider;
import se.su.dsv.scipro.match.dao.interfaces.ProjectIdeaDao;
import se.su.dsv.scipro.match.dataobject.Match;
import se.su.dsv.scipro.match.dataobject.ProjectIdea;
/**
* Custom (and well behaved) SortableDataProvider implementation with Dao-injection override mechanics and custom sorting-fields.
* @see base type for more information.
*/
public class ProjectIdeaDataProvider extends SortableDataProvider<ProjectIdea>{
private static final long serialVersionUID = 1L;
@SpringBean
protected ProjectIdeaDao projectIdeaDao;
private ProjectIdeaDao.Params params;
/**
*/
public ProjectIdeaDataProvider() {
this(null);
}
/**
* Create provider with the given SortSpecifier.
* @param sortSpecifier
*/
public ProjectIdeaDataProvider(final SortSpecifier sortSpecifier) {
super(sortSpecifier, ProjectIdea.class);
}
@Override
protected Dao<ProjectIdea> getDao() {
return projectIdeaDao;
}
public void setParams(ProjectIdeaDao.Params params){
this.params = params;
}
public Iterator<ProjectIdea> iterator(int first, int count) {
params.setLimit(count);
params.setOffset(first);
Iterator<ProjectIdea> itr;
itr = ((ProjectIdeaDao) getDao()).findProjectIdeas(params).iterator();
if(params.getStatuses() != null){
if(params.getStatuses().contains(Match.Status.PUBLISHED) && params.getStatuses().size() == 1 && params.getSupervisor() == null){
itr = ((ProjectIdeaDao) getDao()).findTopWaitingProjects(params).iterator();
}
}
return itr;
}
@Override
public int size() {
params.setLimit(null);
params.setOffset(null);
return (int) ((ProjectIdeaDao) getDao()).countProjectIdeas(params);
}
package se.su.dsv.scipro.match.dataprovider;
import java.util.Iterator;
import org.apache.wicket.spring.injection.annot.SpringBean;
import se.su.dsv.scipro.data.dao.interfaces.Dao;
import se.su.dsv.scipro.dataproviders.SortSpecifier;
import se.su.dsv.scipro.dataproviders.SortableDataProvider;
import se.su.dsv.scipro.match.dao.interfaces.ProjectIdeaDao;
import se.su.dsv.scipro.match.dataobject.Match;
import se.su.dsv.scipro.match.dataobject.ProjectIdea;
/**
* Custom (and well behaved) SortableDataProvider implementation with Dao-injection override mechanics and custom sorting-fields.
* @see base type for more information.
*/
public class ProjectIdeaDataProvider extends SortableDataProvider<ProjectIdea>{
private static final long serialVersionUID = 1L;
@SpringBean
protected ProjectIdeaDao projectIdeaDao;
private ProjectIdeaDao.Params params;
/**
*/
public ProjectIdeaDataProvider() {
this(null);
}
/**
* Create provider with the given SortSpecifier.
* @param sortSpecifier
*/
public ProjectIdeaDataProvider(final SortSpecifier sortSpecifier) {
super(sortSpecifier, ProjectIdea.class);
}
@Override
protected Dao<ProjectIdea> getDao() {
return projectIdeaDao;
}
public void setParams(ProjectIdeaDao.Params params){
this.params = params;
}
public Iterator<ProjectIdea> iterator(int first, int count) {
params.setLimit(count);
params.setOffset(first);
Iterator<ProjectIdea> itr;
itr = ((ProjectIdeaDao) getDao()).findProjectIdeas(params).iterator();
if(params.getStatuses() != null){
if(params.getStatuses().contains(Match.Status.PUBLISHED) && params.getStatuses().size() == 1 && params.getSupervisor() == null){
itr = ((ProjectIdeaDao) getDao()).findTopWaitingProjects(params).iterator();
}
}
return itr;
}
@Override
public int size() {
params.setLimit(null);
params.setOffset(null);
return (int) ((ProjectIdeaDao) getDao()).countProjectIdeas(params);
}
}

@ -27,16 +27,15 @@
<div class="span-22 append-bottom last">
<div class="span-3" wicket:id="projectClassPanel"></div>
<div class="span-7 last append-bottom" wicket:id="matchStatusPanel"></div>
<div class="span-5">
<div class="span-7">
<div><input wicket:id="filterButton" type="submit"/></div>
<div class="prepend-top"><label>DO NOT TOUCH unless you know what you're doing!</label></div>
</div>
<div class="span-5">
<div><label>DO NOT TOUCH unless you know what you're doing!</label></div>
<div>
<button wicket:id="acceptLink">Force accept all PUBLISHED ideas</button>
<button wicket:id="acceptLink">Force accept all SUGGESTED ideas</button>
</div>
</div>
</div>
</form>

@ -116,7 +116,6 @@ public class AdminManageProjectIdeaPanel extends Panel {
@Override
public void onClick(AjaxRequestTarget target) {
// if (target != null) {
dialog.replace(new AdminEditProjectIdeaPanel("dialogContent", new Model<ProjectIdea>(idea), feedBackPanel) {
private static final long serialVersionUID = 1L;
});
@ -124,7 +123,6 @@ public class AdminManageProjectIdeaPanel extends Panel {
target.addComponent(dialog);
dialog.open(target);
// }
}
};
@ -177,6 +175,7 @@ public class AdminManageProjectIdeaPanel extends Panel {
protected void onUpdate(AjaxRequestTarget target) {
allDataView.setItemsPerPage(itemsPerPageChoice.getModelObject());
target.addComponent(allContainer);
target.addComponent(totalProjectIdeas);
}

@ -1,6 +1,5 @@
package se.su.dsv.scipro.match.panel;
import java.util.ArrayList;
import java.util.List;
import org.apache.wicket.markup.html.WebMarkupContainer;
@ -28,19 +27,15 @@ public class FilterFormProjectClassPanel extends Panel {
@SpringBean
private ProjectClassDao projectClassDao;
private List<ProjectClass> projectClasses = new ArrayList<ProjectClass>();
private final CheckGroup<ProjectClass> checkGroup;
public FilterFormProjectClassPanel(String id, final List<ProjectClass> projectClassesToSet) {
private final CheckGroup<ProjectClass> checkGroup;
public FilterFormProjectClassPanel(String id, final List<ProjectClass> projectClassesToSet) {
super(id);
projectClasses = projectClassDao.findAll();
CompoundPropertyModel<List<ProjectClass>> projectClassModel = new CompoundPropertyModel<List<ProjectClass>>(projectClasses);
checkGroup = new CheckGroup<ProjectClass>("checkGroup",projectClassesToSet /*new ArrayList<ProjectClass>()*/);
List<ProjectClass> projectClasses1 = projectClassDao.findAll();
CompoundPropertyModel<List<ProjectClass>> projectClassModel = new CompoundPropertyModel<List<ProjectClass>>(projectClasses1);
checkGroup = new CheckGroup<ProjectClass>("checkGroup",projectClassesToSet);
final WebMarkupContainer container = new WebMarkupContainer("container");
container.setOutputMarkupId(true);
ListView<ProjectClass> projectClasses = new ListView<ProjectClass>("projectClasses", projectClassModel) {
@ -49,11 +44,7 @@ public class FilterFormProjectClassPanel extends Panel {
@Override
protected void populateItem(ListItem<ProjectClass> item) {
Check<ProjectClass> projectClassCheckBox = new Check<ProjectClass>("projectClassCheckBox", item.getModel());
/*if(projectClassesToSet.contains(item.getModelObject())){
projectClassCheckBox.
}*/
item.add(projectClassCheckBox);
Label projectClassName = new Label("projectClassName", item.getModel().getObject().getName());
item.add(projectClassName);
@ -67,5 +58,5 @@ public class FilterFormProjectClassPanel extends Panel {
public List<ProjectClass> getSelectedprojectClasses(){
return (List<ProjectClass>) checkGroup.getModelObject();
}
}
}

@ -13,6 +13,8 @@
</h5>
<div><b>Project status: </b></div>
<div wicket:id="status"></div>
<div><b>Daisy start date </b></div>
<div wicket:id="daisyStartDateLabel"></div>
<div><b>Title: </b></div>
<div wicket:id="title"></div>
<div><b>Authors: </b></div>

@ -1,8 +1,5 @@
package se.su.dsv.scipro.project.panels;
import java.util.ArrayList;
import java.util.List;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.ExternalLink;
import org.apache.wicket.markup.html.list.ListItem;
@ -10,15 +7,16 @@ 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.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.data.dao.interfaces.ProjectDao;
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 java.util.ArrayList;
import java.util.List;
public class ProjectDetailsPanel extends Panel {
private static final long serialVersionUID = 1L;
@ -40,7 +38,13 @@ public class ProjectDetailsPanel extends Panel {
else if(project.getProjectStatus()!=null){
add(new Label("status", "This project is " + project.getProjectStatus().toString()));
}
if (project.getDaisyStartDate()==null){
add(new Label("daisyStartDateLabel", "Cannot get Daisy start date"));
}
else {
add(new Label("daisyStartDateLabel", project.getDaisyStartDate().toString()));
}
add(new Label("title", new PropertyModel<Project>(project, "title")));

@ -34,6 +34,7 @@
</div>
<div class="span-22 last" wicket:id="dataviewContainer">
<div>Number of projects: <span wicket:id="totalProjectsLabel"></span></div>
<table class="rounded-corner">
<thead>
<tr>

@ -44,6 +44,7 @@ public class ProjectManagementPanel extends Panel {
private ProjectDao.Params params;
private NewProjectDataProvider dataProvider;
private Label totalProjectsLabel;
private Label emptyLabel;
private PagingNavigator nav;
@ -64,6 +65,8 @@ public class ProjectManagementPanel extends Panel {
target.addComponent(nav);
emptyLabel.setVisible(dataProvider.size() == 0);
target.addComponent(emptyLabel);
totalProjectsLabel.setDefaultModel(new Model(new String(Integer.toString(dataProvider.size()))));
target.addComponent(totalProjectsLabel);
}
private void dataviewSetup() {
@ -146,11 +149,11 @@ public class ProjectManagementPanel extends Panel {
@Override
public void onUpdate(AjaxRequestTarget target) {
// dialog.close(target);
// ajaxRefresh(target);
dialog.close(target);
ajaxRefresh(target);
// target.addComponent(dialog);
setResponsePage(ProjectManagementPage.class);
// cd g
}
@ -191,7 +194,11 @@ public class ProjectManagementPanel extends Panel {
nav.setOutputMarkupId(true); //make it ajax-targetable
nav.setVisible(dataProvider.size() != 0);
dataviewContainer.add(nav); //add it
totalProjectsLabel = new Label("totalProjectsLabel", Integer.toString(dataProvider.size()));
totalProjectsLabel.setOutputMarkupId(true);
dataviewContainer.add(totalProjectsLabel);
emptyLabel = new Label("emptyLabel", "No projects to show"); //informs the user that the list is emty
emptyLabel.setOutputMarkupId(true); //make it ajax-targetable
emptyLabel.setVisible(dataProvider.size() == 0);
@ -218,6 +225,7 @@ public class ProjectManagementPanel extends Panel {
@Override
public void onUpdateFilter(AjaxRequestTarget target) {
//based on dateCreated, not Daisy-startdate.
params.setCreatedAfter(getFromDate());
params.setCreatedBefore(getToDate());
ajaxRefresh(target);
@ -324,11 +332,11 @@ public class ProjectManagementPanel extends Panel {
@Override
public void onUpdate(AjaxRequestTarget target) {
// dialog.close(target);
// ajaxRefresh(target);
dialog.close(target);
ajaxRefresh(target);
// target.addComponent(dialog);
setResponsePage(ProjectManagementPage.class);
// setResponsePage(ProjectManagementPage.class);
}
@Override

@ -1,23 +1,25 @@
package se.su.dsv.scipro.supervisor.pages;
import org.apache.wicket.PageParameters;
import se.su.dsv.scipro.basepages.MenuPage;
import se.su.dsv.scipro.security.auth.Authorization;
import se.su.dsv.scipro.security.auth.roles.Roles;
import se.su.dsv.scipro.supervisor.panels.SupervisorTabMenuPanel;
/**
* Grants correct authorization and marks the correct main-menu option as "supervisor"
* @author Martin Peters - mpeters@dsv.su.se
*
*/
@Authorization(authorizedRoles={/* Probably Roles.EXTERNAL, too when/if implemented*/ Roles.EMPLOYEE})
public abstract class AbstractSupervisorPage extends MenuPage {
public AbstractSupervisorPage(PageParameters pp) {
super(pp);
add(new SupervisorTabMenuPanel("tabMenu", this.getClass()));
}
}
package se.su.dsv.scipro.supervisor.pages;
import org.apache.wicket.PageParameters;
import se.su.dsv.scipro.basepages.MenuPage;
import se.su.dsv.scipro.security.auth.Authorization;
import se.su.dsv.scipro.security.auth.roles.Roles;
import se.su.dsv.scipro.supervisor.panels.SupervisorTabMenuPanel;
/**
* Grants correct authorization and marks the correct main-menu option as "supervisor"
* @author Martin Peters - mpeters@dsv.su.se
*
*/
@Authorization(authorizedRoles={/* Probably Roles.EXTERNAL, too when/if implemented*/ Roles.EMPLOYEE})
public abstract class AbstractSupervisorPage extends MenuPage {
private static final long serialVersionUID = -1020369453880467888L;
public AbstractSupervisorPage(PageParameters pp) {
super(pp);
add(new SupervisorTabMenuPanel("tabMenu", this.getClass()));
}
}

@ -10,6 +10,7 @@ import se.su.dsv.scipro.supervisor.panels.SupervisorMatchedThesisPanel;
public class SupervisorProjectIdeaPage extends AbstractSupervisorPage {
public static final String MAIN_MENU_LABEL = "Supervisor";
private static final long serialVersionUID = -6146389373527384427L;
public SupervisorProjectIdeaPage(PageParameters pp) {
super(pp);

@ -3,13 +3,10 @@ package se.su.dsv.scipro.supervisor.pages;
import org.apache.wicket.Component;
import org.apache.wicket.PageParameters;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import se.su.dsv.scipro.SciProSession;
import se.su.dsv.scipro.supervisor.panels.SupervisorMatchedThesisPanel;
import se.su.dsv.scipro.supervisor.panels.SupervisorUnmatchedThesisPanel;
public class SupervisorUnmatchedProjectIdeaPage extends AbstractSupervisorPage {
public static final String MAIN_MENU_LABEL = "Supervisor";
private static final long serialVersionUID = 141782543835745748L;
public SupervisorUnmatchedProjectIdeaPage(PageParameters pp) {

@ -0,0 +1,16 @@
<!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>
<form wicket:id="form">
<div wicket:id="wmc1">
<div class="append-bottom"><button wicket:id="acceptButton">Report interest to supervise</button></div>
</div>
</form>
</wicket:panel>
</body>
</html>

@ -0,0 +1,93 @@
package se.su.dsv.scipro.supervisor.panels;
import org.apache.log4j.Logger;
import org.apache.wicket.Component;
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.form.Form;
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.apache.wicket.validation.validator.StringValidator;
import se.su.dsv.scipro.SciProSession;
import se.su.dsv.scipro.data.dao.interfaces.GeneralSystemSettingsDao;
import se.su.dsv.scipro.match.dao.interfaces.ProjectIdeaDao;
import se.su.dsv.scipro.match.dao.interfaces.SupervisorDao;
import se.su.dsv.scipro.match.dataobject.ProjectIdea;
import se.su.dsv.scipro.match.dataobject.SupervisorInterest;
import se.su.dsv.scipro.data.dataobjects.Employee;
import java.util.ArrayList;
import java.util.List;
public abstract class SupervisorInterestPanel extends Panel {
private final Logger logger = Logger.getLogger(SupervisorInterestPanel.class);
private static final long serialVersionUID = 7164999234242995192L;
@SpringBean
private ProjectIdeaDao projectIdeaDao;
@SpringBean
private GeneralSystemSettingsDao gDao;
@SpringBean
SupervisorDao supervisorDao;
public abstract void onUpdate(AjaxRequestTarget target);
public SupervisorInterestPanel(String id, final IModel<ProjectIdea> projectIdeaIModel, final Component feedbackPanel) {
super(id);
final LoadableDetachableModel<ProjectIdea> projectIdeaModel = new LoadableDetachableModel<ProjectIdea>() {
private static final long serialVersionUID = 5696857658828934865L;
@Override
protected ProjectIdea load() {
return projectIdeaDao.load(projectIdeaIModel.getObject().getId());
}
};
add(new SupervisorAcceptDeclineForm(projectIdeaModel, feedbackPanel));
}
private class SupervisorAcceptDeclineForm extends Form<Void> {
private static final long serialVersionUID = -3157033328235572033L;
public SupervisorAcceptDeclineForm(final LoadableDetachableModel<ProjectIdea> projectIdeaModel, final Component feedbackPanel) {
super("form");
WebMarkupContainer wmc1 = new WebMarkupContainer("wmc1");
add(wmc1);
wmc1.add(new AjaxLink("acceptButton") {
private static final long serialVersionUID = -2591216055201410154L;
@Override
public void onClick(AjaxRequestTarget target) {
Employee employee = supervisorDao.getFrom(SciProSession.get().getUser());
if(isInterestAlreadyAdded(projectIdeaModel.getObject(), employee)) {
SupervisorInterest supervisorInterest = new SupervisorInterest();
List<Employee> employeeList = new ArrayList<Employee>();
employeeList.add(employee);
supervisorInterest.setSupervisorInterest(employeeList);
projectIdeaModel.getObject().setSupervisorInterest(supervisorInterest);
projectIdeaDao.save(projectIdeaModel.getObject());
onUpdate(target);
String infoText = "Added supervisor interest to " + employee.getNameAsString() + " for the project idea " + projectIdeaModel.getObject().getTitle();
SciProSession.get().info(infoText);
target.addComponent(feedbackPanel);
logger.info(infoText);
} else {
// the link is disabled when interest already is added for the supervisor so there is no need for a feedback message
logger.info("Interest already added for the supervisor " + employee.getNameAsString() + " to supervise the project idea " + projectIdeaModel.getObject().getTitle());
}
}
});
}
private boolean isInterestAlreadyAdded(ProjectIdea projectIdea, Employee employee ) {
List<Employee> existingEmployees = projectIdea.getSupervisorInterest().getSupervisorInterest();
return existingEmployees.isEmpty() || !existingEmployees.contains(employee);
}
}
}

@ -0,0 +1,9 @@
<!DOCTYPE html>
<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
<body>
<wicket:panel>
<div wicket:id="watsonPanel"></div>
<div wicket:id="acceptDeclinePanel"></div>
</wicket:panel>
</body>
</html>

@ -0,0 +1,32 @@
package se.su.dsv.scipro.supervisor.panels;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import se.su.dsv.scipro.match.dao.interfaces.MatchDao;
import se.su.dsv.scipro.match.dataobject.ProjectIdea;
public abstract class SupervisorInterestProjectIdeaDialogPanel extends Panel {
private static final long serialVersionUID = 6580700521723559167L;
@SpringBean
MatchDao matchDao;
public abstract void onUpdateUpdate(AjaxRequestTarget target);
public SupervisorInterestProjectIdeaDialogPanel(String id, final IModel<ProjectIdea> projectIdea, final Component feedbackPanel) {
super(id);
add(new WatsonInfoPanel("watsonPanel", projectIdea.getObject()));
add(new SupervisorInterestPanel("acceptDeclinePanel", projectIdea, feedbackPanel){
private static final long serialVersionUID = 2192277777696201317L;
@Override
public void onUpdate(AjaxRequestTarget target) {
onUpdateUpdate(target);
}
});
}
}

@ -1,45 +1,48 @@
package se.su.dsv.scipro.supervisor.panels;
import java.util.ArrayList;
import java.util.List;
import org.apache.wicket.Page;
import se.su.dsv.scipro.components.AbstractMenuPanel;
import se.su.dsv.scipro.components.menuhighlighting.MenuHighlightSupervisorMyProjects;
import se.su.dsv.scipro.peer.pages.SupervisorPeerPortalPage;
import se.su.dsv.scipro.supervisor.pages.*;
/**
*
* @author Martin Peters - mpeters@dsv.su.se
*
*/
public class SupervisorTabMenuPanel extends AbstractMenuPanel {
private static final long serialVersionUID = 1L;
public SupervisorTabMenuPanel(String id, Class<? extends Page> containerClass) {
super(id, AbstractSupervisorPage.class, containerClass);
}
@Override
protected List<MenuItem> getItemList() {
List<MenuItem> items = new ArrayList<MenuItem>();
items.add(new MenuItem("My Projects", SupervisorStartPage.class, MenuHighlightSupervisorMyProjects.class));
items.add(new MenuItem("My Project Ideas", SupervisorProjectIdeaPage.class));
items.add(new MenuItem("Unmatched project ideas", SupervisorUnmatchedProjectIdeaPage.class));
items.add(new MenuItem("Activity plan templates", SupervisorScheduleTemplatesPage.class));
items.add(new MenuItem("Peer portal", SupervisorPeerPortalPage.class));
items.add(new MenuItem("Final Seminars", SupervisorProjectsFinalSeminarPage.class));
items.add(new MenuItem("Profile",SupervisorProfilePage.class));
return items;
}
@Override
protected MenuType getMenuType() {
return MenuType.TAB_MULTIPLE_ROWS;
}
}
package se.su.dsv.scipro.supervisor.panels;
import org.apache.wicket.Page;
import se.su.dsv.scipro.SciProSession;
import se.su.dsv.scipro.components.AbstractMenuPanel;
import se.su.dsv.scipro.components.menuhighlighting.MenuHighlightSupervisorMyProjects;
import se.su.dsv.scipro.peer.pages.SupervisorPeerPortalPage;
import se.su.dsv.scipro.security.auth.roles.Roles;
import se.su.dsv.scipro.supervisor.pages.*;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author Martin Peters - mpeters@dsv.su.se
*
*/
public class SupervisorTabMenuPanel extends AbstractMenuPanel {
private static final long serialVersionUID = 1L;
public SupervisorTabMenuPanel(String id, Class<? extends Page> containerClass) {
super(id, AbstractSupervisorPage.class, containerClass);
}
@Override
protected List<MenuItem> getItemList() {
List<MenuItem> items = new ArrayList<MenuItem>();
items.add(new MenuItem("My projects", SupervisorStartPage.class, MenuHighlightSupervisorMyProjects.class));
items.add(new MenuItem("My project Ideas", SupervisorProjectIdeaPage.class));
if(SciProSession.get().authorizedForRole(Roles.SYSADMIN) && SciProSession.get().hasActualRole(Roles.SYSADMIN)) {
items.add(new MenuItem("Unmatched project ideas", SupervisorUnmatchedProjectIdeaPage.class));
}
items.add(new MenuItem("Activity plan templates", SupervisorScheduleTemplatesPage.class));
items.add(new MenuItem("Peer portal", SupervisorPeerPortalPage.class));
items.add(new MenuItem("Final seminars", SupervisorProjectsFinalSeminarPage.class));
items.add(new MenuItem("Profile",SupervisorProfilePage.class));
return items;
}
@Override
protected MenuType getMenuType() {
return MenuType.TAB_MULTIPLE_ROWS;
}
}

@ -3,6 +3,9 @@
xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
<body>
<wicket:panel>
<div wicket:id="dialog">
<div wicket:id="dialogContent"></div>
</div>
<div class="prepend-top"></div>
@ -18,34 +21,43 @@
<label for="titleField">Title:</label><br/>
<input style="width:300px;" wicket:id="titleField" type="text"/><br/>
<label for="regKeyWordAC">Regular keyword:</label><br/>
<label for="regKeyWordAC">Regular keyword (Word):</label><br/>
<input style="width:300px;" wicket:id="regKeyWordAC" /><br/>
<label for="unitKeyWordAC">Unit keyword:</label><br/>
<label for="unitKeyWordAC">Unit keyword (Unit):</label><br/>
<input style="width:300px;" wicket:id="unitKeyWordAC" /><br/>
<label for="areaKeyWordAC">Research area keyword:</label><br/>
<label for="areaKeyWordAC">Research area keyword (Area):</label><br/>
<input style="width:300px;" wicket:id="areaKeyWordAC" /><br/>
</div>
<div class="span-14 last" >
<strong>Selected keywords and keyword types:</strong>
<label>Selected keywords:</label>
<ul wicket:id="keyWordsContainer">
<li wicket:id="keywordList">
<h5><span wicket:id="keyWord">[keyword]</span> (<span wicket:id="keyWordType">[keyWordType]</span>)</h5>
<h5>
<span wicket:id="keyWord">[keyword]</span> (<span wicket:id="keyWordType">[keyWordType]</span>)<span wicket:id ="isDeleted" style="color: red;">[is deleted]</span>
<img wicket:id="deleteKeyWordIcon" />
</h5>
</li>
</ul>
</div>
</div>
<div class="span-22 last append-bottom">
<div class="span-22 last">
<div class="span-3" wicket:id="projectClassPanel">
</div>
<div class="span-5">
<div class="span-12">
<label>Include inactive keywords:</label><br />
<input type="checkbox" wicket:id="includeDeleted" />
</div>
</div>
<div class="span-22 last append-bottom">
<div class="span-2">
<div><input wicket:id="filterButton" type="submit"/></div>
</div>
<div class="span-5">
<div><button wicket:id="clearSearchTermsButton">Clear search terms</button></div>
<div class="span-2">
<div><button wicket:id="clearSearchTermsButton">Clear</button></div>
</div>
</div>
</form>
@ -59,14 +71,12 @@
<div class="span-22 last">
<table class="rounded-corner">
<thead>
<tr>
<th class="rounded-left-top"><a href="#" wicket:id="levelSortLink">Level</a></th>
<th><a href="#" wicket:id="titleSortLink">Title</a></th>
<th>Author(s)</th>
<th><a href="#" wicket:id="supervisorSortLink">Matched to</a></th>
<th>Unit</th>
<th><a href="#" wicket:id="statusSortLink">Status</a></th>
</tr>
<tr>
<th class="rounded-left-top"><a href="#" wicket:id="levelSortLink">Level</a></th>
<th><a href="#" wicket:id="titleSortLink">Title</a></th>
<th>Author(s)</th>
<th>&nbsp;</th>
</tr>
</thead>
<tfoot>
<tr>
@ -76,11 +86,9 @@
<tbody>
<tr wicket:id="allDataView">
<td wicket:id="level"></td>
<td wicket:id="title"></td>
<td><a wicket:id="openLink"><span wicket:id="title"></span></a></td>
<td wicket:id="author"></td>
<td wicket:id="supervisor"></td>
<td wicket:id="supervisorUnit"></td>
<td wicket:id="status"></td>
<td><span wicket:id="interestAdded" style="color: red;">[interest already added]</span></td>
</tr>
<tr>
<td colspan="7" wicket:id="emptyLabel"></td>

@ -1,11 +1,13 @@
package se.su.dsv.scipro.supervisor.panels;
import org.apache.commons.lang.builder.CompareToBuilder;
import org.apache.wicket.Component;
import org.apache.wicket.Session;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
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.AjaxCheckBox;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
@ -19,25 +21,34 @@ import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.data.DataView;
import org.apache.wicket.model.Model;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.apache.wicket.util.string.Strings;
import org.odlabs.wiquery.ui.dialog.Dialog;
import se.su.dsv.scipro.SciProSession;
import se.su.dsv.scipro.components.CustomDateTimeField;
import se.su.dsv.scipro.components.ItemsPerPageChoice;
import se.su.dsv.scipro.data.dao.interfaces.Dao.SortableParams.Sort;
import se.su.dsv.scipro.data.dao.interfaces.ProjectClassDao;
import se.su.dsv.scipro.data.dataobjects.Employee;
import se.su.dsv.scipro.data.dataobjects.ProjectClass;
import se.su.dsv.scipro.data.dataobjects.Student;
import se.su.dsv.scipro.data.facade.ProjectIdeaFacade;
import se.su.dsv.scipro.icons.AjaxActionIcon;
import se.su.dsv.scipro.icons.ImageObject;
import se.su.dsv.scipro.match.dao.interfaces.KeywordDao;
import se.su.dsv.scipro.match.dao.interfaces.KeywordTypeDao;
import se.su.dsv.scipro.match.dao.interfaces.ProjectIdeaDao.Params;
import se.su.dsv.scipro.match.dataobject.Keyword;
import se.su.dsv.scipro.match.dataobject.KeywordType;
import se.su.dsv.scipro.match.dataobject.Match;
import se.su.dsv.scipro.match.dataobject.ProjectIdea;
import se.su.dsv.scipro.match.dao.interfaces.SupervisorDao;
import se.su.dsv.scipro.match.dataobject.*;
import se.su.dsv.scipro.match.dataprovider.ProjectIdeaDataProvider;
import se.su.dsv.scipro.match.panel.FilterFormProjectClassPanel;
import se.su.dsv.scipro.security.auth.Authorization;
import se.su.dsv.scipro.security.auth.roles.Roles;
import se.su.dsv.scipro.util.JavascriptEventConfirmation;
import se.su.dsv.wicket.components.AutoCompleteObjectField;
import java.util.*;
@Authorization(authorizedRoles = {Roles.SYSADMIN})
public class SupervisorUnmatchedThesisPanel extends Panel {
private static final long serialVersionUID = 3080575522365470502L;
@ -50,6 +61,12 @@ public class SupervisorUnmatchedThesisPanel extends Panel {
@SpringBean
private KeywordTypeDao keywordTypeDao;
@SpringBean
private ProjectClassDao projectClassDao;
@SpringBean
SupervisorDao supervisorDao;
public SupervisorUnmatchedThesisPanel(String id, final Component feedBackPanel) {
super(id);
@ -60,7 +77,7 @@ public class SupervisorUnmatchedThesisPanel extends Panel {
Label emptyLabel = new Label("emptyLabel", "No project ideas to show.");
setOutputMarkupId(totalProjectIdeas, emptyLabel, allContainer);
allDataViewSetup(totalProjectIdeas, allContainer, allProvider, emptyLabel);
allDataViewSetup(totalProjectIdeas, allContainer, allProvider, emptyLabel, feedBackPanel);
FilterForm form = new FilterForm(totalProjectIdeas, allContainer, allProvider, emptyLabel, params, feedBackPanel);
addSortingLinks(allContainer, params);
add(form);
@ -108,10 +125,23 @@ public class SupervisorUnmatchedThesisPanel extends Panel {
allContainer.add(new PagingNavigator("nav", allDataView));
allContainer.add(totalProjectIdeas);
}
private void allDataViewSetup(final Label totalProjectIdeas, final WebMarkupContainer allContainer, final ProjectIdeaDataProvider allProvider,
final Label emptyLabel) {
private Dialog createDialog() {
Dialog dialog = new Dialog("dialog");
dialog.setModal(true);
dialog.setAutoOpen(false);
dialog.setWidth(800);
dialog.setHeight(800);
dialog.add(new EmptyPanel("dialogContent"));
return dialog;
}
private void allDataViewSetup(final Label totalProjectIdeas, final WebMarkupContainer allContainer, final ProjectIdeaDataProvider allProvider, final Label emptyLabel,
final Component feedBackPanel) {
final Dialog dialog = createDialog();
add(dialog.setOutputMarkupId(true));
allContainer.add(emptyLabel.setOutputMarkupId(true));
final DataView<ProjectIdea> allDataView = new DataView<ProjectIdea>("allDataView", allProvider) {
private static final long serialVersionUID = 1533192070850862197L;
@ -120,22 +150,39 @@ public class SupervisorUnmatchedThesisPanel extends Panel {
protected void populateItem(final Item<ProjectIdea> item) {
final ProjectIdea idea = item.getModelObject();
item.add(new Label("level", new Model<ProjectClass>(idea.getProjectClass())));
item.add(new Label("title", new Model<String>(idea.getTitle())));
item.add(new Label("author", new Model<String>(createAuthorString(idea))));
item.add(new EmptyPanel("supervisor"));
item.add(new EmptyPanel("supervisorUnit"));
item.add(new Label("status", new Model<String>(idea.getStatus() != null ? idea.getStatus() : "")));
if (idea.getMatch().getSupervisor() != null) {
item.replace(new Label("supervisor", new Model<String>(idea.getMatch().getSupervisor().getNameAsString())));
if (idea.getMatch().getSupervisor().getKeywords().getFiltered("Unit") != null) {
List<Keyword> keywordList = idea.getMatch().getSupervisor().getKeywords().getFiltered("Unit");
if (!keywordList.isEmpty()) {
Keyword kw = keywordList.get(0);
item.replace(new Label("supervisorUnit", new Model<String>(kw.getKeyword())));
}
item.add(new AjaxLink<Void>("openLink") {
private static final long serialVersionUID = -6853137019834200749L;
@Override
public void onClick(AjaxRequestTarget target) {
dialog.replace(new SupervisorInterestProjectIdeaDialogPanel("dialogContent", new Model<ProjectIdea>(idea), feedBackPanel) {
private static final long serialVersionUID = 5108807012237992330L;
@Override
public void onUpdateUpdate(AjaxRequestTarget target2) {
emptyLabel.setVisible(allProvider.size() == 0);
dialog.close(target2);
target2.addComponent(allContainer);
target2.addComponent(emptyLabel);
}
});
dialog.setTitle(Strings.escapeMarkup(idea.getTitle()).toString());
dialog.open(target);
target.addComponent(dialog);
}
}
}.add(new Label("title", new Model<String>(idea.getTitle()))).setEnabled(!isInterestAlreadyAdded(idea)));
item.add(new Label("author", new Model<String>(createAuthorString(idea))));
item.add(new Label("interestAdded", "Interest is added") {
private static final long serialVersionUID = 7583144096184196178L;
@Override
public boolean isVisible() {
return isInterestAlreadyAdded(idea);
}
});
}
};
@ -155,12 +202,15 @@ public class SupervisorUnmatchedThesisPanel extends Panel {
});
allContainer.add(itemsPerPageChoice);
}
private boolean isInterestAlreadyAdded(ProjectIdea projectIdea) {
List<Employee> existingEmployees = projectIdea.getSupervisorInterest().getSupervisorInterest();
return !existingEmployees.isEmpty() && existingEmployees.contains(supervisorDao.getFrom(SciProSession.get().getUser()));
}
private void addSortingLinks(final WebMarkupContainer allContainer, final Params params) {
addSortLink("level", "projectClass.name", allContainer, params);
addSortLink("title", "title", allContainer, params);
addSortLink("status", "match.status", allContainer, params);
addSortLink("supervisor", "match.supervisor", allContainer, params);
}
private void addSortLink(String markup, final String sortField, final WebMarkupContainer allContainer, final Params params) {
@ -180,8 +230,8 @@ public class SupervisorUnmatchedThesisPanel extends Panel {
allContainer.add(sortLink);
}
public AutoCompleteObjectField<Keyword, Long> createKeywordAC(final String wicketId, final KeywordTypeDao.TYPE keyWordType,
final List<Keyword> keywords, final Component feedBackPanel, final WebMarkupContainer keyWordsContainer) {
private AutoCompleteObjectField<Keyword, Long> createKeywordAC(final String wicketId, final KeywordTypeDao.TYPE keyWordType, final List<Keyword> keywords, final Component feedBackPanel,
final WebMarkupContainer keyWordsContainer, final AjaxCheckBox includeDeletedChbx) {
return new AutoCompleteObjectField<Keyword, Long>(wicketId, Keyword.class) {
private static final long serialVersionUID = 7734889540424308421L;
@ -214,9 +264,9 @@ public class SupervisorUnmatchedThesisPanel extends Panel {
@Override
public Iterator<Keyword> getChoices(String input) {
final KeywordType kwtype = keywordTypeDao.findByType(keyWordType); // keyWordType is only the Type, but the object is required in findAllFromType
return keywordDao.getAutoCompleteCapableSupervisors(kwtype, input).iterator();
boolean includeDeleted = includeDeletedChbx.getModelObject() != null ? includeDeletedChbx.getModelObject() : false;
final KeywordType kwtype = keywordTypeDao.findByType(keyWordType);
return keywordDao.getAutoCompleteCapableSupervisors(kwtype, input, includeDeleted).iterator();
}
@Override
@ -227,8 +277,20 @@ public class SupervisorUnmatchedThesisPanel extends Panel {
if(!keywords.contains(newSelection)) {
keywords.add(newSelection);
}
Collections.sort(keywords, new Comparator<Keyword>() {
@Override
public int compare(Keyword o1, Keyword o2) {
return new CompareToBuilder().append(o1.getKeyword().toLowerCase(), o2.getKeyword().toLowerCase()).toComparison();
}
});
//noinspection unchecked
((ListView) keyWordsContainer.get("keywordList")).setModelObject(keywords);
Session.get().info("Added the keyword " + newSelection + " to the search terms.");
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("Added the keyword ").append(newSelection).append(" (").append(newSelection.getType().getName()).append(") to the search terms.");
if(newSelection.isDeleted()) {
stringBuilder.append(" The keyword is inactive");
}
Session.get().info(stringBuilder.toString());
this.setModelObject(null);
this.clearInput();
pTarget.addComponent(this);
@ -243,61 +305,121 @@ public class SupervisorUnmatchedThesisPanel extends Panel {
private class FilterForm extends Form<Void> {
private static final long serialVersionUID = -3290826142955107010L;
public FilterForm(final Label totalProjectIdeas, final WebMarkupContainer allContainer, final ProjectIdeaDataProvider allProvider,
final Label emptyLabel, final Params params, final Component feedBackPanel) {
public FilterForm(final Label totalProjectIdeas, final WebMarkupContainer allContainer, final ProjectIdeaDataProvider allProvider, final Label emptyLabel, final Params params, final Component feedBackPanel) {
super("form");
final TextField<String> titleField = new TextField<String>("titleField", new Model<String>());
titleField.setOutputMarkupId(true);
final List<Keyword> keywords = new ArrayList<Keyword>();
ListView<Keyword> keywordListView = new ListView<Keyword>("keywordList", new Model<ArrayList<Keyword>>()) {
private static final long serialVersionUID = 78442920410294688L;
final WebMarkupContainer keyWordsContainer = new WebMarkupContainer("keyWordsContainer");
final ListView<Keyword> keywordListView = createKeywordListView(keyWordsContainer, feedBackPanel);
keyWordsContainer.add(keywordListView.setOutputMarkupId(true));
add(keyWordsContainer.setOutputMarkupId(true));
final AjaxCheckBox includeDeletedChbx = new AjaxCheckBox("includeDeleted", new Model<Boolean>()) {
private static final long serialVersionUID = -1810576794268334574L;
@Override
protected void populateItem(ListItem<Keyword> keywordListItem) {
//To change body of implemented methods use File | Settings | File Templates.
Keyword keyword = keywordListItem.getModelObject();
keywordListItem.add(new Label("keyWord",keyword.getKeyword()));
keywordListItem.add(new Label("keyWordType",keyword.getType().getName()));
protected void onUpdate(AjaxRequestTarget target) {
target.addComponent(this);
}
};
final WebMarkupContainer keyWordsContainer = new WebMarkupContainer("keyWordsContainer");
keyWordsContainer.setOutputMarkupId(true);
keyWordsContainer.add(keywordListView);
add(keyWordsContainer);
AutoCompleteObjectField<Keyword, Long> regKeyWordAc = createKeywordAC("regKeyWordAC", KeywordTypeDao.TYPE.REGULAR, keywords, feedBackPanel, keyWordsContainer);
AutoCompleteObjectField<Keyword, Long> unitKeyWordAc = createKeywordAC("unitKeyWordAC", KeywordTypeDao.TYPE.UNIT, keywords, feedBackPanel, keyWordsContainer);
AutoCompleteObjectField<Keyword, Long> areaKeyWordAc = createKeywordAC("areaKeyWordAC", KeywordTypeDao.TYPE.RESEARCH_AREA, keywords, feedBackPanel, keyWordsContainer);
regKeyWordAc.setOutputMarkupId(true);
unitKeyWordAc.setOutputMarkupId(true);
areaKeyWordAc.setOutputMarkupId(true);
add(titleField.setOutputMarkupId(true));
add(createKeywordAC("regKeyWordAC", KeywordTypeDao.TYPE.REGULAR, keywords, feedBackPanel, keyWordsContainer, includeDeletedChbx).setOutputMarkupId(true));
add(createKeywordAC("unitKeyWordAC", KeywordTypeDao.TYPE.UNIT, keywords, feedBackPanel, keyWordsContainer, includeDeletedChbx).setOutputMarkupId(true));
add(createKeywordAC("areaKeyWordAC", KeywordTypeDao.TYPE.RESEARCH_AREA, keywords, feedBackPanel, keyWordsContainer, includeDeletedChbx).setOutputMarkupId(true));
final CustomDateTimeField dateFrom = new CustomDateTimeField("dateFrom", new Model<Date>(getDateSixMonthsAgo()));
final CustomDateTimeField dateTo = new CustomDateTimeField("dateTo", new Model<Date>(Calendar.getInstance().getTime()));
add(titleField);
add(regKeyWordAc);
add(unitKeyWordAc);
add(areaKeyWordAc);
WebMarkupContainer container = new WebMarkupContainer("container");
container.add(dateFrom);
container.add(dateTo);
add(container);
add(new WebMarkupContainer("container").add(dateFrom).add(dateTo));
final FilterFormProjectClassPanel projectClassPanel = new FilterFormProjectClassPanel("projectClassPanel", new ArrayList<ProjectClass>());
add(projectClassPanel);
AjaxButton filterButton = new AjaxButton("filterButton", new Model<String>("Filter")) {
add(projectClassPanel.setOutputMarkupId(true));
add(includeDeletedChbx.setOutputMarkupId(true));
add(createFilterButton(params, titleField, projectClassPanel, keywords, emptyLabel, allContainer, allProvider, dateFrom, dateTo, totalProjectIdeas, feedBackPanel));
add(new AjaxButton("clearSearchTermsButton") {
private static final long serialVersionUID = 443680343329839590L;
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
@SuppressWarnings("unchecked") List<Keyword> keywordList = ((ListView) keyWordsContainer.get("keywordList")).getModelObject();
if(keywordList != null && !keywordList.isEmpty()) {
keywordList.clear();
}
titleField.setModelObject(null);
projectClassPanel.getSelectedprojectClasses().clear();
includeDeletedChbx.setDefaultModelObject(false);
target.addComponent(includeDeletedChbx);
target.addComponent(feedBackPanel);
target.addComponent(keyWordsContainer);
target.addComponent(titleField);
target.addComponent(projectClassPanel);
}
});
}
private ListView<Keyword> createKeywordListView(final WebMarkupContainer keyWordsContainer, final Component feedbackPanel) {
return new ListView<Keyword>("keywordList", new Model<ArrayList<Keyword>>()) {
private static final long serialVersionUID = 78442920410294688L;
@Override
protected void populateItem(final ListItem<Keyword> keywordListItem) {
//To change body of implemented methods use File | Settings | File Templates.
final Keyword keyword = keywordListItem.getModelObject();
keywordListItem.add(new Label("keyWord",keyword.getKeyword()));
keywordListItem.add(new Label("isDeleted", " keyword is inactive ") {
private static final long serialVersionUID = -8762949529390464842L;
@Override
public boolean isVisible() {
return keyword.isDeleted();
}
});
keywordListItem.add(new Label("keyWordType",keyword.getType().getName()));
AjaxActionIcon deleteKeyWordIcon = new AjaxActionIcon("deleteKeyWordIcon", ImageObject.SIXTEEN + ImageObject.DELETE){
private static final long serialVersionUID = -8732262906336014797L;
@Override
protected void onClick(AjaxRequestTarget target) {
keywordListItem.remove();
Session.get().info("Removed the keyword " + keyword + " from the search terms.");
@SuppressWarnings("unchecked") final List<Keyword> keywordList = ((ListView) keyWordsContainer.get("keywordList")).getModelObject();
if(keywordList.contains(keyword)) {
keywordList.remove(keyword);
}
target.addComponent(keyWordsContainer);
target.addComponent(feedbackPanel);
}
};
deleteKeyWordIcon.add(new JavascriptEventConfirmation("onclick", "Are you sure you want to delete the keyword " + keyword + "?"));
keywordListItem.add(deleteKeyWordIcon);
}
};
}
private AjaxButton createFilterButton(final Params params, final TextField<String> titleField, final FilterFormProjectClassPanel projectClassPanel,
final List<Keyword> keywords, final Label emptyLabel, final WebMarkupContainer allContainer, final ProjectIdeaDataProvider allProvider,
final CustomDateTimeField dateFrom, final CustomDateTimeField dateTo, final Label totalProjectIdeas, final Component feedBackPanel) {
return new AjaxButton("filterButton", new Model<String>("Filter")) {
private static final long serialVersionUID = 874722659774465502L;
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
params.setTitleContains(titleField.getModelObject());
params.setTitleContains(titleField.getModelObject() != null ? titleField.getModelObject() : "");
List<ProjectClass> pclasses = projectClassPanel.getSelectedprojectClasses();
if (!pclasses.isEmpty()) {
params.setProjectClasses(pclasses);
} else if(params.getProjectClasses() == null || params.getProjectClasses().size() == 0) {
addProjectClasses(params);
}
if(!keywords.isEmpty()) {
params.setKeywords(keywords);
params.setKeywords(keywords); // there should always be a project class, we may otherwise get an NPE when we clear() in clearSearchTermsButton#onSubmit
for(Keyword keyword : keywords) {
if(keyword.isDeleted()) {
params.setIncludeDeleted(true);
break;
}
}
}
params.setSubmittedAfter(dateFrom.getModelObject());
params.setSubmittedBefore(dateTo.getModelObject());
@ -305,21 +427,18 @@ public class SupervisorUnmatchedThesisPanel extends Panel {
allContainer.replace(new Label("totalProjectIdeas", Integer.toString(allProvider.size())));
target.addComponent(totalProjectIdeas);
target.addComponent(allContainer);
target.addComponent(feedBackPanel);
}
};
add(filterButton);
add(new AjaxButton("clearSearchTermsButton") {
private static final long serialVersionUID = 443680343329839590L;
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
((ListView) keyWordsContainer.get("keywordList")).setModelObject(null);
titleField.setModelObject(null);
target.addComponent(keyWordsContainer);
target.addComponent(titleField);
//projectClassPanel => för att noll-ställa
}
});
}
private void addProjectClasses(Params params) {
Collection<ProjectClass> projectClassCollection = new ArrayList<ProjectClass>();
ProjectClass projectClass = projectClassDao.getProjectClass(ProjectClass.BACHELOR);
projectClassCollection.add(projectClass);
projectClass = projectClassDao.getProjectClass(ProjectClass.MASTER);
projectClassCollection.add(projectClass);
params.setProjectClasses(projectClassCollection);
}
}
}

@ -15,6 +15,7 @@
<!-- 2nd level cache -->
<property name="hibernate.cache.provider_class"
value="org.hibernate.cache.SingletonEhCacheProvider"/>
<!--<property name="hibernate.hbm2ddl.auto" value="update" />-->
<property name="net.sf.ehcache.configurationResourceName"
value="/ehcache.xml"/>
<property name="hibernate.cache.use_query_cache" value="true"/>

@ -1,31 +0,0 @@
<?xml version='1.0' encoding='utf-8'?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!-- The contents of this file will be loaded for each web application -->
<Context privileged="true" distributable="1" reloadable="1" debug="1">
<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<!--
<Manager pathname="" />
-->
<!-- Uncomment this to enable Comet connection tacking (provides events
on session expiration as well as webapp lifecycle) -->
<!--
<Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
-->
</Context>