/* (c) 2014 - 2015 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.wfs.xml.v2_0;
import java.io.Reader;
import java.util.Map;
import javax.xml.namespace.QName;
import org.geoserver.config.GeoServer;
import org.geoserver.ows.XmlRequestReader;
import org.geoserver.platform.ServiceException;
import org.geoserver.wfs.WFSException;
import org.geoserver.wfs.WFSInfo;
import org.geoserver.wfs.xml.FeatureTypeSchemaBuilder;
import org.geoserver.wfs.xml.WFSURIHandler;
import org.geoserver.wfs.xml.WFSXmlUtils;
import org.geoserver.util.EntityResolverProvider;
import org.geotools.util.Version;
import org.geotools.wfs.v2_0.WFS;
import org.geotools.xml.Parser;
/**
* Xml reader for wfs 2.0 xml requests.
*
* @author Justin Deoliveira, OpenGeo
*
*/
public class WfsXmlReader extends XmlRequestReader {
GeoServer gs;
EntityResolverProvider entityResolverProvider;
public WfsXmlReader(String element, GeoServer gs) {
super(new QName(WFS.NAMESPACE, element), new Version("2.0.0"), "wfs");
this.gs = gs;
this.entityResolverProvider = new EntityResolverProvider(gs);
}
@Override
public Object read(Object request, Reader reader, Map kvp) throws Exception {
WFSConfiguration config = new WFSConfiguration();
WFSXmlUtils.initWfsConfiguration(config, gs, new FeatureTypeSchemaBuilder.GML32(gs));
Parser parser = new Parser(config);
parser.setEntityResolver(entityResolverProvider.getEntityResolver());
WFSInfo wfs = wfs();
WFSXmlUtils.initRequestParser(parser, wfs, gs, kvp);
Object parsed = null;
try {
parsed = WFSXmlUtils.parseRequest(parser, reader, wfs);
}
catch(Exception e) {
//check the exception, and set code to OperationParsingFailed if code not set
if (!(e instanceof ServiceException) || ((ServiceException)e).getCode() == null) {
e = new WFSException("Request parsing failed", e, "OperationParsingFailed");
}
throw e;
}
WFSXmlUtils.checkValidationErrors(parser, this);
return parsed;
}
WFSInfo wfs() {
return gs.getService(WFSInfo.class);
}
}