/* Copyright (c) 2001 - 2007 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.wfsv.response.v1_0_0;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.geoserver.ows.Response;
import org.geoserver.platform.Operation;
import org.geoserver.wfs.xml.v1_1_0.XmlSchemaEncoder;
import org.geoserver.wfsv.VersionedDescribeResults;
/**
*
* @author Andrea Aime
*
*/
public class VersionedXmlSchemaEncoder extends Response {
private static String[][] REPLACEMENTS;
static {
REPLACEMENTS = new String[4][2];
REPLACEMENTS[0][0] = "\"http://www.opengis.net/gml\"";
REPLACEMENTS[0][1] = "\"http://www.opengis.net/wfsv\"";
REPLACEMENTS[1][0] = "schemas/gml/2.1.2.1/feature.xsd\"";
REPLACEMENTS[1][1] = "schemas/wfs/1.0.0/WFS-versioning.xsd\"";
REPLACEMENTS[2][0] = "base=\"gml:AbstractFeatureType\"";
REPLACEMENTS[2][1] = "base=\"wfsv:AbstractVersionedFeatureType\"";
REPLACEMENTS[3][0] = "substitutionGroup=\"gml:_Feature\"";
REPLACEMENTS[3][1] = "substitutionGroup=\"wfsv:_VersionedFeature\"";
}
private XmlSchemaEncoder delegate;
public VersionedXmlSchemaEncoder(XmlSchemaEncoder delegate) {
super(VersionedDescribeResults.class, delegate.getOutputFormats());
this.delegate = delegate;
}
public String getMimeType(Object value, Operation operation)
throws org.geoserver.platform.ServiceException {
return delegate.getMimeType(value, operation);
}
public void write(Object value, OutputStream output, Operation operation)
throws IOException, org.geoserver.platform.ServiceException {
VersionedDescribeResults results = (VersionedDescribeResults) value;
if (!results.isVersioned()) {
delegate.write(results.getFeatureTypeInfo(), output, operation);
} else {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
delegate.write(results.getFeatureTypeInfo(), bos, operation);
String describe = bos.toString();
// now let's do the transformation magic, sigh...
for (int i = 0; i < REPLACEMENTS.length; i++) {
describe = describe.replaceAll(REPLACEMENTS[i][0],
REPLACEMENTS[i][1]);
}
// back on the output stream
output.write(describe.getBytes());
}
}
public boolean canHandle(Operation operation) {
return "DescribeVersionedFeatureType".equalsIgnoreCase(operation
.getId())
&& operation.getService().getId().equalsIgnoreCase("wfsv");
}
}