/* 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.service; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.SubmitLink; import org.apache.wicket.markup.html.link.BookmarkablePageLink; import org.apache.wicket.model.CompoundPropertyModel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.geoserver.platform.GeoServerExtensions; import org.geoserver.platform.Service; import org.geoserver.security.impl.DataAccessRule; import org.geoserver.security.impl.ServiceAccessRule; import org.geoserver.web.GeoServerSecuredPage; import org.geoserver.web.security.RolesFormComponent; /** * Abstract page binding a {@link DataAccessRule} */ @SuppressWarnings("serial") public abstract class AbstractServiceAccessRulePage extends GeoServerSecuredPage { DropDownChoice service; DropDownChoice method; RolesFormComponent rolesForComponent; Form form; public AbstractServiceAccessRulePage(ServiceAccessRule rule) { setDefaultModel(new CompoundPropertyModel(new ServiceAccessRule(rule))); // build the form form = new Form("ruleForm"); add(form); form.add(service = new DropDownChoice("service", getServiceNames())); service.add(new AjaxFormComponentUpdatingBehavior("onchange") { @Override protected void onUpdate(AjaxRequestTarget target) { method.setChoices(new Model(getMethod((String) service.getConvertedInput()))); method.modelChanged(); target.addComponent(method); } }); setOutputMarkupId(true); form.add(method = new DropDownChoice("method", getMethod(rule.getService()))); method.setOutputMarkupId(true); form.add(rolesForComponent = new RolesFormComponent("roles", new RolesModel(rule), form, true)); // build the submit/cancel form.add(new BookmarkablePageLink("cancel", ServiceAccessRulePage.class)); form.add(saveLink()); // add the validators service.setRequired(true); method.setRequired(true); } SubmitLink saveLink() { return new SubmitLink("save") { @Override public void onSubmit() { onFormSubmit(); } }; } /** * Implements the actual save action */ protected abstract void onFormSubmit(); /** * Returns a sorted list of workspace names */ ArrayList<String> getServiceNames() { ArrayList<String> result = new ArrayList<String>(); for (Service ows : GeoServerExtensions.extensions(Service.class)) { if (!result.contains(ows.getId())) result.add(ows.getId()); } Collections.sort(result); result.add(0, "*"); return result; } /** * Returns a sorted list of layer names in the specified workspace (or * if the workspace is *) */ ArrayList<String> getMethod(String service) { ArrayList<String> result = new ArrayList<String>(); boolean flag = true; for (Service ows : GeoServerExtensions.extensions(Service.class)) { if (service.equals(ows.getId()) && !result.contains(ows.getOperations()) && flag) { flag = false; result.addAll(ows.getOperations()); } } Collections.sort(result); result.add(0, "*"); return result; } /** * Bridge between Set and List */ static class RolesModel implements IModel { ServiceAccessRule rule; RolesModel(ServiceAccessRule rule) { this.rule = rule; } public Object getObject() { return new ArrayList<String>(rule.getRoles()); } public void setObject(Object object) { rule.getRoles().clear(); rule.getRoles().addAll((List<String>) object); } public void detach() { // nothing to do } } }