/* (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.role; 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.GeoServerRoleService; import org.geoserver.security.impl.GeoServerRole; 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 roles, allowing for removal, addition and linking to an edit page */ @SuppressWarnings("serial") public class RolePanel extends Panel { protected GeoServerTablePanel<GeoServerRole> roles; protected GeoServerDialog dialog; protected SelectionRoleRemovalLink removal; protected Link<?> add; protected String roleServiceName; public RolePanel(String id, String serviceName) { super(id); this.roleServiceName=serviceName; RoleListProvider provider = new RoleListProvider(this.roleServiceName); add(roles = new GeoServerTablePanel<GeoServerRole>("table", provider, true) { @Override protected Component getComponentForProperty(String id, IModel<GeoServerRole> itemModel, Property<GeoServerRole> property) { if (property == RoleListProvider.ROLENAME) { return editRoleLink(id, itemModel, property); } else if (RoleListProvider.ParentPropertyName.equals(property.getName())) { return editParentRoleLink(id, itemModel, property); } else if (property == RoleListProvider.HASROLEPARAMS) { 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(roles.getSelection().size() > 0); target.add(removal); } }); roles.setItemReuseStrategy(new DefaultItemReuseStrategy()); roles.setOutputMarkupId(true); add(dialog = new GeoServerDialog("dialog")); headerComponents(); } public RolePanel setHeaderVisible(boolean visible) { get("header").setVisible(visible); return this; } public RolePanel setPagersVisible(boolean top, boolean bottom) { roles.getTopPager().setVisible(top); roles.getBottomPager().setVisible(bottom); return this; } protected void headerComponents() { boolean canCreateStore=getService().canCreateStore(); 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())); } // the add button h.add(add = new Link("addNew") { @Override public void onClick() { setResponsePage(new NewRolePage(roleServiceName).setReturnPage(getPage())); } }); add.setVisible(canCreateStore); // the removal button h.add(removal = new SelectionRoleRemovalLink(roleServiceName,"removeSelected", roles, dialog)); removal.setOutputMarkupId(true); removal.setEnabled(false); removal.setVisible(canCreateStore); } protected GeoServerRoleService getService() { try { return GeoServerApplication.get().getSecurityManager(). loadRoleService(roleServiceName); } catch (IOException e) { throw new RuntimeException(e); } } // AjaxLink addRoleLink() { // return new AjaxLink("addRole", new Model()) { // // @Override // public void onClick(AjaxRequestTarget target) { // setResponsePage(new NewRolePage()); // } // // }; // } @SuppressWarnings("unchecked") Component editRoleLink(String id, IModel itemModel, Property<GeoServerRole> property) { return new SimpleAjaxLink(id, itemModel, property.getModel(itemModel)) { @Override protected void onClick(AjaxRequestTarget target) { setResponsePage(new EditRolePage(roleServiceName, (GeoServerRole) getDefaultModelObject()).setReturnPage(getPage())); } }; } @SuppressWarnings("unchecked") Component editParentRoleLink(String id, IModel itemModel, Property<GeoServerRole> property) { return new SimpleAjaxLink(id, itemModel, property.getModel(itemModel)) { @Override protected void onClick(AjaxRequestTarget target) { GeoServerRole role = (GeoServerRole) getDefaultModelObject(); GeoServerRole parentRole; try { parentRole = GeoServerApplication.get().getSecurityManager() .loadRoleService(roleServiceName).getParentRole(role); } catch (IOException e) { throw new RuntimeException(e); } setResponsePage(new EditRolePage(roleServiceName, parentRole).setReturnPage(getPage())); } }; } @Override protected void onBeforeRender() { roles.clearSelection(); removal.setEnabled(false); super.onBeforeRender(); } }