/* 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.data;
import java.util.ArrayList;
import java.util.Arrays;
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.IChoiceRenderer;
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.catalog.ResourceInfo;
import org.geoserver.catalog.WorkspaceInfo;
import org.geoserver.security.AccessMode;
import org.geoserver.security.impl.DataAccessRule;
import org.geoserver.web.GeoServerSecuredPage;
import org.geoserver.web.security.RolesFormComponent;
import org.geoserver.web.wicket.ParamResourceModel;
/**
* Abstract page binding a {@link DataAccessRule}
*/
@SuppressWarnings("serial")
public abstract class AbstractDataAccessRulePage extends GeoServerSecuredPage {
List<AccessMode> MODES = Arrays.asList(AccessMode.READ, AccessMode.WRITE);
DropDownChoice workspace;
DropDownChoice layer;
DropDownChoice accessMode;
RolesFormComponent rolesForComponent;
Form form;
public AbstractDataAccessRulePage(DataAccessRule rule) {
setDefaultModel(new CompoundPropertyModel(new DataAccessRule(rule)));
// build the form
form = new Form("ruleForm");
add(form);
form.add(workspace = new DropDownChoice("workspace", getWorkspaceNames()));
workspace.add(new AjaxFormComponentUpdatingBehavior("onchange") {
@Override
protected void onUpdate(AjaxRequestTarget target) {
layer.setChoices(new Model(getLayerNames((String) workspace.getConvertedInput())));
layer.modelChanged();
target.addComponent(layer);
}
});
setOutputMarkupId(true);
form.add(layer = new DropDownChoice("layer", getLayerNames(rule.getWorkspace())));
layer.setOutputMarkupId(true);
form.add(accessMode = new DropDownChoice("accessMode", MODES, new AccessModeRenderer()));
form.add(rolesForComponent = new RolesFormComponent("roles", new RolesModel(rule), form,
true));
// build the submit/cancel
form.add(new BookmarkablePageLink("cancel", DataAccessRulePage.class));
form.add(saveLink());
// add the validators
workspace.setRequired(true);
layer.setRequired(true);
accessMode.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> getWorkspaceNames() {
ArrayList<String> result = new ArrayList<String>();
for (WorkspaceInfo ws : getCatalog().getWorkspaces()) {
result.add(ws.getName());
}
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> getLayerNames(String workspaceName) {
ArrayList<String> result = new ArrayList<String>();
if (!workspaceName.equals("*")) {
for (ResourceInfo r : getCatalog().getResources(ResourceInfo.class)) {
if (r.getStore().getWorkspace().getName().equals(workspaceName))
result.add(r.getName());
}
Collections.sort(result);
}
result.add(0, "*");
return result;
}
/**
* Makes sure we see translated text, by the raw name is used for the model
*/
class AccessModeRenderer implements IChoiceRenderer {
public Object getDisplayValue(Object object) {
return (String) new ParamResourceModel(((AccessMode) object).name(), getPage())
.getObject();
}
public String getIdValue(Object object, int index) {
return ((AccessMode) object).name();
}
}
/**
* Bridge between Set and List
*/
static class RolesModel implements IModel {
DataAccessRule rule;
RolesModel(DataAccessRule 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
}
}
}