/* Copyright (c) 2001 - 2009 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.sfs;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;
import org.apache.commons.io.IOUtils;
import org.geoserver.catalog.FeatureTypeInfo;
import org.geoserver.rest.format.StreamDataFormat;
import org.json.simple.JSONObject;
import org.opengis.feature.simple.SimpleFeatureType;
import org.opengis.feature.type.AttributeDescriptor;
import org.restlet.data.MediaType;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryCollection;
import com.vividsolutions.jts.geom.LineString;
import com.vividsolutions.jts.geom.MultiLineString;
import com.vividsolutions.jts.geom.MultiPoint;
import com.vividsolutions.jts.geom.MultiPolygon;
import com.vividsolutions.jts.geom.Point;
import com.vividsolutions.jts.geom.Polygon;
/**
* Writes out a layer description
*
* @author Andrea Aime - GeoSolutions
*
*/
public class DescribeJSONFormat extends StreamDataFormat {
protected DescribeJSONFormat() {
super(MediaType.APPLICATION_JSON);
}
@Override
protected Object read(InputStream in) throws IOException {
throw new UnsupportedOperationException("Can't read capabilities documents with this class");
}
@Override
protected void write(Object object, OutputStream out) throws IOException {
FeatureTypeInfo fti = (FeatureTypeInfo) object;
SimpleFeatureType schema = (SimpleFeatureType) fti.getFeatureType();
Writer writer = null;
try {
writer = new OutputStreamWriter(out);
writer.write("[");
Map<String, String> attributes = new LinkedHashMap<String, String>();
for (AttributeDescriptor att : schema.getAttributeDescriptors()) {
attributes.put(att.getLocalName(), findAttributeType(att));
}
JSONObject.writeJSONString(attributes, writer);
writer.write("]");
} finally {
IOUtils.closeQuietly(writer);
}
}
private String findAttributeType(AttributeDescriptor att) {
Class binding = att.getType().getBinding();
if (Geometry.class.isAssignableFrom(binding)) {
return findGeometryType(binding);
} else if (Number.class.isAssignableFrom(binding)) {
return "number";
} else if (Date.class.isAssignableFrom(binding)) {
return "timestamp";
} else if (Boolean.class.isAssignableFrom(binding)) {
return "boolean";
} else {
return "string";
}
}
private String findGeometryType(Class binding) {
if (GeometryCollection.class.isAssignableFrom(binding)) {
if (MultiPoint.class.isAssignableFrom(binding)) {
return "MultiPoint";
} else if (MultiPolygon.class.isAssignableFrom(binding)) {
return "MultiPolygon";
} else if (MultiLineString.class.isAssignableFrom(binding)) {
return "MultiLineString";
} else {
return "GeometryCollection";
}
} else {
if (Point.class.isAssignableFrom(binding)) {
return "Point";
} else if (Polygon.class.isAssignableFrom(binding)) {
return "Polygon";
} else if (LineString.class.isAssignableFrom(binding)) {
return "LineString";
} else {
return "Geometry";
}
}
}
}