/* (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); } } }