Fixed merge conflicts in PeerPortalPanel-files

This commit is contained in:
Emil Siverhall 2011-07-15 10:23:18 +02:00
commit a03cba66cb
51 changed files with 834 additions and 183 deletions
.gitignorepom.xml
src
target/work/WicketMockServlet-filestore
2225/4400/e95749e4_308e_4698_a057_bb86050ac96e
2349/5733/fd6064a1_8b84_4446_82cc_69fd7167e7c6
4435/793/a137fc0e_994c_4fd1_94a7_801290d34f88
6408/4902/a7851e5b_30d6_4edf_a954_3f4f8c6690fb
7238/3517/7b8c41d4_a788_46e0_a576_ab3eb0b03be8

5
.gitignore vendored Normal file

@ -0,0 +1,5 @@
\.settings/
\.project
\.classpath
\target/**/*
\target/*

@ -21,7 +21,6 @@
</repository>
</repositories>
<dependencies>
<!-- WICKET DEPENDENCIES -->
<dependency>
@ -34,7 +33,13 @@
<artifactId>wicket-spring</artifactId>
<version>${wicket.version}</version>
</dependency>
<!-- Servlet API, needed for compilation. -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<!-- LOGGING DEPENDENCIES - LOG4J -->
<dependency>
<groupId>org.slf4j</groupId>

@ -11,6 +11,7 @@ public class ApplicationSettings {
private boolean enableRemoteUserLookup;
private String remoteLookupUrl;
private boolean acceptExternalAuthentication;
public boolean isEnableRemoteUserLookup() {
return enableRemoteUserLookup;
@ -28,4 +29,12 @@ public class ApplicationSettings {
return remoteLookupUrl;
}
public boolean isAcceptExternalAuthentication(){
return acceptExternalAuthentication;
}
public void setAcceptExternalAuthentication(boolean pAcceptExternalAuthentication){
acceptExternalAuthentication = pAcceptExternalAuthentication;
}
}

@ -28,6 +28,7 @@ import se.su.dsv.scipro.admin.pages.settings.AdminFinalSeminarSettingsPage;
import se.su.dsv.scipro.admin.pages.settings.AdminFinalSeminarSettingsPerProjectClassPage;
import se.su.dsv.scipro.admin.pages.settings.AdminGeneralSettingsPage;
import se.su.dsv.scipro.admin.pages.settings.AdminPeerSettingsPage;
import se.su.dsv.scipro.admin.pages.settings.AdminServerEnvironmentSettingsPage;
import se.su.dsv.scipro.basepages.DemoPage;
import se.su.dsv.scipro.basepages.errorpages.AccessDeniedPage;
import se.su.dsv.scipro.basepages.errorpages.NotFoundPage;
@ -104,9 +105,8 @@ public class SciProApplication extends RepositoryApplication implements IThemabl
/**
* Logger instance.
* @TODO Inject
*/
private Logger logger = Logger.getLogger(this.getClass());
private Logger logger = Logger.getLogger(SciProApplication.class);
/**
* Constructor
*/
@ -191,6 +191,7 @@ public class SciProApplication extends RepositoryApplication implements IThemabl
mountBookmarkablePage("admin/files", SysAdminFilePage.class);
mountBookmarkablePage("admin/allfinalseminars", AdminFinalSeminarPage.class);
mountBookmarkablePage("admin/settings", AdminGeneralSettingsPage.class);
mountBookmarkablePage("admin/settings/serverenvironment", AdminServerEnvironmentSettingsPage.class);
mountBookmarkablePage("admin/settings/finalseminargeneralsettings", AdminFinalSeminarSettingsPage.class);
mountBookmarkablePage("admin/settings/finalseminarprojectlevel", AdminFinalSeminarSettingsPerProjectClassPage.class);
mountBookmarkablePage("admin/settings/peer", AdminPeerSettingsPage.class);
@ -310,7 +311,7 @@ public class SciProApplication extends RepositoryApplication implements IThemabl
public WebRequest newWebRequest(final HttpServletRequest request){
final WebRequest webRequest = super.newWebRequest(request);
if(attemptExternalAuthentication(webRequest)){
logger.debug("External authentication used");
logger.debug("External authentication used successfully");
}
return webRequest;
}
@ -331,19 +332,19 @@ public class SciProApplication extends RepositoryApplication implements IThemabl
if(session != null){
if(session.isLoggedIn()){
if(!helper.isRemoteUserValid(session.getUser())){//This check may not be needed and may hinder performance, but better safe than sorry for now.
logger.warn("User is logged in, but conflicting info is supplied via external authentication protocols.");
logger.debug("User is logged in as '"+session.getUser().getEmailAddress()+"', but conflicting info ('"+helper.getExternalAuthRemoteUser()+"') is supplied via external authentication protocols.");
}
}else{
//logger.info("Attempting sign in with external auth data");
if(!helper.signIn(session)){
logger.error("User passes external authentication but cannot be signed in.");
logger.error("User '"+helper.getExternalAuthRemoteUser()+"' passes external authentication but cannot be signed in.");
}else{
logger.debug("Signed in user '"+helper.getExternalAuthRemoteUser()+"' via external authentication");
return true;
}
}
}else{
throw new IllegalStateException("External authentication was attempted, but no session was available.");
throw new IllegalStateException("External authentication was attempted, but no session was available for sign in.");
}
}
return false;

