/* (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.gwc.web.layer; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Locale; import org.apache.commons.lang.StringUtils; import org.apache.wicket.Component; 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.util.convert.ConversionException; import org.apache.wicket.util.convert.IConverter; import org.geowebcache.filter.parameters.FloatParameterFilter; /** * Subform that allows editing of a StringParameterFilter * @author Kevin Smith, OpenGeo * */ public class FloatParameterFilterSubform extends AbstractParameterFilterSubform<FloatParameterFilter> { private static final long serialVersionUID = -1715100884515717529L; private static final IConverter<Float> FLOAT = new IConverter<Float>() { private static final long serialVersionUID = 5393727015187736272L; @Override public Float convertToObject(String value, Locale locale) { if(value==null || value.isEmpty()) return null; try { return Float.parseFloat(value); } catch (NumberFormatException ex) { throw new ConversionException(ex) .setConverter(this) .setLocale(locale) .setTargetType(Float.class) .setSourceValue(value) .setResourceKey("notAValidNumber"); } } @Override public String convertToString(Float value, Locale locale) { return Float.toString(value); } }; private static final IConverter<List<Float>> CONVERT = new IConverter<List<Float>>() { private static final long serialVersionUID = 6972092160668131862L; @Override public List<Float> convertToObject(String value, Locale locale) { if(value==null) { return null; } else { String[] strings = StringUtils.split(value, "\r\n"); List<Float> floats = new ArrayList<Float>(strings.length); for(String s: strings) { floats.add((Float)FLOAT.convertToObject(s, locale)); } return floats; } } @Override public String convertToString(List<Float> value, Locale locale) { Iterator<Float> i = value.iterator(); StringBuilder sb = new StringBuilder(); if(i.hasNext()) { sb.append(FLOAT.convertToString(i.next(), locale)); } while(i.hasNext()){ sb.append("\r\n"); sb.append(FLOAT.convertToString(i.next(), locale)); } return sb.toString(); } }; public FloatParameterFilterSubform(String id, IModel<FloatParameterFilter> model) { super(id, model); final Component defaultValue; defaultValue = new TextField<String>("defaultValue", new PropertyModel<String>(model, "defaultValue")); add(defaultValue); final TextArea<List<Float>> values; values = new TextArea<List<Float>>("values", new PropertyModel<List<Float>>(model, "values")) { /** serialVersionUID */ private static final long serialVersionUID = 1L; @SuppressWarnings("unchecked") @Override public <S> IConverter<S> getConverter(Class<S> type) { if (List.class.isAssignableFrom(type)) { return (IConverter<S>) CONVERT; } return super.getConverter(type); } }; values.setConvertEmptyInputStringToNull(false); add(values); final Component threshold; threshold = new TextField<Float>("threshold", new PropertyModel<Float>(model, "threshold")) { /** serialVersionUID */ private static final long serialVersionUID = 1L; // Want to use non-localized float parsing so we can handle exponential notation @SuppressWarnings("unchecked") @Override public <S> IConverter<S> getConverter(Class<S> type) { if (Float.class.isAssignableFrom(type)) { return (IConverter<S>) FLOAT; } return super.getConverter(type); } }; add(threshold); } }