/* (c) 2014 - 2016 Open Source Geospatial Foundation - all rights reserved * (c) 2001 - 2013 OpenPlans * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.wps.web; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.logging.Level; import org.apache.wicket.Component; import org.apache.wicket.extensions.ajax.markup.html.autocomplete.AutoCompleteBehavior; import org.apache.wicket.extensions.ajax.markup.html.autocomplete.AutoCompleteSettings; import org.apache.wicket.extensions.ajax.markup.html.autocomplete.IAutoCompleteRenderer; import org.apache.wicket.markup.html.basic.Label; 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.link.Link; import org.apache.wicket.markup.html.panel.Fragment; import org.apache.wicket.model.AbstractReadOnlyModel; import org.apache.wicket.model.IModel; import org.geoserver.security.GeoServerRoleService; import org.geoserver.security.impl.GeoServerRole; import org.geoserver.security.web.AbstractSecurityPage; import org.geoserver.web.wicket.GeoServerDataProvider.Property; import org.geoserver.web.wicket.GeoServerTablePanel; import org.geoserver.web.wicket.ParamResourceModel; import org.geoserver.wps.ProcessGroupInfo; import org.geoserver.wps.ProcessInfo; import org.geoserver.wps.process.GeoServerProcessors; import org.geoserver.wps.web.FilteredProcessesProvider.FilteredProcess; import org.geotools.process.ProcessFactory; import org.opengis.feature.type.Name; /** * A page listing all WPS process for specific group, * allowing enable/disable single process and add/remove roles to grant access to it * This page is opened and return to WPS security group management page. * * @see WPSAccessRulePage */ public class ProcessSelectionPage extends AbstractSecurityPage { private String title; private GeoServerTablePanel<FilteredProcess> processSelector; private ProcessGroupInfo pfi; private List<String> availableRoles = new ArrayList<String>(); public ProcessSelectionPage(final WPSAccessRulePage wpsAccessRulePage, final ProcessGroupInfo pfi) { this.pfi = pfi; // prepare the process factory title Class<? extends ProcessFactory> factoryClass = pfi.getFactoryClass(); ProcessFactory pf = GeoServerProcessors.getProcessFactory(factoryClass, false); if(pf == null) { throw new IllegalArgumentException("Failed to locate the process factory " + factoryClass); } this.title = pf.getTitle().toString(getLocale()); Form form = new Form("form"); add(form); GeoServerRoleService roleService = getSecurityManager().getActiveRoleService(); try { for(GeoServerRole r : roleService.getRoles()){ availableRoles.add(r.getAuthority()); } } catch (IOException e1) { LOGGER.log(Level.FINER, e1.getMessage(), e1); } final FilteredProcessesProvider provider = new FilteredProcessesProvider(pfi, getLocale()); final AutoCompleteSettings settings = new AutoCompleteSettings(); settings.setShowCompleteListOnFocusGain(false); settings.setShowListOnEmptyInput(true); settings.setShowListOnFocusGain(true); settings.setMaxHeightInPx(100); processSelector = new GeoServerTablePanel<FilteredProcess>("selectionTable", provider) { @Override protected Component getComponentForProperty(String id, final IModel<FilteredProcess> itemModel, Property<FilteredProcess> property) { if(property.getName().equals("enabled")) { Fragment fragment = new Fragment(id, "enabledFragment", ProcessSelectionPage.this); CheckBox enabled = new CheckBox("enabled", (IModel<Boolean>) property.getModel(itemModel)); enabled.setOutputMarkupId(true); fragment.add(enabled); return fragment; }else if(property.getName().equals("title")) { return new Label(id, property.getModel(itemModel)); } else if(property.getName().equals("description")) { return new Label(id, property.getModel(itemModel)); } else if(property.getName().equals("roles")) { Fragment fragment = new Fragment(id, "rolesFragment", ProcessSelectionPage.this); TextArea<?> roles = new TextArea("roles", property.getModel(itemModel)) { public <C extends Object> org.apache.wicket.util.convert.IConverter<C> getConverter(java.lang.Class<C> type) { return new RolesConverter(availableRoles); }; }; StringBuilder selectedRoles = new StringBuilder (); IAutoCompleteRenderer<String> roleRenderer = new RolesRenderer(selectedRoles); AutoCompleteBehavior<String> b = new RolesAutoCompleteBehavior(roleRenderer,settings,selectedRoles,availableRoles); roles.setOutputMarkupId(true); roles.add(b); fragment.add(roles); return fragment; } else if (property.getName().equals("validated")) { final IModel<Boolean> hasValidatorsModel = (IModel<Boolean>) property.getModel(itemModel); IModel<String> availableModel = new AbstractReadOnlyModel<String>() { @Override public String getObject() { Boolean value = hasValidatorsModel.getObject(); if (Boolean.TRUE.equals(value)) { return "*"; } else { return ""; } } }; return new Label(id, availableModel); } else if (property.getName().equals("edit")) { Fragment fragment = new Fragment(id, "linkFragment", ProcessSelectionPage.this); // we use a submit link to avoid losing the other edits in the form Link link = new Link("link") { @Override public void onClick() { FilteredProcess fp = (FilteredProcess) itemModel.getObject(); setResponsePage(new ProcessLimitsPage(ProcessSelectionPage.this, fp)); } }; fragment.add(link); return fragment; } return null; } }; processSelector.setFilterable(false); processSelector.setPageable(false); processSelector.setOutputMarkupId( true ); form.add(processSelector); SubmitLink apply = new SubmitLink("apply") { @Override public void onSubmit() { // super.onSubmit(); pfi.getFilteredProcesses().clear(); for (FilteredProcess process : provider.getItems()){ if ((process.getRoles() != null && !process.getRoles().isEmpty()) || !process.getEnabled() || (process.getValidators() != null && !process.getValidators().isEmpty())) { ProcessInfo pai = process.toProcessInfo(); pfi.getFilteredProcesses().add(pai); } } setResponsePage(wpsAccessRulePage); } }; form.add(apply); Link cancel = new Link("cancel") { @Override public void onClick() { setResponsePage(wpsAccessRulePage); } }; form.add(cancel); } protected Collection<? extends Name> getFilteredProcesses() { ProcessFactory pf = GeoServerProcessors.getProcessFactory(pfi.getFactoryClass(), false); List<Name> disabled = new ArrayList<Name>(pf.getNames()); for(FilteredProcess fp : processSelector.getSelection()) { disabled.remove(fp.getName()); } return disabled; } @Override protected String getDescription() { return new ParamResourceModel("description", this, title).getString(); } }