@ -207,7 +207,9 @@ public class SciProSession extends WebSession {
* @return true if the switch was successful, else false.
*/
public boolean switchAuthenticatedUser(final String suUser, final String suRealm){
logger.info("Currently logged in user: '"+user.getEmailAddress()+"' attempting switch to '"+suUser+"'");
if(!isLoggedIn() || user == null)//Terminate early
return false;
logger.info("Currently logged in user: '"+user.getEmailAddress()+"' attempting switch to '"+suUser+"@"+suRealm+"'");
if(suUser != null && roleDao.isSysadmin(user)){
iRoles.clear();
return signInAuthenticatedUser(suUser, suRealm);

@ -10,6 +10,7 @@ import se.su.dsv.scipro.admin.pages.settings.AdminFinalSeminarSettingsPage;
import se.su.dsv.scipro.admin.pages.settings.AdminFinalSeminarSettingsPerProjectClassPage;
import se.su.dsv.scipro.admin.pages.settings.AdminGeneralSettingsPage;
import se.su.dsv.scipro.admin.pages.settings.AdminPeerSettingsPage;
import se.su.dsv.scipro.admin.pages.settings.AdminServerEnvironmentSettingsPage;
import se.su.dsv.scipro.components.AbstractMenuPanel;
import se.su.dsv.scipro.icons.ImageIcon;
import se.su.dsv.scipro.security.auth.Authorization;
@ -29,9 +30,10 @@ public abstract class AbstractAdminSettingsPage extends AbstractAdminPage {
protected List<MenuItem> getItemList() {
final List<MenuItem> items = new ArrayList<MenuItem>();
items.add(new MenuItem("General settings", AdminGeneralSettingsPage.class));
items.add(new MenuItem("Server Environment", AdminServerEnvironmentSettingsPage.class));
items.add(new MenuItem("Final seminar general settings", AdminFinalSeminarSettingsPage.class));
items.add(new MenuItem("Final seminar project level settings", AdminFinalSeminarSettingsPerProjectClassPage.class));
items.add(new MenuItem("Peer settings", AdminPeerSettingsPage.class, ImageIcon.ICON_SETTINGS));
items.add(new MenuItem("Peer settings", AdminPeerSettingsPage.class /*,ImageIcon.ICON_SETTINGS */));
return items;
}

@ -10,7 +10,6 @@ import org.apache.wicket.spring.injection.annot.SpringBean;
import se.su.dsv.scipro.data.dao.interfaces.GeneralSystemSettingsDao;
import se.su.dsv.scipro.data.dataobjects.GeneralSystemSettings;
import se.su.dsv.scipro.data.dataobjects.ProjectPartner;
import se.su.dsv.scipro.project.panels.ProjectPartnerPanel;
import se.su.dsv.scipro.security.auth.Authorization;
import se.su.dsv.scipro.security.auth.roles.Roles;

@ -3,17 +3,29 @@
xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
<body>
<wicket:extend>
<h3 class="section">Final Seminar Settings</h3>
<form wicket:id="maxActiveParticipationForm">
<p><label>Set max active participants on a final seminar:</label> <input wicket:id="maxActiveParticipation"
type="text" /></p>
<p><label>Set days before a final seminar a student can register as an active participant:</label> <input wicket:id="registerAsActive"
type="text" /></p>
<p><label>Set days before a final seminar a student can register as an opponent:</label> <input wicket:id="registerAsOpponent"
type="text" /></p>
<p><label>The file format of theses and opposition-reports must be PDF:</label> <input type="checkbox" wicket:id="finalSeminarThesisMustBeAPDF" /></p>
<div> <input type="submit" value="Save"
name="NoticeSubmit" /></div>
<h5 class="peer-title">Final Seminar Settings</h5>
<form wicket:id="finalSeminarSettingsForm">
<table>
<tr>
<td><label for="1">Max active participants on a final seminar:</label></td>
<td><input name="1" wicket:id="finalSeminarMaxActiveParticipants" type="text" /></td>
</tr>
<tr>
<td><label for="2">Minimum number of days before a final seminar a student can register as an active participant:</label></td>
<td><input name="2" wicket:id="daysBeforeFinalSeminarCanRegisterAsActiveParticipant" type="text" /></td>
</tr>
<tr>
<td><label for="3">Minimum number of days before a final seminar a student can register as an opponent:</label></td>
<td><input name="3" wicket:id="daysBeforeFinalSeminarCanRegisterAsOpponent" type="text" /></td>
</tr>
<tr>
<td><label for="4">File format of uploaded theses and opposition-reports must be PDF:</label></td>
<td><input name="4" type="checkbox" wicket:id="finalSeminarThesisMustBeAPDF" /></td>
</tr>
</table>
<button type="submit" ><img src="css/blueprint/plugins/buttons/icons/tick.png" alt=""/> Save changes</button>
</form>
</wicket:extend>
</body>

@ -1,73 +1,50 @@
package se.su.dsv.scipro.admin.pages.settings;
import org.apache.wicket.PageParameters;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxCheckBox;
import org.apache.wicket.markup.html.form.CheckBox;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.RequiredTextField;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.IModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import se.su.dsv.scipro.admin.models.SettingsModel;
import se.su.dsv.scipro.admin.pages.AbstractAdminSettingsPage;
import se.su.dsv.scipro.data.dao.interfaces.GeneralSystemSettingsDao;
import se.su.dsv.scipro.data.dao.interfaces.ProjectClassDao;
import se.su.dsv.scipro.data.dao.interfaces.ProjectClassSettingsDao;
import se.su.dsv.scipro.data.dataobjects.GeneralSystemSettings;
import se.su.dsv.scipro.data.dataobjects.ProjectClass;
import se.su.dsv.scipro.data.dataobjects.ProjectClassSettings;
public class AdminFinalSeminarSettingsPage extends AbstractAdminSettingsPage {
@SpringBean
private GeneralSystemSettingsDao generalSystemSettingsDao;
private GeneralSystemSettings settings;
public AdminFinalSeminarSettingsPage(final PageParameters pp){
public AdminFinalSeminarSettingsPage(final PageParameters pp) {
super(pp);
add(new MaxActiveParticipationForm("maxActiveParticipationForm"));
add(new FinalSeminarSettingsForm(
"finalSeminarSettingsForm",
new CompoundPropertyModel<GeneralSystemSettings>(generalSystemSettingsDao.getGeneralSystemSettingsInstance())));
}
private class MaxActiveParticipationForm extends Form<SettingsModel> {
private class FinalSeminarSettingsForm extends Form<GeneralSystemSettings> {
private static final long serialVersionUID = 1L;
public MaxActiveParticipationForm(String id) {
super(id, new CompoundPropertyModel<SettingsModel>(
new SettingsModel()));
settings = generalSystemSettingsDao.getGeneralSystemSettingsInstance();
TextField<Integer> activeParticipation = new TextField<Integer>(
"maxActiveParticipation");
TextField<Integer> registerAsActive = new TextField<Integer>(
"registerAsActive");
TextField<Integer> registerAsOpponent = new TextField<Integer>(
"registerAsOpponent");
CheckBox pdfCheckBox = new CheckBox(
"finalSeminarThesisMustBeAPDF");
SettingsModel settingsModel = ((SettingsModel) getDefaultModelObject());
settingsModel.setMaxActiveParticipation(settings.getFinalSeminarMaxActiveParticipants());
settingsModel.setRegisterAsActive(settings.getDaysBeforeFinalSeminarCanRegisterAsActiveParticipant());
settingsModel.setRegisterAsOpponent(settings.getDaysBeforeFinalSeminarCanRegisterAsOpponent());
settingsModel.setFinalSeminarThesisMustBeAPDF(settings.isFinalSeminarThesisMustBeAPDF());
public FinalSeminarSettingsForm(String id, IModel<GeneralSystemSettings> model) {
super(id, model );
TextField<Integer> activeParticipation = new RequiredTextField<Integer>("finalSeminarMaxActiveParticipants");
TextField<Integer> registerAsActive = new RequiredTextField<Integer>("daysBeforeFinalSeminarCanRegisterAsActiveParticipant");
TextField<Integer> registerAsOpponent = new RequiredTextField<Integer>("daysBeforeFinalSeminarCanRegisterAsOpponent");
CheckBox pdfCheckBox = new CheckBox("finalSeminarThesisMustBeAPDF");
add(registerAsActive);
add(registerAsOpponent);
add(activeParticipation);
add(pdfCheckBox);
}
@Override
protected void onSubmit() {
SettingsModel settingsModel = ((SettingsModel) getDefaultModelObject());
settings.setFinalSeminarMaxActiveParticipants(settingsModel.getMaxActiveParticipation());
settings.setDaysBeforeFinalSeminarCanRegisterAsActiveParticipant(settingsModel.getRegisterAsActive());
settings.setDaysBeforeFinalSeminarCanRegisterAsOpponent(settingsModel.getRegisterAsOpponent());
settings.setFinalSeminarThesisMustBeAPDF(settingsModel.isFinalSeminarThesisMustBeAPDF());
generalSystemSettingsDao.save(settings);
setModelObject( generalSystemSettingsDao.save(getModelObject()) );
info("Final seminar settings saved");
}
}

@ -6,7 +6,7 @@
<div class="append-bottom">
<h5 class="peer-title">Settings for levels</h5>
<form wicket:id="peerSettingsForm">
<form wicket:id="settingsForm">
<ul class="no-list-style">
<li wicket:id="projectClassList" class="append-bottom">
<h5 wicket:id="projectClassName" class="peer-box-subtitle"></h5>

@ -23,7 +23,7 @@ public class AdminFinalSeminarSettingsPerProjectClassPage extends AbstractAdminS
public AdminFinalSeminarSettingsPerProjectClassPage(final PageParameters pp){
super(pp);
final Form<Void> peerSettingsForm = new Form<Void>("peerSettingsForm"){
final Form<Void> settingsForm = new Form<Void>("settingsForm"){
private static final long serialVersionUID = 1L;
@Override
@ -32,26 +32,26 @@ public class AdminFinalSeminarSettingsPerProjectClassPage extends AbstractAdminS
}
};
peerSettingsForm.add(new ListView<ProjectClass>("projectClassList", projectClassDao.findAll()){
settingsForm.add(new ListView<ProjectClass>("projectClassList", projectClassDao.findAll()){
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(ListItem<ProjectClass> item) {
item.add(new Label("projectClassName", item.getModelObject().getName()));
item.add(new PeerProjectClassSettingsForm("projectClassSettingsForm", item.getModelObject()));
item.add(new SettingsPerProjectClassForm("projectClassSettingsForm", item.getModelObject()));
add(item);
}
});
peerSettingsForm.add(new Button("submit"));
add(peerSettingsForm);
settingsForm.add(new Button("submit"));
add(settingsForm);
}
private class PeerProjectClassSettingsForm extends Form<ProjectClassSettings> {
private class SettingsPerProjectClassForm extends Form<ProjectClassSettings> {
private static final long serialVersionUID = 1L;
public PeerProjectClassSettingsForm(final String id, final ProjectClass projectClass){
public SettingsPerProjectClassForm(final String id, final ProjectClass projectClass){
super(id, new CompoundPropertyModel<ProjectClassSettings>(projectClass.getProjectClassSettings()));
TextField<Integer> numDaysBetweenPeerReviewsOnSameProject =

@ -0,0 +1,17 @@
<!DOCTYPE html>
<html
xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
<body>
<wicket:extend>
<h3 class="section">Server/Request environment</h3>
<div style="overflow:auto;height:390px;">
<ul>
<li wicket:id="requestAttributes">
<span wicket:id="name">[name]</span>:
<span wicket:id="value">[value]</span>
</li>
</ul>
</div>
</wicket:extend>
</body>
</html>

@ -0,0 +1,49 @@
package se.su.dsv.scipro.admin.pages.settings;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.wicket.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import se.su.dsv.scipro.admin.pages.AbstractAdminSettingsPage;
import se.su.dsv.scipro.util.KeyValuePair;
public class AdminServerEnvironmentSettingsPage extends AbstractAdminSettingsPage {
public AdminServerEnvironmentSettingsPage(final PageParameters pp) {
super(pp);
add(new ListView<KeyValuePair<String>>("requestAttributes",getRequestAttributes()){
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(ListItem<KeyValuePair<String>> item){
KeyValuePair<String> pair = item.getModelObject();
item.add(new Label("name",pair.getKey()));
item.add(new Label("value","'"+pair.getValue()+"'"));
}
});
}
private List<KeyValuePair<String>> getRequestAttributes(){
final HttpServletRequest rawRequest = getWebRequestCycle().getWebRequest().getHttpServletRequest();
List<KeyValuePair<String>> list = new ArrayList<KeyValuePair<String>>();
list.add(new KeyValuePair<String>("[CALL] getRemoteUser",rawRequest.getRemoteUser()));
list.add(new KeyValuePair<String>("[CALL] getAuthType",rawRequest.getAuthType()));
@SuppressWarnings("rawtypes") Enumeration attributes = rawRequest.getAttributeNames();
while(attributes.hasMoreElements()){
final String key = (String)attributes.nextElement();
final String value = rawRequest.getAttribute(key).toString();
list.add(new KeyValuePair<String>("[ATTR] "+key,value));
}
Map<String,String> envs = System.getenv();
for(String key : envs.keySet()){
list.add(new KeyValuePair<String>("[ENV] "+key,envs.get(key)));
}
return list;
}
}

@ -15,6 +15,7 @@ import se.su.dsv.scipro.admin.pages.ProjectManagementPage;
import se.su.dsv.scipro.admin.pages.SystemMaintenancePage;
import se.su.dsv.scipro.admin.pages.settings.AdminGeneralSettingsPage;
import se.su.dsv.scipro.components.AbstractMenuPanel;
import se.su.dsv.scipro.icons.ImageIcon;
import se.su.dsv.scipro.peer.pages.PeerReviewTemplatePage;
public class AdminTabMenuPanel extends AbstractMenuPanel {
@ -35,7 +36,7 @@ public class AdminTabMenuPanel extends AbstractMenuPanel {
items.add(new MenuItem("System maintenance", SystemMaintenancePage.class));
items.add(new MenuItem("All final seminars", AdminFinalSeminarPage.class));
items.add(new MenuItem("Peer review templates", PeerReviewTemplatePage.class));
items.add(new MenuItem("Settings", AdminGeneralSettingsPage.class));
items.add(new MenuItem("Settings", AdminGeneralSettingsPage.class, ImageIcon.ICON_SETTINGS));
items.add(new MenuItem("Role management", AdminRolePage.class));
items.add(new MenuItem("Project partner", AdminProjectPartnerPage.class));
@ -44,7 +45,7 @@ public class AdminTabMenuPanel extends AbstractMenuPanel {
@Override
protected MenuType getMenuType() {
return MenuType.TAB;
return MenuType.TAB_MULTIPLE_ROWS;
}
}

@ -1,6 +1,14 @@
<!DOCTYPE html>
<!--[if lt IE 7]> <html class="ie ie6 lte9 lte8 lte7"> <![endif]-->
<!--[if IE 7]> <html class="ie ie7 lte9 lte8 lte7"> <![endif]-->
<!--[if IE 8]> <html class="ie ie8 lte9 lte8"> <![endif]-->
<!--[if IE 9]> <html class="ie ie9 lte9"> <![endif]-->
<!--[if gt IE 9]> <html> <![endif]-->
<!--[if !IE]><!-->
<html lang="en"
xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
<!--<![endif]-->
<head>
<meta charset="UTF-8" />
<title wicket:id="pageTitle">SciPro DSV</title>
@ -16,18 +24,37 @@
<!-- <link href='http://fonts.googleapis.com/css?family=Vollkorn' rel='stylesheet' type='text/css' />
<link href='http://fonts.googleapis.com/css?family=Ubuntu:regular,bold' rel='stylesheet' type='text/css' /> -->
<!--<link rel="stylesheet" href="css/scipro.css" media="screen,projection" />-->
<!--[if lte IE 9]>
<link rel="stylesheet" href="css/scipro-ie.css" media="screen,projection" />
<![endif]-->
<!-- <link type="text/css" href="css/smoothness/jquery-ui-1.8.10.custom.css" rel="stylesheet" />
<script type="text/javascript" src="js/jquery-1.5.1.min.js"></script>
<script type="text/javascript" src="js/jquery-ui-1.8.10.custom.min.js"></script> -->
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-24546333-1']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
</head>
<body>
<div id="ajax-loader" style="display: none;"><img src="images/ajax-loader.gif" class="ajax-loader-image" alt="" /></div>
<div id="ajax-loader" style="display: none;"><img
src="images/ajax-loader.gif" class="ajax-loader-image" alt="" /></div>
<div wicket:id="systemNotice" id="system-notice"></div>
<div class="container">
<wicket:child />
</div>
<div class="container"><wicket:child /></div>
</body>
</html>
</html>
<!--[if gt IE 9]> </html> <![endif]-->
<!--[if IE 9]> </html> <![endif]-->
<!--[if IE 8]> </html> <![endif]-->
<!--[if IE 7]> </html> <![endif]-->
<!--[if lt IE 7]> </html> <![endif]-->

@ -52,7 +52,9 @@ public abstract class AbstractMainMenuItem extends Panel {
BookmarkablePageLink<Void> result = new BookmarkablePageLink<Void>(id, targetPageClass, pp);
result.setOutputMarkupId(true);
if(targetPageClass == containerPageClass || (targetPageClass.getSuperclass().isAssignableFrom(containerPageClass) && targetPageClass.getSuperclass() != MenuPage.class) ){
result.setMarkupId("current");
//TODO Should prefereably be replaced with the line below because repeating id's aren't valid html. I couldn't get the CSS to work though //mpeters
result.setMarkupId("current");
//result.add(new AttributeAppender("class", new Model<String>("current"), " "));
}
return result;
}

@ -6,14 +6,15 @@ import java.util.List;
import org.apache.wicket.IClusterable;
import org.apache.wicket.Page;
import org.apache.wicket.PageParameters;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.behavior.SimpleAttributeModifier;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.EmptyPanel;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.Model;
import se.su.dsv.scipro.icons.ImageIcon;
@ -26,6 +27,7 @@ public abstract class AbstractMenuPanel extends Panel {
{
put(MenuType.NONE, "abstract-menu");
put(MenuType.TAB, "abstract-menu tab-menu");
put(MenuType.TAB_MULTIPLE_ROWS, "abstract-menu multi-tab-menu");
put(MenuType.HORIZONTAL, "abstract-menu horizontal-menu");
put(MenuType.VERTICAL, "abstract-menu vertical-menu");
}
@ -34,12 +36,13 @@ public abstract class AbstractMenuPanel extends Panel {
public enum MenuType {
NONE,
TAB,
TAB_MULTIPLE_ROWS,
HORIZONTAL,
VERTICAL
}
public AbstractMenuPanel(final String id, final Class<? extends Page> tabCommonSuperClass,final Class<? extends Page> containerClass) {
public AbstractMenuPanel(final String id, final Class<? extends Page> menuContainerCommonSuperClass,final Class<? extends Page> containerClass) {
super(id);
final WebMarkupContainer menuContainer = new WebMarkupContainer("menuContainer");
@ -52,11 +55,28 @@ public abstract class AbstractMenuPanel extends Panel {
@Override
protected void populateItem( ListItem<MenuItem> item ) {
final MenuItem mi = item.getModelObject();
if( (mi.getTargetClass().getSuperclass().isAssignableFrom(containerClass)
&& mi.getTargetClass().getSuperclass() != tabCommonSuperClass)
|| mi.getTargetClass() == containerClass){
item.setMarkupId("current");
item.setOutputMarkupId(true);
boolean highLightAsCurrentByInterface = false;
Class<?> menuItemInterface = mi.getMenuHilightInterface();
if( menuItemInterface != null ){
for( Class<?> actualPageInterface : containerClass.getInterfaces() ){
if( actualPageInterface.equals(menuItemInterface) ){
highLightAsCurrentByInterface = true;
break;
}
}
}
if( highLightAsCurrentByInterface || mi.getTargetClass() == containerClass
||
(
mi.getTargetClass().getSuperclass().isAssignableFrom(containerClass)
&&
mi.getTargetClass().getSuperclass() != menuContainerCommonSuperClass
)
){
//item.setMarkupId("current");
//item.setOutputMarkupId(true);
//Replaced the above because it generates invalid markup if two menus are added to the same page (id no longer unique)
item.add(new AttributeAppender("class", new Model<String>("current"), " "));
}
BookmarkablePageLink<Void> link = new BookmarkablePageLink<Void>("menuItem", mi.getTargetClass(), mi.getPageParameters());
@ -98,22 +118,37 @@ public abstract class AbstractMenuPanel extends Panel {
private Class<? extends Page> targetClass;
private PageParameters pp;
private String iconName;
private Class<? extends MenuHighlight> menuHilightInterface;
public MenuItem(final String name, final Class<? extends Page> targetClass) {
this(name, targetClass, null, null);
this(name, targetClass, null, null, null);
}
public MenuItem(final String name, final Class<? extends Page> targetClass, final Class<? extends MenuHighlight> menuHilightInterface) {
this(name, targetClass, menuHilightInterface, null, null);
}
public MenuItem(final String name, final Class<? extends Page> targetClass, PageParameters pp){
this(name, targetClass, pp, null);
this(name, targetClass, null, pp, null);
}
public MenuItem(final String name, final Class<? extends Page> targetClass, final Class<? extends MenuHighlight> menuHilightInterface, PageParameters pp){
this(name, targetClass, menuHilightInterface, pp, null);
}
public MenuItem(final String name, final Class<? extends Page> targetClass, String iconName) {
this(name, targetClass, null, iconName);
this(name, targetClass, null, null, iconName);
}
public MenuItem(final String name, final Class<? extends Page> targetClass, final Class<? extends MenuHighlight> menuHilightInterface, String iconName) {
this(name, targetClass, menuHilightInterface, null, iconName);
}
public MenuItem(final String name, final Class<? extends Page> targetClass, PageParameters pp, String iconName) {
this(name, targetClass, null, pp, iconName);
}
public MenuItem(final String name, final Class<? extends Page> targetClass, final Class<? extends MenuHighlight> menuHilightInterface, PageParameters pp, String iconName) {
this.name = name;
this.targetClass = targetClass;
this.menuHilightInterface = menuHilightInterface;
this.pp = pp;
this.iconName = iconName == null ? ImageIcon.ICON_EMPTY : iconName;
}
@ -133,6 +168,16 @@ public abstract class AbstractMenuPanel extends Panel {
public String getIconName() {
return iconName;
}
public MenuItem setMenuHilightInterface(Class<? extends MenuHighlight> menuHilightInterface) {
this.menuHilightInterface = menuHilightInterface;
return this;
}
public Class<? extends MenuHighlight> getMenuHilightInterface() {
return menuHilightInterface;
}
}//MenuItem

@ -0,0 +1,12 @@
package se.su.dsv.scipro.components;
/**
* Base interface only signaling intent, that is if a menu item needs to be highlighted.
* Should preferably not be used directly, subclass it instead so intent is clear.
*
* @author Martin Peters - mpeters@dsv.su.se
*
*/
public interface MenuHighlight {
}

@ -65,6 +65,9 @@ public class ImageIcon extends Image {
if(alt != null){
add(new AttributeAppender("alt", true, new Model<String>(alt), " "));
}
else {
add(new AttributeAppender("alt", true, new Model<String>(name), " "));
}
}
public ImageIcon(String id, String name){

@ -0,0 +1,12 @@
package se.su.dsv.scipro.peer.interfaces;
import se.su.dsv.scipro.components.MenuHighlight;
/**
* Used to highlight hierarchy for peer review pages
*
* @author Martin Peters - mpeters@dsv.su.se
*
*/
public interface MenuHighlightReviewPage extends MenuHighlight{
}

@ -4,7 +4,6 @@ import java.util.ArrayList;
import java.util.List;
import org.apache.wicket.PageParameters;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import se.su.dsv.scipro.SciProSession;
import se.su.dsv.scipro.components.AbstractMenuPanel;
@ -13,6 +12,7 @@ import se.su.dsv.scipro.data.dataobjects.User;
import se.su.dsv.scipro.exceptions.AccessDeniedException;
import se.su.dsv.scipro.icons.ImageIcon;
import se.su.dsv.scipro.peer.data.dataobjects.PeerReview;
import se.su.dsv.scipro.peer.interfaces.MenuHighlightReviewPage;
import se.su.dsv.scipro.project.pages.ProjectPage;
import se.su.dsv.scipro.security.auth.Authorization;
import se.su.dsv.scipro.security.auth.roles.Roles;
@ -30,7 +30,7 @@ public abstract class AbstractProjectPeerPage extends ProjectPage {
protected List<MenuItem> getItemList() {
final List<MenuItem> items = new ArrayList<MenuItem>();
items.add(new MenuItem("Peer portal", ProjectPeerPortalPage.class, ImageIcon.ICON_FIND));
items.add(new MenuItem("My requests & reviews", ProjectPeerStatsPage.class, ImageIcon.ICON_STATISTICS));
items.add(new MenuItem("My requests & reviews", ProjectPeerStatsPage.class, MenuHighlightReviewPage.class, ImageIcon.ICON_STATISTICS));
items.add(new MenuItem("Request peer review", PeerRequestSubmissionPage.class, ImageIcon.ICON_ADD));
items.add(new MenuItem("How to write a good review", ProjectPeerReviewGuidePage.class, ImageIcon.ICON_HELP));
return items;

@ -5,6 +5,7 @@ import java.util.List;
import org.apache.wicket.PageParameters;
import se.su.dsv.scipro.components.AbstractMenuPanel;
import se.su.dsv.scipro.icons.ImageIcon;
import se.su.dsv.scipro.peer.interfaces.MenuHighlightReviewPage;
import se.su.dsv.scipro.security.auth.Authorization;
import se.su.dsv.scipro.security.auth.roles.Roles;
import se.su.dsv.scipro.supervisor.pages.AbstractSupervisorPage;
@ -21,7 +22,7 @@ public abstract class AbstractSupervisorPeerPage extends AbstractSupervisorPage
@Override
protected List<MenuItem> getItemList() {
final List<MenuItem> items = new ArrayList<MenuItem>();
items.add(new MenuItem("My projects", SupervisorPeerStatsPage.class, ImageIcon.ICON_STATISTICS));
items.add(new MenuItem("My projects", SupervisorPeerStatsPage.class, MenuHighlightReviewPage.class, ImageIcon.ICON_STATISTICS));
items.add(new MenuItem("Peer portal", SupervisorPeerPortalPage.class, ImageIcon.ICON_FIND));
items.add(new MenuItem("How to write a good review", SupervisorPeerReviewGuidePage.class, ImageIcon.ICON_HELP));
return items;

@ -6,9 +6,10 @@ import org.apache.wicket.spring.injection.annot.SpringBean;
import se.su.dsv.scipro.exceptions.PageNotFoundException;
import se.su.dsv.scipro.peer.data.dao.interfaces.PeerReviewDao;
import se.su.dsv.scipro.peer.data.dataobjects.PeerReview;
import se.su.dsv.scipro.peer.interfaces.MenuHighlightReviewPage;
import se.su.dsv.scipro.peer.panels.PeerReviewPanel;
public class ProjectPeerReviewPage extends AbstractProjectPeerPage {
public class ProjectPeerReviewPage extends AbstractProjectPeerPage implements MenuHighlightReviewPage {
@SpringBean
private PeerReviewDao peerReviewDao;

@ -6,9 +6,10 @@ import org.apache.wicket.spring.injection.annot.SpringBean;
import se.su.dsv.scipro.exceptions.PageNotFoundException;
import se.su.dsv.scipro.peer.data.dao.interfaces.PeerReviewDao;
import se.su.dsv.scipro.peer.data.dataobjects.PeerReview;
import se.su.dsv.scipro.peer.interfaces.MenuHighlightReviewPage;
import se.su.dsv.scipro.peer.panels.PeerReviewPanel;
public class SupervisorPeerReviewPage extends AbstractSupervisorPeerPage {
public class SupervisorPeerReviewPage extends AbstractSupervisorPeerPage implements MenuHighlightReviewPage {
@SpringBean
private PeerReviewDao peerReviewDao;

@ -84,15 +84,14 @@
<div wicket:id="mostFrequentPanel" class="append-bottom"></div>
</div>
</wicket:enclosure>
<wicket:enclosure>
<div class="rounded-box">
<div class="rounded-box" wicket:id="bestRatedContainer">
<span class="box-title">Best rated reviewers</span>
<div wicket:id="bestRatedPanel" class="append-bottom"></div>
</div>
<div>
<i><span class="small right">Last 12 months</span></i>
</div>
</wicket:enclosure>
</div>
</div>
</wicket:panel>

@ -6,12 +6,12 @@ import java.util.List;
import org.apache.wicket.PageParameters;
import org.apache.wicket.datetime.PatternDateConverter;
import org.apache.wicket.datetime.markup.html.basic.DateLabel;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.PageableListView;
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.model.Model;
@ -216,8 +216,9 @@ public class PeerPortalPanel extends Panel {
GeneralSystemSettings gsettings = generalSystemSettingsDao.getGeneralSystemSettingsInstance();
final String mostFrequentPanel = "mostFrequentPanel";
final String bestRatedPanel = "bestRatedPanel";
final String latestReviewPanel ="latestReviewPanel";
final String bestRatedContainer = "bestRatedContainer";
if(gsettings.isPeerDisplayNumberOfReviewsPerformed()){
add(new MostFrequentReviewersPanel(mostFrequentPanel));
@ -225,9 +226,9 @@ public class PeerPortalPanel extends Panel {
add(new InvisiblePanel(mostFrequentPanel));
}
if( gsettings.isPeerRatingsEnabled() ){
add(new BestRatedReviewersPanel(bestRatedPanel));
add(new WebMarkupContainer(bestRatedContainer).add(new BestRatedReviewersPanel("bestRatedPanel") ) );
} else {
add(new InvisiblePanel(bestRatedPanel));
add(new InvisiblePanel(bestRatedContainer));
}
if(gsettings.isPeerDisplayLatestReviews()) {
add(new LatestReviewPanel(latestReviewPanel, new Model<Integer>(gsettings.getNumberOfLatestReviewsDisplayed())));

@ -14,11 +14,9 @@
<li><strong>Accept date: </strong><span wicket:id="acceptDate">2011-03-08 10:58</span></li>
</ul>
<div>
<wicket:enclosure>
<div wicket:id="ratingPanelContainer">
<strong>Review rating:</strong>
<div wicket:id="ratingPanel"></div>
</wicket:enclosure>
</div>
</div>
</wicket:panel>

@ -4,6 +4,7 @@ import java.util.Date;
import org.apache.wicket.datetime.PatternDateConverter;
import org.apache.wicket.datetime.markup.html.basic.DateLabel;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
@ -37,11 +38,11 @@ public class ReviewPageReviewDetailsPanel extends Panel {
add(review.getProject().getHeadSupervisor().getUser().getDisplayComponent("supervisor"));
add(new DateLabel("acceptDate", new Model<Date>(review.getDateCreated()), dpc));
final String ratingPanel = "ratingPanel";
final String ratingPanelContainer = "ratingPanelContainer";
if(generalSystemSettingsDao.getGeneralSystemSettingsInstance().isPeerRatingsEnabled()){
add(new PeerReviewRatingPanel(ratingPanel, reviewModel ));
add(new WebMarkupContainer(ratingPanelContainer).add(new PeerReviewRatingPanel("ratingPanel", reviewModel )));
} else {
add(new InvisiblePanel(ratingPanel));
add(new InvisiblePanel(ratingPanelContainer));
}
}

@ -15,15 +15,12 @@ import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.RadioChoice;
import org.apache.wicket.markup.html.form.SubmitLink;
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.navigation.paging.PagingNavigator;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.data.DataView;
import org.apache.wicket.model.CompoundPropertyModel;
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;

@ -115,8 +115,10 @@ public class FileOpenLink extends ResourceLink<Void> {
in = fileRepository.retrieveFileByIdentifier(fileDesc.getIdentifier());
return in;
}
@Override
public void close() throws IOException {
in.close();
if( in != null )
in.close();
}
@Override
public long length(){

@ -33,7 +33,6 @@ public class RepositoryDownloadPage extends WebPage {
failAndRedirect();
String uuid = pp.getString(PP_KEY);
//System.out.println("Attempting to download:"+uuid);
try{
FileDescription fd = fileRepository.retrieveFileDescriptionByIdentifier(uuid);
IResourceStream stream = fileRepository.getFileStream(fd);

@ -1,6 +1,5 @@
package se.su.dsv.scipro.security.auth;
import java.security.Policy.Parameters;
import java.util.Enumeration;
import java.util.Map;
import java.util.Set;
@ -8,7 +7,10 @@ import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
import org.apache.wicket.injection.web.InjectorHolder;
import org.apache.wicket.spring.injection.annot.SpringBean;
import se.su.dsv.scipro.ApplicationSettings;
import se.su.dsv.scipro.SciProSession;
import se.su.dsv.scipro.data.dataobjects.User;
import se.su.dsv.scipro.data.dataobjects.Username;
@ -30,18 +32,24 @@ public final class ExternalAuthenticationRequestHelper{
//Wrapped request
private final HttpServletRequest req;
//remote user attribute
private String remoteUser;
private String remoteUser=null;
//if remote user is on the username@realm form, this attribute holds the username
private String remoteUserId;
private String remoteUserId=null;
//if remote user is on the username@realm form, this attribute holds the realm
private String remoteUserRealm;
private String remoteUserRealm=null;
//logger instance
private Logger logger = Logger.getLogger(this.getClass());
@SpringBean
private ApplicationSettings appSettings;
/**
* Construct a utility wrapper from a servlet request.
* Throws IllegalStateException if the request is null.
* @param request
*/
public ExternalAuthenticationRequestHelper(final HttpServletRequest request){
public ExternalAuthenticationRequestHelper(final HttpServletRequest request) throws IllegalStateException{
if(request==null)
throw new IllegalStateException("Request is null, this is considered illegal.");
InjectorHolder.getInjector().inject(this);
req = request;
formatUserString();
}
@ -54,7 +62,7 @@ public final class ExternalAuthenticationRequestHelper{
}
/**
* Exposed query method.
* @return If remote user is on the username@realm form, this attribute holds the userid, else getExternalAuthRemoteUser().
* @return If remote user is on the username@realm form, this attribute holds the username, else getExternalAuthRemoteUser().
*/
public String getExternalAuthRemoteUserId(){
return remoteUserId;
@ -70,7 +78,7 @@ public final class ExternalAuthenticationRequestHelper{
* Internal query method
*/
private boolean isExternalAuthInfoOnRequest(){
return (req.getRemoteUser()!=null);
return (remoteUser!=null);
}
/**
* Internal query method
@ -83,12 +91,16 @@ public final class ExternalAuthenticationRequestHelper{
* @return true if the application is configured to accept external authentication and the needed information is available on the request, else false.
*/
public boolean isExternalAuthSupported(){
return (true && isExternalAuthInfoOnRequest());
if(appSettings.isAcceptExternalAuthentication() && !isExternalAuthInfoOnRequest())
logger.warn("External authentication support is ON, but REMOTE_USER is not populated");
if(!appSettings.isAcceptExternalAuthentication() && isExternalAuthInfoOnRequest())
logger.warn("External authentication support is OFF, but REMOTE_USER is populated");
return (appSettings.isAcceptExternalAuthentication() && isExternalAuthInfoOnRequest());
}
/**
* Private utility method for dumping headers.
*/
public void dumpAuthInfo(){
private void dumpAuthInfo(){
logger.debug("---Standard methods---");
logger.debug("Request implementation:" + req.getClass().getName());
logger.debug("getAuthType = '" + getExternalAuthType() +"'");
@ -165,12 +177,12 @@ public final class ExternalAuthenticationRequestHelper{
}
}
/**
* Signs the stored remote user in on the given SciProSession.
* @param session
* Signs the stored remote user in on the supplied SciProSession.
* @param session If null, method fails gracefully by returning false.
* @return true on success, else false.
*/
public boolean signIn(final SciProSession session){
if(session != null){
if(session != null && isExternalAuthSupported()){
//dumpAuthInfo();
return session.signInAuthenticatedUser(getExternalAuthRemoteUserId(), getExternalAuthRemoteUserRealm());
}

@ -0,0 +1,79 @@
package se.su.dsv.scipro.util;
import java.io.Serializable;
/**
* Small utility class for immutable (yes it's immutable and no it's never going to be otherwise) key/value pairs.
* The "value" field is parameterized, but the key is always intended to be a simple String.
* The Serializable properties of this depends on those of the parameterized type.
* Typical usage:
* <code>
* KeyValuePair<SomeType> pair = new KeyValuePair<SomeType>("thisIsAKey",someObject);
* pair.getKey();
* pair.getValue();
* </code>
* @param <V>
*/
public final class KeyValuePair<V> implements Serializable{
private static final long serialVersionUID = 1L;
private final String key;
private final V value;
/**
* Default and only constructor, provide key and value.
* null values are accepted for both key and value, and should be safe to use (yet nonsensical).
* @param key
* @param value
*/
public KeyValuePair(final String key, final V value){
this.key = key;
this.value = value;
}
/**
* Getter for wrapped key String
* @return The key
*/
public String getKey(){
return key;
}
/**
* Getter for wrapped Value
* @return The value
*/
public V getValue(){
return value;
}
/**
* Equals override, behaves in a logical fashion (two objects are equal if both key and value matches).
* Null values are accounted for, ie: two objects with null key+value are considered equal.
*/
@Override
public boolean equals(final Object o){
if(o==this)
return true;
if(!(o instanceof KeyValuePair))
return false;
@SuppressWarnings("unchecked")
final KeyValuePair<V> other = (KeyValuePair<V>)o;
return ((key==null?other.key==null:key.equals(other.key)) &&
(value==null?other.value==null:value.equals(other.value)));
}
/**
* Hash-code override, uses both components in a standard fashion.
*/
@Override
public int hashCode(){
final int w = 31;
int result = 17;//Why hello there Mr Bloch, how are we feeling today ?
result = w * result + (key==null?0:key.hashCode());
result = w * result + (value==null?0:value.hashCode());
return result;
}
/**
* Standard override, return String format not exposed and subject to change.
* Any parsing of this representation is strongly advised against and done at your own risk.
*/
@Override
public String toString(){
return ("{"+key+":"+value+"}");
}
}

@ -83,8 +83,8 @@
<!-- DEVELOPMENT VARIABLE, REMOVE FOR PRODUCTION USE -->
<property name="hibernate.hbm2ddl.auto" value="update" />
<!-- Local mysql production settings database -->
<!-- production settings database -->
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"></property>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost/scipro"></property>
@ -96,7 +96,7 @@
<property name="hibernate.c3p0.timeout" value="1800"></property>
<property name="hibernate.c3p0.acquire_increment" value="2"></property>
<property name="hibernate.c3p0.idle_test_period" value="360"></property>
<!--
<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" />
<property name="hibernate.hbm2ddl.auto" value="update" />
@ -198,16 +198,15 @@
<!-- Local mysql test database -->
<!--
<!--
<property name="hibernate.hbm2ddl.auto" value="create" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"></property>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost/scipro"></property>
<property name="hibernate.connection.username" value="root"></property>
<property name="hibernate.connection.password" value="root"></property>
<property name="hibernate.c3p0.idle_test_period" value="3600"></property>
-->
<property name="hibernate.connection.username" value=""></property>
<property name="hibernate.connection.password" value=""></property>
<property name="hibernate.c3p0.idle_test_period" value="3600"></property>
-->
</properties>
</persistence-unit>

@ -82,7 +82,9 @@
-->
<property name="enableRemoteUserLookup" value="true"></property>
<!-- This property points to the location of the daisy json search -->
<property name="remoteLookupUrl" value="https://thesis.dsv.su.se/projectplan/json" />
<property name="remoteLookupUrl" value="https://thesis.dsv.su.se/match/json" />
<!-- External auth support (via J2EE standard mechanism REMOTE_USER), if true: other authentication mechanics will be bypassed.-->
<property name="acceptExternalAuthentication" value="true"/>
</bean>
<!-- Defines the class used for lookup in username against a remote server NOW AUTOWIRED AND DEPRECATED, NOT MAINTAINED-->

@ -1,9 +0,0 @@
#main-nav .current a,
#main-nav li:hover > a {
behavior: url('border-radius.htc');
}
/* Checked styles for IE(9) */
span.hilight > input[type=radio]:checked + label { background-color: PaleGreen;}
span.hilight > input[type=checkbox]:checked + label { background-color: PaleGreen;}

@ -442,7 +442,10 @@ ul.multiobject-selected-list li {
font-size:93%;
line-height:normal;
}
.tab-menu img {
height: 12px;
vertical-align:middle;
}
.tab-menu ul {
margin:0;
padding: 0px 10px 0;
@ -470,15 +473,64 @@ ul.multiobject-selected-list li {
.tab-menu a:hover {
color:#333;
}
.tab-menu #current {
.tab-menu .current {
background-image:url("../images/tab_left_on.gif");
}
.tab-menu #current a {
.tab-menu .current a {
background-image:url("../images/tab_right_on.gif");
color:#333;
padding-bottom:5px;
}
.multi-tab-menu {
float:left;
width:100%;
/* background: url("../images/tab_bg.gif") repeat-x bottom;*/
font-size:93%;
line-height:normal;
}
.multi-tab-menu img {
height: 12px;
vertical-align:middle;
}
.multi-tab-menu ul {
margin:0;
padding: 0px 10px 0;
list-style:none;
}
.multi-tab-menu li {
float:left;
background:url("../images/tab_left.gif") no-repeat left top;
margin:0 0 3px 0;
padding:0 0 0 9px;
border-bottom: 1px solid #78645A;
}
.multi-tab-menu a {
float:left;
display:block;
background:url("../images/tab_right.gif") no-repeat right top;
padding:5px 15px 4px 6px;
text-decoration:none;
font-weight:bold;
color:#765;
}
/* Commented Backslash Hack
hides rule from IE5-Mac \*/
.multi-tab-menu a {float:none;}
/* End IE5-Mac hack */
.multi-tab-menu a:hover {
color:#333;
}
.multi-tab-menu .current {
background-image:url("../images/tab_left_on.gif");
border-bottom: 1px solid transparent !important;
}
.multi-tab-menu .current a {
background-image:url("../images/tab_right_on.gif");
color:#333;
}
.vertical-menu ul {
list-style: none;
margin: 0px;
@ -502,7 +554,7 @@ ul.multiobject-selected-list li {
background-color: #eeeeee;
}
.vertical-menu #current a {
.vertical-menu .current a {
color: black;
background-color: #DDE7EE;
}
@ -534,7 +586,7 @@ ul.multiobject-selected-list li {
border-bottom-color: black;
}
.horizontal-menu #current a {
.horizontal-menu .current a {
border-bottom-color: #2DB300;
}
@ -789,14 +841,11 @@ span.hilight > input + label:hover, span.hilight > input:focus + label {
color: #2C7AD0;
}
/* Highlight checked form components, IE-specific variant in scipro-ie.css */
span.hilight > input[type=radio]:checked + label {
text-shadow: lime 0px 0px 5px;
}
span.hilight > input[type=checkbox]:checked + label {
text-shadow: lime 0px 0px 5px;
}
/* Highlight checked form components, IE9-specific variant below, older IE's don't work */
span.hilight > input[type=radio]:checked + label { text-shadow: lime 0px 0px 5px; }
span.hilight > input[type=checkbox]:checked + label { text-shadow: lime 0px 0px 5px; }
.ie9 span.hilight > input[type=radio]:checked + label { background-color: PaleGreen; }
.ie9 span.hilight > input[type=checkbox]:checked + label { background-color: PaleGreen; }
.question-feedback {
margin-left: 1.5em;

Binary file not shown.

After

(image error) Size: 180 B

@ -8,6 +8,7 @@ import java.util.TreeSet;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
@ -32,6 +33,7 @@ import se.su.dsv.scipro.data.dataobjects.User;
* @author Johan Aschan - aschan@dsv.su.se
*
*/
@Ignore
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class TestCommentThreadDaoJpa {

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"
default-autowire="byName">
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
<property name="persistenceUnitName" value="testPersistenceUnit" />
</bean>
<!--
enable the configuration of transactional behavior based on
annotations
-->
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<bean id="projectPartnerDao" class="se.su.dsv.scipro.data.dao.jpa.ProjectPartnerDaoJPAImp">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<bean id="projectClassDao" class="se.su.dsv.scipro.data.dao.jpa.ProjectClassDaoJPAImp">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<bean id="userDao" class="se.su.dsv.scipro.data.dao.jpa.UserDaoJPAImp">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
</beans>

@ -0,0 +1,77 @@
package se.su.dsv.scipro.dao.jpa;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;
import se.su.dsv.scipro.data.dao.interfaces.ProjectClassDao;
import se.su.dsv.scipro.data.dao.interfaces.ProjectPartnerDao;
import se.su.dsv.scipro.data.dao.interfaces.UserDao;
import se.su.dsv.scipro.data.dataobjects.ProjectClass;
import se.su.dsv.scipro.data.dataobjects.ProjectPartner;
import se.su.dsv.scipro.data.dataobjects.User;
@Ignore
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class TestProjectPartnerDaoJPA {
private User user;
private ProjectPartner projectPartner;
private ProjectClass projectClass;
@Autowired
private UserDao userDao;
@Autowired
private ProjectClassDao projectClassDao;
@Autowired
private ProjectPartnerDao projectPartnerDao;
@Test
@Transactional
@Rollback
public void testCountProjectPartnerInSpan(){
user = new User();
user = userDao.save(user);
projectPartner = new ProjectPartner(user);
projectPartner.setInfoText("testtext");
projectClass = new ProjectClass("test", "moo", "bleh");
projectClass = projectClassDao.save(projectClass);
projectPartner.setProjectClass(projectClass);
projectPartner = projectPartnerDao.save(projectPartner);
Assert.assertEquals(1, projectPartnerDao.countProjectPartnerInSpan(projectClass, 2));
}
@Test
@Transactional
@Rollback
public void testProjectPartnerInSpan(){
user = new User();
user = userDao.save(user);
projectPartner = new ProjectPartner(user);
projectPartner.setInfoText("testtext");
projectClass = new ProjectClass("test2", "moo2", "bleh2");
projectClass = projectClassDao.save(projectClass);
projectPartner.setProjectClass(projectClass);
projectPartner = projectPartnerDao.save(projectPartner);
int count = projectPartnerDao.countProjectPartnerInSpan(projectClass, 2);
ProjectPartner temp = projectPartnerDao.getProjectPartnerInSpan(projectClass, 5, 0, count).get(0);
Assert.assertEquals("testtext", temp.getInfoText());
}
}

@ -1,27 +1,6 @@
package se.su.dsv.scipro.dao.jpa;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;
import junit.framework.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;
import se.su.dsv.scipro.data.dao.interfaces.EventDao;
import se.su.dsv.scipro.data.dao.interfaces.ProjectDao;
import se.su.dsv.scipro.data.dao.interfaces.ProjectScheduleDao;
import se.su.dsv.scipro.data.dataobjects.Event;
import se.su.dsv.scipro.data.dataobjects.Project;
import se.su.dsv.scipro.data.dataobjects.ProjectSchedule;
import org.junit.Ignore;
/**
* @author Dan Kjellman <dan-kjel@dsv.su.se>
@ -29,6 +8,7 @@ import se.su.dsv.scipro.data.dataobjects.ProjectSchedule;
*/
//@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration
@Ignore
public class TestProjectScheduleDaoJPA {

@ -0,0 +1,192 @@
package se.su.dsv.scipro.security.auth;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import javax.servlet.http.HttpServletRequestWrapper;
import org.apache.wicket.protocol.http.HttpSessionStore;
import org.apache.wicket.session.ISessionStore;
import org.apache.wicket.spring.injection.annot.SpringComponentInjector;
import org.apache.wicket.spring.test.ApplicationContextMock;
import org.apache.wicket.util.tester.WicketTester;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.springframework.orm.jpa.LocalEntityManagerFactoryBean;
import se.su.dsv.scipro.ApplicationSettings;
import se.su.dsv.scipro.SciProApplication;
import se.su.dsv.scipro.SciProSession;
import se.su.dsv.scipro.data.dao.interfaces.ProjectDao;
import se.su.dsv.scipro.data.dao.interfaces.RoleDao;
import se.su.dsv.scipro.data.dao.interfaces.StringResourceDao;
import se.su.dsv.scipro.data.dao.interfaces.UserDao;
import se.su.dsv.scipro.data.dao.interfaces.UserSettingsDao;
import se.su.dsv.scipro.data.dataobjects.Role;
import se.su.dsv.scipro.data.dataobjects.Student;
import se.su.dsv.scipro.data.dataobjects.SysAdmin;
import se.su.dsv.scipro.data.dataobjects.User;
import se.su.dsv.scipro.data.dataobjects.Username;
import se.su.dsv.scipro.json.IUserLookup;
import se.su.dsv.scipro.repository.util.RepositoryManager;
public class TestAuthRoutines {
private SciProSession session;
private WicketTester wt;
private User user;
private Role sysAdm;
private IUserLookup fixedLookup;
private ApplicationSettings appSettings;
@Before
public void init(){
final ApplicationContextMock ac = new ApplicationContextMock();
//Create mock object in need of config
appSettings = new ApplicationSettings();
appSettings.setAcceptExternalAuthentication(true);
//Fake a lookup mechanism
fixedLookup = new IUserLookup(){
@Override
public User lookup(String username) throws Exception{
if(username.equals("kalle-kula"))
return user;
else
return null;
}
};
//Create mock user and associated data
user = new User();
user.setDateCreated(new Date());
user.setEmailAddress("kalle-kula@dsv.su.se");
user.setFirstName("Kalle");
user.setLastName("Kula");
user.setIdentifier(new Long(666));
user.setLastModified(new Date());
Set<Role> roles = new HashSet<Role>();
//Faked student
Role role = new Student();
role.setId(new Long(555));
role.setUser(user);
roles.add(new Student());
user.setRoles(roles);
//Faked sysadm, added later
sysAdm = new SysAdmin();
sysAdm.setId(new Long(444));
Set<Username> usernames = new HashSet<Username>();
Username username = new Username();
username.setUserName("kalle-kula");
username.setRealm("DSV.SU.SE");
usernames.add(username);
user.setUserNames(usernames);
//Put stuff on bean context
ac.putBean("entityManagerFactory",Mockito.mock(LocalEntityManagerFactoryBean.class));
ac.putBean("repositoryManager",Mockito.mock(RepositoryManager.class));
ac.putBean("applicationSettings",appSettings);
ac.putBean("userDao",Mockito.mock(UserDao.class));
ac.putBean("stringResourceDao",Mockito.mock(StringResourceDao.class));
RoleDao mockedRoleDao = Mockito.mock(RoleDao.class);
Mockito.when(mockedRoleDao.isSysadmin(user)).thenAnswer(new Answer<Boolean>() {
@Override
public Boolean answer(InvocationOnMock invocation) throws Throwable {
return user.getRoles().contains(sysAdm);
}
});
ac.putBean("roleDao",mockedRoleDao);
ac.putBean("projectDao",Mockito.mock(ProjectDao.class));
ac.putBean("userSettingsDao",Mockito.mock(UserSettingsDao.class));
ac.putBean("userFullLookup",fixedLookup);
//Create tester
wt = new WicketTester(new SciProApplication(){
@Override
protected ISessionStore newSessionStore(){
return new HttpSessionStore(this);
}
@Override
protected SpringComponentInjector getSpringInjector() {
return new SpringComponentInjector(this, ac, true);
}
});
wt.setupRequestAndResponse();
session = (SciProSession)wt.getWicketSession();
}
@Test
public void testAuthenticationHelper() throws IllegalStateException {
//Try with faulty request
ExternalAuthenticationRequestHelper helper = new ExternalAuthenticationRequestHelper(wt.getServletRequest());
Assert.assertFalse(helper.isExternalAuthSupported());
Assert.assertTrue(helper.getExternalAuthRemoteUser()==null);
Assert.assertTrue(helper.getExternalAuthRemoteUserId()==null);
Assert.assertTrue(helper.getExternalAuthRemoteUserRealm().equals("DSV.SU.SE"));
Assert.assertFalse(helper.isRemoteUserValid(user));
Assert.assertFalse(helper.signIn(null));
//Try with conforming request
helper = new ExternalAuthenticationRequestHelper(new HttpServletRequestWrapper(wt.getServletRequest()){
@Override
public String getRemoteUser(){
return "kalle-kula@dsv.su.se";
}
});
Assert.assertTrue(helper.isExternalAuthSupported());
Assert.assertTrue(helper.getExternalAuthRemoteUser().equals("kalle-kula@dsv.su.se"));
Assert.assertTrue(helper.getExternalAuthRemoteUserId().equals("kalle-kula"));
Assert.assertTrue(helper.getExternalAuthRemoteUserRealm().equals("DSV.SU.SE"));
Assert.assertTrue(helper.isRemoteUserValid(user));
}
@Test
public void testTurnOffViaSettings(){
appSettings.setAcceptExternalAuthentication(false);
ExternalAuthenticationRequestHelper helper = new ExternalAuthenticationRequestHelper(wt.getServletRequest());
Assert.assertFalse(helper.isExternalAuthSupported());
}
@Test(expected=IllegalStateException.class)
public void testNullRequest(){
//At this point, an exception should be thrown
new ExternalAuthenticationRequestHelper(null);
}
@Test(expected=NullPointerException.class)
public void testSessionSignInAndSu(){
ExternalAuthenticationRequestHelper helper = new ExternalAuthenticationRequestHelper(new HttpServletRequestWrapper(wt.getServletRequest()){
@Override
public String getRemoteUser(){
return "kalle-kula@dsv.su.se";
}
});
Assert.assertTrue(helper.isExternalAuthSupported());
Assert.assertTrue(helper.signIn(session));
Assert.assertTrue(helper.isRemoteUserValid(user));
Assert.assertTrue(session.isLoggedIn());
Assert.assertTrue(session.getUser().getIdentifier().equals(user.getIdentifier()));
//User not authorized to switch, this should fail
Assert.assertFalse(session.switchAuthenticatedUser("kalle-kula", "dsv.su.se"));
//Change his roles and try again
Set<Role> roles = user.getRoles();
sysAdm.setUser(user);
roles.add(sysAdm);
user.setRoles(roles);
Assert.assertTrue(session.switchAuthenticatedUser("kalle-kula", "dsv.su.se"));
Assert.assertTrue(session.getUser().getIdentifier().equals(user.getIdentifier()));
//This should fail with an exception, there is no such user
session.switchAuthenticatedUser("somebody","somewhere.se");
}
@Test(expected=NullPointerException.class)
public void testFailedAuthenticatedSignIn(){
ExternalAuthenticationRequestHelper helper = new ExternalAuthenticationRequestHelper(new HttpServletRequestWrapper(wt.getServletRequest()){
@Override
public String getRemoteUser(){
return "some-dude@ki.se";
}
});
//This should throw exceptions, not sure about this interface (throwing exceptions when authentication passes but no user can be located).
helper.signIn(session);
}
@Test
public void testFailedSwitchAuthentitedUser(){
Assert.assertFalse(session.isLoggedIn());
Assert.assertFalse(session.switchAuthenticatedUser("some-dude-who-is-not-real","someplace.se"));
Assert.assertFalse(session.switchAuthenticatedUser("some-dude","someplace.se"));
}
}

@ -0,0 +1,22 @@
package se.su.dsv.scipro.util;
import org.junit.Assert;
import org.junit.Test;
public class TestKeyValuePair {
@Test
public void testEqualsOperations() {
KeyValuePair<String> kvpOne = new KeyValuePair<String>("key","value");
KeyValuePair<String> kvpTwo = new KeyValuePair<String>("key","value");
KeyValuePair<String> kvpThree = new KeyValuePair<String>("key3","value");
KeyValuePair<String> kvpFour = new KeyValuePair<String>(null,null);
KeyValuePair<TestKeyValuePair> kvpFive = new KeyValuePair<TestKeyValuePair>("key",this);
Assert.assertTrue(kvpOne.equals(kvpOne));
Assert.assertTrue(kvpFour.equals(kvpFour));
Assert.assertTrue(kvpOne.equals(kvpTwo) && kvpTwo.equals(kvpOne));
Assert.assertFalse(kvpOne.equals(kvpThree) && kvpThree.equals(kvpOne));
Assert.assertFalse(kvpFour.equals(kvpThree) && kvpThree.equals(kvpFour));
Assert.assertFalse(kvpOne.equals(kvpFive) && kvpFive.equals(kvpOne));
}
}

@ -9,6 +9,7 @@ import org.apache.wicket.spring.injection.annot.SpringComponentInjector;
import org.apache.wicket.spring.test.ApplicationContextMock;
import org.apache.wicket.util.tester.WicketTester;
import org.junit.Before;
import org.junit.Ignore;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
@ -17,6 +18,7 @@ import org.mockito.stubbing.Answer;
import org.springframework.orm.jpa.EntityManagerFactoryInfo;
import org.springframework.orm.jpa.LocalEntityManagerFactoryBean;
import se.su.dsv.scipro.ApplicationSettings;
import se.su.dsv.scipro.SciProApplication;
import se.su.dsv.scipro.data.controllers.FinalSeminarUploadController;
import se.su.dsv.scipro.data.dao.interfaces.BoardMessageDao;
@ -35,6 +37,7 @@ import se.su.dsv.scipro.data.dao.interfaces.ProjectClassDao;
import se.su.dsv.scipro.data.dao.interfaces.ProjectClassSettingsDao;
import se.su.dsv.scipro.data.dao.interfaces.ProjectDao;
import se.su.dsv.scipro.data.dao.interfaces.ProjectEventDao;
import se.su.dsv.scipro.data.dao.interfaces.ProjectPartnerDao;
import se.su.dsv.scipro.data.dao.interfaces.ProjectScheduleDao;
import se.su.dsv.scipro.data.dao.interfaces.RoleDao;
import se.su.dsv.scipro.data.dao.interfaces.ScheduleTemplateDao;
@ -58,6 +61,7 @@ import se.su.dsv.scipro.repository.util.RepositoryManager;
* @author Martin Peters - mpeters@dsv.su.se
*
*/
@Ignore
public class BaseWicketTest {
protected WicketTester tester;
@ -94,8 +98,11 @@ public class BaseWicketTest {
@Mock ProjectClassSettingsDao projectClassSettingsDao;
@Mock GroupEventDao groupEventDao;
@Mock HandInActivityDao handInActivityDao;
@Mock ScheduleTemplateDao scheduleTemplateDao;
@Mock ScheduleTemplateDao scheduleTemplateDao;
@Mock ProjectPartnerDao projectPartnerDao;
@Mock ApplicationSettings applicationSettings;
@Mock RepositoryManager repositoryManager;
@Mock StringResourceDao stringResourceDao;

@ -6,7 +6,9 @@ import org.junit.Test;
import org.mockito.Mockito;
import se.su.dsv.scipro.HomePage;
import se.su.dsv.scipro.admin.pages.AdminProjectPartnerPage;
import se.su.dsv.scipro.admin.pages.SystemMaintenancePage;
import se.su.dsv.scipro.admin.pages.settings.AdminServerEnvironmentSettingsPage;
import se.su.dsv.scipro.data.dataobjects.GeneralSystemSettings;
import se.su.dsv.scipro.data.dataobjects.Project;
import se.su.dsv.scipro.data.dataobjects.ProjectClass;
@ -16,6 +18,7 @@ import se.su.dsv.scipro.loginlogout.pages.LogoutPage;
import se.su.dsv.scipro.project.pages.FinalSeminarProjectListPage;
import se.su.dsv.scipro.project.pages.ProjectFilePage;
import se.su.dsv.scipro.project.pages.ProjectOppositionPage;
import se.su.dsv.scipro.project.pages.ProjectPartnerPage;
import se.su.dsv.scipro.project.pages.ProjectSchedulePlannerPage;
import se.su.dsv.scipro.supervisor.pages.SupervisorFinalSeminarListingPage;
import se.su.dsv.scipro.supervisor.pages.SupervisorProjectDetailsPage;
@ -166,4 +169,25 @@ public class TestWicketPages extends BaseWicketTest {
tester.assertRenderedPage(SystemMaintenancePage.class);
}
@Test
public void testAdminProjectPartnerPage() {
MockSciProSession.currentSession.setLoggedInAsSysAdmin();
tester.startPage(AdminProjectPartnerPage.class);
tester.assertRenderedPage(AdminProjectPartnerPage.class);
}
@Test
public void testProjectPartnerPage() {
tester.startPage(ProjectPartnerPage.class);
tester.assertRenderedPage(ProjectPartnerPage.class);
}
@Test
public void testAdminServerEnvironmentSettingsPage(){
tester.startPage(AdminServerEnvironmentSettingsPage.class);
}
}