/* (c) 2014 - 2016 Open Source Geospatial Foundation - all rights reserved
* (c) 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.web.wicket;
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.TextArea;
import org.apache.wicket.model.IModel;
import org.apache.wicket.util.convert.IConverter;
import org.apache.wicket.validation.IValidatable;
import org.apache.wicket.validation.IValidationError;
import org.apache.wicket.validation.IValidator;
import org.apache.wicket.validation.ValidationError;
import org.geotools.referencing.CRS;
public class SRSListTextArea extends TextArea<List<String>> {
private static final long serialVersionUID = -4851891710707750564L;
public SRSListTextArea(String id, IModel<List<String>> model) {
super(id, model);
add(new SRSListValidator());
setType(List.class);
}
@SuppressWarnings("unchecked")
@Override
public <C> IConverter<C> getConverter(Class<C> type) {
if (List.class.isAssignableFrom(type)) {
return (IConverter<C>) new SRSListConverter();
}
return super.getConverter(type);
}
private static class SRSListConverter implements IConverter<List<String>> {
private static final long serialVersionUID = 6381056789141754260L;
static final Pattern COMMA_SEPARATED = Pattern.compile("\\s*,\\s*", Pattern.MULTILINE);
public String convertToString(List<String> srsList, Locale locale) {
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 List<String> 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 implements IValidator<List<String>> {
private static final long serialVersionUID = -6376260926391668771L;
@Override
public void validate(IValidatable<List<String>> validatable) {
List<String> srsList = validatable.getValue();
List<String> invalid = new ArrayList<>();
srsList.stream().forEach((srs) -> {
try {
CRS.decode("EPSG:" + srs);
} catch (Exception e) {
invalid.add(srs);
}
});
if (invalid.size() > 0) {
IValidationError err = new ValidationError("SRSListTextArea.unknownEPSGCodes")
.addKey("SRSListTextArea.unknownEPSGCodes")
.setVariable("codes", invalid.toString());
validatable.error(err);
}
}
}
}