/* (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.web.data.layer; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.geoserver.web.wicket.GeoServerDataProvider; import org.geotools.jdbc.VirtualTable; import org.geotools.util.logging.Logging; public class SQLViewParamProvider extends GeoServerDataProvider<Parameter> { /** serialVersionUID */ private static final long serialVersionUID = 4823593149295419810L; private static final String DEFAULT_REGEXP = "^[\\w\\d\\s]+$"; static final Logger LOGGER = Logging.getLogger(SQLViewParamProvider.class); List<Parameter> parameters = new ArrayList<Parameter>(); static final Property<Parameter> NAME = new BeanProperty<Parameter>("name", "name"); static final Property<Parameter> DEFAULT_VALUE = new BeanProperty<Parameter>("defaultValue", "defaultValue"); static final Property<Parameter> REGEXP = new BeanProperty<Parameter>("regexp", "regexp"); public SQLViewParamProvider() { setEditable(true); } @Override protected List<Parameter> getItems() { return parameters; } @Override protected List<org.geoserver.web.wicket.GeoServerDataProvider.Property<Parameter>> getProperties() { return Arrays.asList(NAME, DEFAULT_VALUE, REGEXP); } public void init(VirtualTable vt) { parameters.clear(); for (String name : vt.getParameterNames()) { parameters.add(new Parameter(vt.getParameter(name))); } } /** * Adds the parameters found in the sql definition * * @param sql */ public void refreshFromSql(String sql) { Pattern p = Pattern.compile("%[\\w\\d\\s]+%"); Matcher matcher = p.matcher(sql); Set<String> paramNames = new HashSet<String>(); while (matcher.find()) { paramNames.add(matcher.group().replace('%', ' ').trim()); } // remove the old ones parameters.clear(); // add the new ones for (String name : paramNames) { parameters.add(new Parameter(name, null, DEFAULT_REGEXP)); } } public void updateVirtualTable(VirtualTable vt) { for (String name : vt.getParameterNames()) { vt.removeParameter(name); } for (Parameter param : parameters) { vt.addParameter(param.toVirtualTableParameter()); } } public void addParameter() { parameters.add(new Parameter(null, null, DEFAULT_REGEXP)); } public void removeAll(List<Parameter> params) { parameters.removeAll(params); } }