org.geoserver.params.extractor.web.ParamsExtractorConfigPage.java Source code

Java tutorial

Introduction

Here is the source code for org.geoserver.params.extractor.web.ParamsExtractorConfigPage.java

Source

/* (c) 2016 Open Source Geospatial Foundation - all rights reserved
 * This code is licensed under the GPL 2.0 license, available at the root
 * application directory.
 */
package org.geoserver.params.extractor.web;

import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.markup.html.form.CheckBox;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.SubmitLink;
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.request.resource.PackageResourceReference;
import org.geoserver.params.extractor.UrlTransform;
import org.geoserver.params.extractor.Utils;
import org.geoserver.web.GeoServerSecuredPage;
import org.geoserver.web.wicket.GeoServerDataProvider;
import org.geoserver.web.wicket.GeoServerTablePanel;
import org.geoserver.web.wicket.ImageAjaxLink;
import org.geoserver.web.wicket.ParamResourceModel;

import java.util.Optional;

public class ParamsExtractorConfigPage extends GeoServerSecuredPage {

    GeoServerTablePanel<RuleModel> rulesPanel;

    public ParamsExtractorConfigPage() {
        setHeaderPanel(headerPanel());
        add(rulesPanel = new GeoServerTablePanel<RuleModel>("rulesPanel", new RulesModel(), true) {

            @Override
            protected Component getComponentForProperty(String id, IModel<RuleModel> itemModel,
                    GeoServerDataProvider.Property<RuleModel> property) {
                if (property == RulesModel.EDIT_BUTTON) {
                    return new EditButtonPanel(id, itemModel.getObject());
                }
                if (property == RulesModel.ACTIVATE_BUTTON) {
                    return new ActivateButtonPanel(id, itemModel.getObject());
                }
                return null;
            }
        });
        rulesPanel.setOutputMarkupId(true);
        RuleTestModel ruleTestModel = new RuleTestModel();
        Form<RuleTestModel> form = new Form<>("form", new CompoundPropertyModel<>(ruleTestModel));
        add(form);
        TextArea<String> input = new TextArea<>("input", new PropertyModel<>(ruleTestModel, "input"));
        form.add(input);
        input.setDefaultModelObject(
                "/geoserver/tiger/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&CQL_FILTER=CFCC%3D%27H11%27");
        TextArea<String> output = new TextArea<>("output", new PropertyModel<>(ruleTestModel, "output"));
        output.setEnabled(false);
        form.add(output);
        form.add(new SubmitLink("test") {
            @Override
            public void onSubmit() {
                if (rulesPanel.getSelection().isEmpty()) {
                    output.setModelObject("NO RULES SELECTED !");
                    return;
                }
                String outputText;
                try {
                    RuleTestModel ruleTestModel = (RuleTestModel) getForm().getModelObject();
                    String[] urlParts = ruleTestModel.getInput().split("\\?");
                    String requestUri = urlParts[0];
                    Optional<String> queryRequest = urlParts.length > 1 ? Optional.ofNullable(urlParts[1])
                            : Optional.empty();
                    UrlTransform urlTransform = new UrlTransform(requestUri, Utils.parseParameters(queryRequest));
                    rulesPanel.getSelection().stream().filter(rule -> !rule.isEchoOnly()).map(RuleModel::toRule)
                            .forEach(rule -> rule.apply(urlTransform));
                    if (urlTransform.haveChanged()) {
                        outputText = urlTransform.toString();
                    } else {
                        outputText = "NO RULES APPLIED !";
                    }
                } catch (Exception exception) {
                    outputText = "Exception: " + exception.getMessage();
                }
                output.setModelObject(outputText);
            }
        });
    }

    private Component headerPanel() {
        Fragment header = new Fragment(HEADER_PANEL, "header", this);
        header.add(new AjaxLink<Object>("addNew") {
            @Override
            public void onClick(AjaxRequestTarget target) {
                setResponsePage(new ParamsExtractorRulePage(Optional.empty()));
            }
        });
        header.add(new AjaxLink<Object>("removeSelected") {
            @Override
            public void onClick(AjaxRequestTarget target) {
                RulesModel.delete(rulesPanel.getSelection().stream().map(RuleModel::getId).toArray(String[]::new));
                target.add(rulesPanel);
            }
        });
        return header;
    }

    private class EditButtonPanel extends Panel {

        public EditButtonPanel(String id, final RuleModel ruleModel) {
            super(id);
            this.setOutputMarkupId(true);
            ImageAjaxLink<Object> editLink = new ImageAjaxLink<Object>("edit",
                    new PackageResourceReference(getClass(), "img/edit.png")) {
                @Override
                protected void onClick(AjaxRequestTarget target) {
                    setResponsePage(new ParamsExtractorRulePage(Optional.of(ruleModel)));
                }
            };
            editLink.getImage().add(new AttributeModifier("alt",
                    new ParamResourceModel("ParamsExtractorConfigPage.edit", editLink)));
            editLink.setOutputMarkupId(true);
            add(editLink);
        }
    }

    private class ActivateButtonPanel extends Panel {

        public ActivateButtonPanel(String id, final RuleModel ruleModel) {
            super(id);
            this.setOutputMarkupId(true);
            CheckBox activateButton = new CheckBox("activated", new PropertyModel<>(ruleModel, "activated")) {

                @Override
                public void onSelectionChanged() {
                    super.onSelectionChanged();
                    RulesModel.saveOrUpdate(ruleModel);
                }

                @Override
                protected boolean wantOnSelectionChangedNotifications() {
                    return true;
                }
            };
            add(activateButton);
        }
    }
}