forked from geoserver/geoserver
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Adding KVP parsing for the range subset extension
- Loading branch information
Showing
6 changed files
with
197 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
71 changes: 71 additions & 0 deletions
71
src/community/wcs2_0/src/main/java/org/geoserver/wcs2_0/kvp/RangeSubsetKvpParser.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
/* Copyright (c) 2012 TOPP - www.openplans.org. All rights reserved. | ||
* This code is licensed under the GPL 2.0 license, availible 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.WCSExceptionCode.InvalidEncodingSyntax, "rangeSubset"); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
73 changes: 73 additions & 0 deletions
73
src/community/wcs2_0/src/test/java/org/geoserver/wcs2_0/kvp/RangeSubsetKvpParserTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
package org.geoserver.wcs2_0.kvp; | ||
|
||
import static org.junit.Assert.*; | ||
|
||
import net.opengis.wcs20.RangeItemType; | ||
import net.opengis.wcs20.RangeSubsetType; | ||
|
||
import org.eclipse.emf.common.util.EList; | ||
import org.geoserver.platform.OWS20Exception; | ||
import org.junit.Test; | ||
|
||
public class RangeSubsetKvpParserTest { | ||
|
||
RangeSubsetKvpParser parser = new RangeSubsetKvpParser(); | ||
|
||
@Test | ||
public void testInvalidValues() throws Exception { | ||
try { | ||
parser.parse("axis::blah"); | ||
fail("should have thrown an exception"); | ||
} catch(OWS20Exception e) { | ||
checkInvalidSyntaxException(e); | ||
} | ||
|
||
try { | ||
parser.parse("band1,band2:band3:band4"); | ||
fail("should have thrown an exception"); | ||
} catch(OWS20Exception e) { | ||
checkInvalidSyntaxException(e); | ||
} | ||
|
||
try { | ||
parser.parse("band1,,band2"); | ||
fail("should have thrown an exception"); | ||
} catch(OWS20Exception e) { | ||
checkInvalidSyntaxException(e); | ||
} | ||
|
||
try { | ||
parser.parse("band1,band2,"); | ||
fail("should have thrown an exception"); | ||
} catch(OWS20Exception e) { | ||
checkInvalidSyntaxException(e); | ||
} | ||
|
||
} | ||
|
||
private void checkInvalidSyntaxException(OWS20Exception e) { | ||
assertNotNull(e.getHttpCode()); | ||
assertEquals(400, e.getHttpCode().intValue()); | ||
assertEquals("InvalidEncodingSyntax", e.getCode()); | ||
assertEquals("rangeSubset", e.getLocator()); | ||
} | ||
|
||
@Test | ||
public void testMixed() throws Exception { | ||
RangeSubsetType rs = (RangeSubsetType) parser.parse("band01,band03:band05,band10,band19:band21"); | ||
EList<RangeItemType> items = rs.getRangeItems(); | ||
assertEquals(4, items.size()); | ||
RangeItemType i1 = items.get(0); | ||
assertEquals("band01", i1.getRangeComponent()); | ||
RangeItemType i2 = items.get(1); | ||
assertEquals("band03", i2.getRangeInterval().getStartComponent()); | ||
assertEquals("band05", i2.getRangeInterval().getEndComponent()); | ||
RangeItemType i3 = items.get(2); | ||
assertEquals("band10", i3.getRangeComponent()); | ||
RangeItemType i4 = items.get(3); | ||
assertEquals("band19", i4.getRangeInterval().getStartComponent()); | ||
assertEquals("band21", i4.getRangeInterval().getEndComponent()); | ||
} | ||
|
||
} | ||
|