/* Copyright (c) 2001 - 2007 TOPP - www.openplans.org. All rights reserved.
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.web.security.user;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
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.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.geoserver.web.CatalogIconFactory;
import org.geoserver.web.GeoServerSecuredPage;
import org.geoserver.web.security.SelectionUserRemovalLink;
import org.geoserver.web.wicket.GeoServerDialog;
import org.geoserver.web.wicket.GeoServerTablePanel;
import org.geoserver.web.wicket.Icon;
import org.geoserver.web.wicket.SimpleAjaxLink;
import org.geoserver.web.wicket.GeoServerDataProvider.Property;
/**
* A page listing users, allowing for removal, addition and linking to an edit page
*/
@SuppressWarnings("serial")
public class UserPage extends GeoServerSecuredPage {
private GeoServerTablePanel<User> users;
GeoServerDialog dialog;
private SelectionUserRemovalLink removal;
public UserPage() {
UserListProvider provider = new UserListProvider();
add(users = new GeoServerTablePanel<User>("table", provider, true) {
@SuppressWarnings("rawtypes")
@Override
protected Component getComponentForProperty(String id, IModel itemModel,
Property<User> property) {
if (property == UserListProvider.USERNAME) {
return editUserLink(id, itemModel, property);
} else if (property == UserListProvider.ROLES) {
return new Label(id, property.getModel(itemModel));
} else if (property == UserListProvider.ADMIN) {
User user = (User) itemModel.getObject();
Boolean isAdmin = (Boolean) property.getPropertyValue(user);
if (Boolean.TRUE.equals(isAdmin)) {
return new Icon(id, CatalogIconFactory.ENABLED_ICON);
} else {
return new Label(id, "");
}
}
throw new RuntimeException("Uknown property " + property);
}
@Override
protected void onSelectionUpdate(AjaxRequestTarget target) {
removal.setEnabled(users.getSelection().size() > 0);
target.addComponent(removal);
}
});
users.setOutputMarkupId(true);
add(dialog = new GeoServerDialog("dialog"));
setHeaderPanel(headerPanel());
}
protected Component headerPanel() {
Fragment header = new Fragment(HEADER_PANEL, "header", this);
// the add button
header.add(new BookmarkablePageLink("addNew", NewUserPage.class));
// the removal button
header.add(removal = new SelectionUserRemovalLink("removeSelected", users, dialog));
removal.setOutputMarkupId(true);
removal.setEnabled(false);
return header;
}
AjaxLink addUserLink() {
return new AjaxLink("addUser", new Model()) {
@Override
public void onClick(AjaxRequestTarget target) {
setResponsePage(new NewUserPage());
}
};
}
Component editUserLink(String id, IModel itemModel, Property<User> property) {
return new SimpleAjaxLink(id, itemModel, property.getModel(itemModel)) {
@Override
protected void onClick(AjaxRequestTarget target) {
setResponsePage(new EditUserPage((UserDetails) getDefaultModelObject()));
}
};
}
}