package org.geoserver.wfsv.response.v1_1_0;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Collections;
import net.opengis.wfs.DescribeFeatureTypeType;
import org.eclipse.xsd.XSDSchema;
import org.eclipse.xsd.util.XSDResourceImpl;
import org.geoserver.catalog.Catalog;
import org.geoserver.config.GeoServer;
import org.geoserver.ows.Response;
import org.geoserver.ows.util.RequestUtils;
import org.geoserver.platform.GeoServerResourceLoader;
import org.geoserver.platform.Operation;
import org.geoserver.platform.ServiceException;
import org.geoserver.wfs.WFSInfo;
import org.geoserver.wfs.xml.FeatureTypeSchemaBuilder;
import org.geoserver.wfsv.VersionedDescribeResults;
import org.geoserver.wfsv.xml.v1_1_0.WFSVConfiguration;
public class VersionedXmlSchemaEncoder extends Response {
/** wfs configuration */
WFSInfo wfs;
/** the catalog */
Catalog catalog;
WFSVConfiguration configuration;
public VersionedXmlSchemaEncoder(GeoServer gs,WFSVConfiguration configuration) {
super(VersionedDescribeResults.class, Collections
.singleton("text/xml; subtype=gml/3.1.1"));
this.wfs = gs.getService( WFSInfo.class );
this.catalog = gs.getCatalog();
this.configuration = configuration;
}
public String getMimeType(Object value, Operation operation)
throws ServiceException {
return "text/xml; subtype=gml/3.1.1";
}
public void write(Object value, OutputStream output,
Operation describeFeatureType) throws IOException {
VersionedDescribeResults results = (VersionedDescribeResults) value;
// create the schema
DescribeFeatureTypeType req = (DescribeFeatureTypeType) describeFeatureType
.getParameters()[0];
FeatureTypeSchemaBuilder builder = null;
if (results.isVersioned()) {
builder = new VersionedSchemaBuilder(wfs.getGeoServer(), configuration);
} else {
builder = new FeatureTypeSchemaBuilder.GML3(wfs.getGeoServer());
}
XSDSchema schema = builder.build(results.getFeatureTypeInfo(), req.getBaseUrl());
// serialize
schema.updateElement();
XSDResourceImpl.serialize(output, schema.getElement());
}
public boolean canHandle(Operation operation) {
return "DescribeVersionedFeatureType".equalsIgnoreCase(operation
.getId())
&& operation.getService().getId().equalsIgnoreCase("wfsv");
}
}