/* 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.vfny.geoserver.wms.responses.map.kml;
import javax.xml.namespace.QName;
import org.geotools.gml3.GMLConfiguration;
import org.geotools.xml.Encoder;
import org.geotools.xml.transform.TransformerBase;
import org.geotools.xml.transform.Translator;
import org.xml.sax.ContentHandler;
import org.xml.sax.helpers.NamespaceSupport;
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;
/**
* This is a GML3 geometry encoder for KML - OWS5 branch. It has been an experiment
* that people decided to discard.
* </p>
* @author Andrea Aime, TOPP
*
*/
public class OWS5GeometryTransformer extends TransformerBase {
public Translator createTranslator(ContentHandler handler) {
return new KML3GeometryTranslator(handler);
}
/**
* Subclass which sets prefix and nsuri to null.
*/
static class KML3GeometryTranslator implements Translator {
private Encoder encoder;
private ContentHandler handler;
public KML3GeometryTranslator(ContentHandler handler) {
this.handler = handler;
org.geotools.xml.Configuration configuration = new GMLConfiguration();
this.encoder = new Encoder(configuration);
this.encoder.setNamespaceAware(false);
}
public void abort() {
// cannot do that
}
public void encode(Object o) throws IllegalArgumentException {
if(o == null)
return;
QName name = null;
if(o instanceof GeometryCollection) {
if(o instanceof MultiPoint)
name = org.geotools.gml3.GML.MultiPoint;
else if(o instanceof MultiLineString)
name = org.geotools.gml3.GML.MultiLineString;
else if(o instanceof MultiPolygon)
name = org.geotools.gml3.GML.MultiSurface;
else
name = org.geotools.gml3.GML.MultiGeometry;
} else if(o instanceof Point)
name = org.geotools.gml3.GML.Point;
else if(o instanceof LineString)
name = org.geotools.gml3.GML.LineString;
else if(o instanceof Polygon)
name = org.geotools.gml3.GML.Polygon;
else
throw new IllegalArgumentException("Cannot handle geometries of type " + o.getClass());
try {
encoder.encode(o, name, handler);
} catch(IllegalArgumentException e) {
throw e;
} catch(Exception e) {
throw new RuntimeException("Error occurred during gml3 encoding", e);
}
}
public String getDefaultNamespace() {
return encoder.getSchema().getTargetNamespace();
}
public String getDefaultPrefix() {
return "gml";
}
public NamespaceSupport getNamespaceSupport() {
return null;
}
public SchemaLocationSupport getSchemaLocationSupport() {
return null;
}
}
}