/* (c) 2014 - 2016 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.security.web.group;
import java.io.IOException;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.repeater.DefaultItemReuseStrategy;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.StringResourceModel;
import org.geoserver.security.GeoServerUserGroupService;
import org.geoserver.security.impl.GeoServerUserGroup;
import org.geoserver.security.web.user.UserPanel;
import org.geoserver.web.CatalogIconFactory;
import org.geoserver.web.GeoServerApplication;
import org.geoserver.web.wicket.GeoServerDataProvider.Property;
import org.geoserver.web.wicket.GeoServerDialog;
import org.geoserver.web.wicket.GeoServerTablePanel;
import org.geoserver.web.wicket.Icon;
import org.geoserver.web.wicket.SimpleAjaxLink;
/**
* A page listing users, allowing for removal, addition and linking to an edit page
*/
@SuppressWarnings("serial")
public class GroupPanel extends Panel {
protected GeoServerTablePanel<GeoServerUserGroup> groups;
protected GeoServerDialog dialog;
protected SelectionGroupRemovalLink removal, removalWithRoles;
protected Link<?> add;
protected String serviceName;
protected GeoServerUserGroupService getService() {
try {
return GeoServerApplication.get().getSecurityManager().
loadUserGroupService(serviceName);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public GroupPanel(String id, String serviceName) {
super(id);
this.serviceName=serviceName;
GroupListProvider provider = new GroupListProvider(serviceName);
add(groups = new GeoServerTablePanel<GeoServerUserGroup>("table", provider, true) {
@Override
protected Component getComponentForProperty(String id, IModel<GeoServerUserGroup> itemModel,
Property<GeoServerUserGroup> property) {
if (property == GroupListProvider.GROUPNAME) {
return editGroupLink(id, itemModel, property);
} else if (property == GroupListProvider.ENABLED) {
if((Boolean) property.getModel(itemModel).getObject())
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(groups.getSelection().size() > 0);
target.add(removal);
removalWithRoles.setEnabled(groups.getSelection().size() > 0);
target.add(removalWithRoles);
}
});
groups.setItemReuseStrategy(new DefaultItemReuseStrategy());
groups.setOutputMarkupId(true);
add(dialog = new GeoServerDialog("dialog"));
headerComponents();
}
public GroupPanel setHeaderVisible(boolean visible) {
get("header").setVisible(visible);
return this;
}
public GroupPanel setPagersVisible(boolean top, boolean bottom) {
groups.getTopPager().setVisible(top);
groups.getBottomPager().setVisible(bottom);
return this;
}
protected void headerComponents() {
boolean canCreateStore=getService().canCreateStore();
// the add button
WebMarkupContainer h = new WebMarkupContainer("header");
add(h);
if (!canCreateStore) {
h.add(new Label("message", new StringResourceModel("noCreateStore", this, null))
.add(new AttributeAppender("class", new Model("info-link"), " ")));
}
else {
h.add(new Label("message", new Model()));
}
h.add(add = new Link("addNew") {
@Override
public void onClick() {
setResponsePage(new NewGroupPage(serviceName).setReturnPage(getPage()));
}
});
add.setVisible(canCreateStore);
// the removal button
h.add(removal = new SelectionGroupRemovalLink(serviceName,"removeSelected", groups, dialog,false));
removal.setOutputMarkupId(true);
removal.setEnabled(false);
removal.setVisibilityAllowed(canCreateStore);
// the removal button
h.add(removalWithRoles = new SelectionGroupRemovalLink(serviceName,"removeSelectedWithRoles", groups, dialog,true));
removalWithRoles.setOutputMarkupId(true);
removalWithRoles.setEnabled(false);
removalWithRoles.setVisibilityAllowed(canCreateStore&&
GeoServerApplication.get().getSecurityManager().getActiveRoleService().canCreateStore());
//enable header only for full admin
h.setEnabled(getService().getSecurityManager().checkAuthenticationForAdminRole());
}
Component editGroupLink(String id, IModel itemModel, Property<GeoServerUserGroup> property) {
return new SimpleAjaxLink(id, itemModel, property.getModel(itemModel)) {
@Override
protected void onClick(AjaxRequestTarget target) {
setResponsePage(new EditGroupPage(serviceName,(GeoServerUserGroup) getDefaultModelObject())
.setReturnPage(getPage()));
}
};
}
protected void onBeforeRender() {
groups.clearSelection();
removal.setEnabled(false);
removalWithRoles.setEnabled(false);
super.onBeforeRender();
}
}