Package org.geoserver.web.security.data

Source Code of org.geoserver.web.security.data.AbstractDataAccessRulePage

/* 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.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) {
        setModel(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

        }

    }

}
TOP

Related Classes of org.geoserver.web.security.data.AbstractDataAccessRulePage

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.
ga('create', 'UA-20639858-1', 'auto'); ga('send', 'pageview');