/* (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.wcs.kvp;
import static org.vfny.geoserver.wcs.WcsException.WcsExceptionCode.InvalidParameterValue;
import java.io.StringReader;
import java.util.Iterator;
import net.opengis.ows11.CodeType;
import net.opengis.ows11.Ows11Factory;
import net.opengis.wcs11.AxisSubsetType;
import net.opengis.wcs11.FieldSubsetType;
import net.opengis.wcs11.RangeSubsetType;
import net.opengis.wcs11.Wcs111Factory;
import org.geoserver.ows.KvpParser;
import org.geoserver.wcs.kvp.rangesubset.ASTAxisId;
import org.geoserver.wcs.kvp.rangesubset.ASTAxisSubset;
import org.geoserver.wcs.kvp.rangesubset.ASTFieldId;
import org.geoserver.wcs.kvp.rangesubset.ASTFieldSubset;
import org.geoserver.wcs.kvp.rangesubset.ASTInterpolation;
import org.geoserver.wcs.kvp.rangesubset.ASTKey;
import org.geoserver.wcs.kvp.rangesubset.ASTRangeSubset;
import org.geoserver.wcs.kvp.rangesubset.Node;
import org.geoserver.wcs.kvp.rangesubset.RangeSubsetParser;
import org.geoserver.wcs.kvp.rangesubset.RangeSubsetParserVisitor;
import org.geoserver.wcs.kvp.rangesubset.SimpleNode;
import org.vfny.geoserver.wcs.WcsException;
/**
* Parses the RangeSubset parameter of a GetFeature KVP request
* @author Andrea Aime
*
*/
public class RangeSubsetKvpParser extends KvpParser {
public RangeSubsetKvpParser() {
super("RangeSubset", RangeSubsetType.class);
}
@Override
public Object parse(String value) throws Exception {
RangeSubsetParser parser = new RangeSubsetParser(new StringReader(value));
SimpleNode root = parser.RangeSubset();
RangeSubsetType result = (RangeSubsetType) root.jjtAccept(new RangeSubsetKvpParserVisitor(), null);
for (Iterator it = result.getFieldSubset().iterator(); it.hasNext();) {
FieldSubsetType type = (FieldSubsetType) it.next();
String interpolationType = type.getInterpolationType();
if(interpolationType != null) {
try {
InterpolationMethod method = InterpolationMethod.valueOf(interpolationType);
} catch(IllegalArgumentException e) {
throw new WcsException("Unknown interpolation method " + interpolationType, InvalidParameterValue, "RangeSubset");
}
}
}
return result;
}
private static class RangeSubsetKvpParserVisitor implements RangeSubsetParserVisitor {
Wcs111Factory wcsf = Wcs111Factory.eINSTANCE;
Ows11Factory owsf = Ows11Factory.eINSTANCE;
public Object visit(SimpleNode node, Object data) {
throw new UnsupportedOperationException("This method should never be reached");
}
public Object visit(ASTRangeSubset node, Object data) {
RangeSubsetType rs = wcsf.createRangeSubsetType();
for (int i = 0; i < node.jjtGetNumChildren(); i++) {
ASTFieldSubset fs = (ASTFieldSubset) node.jjtGetChild(i);
FieldSubsetType fst = (FieldSubsetType) fs.jjtAccept(this, data);
rs.getFieldSubset().add(fst);
}
return rs;
}
public Object visit(ASTFieldSubset node, Object data) {
FieldSubsetType fs = wcsf.createFieldSubsetType();
for (int i = 0; i < node.jjtGetNumChildren(); i++) {
Node child = node.jjtGetChild(i);
if(child instanceof ASTFieldId) {
CodeType id = owsf.createCodeType();
id.setValue((String) child.jjtAccept(this, null));
fs.setIdentifier(id);
} else if(child instanceof ASTInterpolation) {
fs.setInterpolationType((String) child.jjtAccept(this, null));
} else if(child instanceof ASTAxisSubset) {
fs.getAxisSubset().add(child.jjtAccept(this, null));
}
}
return fs;
}
public Object visit(ASTAxisSubset node, Object data) {
AxisSubsetType as = wcsf.createAxisSubsetType();
as.setIdentifier(((SimpleNode) node.jjtGetChild(0)).getContent());
for (int i = 1; i < node.jjtGetNumChildren(); i++) {
as.getKey().add(node.jjtGetChild(i).jjtAccept(this, null));
}
return as;
}
public Object visit(ASTFieldId node, Object data) {
return node.getContent();
}
public Object visit(ASTAxisId node, Object data) {
return node.getContent();
}
public Object visit(ASTInterpolation node, Object data) {
return node.getContent();
}
public Object visit(ASTKey node, Object data) {
return node.getContent();
}
}
}