/* (c) 2014 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.wcs2_0.kvp; import net.opengis.wcs20.InterpolationAxesType; import net.opengis.wcs20.InterpolationAxisType; import net.opengis.wcs20.InterpolationMethodType; import net.opengis.wcs20.InterpolationType; import net.opengis.wcs20.Wcs20Factory; import org.geoserver.ows.KvpParser; import org.geoserver.wcs2_0.exception.WCS20Exception; /** * KVP parser for the WCS 2.0 {@link InterpolationType} * * @author Andrea Aime - GeoSolutions */ public class InterpolationKvpParser extends KvpParser { public InterpolationKvpParser() { super("interpolation", InterpolationType.class); } @Override public Object parse(String value) throws Exception { InterpolationType result = Wcs20Factory.eINSTANCE.createInterpolationType(); // remove space value = value.trim(); // single value? if (value.matches("http://www.opengis.net/def/interpolation/OGC/1/[^,:]*")) { // single value then InterpolationMethodType method = Wcs20Factory.eINSTANCE.createInterpolationMethodType(); method.setInterpolationMethod(value); result.setInterpolationMethod(method); return result; } // minimal validation of the multi-axis case if (value.matches(".*,\\s*,.*")) { // two consequent commas throwInvalidSyntaxException(); } else if (value.startsWith(",") || value.endsWith(",")) { throwInvalidSyntaxException(); } InterpolationAxesType axes = Wcs20Factory.eINSTANCE.createInterpolationAxesType(); result.setInterpolationAxes(axes); String[] components = value.split("\\s*,\\s*"); for (String component : components) { // minimal validation of the content if (!component.matches(".*:http://www.opengis.net/def/interpolation/OGC/1/.*")) { // not a regular axis:interpolation structure throwInvalidSyntaxException(); } else if (component.matches(".*:\\s*:.*")) { // two consequent columns throwInvalidSyntaxException(); } int idx = component.lastIndexOf(":", component.lastIndexOf(":") - 1); InterpolationAxisType ia = Wcs20Factory.eINSTANCE.createInterpolationAxisType(); ia.setAxis(component.substring(0, idx)); ia.setInterpolationMethod(component.substring(idx + 1)); axes.getInterpolationAxis().add(ia); } return result; } protected void throwInvalidSyntaxException() { throw new WCS20Exception( "Invalid Interpolation syntax, expecting either a single interpolation value, " + "or a comma separated list of axis:interpolation specs", WCS20Exception.WCS20ExceptionCode.InvalidEncodingSyntax, "interpolation"); } }