/* 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.wms.web; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Locale; import java.util.regex.Pattern; import org.apache.wicket.markup.html.form.CheckBox; 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.TextArea; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.model.IModel; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.model.StringResourceModel; import org.apache.wicket.util.convert.IConverter; import org.apache.wicket.validation.IValidatable; import org.apache.wicket.validation.validator.AbstractValidator; import org.apache.wicket.validation.validator.NumberValidator; import org.geoserver.web.services.BaseServiceAdminPage; import org.geoserver.web.util.MapModel; import org.geoserver.web.wicket.LiveCollectionModel; import org.geoserver.wms.WMS; import org.geoserver.wms.WMSInfo; import org.geoserver.wms.WMSInfo.WMSInterpolation; import org.geoserver.wms.WatermarkInfo.Position; import org.geotools.referencing.CRS; /** * Edits the WMS service details */ @SuppressWarnings("serial") public class WMSAdminPage extends BaseServiceAdminPage<WMSInfo> { static final List<String> SVG_RENDERERS = Arrays.asList(new String[] {WMS.SVG_BATIK, WMS.SVG_SIMPLE}); protected Class<WMSInfo> getServiceClass() { return WMSInfo.class; } protected void build(IModel info, Form form) { // limited srs list TextArea srsList = new TextArea("srs", LiveCollectionModel.list(new PropertyModel(info, "sRS"))) { @Override public IConverter getConverter(Class type) { return new SRSListConverter(); } }; srsList.add(new SRSListValidator()); srsList.setType(List.class); form.add(srsList); // general form.add(new DropDownChoice("interpolation", Arrays.asList(WMSInfo.WMSInterpolation.values()), new InterpolationRenderer())); // resource limits TextField maxMemory = new TextField("maxRequestMemory"); maxMemory.add(NumberValidator.minimum(0.0)); form.add(maxMemory); TextField maxTime = new TextField("maxRenderingTime"); maxTime.add(NumberValidator.minimum(0.0)); form.add(maxTime); TextField maxErrors = new TextField("maxRenderingErrors"); maxErrors.add(NumberValidator.minimum(0.0)); form.add(maxErrors); // watermark form.add(new CheckBox("watermark.enabled")); form.add(new TextField("watermark.uRL")); TextField transparency = new TextField("watermark.transparency"); transparency.add(NumberValidator.range(0, 100)); form.add(transparency); form.add(new DropDownChoice("watermark.position", Arrays.asList(Position.values()), new WatermarkPositionRenderer())); // svg PropertyModel metadataModel = new PropertyModel(info, "metadata"); form.add(new CheckBox("svg.antialias", new MapModel(metadataModel, "svgAntiAlias"))); form.add(new DropDownChoice("svg.producer", new MapModel(metadataModel, "svgRenderer"), SVG_RENDERERS, new SVGMethodRenderer())); // png compression levels MapModel pngCompression = new MapModel(metadataModel, WMS.PNG_COMPRESSION); if(pngCompression.getObject() == null) pngCompression.setObject(WMS.PNG_COMPRESSION_DEFAULT); TextField pngCompressionField = new TextField("png.compression", pngCompression, Integer.class); pngCompressionField.add(new NumberValidator.RangeValidator(0, 100)); form.add(pngCompressionField); // jpeg compression levels MapModel jpegCompression = new MapModel(metadataModel, WMS.JPEG_COMPRESSION); if(jpegCompression.getObject() == null) jpegCompression.setObject(WMS.JPEG_COMPRESSION_DEFAULT); TextField jpegCompressionField = new TextField("jpeg.compression", jpegCompression, Integer.class); form.add(jpegCompressionField); } protected String getServiceName(){ return "WMS"; } private class WatermarkPositionRenderer implements IChoiceRenderer { public Object getDisplayValue(Object object) { return new StringResourceModel(((Position) object).name(), WMSAdminPage.this, null).getString(); } public String getIdValue(Object object, int index) { return ((Position) object).name(); } } private class InterpolationRenderer implements IChoiceRenderer { public Object getDisplayValue(Object object) { return new StringResourceModel(((WMSInterpolation) object).name(), WMSAdminPage.this, null).getString(); } public String getIdValue(Object object, int index) { return ((WMSInterpolation) object).name(); } } private class SVGMethodRenderer implements IChoiceRenderer { public Object getDisplayValue(Object object) { return new StringResourceModel("svg." + object, WMSAdminPage.this, null).getString(); } public String getIdValue(Object object, int index) { return (String) object; } } private static class SRSListConverter implements IConverter { static final Pattern COMMA_SEPARATED = Pattern.compile("\\s*,\\s*", Pattern.MULTILINE); public String convertToString(Object value, Locale locale) { List<String> srsList = (List<String>) value; if(srsList.isEmpty()) return ""; StringBuffer sb = new StringBuffer(); for (String srs : srsList) { sb.append(srs).append(", "); } sb.setLength(sb.length() - 2); return sb.toString(); } public Object convertToObject(String value, Locale locale) { if(value == null || value.trim().equals("")) return Collections.emptyList(); return new ArrayList<String>(Arrays.asList(COMMA_SEPARATED.split(value))); } } private static class SRSListValidator extends AbstractValidator { @Override protected void onValidate(IValidatable validatable) { List<String> srsList = (List<String>) validatable.getValue(); List<String> invalid = new ArrayList<String>(); for (String srs : srsList) { try { CRS.decode("EPSG:" + srs); } catch(Exception e) { invalid.add(srs); } } if(invalid.size() > 0) error(validatable, "WMSAdminPage.unknownEPSGCodes", Collections.singletonMap("codes", invalid.toString())); } } }