/* (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.RangeIntervalType; import net.opengis.wcs20.RangeItemType; import net.opengis.wcs20.RangeSubsetType; 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 RangeSubsetType} * * @author Andrea Aime - GeoSolutions */ public class RangeSubsetKvpParser extends KvpParser { public RangeSubsetKvpParser() { super("rangesubset", RangeSubsetType.class); } @Override public Object parse(String value) throws Exception { RangeSubsetType result = Wcs20Factory.eINSTANCE.createRangeSubsetType(); // remove space value = value.trim(); // minimal validation if(value.matches(".*,\\s*,.*")) { // two consequent commas throwInvalidSyntaxException(); } else if(value.startsWith(",") || value.endsWith(",")) { throwInvalidSyntaxException(); } String[] components = value.split("\\s*,\\s*"); for (String component : components) { if (component.contains(":")) { String[] lowHigh = component.split(":"); if (lowHigh.length != 2) { throwInvalidSyntaxException(); } RangeIntervalType ri = Wcs20Factory.eINSTANCE.createRangeIntervalType(); ri.setStartComponent(lowHigh[0]); ri.setEndComponent(lowHigh[1]); RangeItemType item = Wcs20Factory.eINSTANCE.createRangeItemType(); item.setRangeInterval(ri); result.getRangeItems().add(item); } else { RangeItemType item = Wcs20Factory.eINSTANCE.createRangeItemType(); item.setRangeComponent(component); result.getRangeItems().add(item); } } return result; } protected void throwInvalidSyntaxException() { throw new WCS20Exception( "Invalid RangeSubset syntax, expecting a list of band names or band ranges (b1:b2)", WCS20Exception.WCS20ExceptionCode.InvalidEncodingSyntax, "rangeSubset"); } }