/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2002-2008, Open Source Geospatial Foundation (OSGeo)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package org.geotools.gml2.bindings;
import java.util.Date;
import javax.xml.namespace.QName;
import org.geotools.feature.simple.SimpleFeatureBuilder;
import org.geotools.feature.simple.SimpleFeatureTypeBuilder;
import org.geotools.gml2.GML;
import org.geotools.gml2.TEST;
import org.geotools.referencing.CRS;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;
import org.opengis.referencing.FactoryException;
import org.opengis.referencing.NoSuchAuthorityCodeException;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.CoordinateSequence;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.LineString;
import com.vividsolutions.jts.geom.LinearRing;
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;
import com.vividsolutions.jts.geom.impl.CoordinateArraySequence;
/**
* Collection of static methods for creating mock data for binding unit tests.
*
* @author Justin Deoliveira, The Open Planning Project
*
*
* @source $URL$
*/
public class GML2MockData {
/** factory used to create geometries */
static GeometryFactory gf = new GeometryFactory();
//
//Geometries
//
static Coordinate coordinate() {
return new Coordinate(1, 2);
}
static Element coordinate(Document document, Node parent) {
Element coord = element(GML.coord, document, parent);
Element x = element(new QName(GML.NAMESPACE, "X"), document, coord);
x.appendChild(document.createTextNode("1.0"));
Element y = element(new QName(GML.NAMESPACE, "Y"), document, coord);
y.appendChild(document.createTextNode("2.0"));
return coord;
}
static CoordinateSequence coordinates() {
return new CoordinateArraySequence(new Coordinate[] {
new Coordinate(1, 2), new Coordinate(3, 4)
});
}
static Element coordinates(Document document, Node parent) {
Element coordinates = element(GML.coordinates, document, parent);
coordinates.appendChild(document.createTextNode("1.0,2.0 3.0,4.0"));
return coordinates;
}
static Element boundedBy(Document document, Node parent) {
Element boundedBy = element(GML.boundedBy, document, parent);
box(document, boundedBy);
return boundedBy;
}
static Element boundedByWithNull(Document document, Node parent) {
Element boundedBy = element(GML.boundedBy, document, parent);
nil(document, boundedBy);
return boundedBy;
}
static Element box(Document document, Node parent) {
Element box = element(GML.Box, document, parent);
coordinate(document, box);
coordinate(document, box);
return box;
}
static Element nil(Document document, Node parent) {
return element(new QName(GML.NAMESPACE, "null"), document, parent);
}
static Point point() {
return gf.createPoint(coordinate());
}
static Element point(Document document, Node parent) {
Element point = element(GML.Point, document, parent);
coordinate(document, point);
return point;
}
static Element pointProperty(Document document, Node parent) {
Element pointProperty = element(GML.pointProperty, document, parent);
point(document, pointProperty);
return pointProperty;
}
static LineString lineString() {
return gf.createLineString(coordinates());
}
static Element lineString(Document document, Node parent) {
Element lineString = element(GML.LineString, document, parent);
coordinates(document, lineString);
return lineString;
}
static LinearRing linearRing() {
return gf.createLinearRing(new Coordinate[] {
new Coordinate(1, 1), new Coordinate(2, 2), new Coordinate(3, 3),
new Coordinate(1, 1)
});
}
static Element lineStringProperty(Document document, Node parent) {
Element property = element(GML.lineStringProperty, document, parent);
lineString(document, property);
return property;
}
static Element linearRing(Document document, Node parent) {
Element linearRing = element(GML.LinearRing, document, parent);
Element coordinates = element(GML.coordinates, document, linearRing);
coordinates.appendChild(document.createTextNode("1.0,2.0 3.0,4.0 5.0,6.0 1.0,2.0"));
return linearRing;
}
static Polygon polygon() {
return gf.createPolygon(linearRing(), null);
}
static Element polygon(Document document, Node parent) {
Element polygon = element(GML.Polygon, document, parent);
Element exterior = element(GML.outerBoundaryIs, document, polygon);
linearRing(document, exterior);
return polygon;
}
static Element polygonProperty(Document document, Node parent) {
Element property = element(GML.polygonProperty, document, parent);
polygon(document, property);
return property;
}
static MultiPoint multiPoint() {
return setCRS(gf.createMultiPoint(new Coordinate[] { new Coordinate(1, 1), new Coordinate(2, 2) }));
}
static Element multiPoint(Document document, Node parent) {
Element multiPoint = element(GML.MultiPoint, document, parent);
// 2 pointMember elements
Element pointMember = element(GML.pointMember, document, multiPoint);
point(document, pointMember);
pointMember = element(GML.pointMember, document, multiPoint);
point(document, pointMember);
return multiPoint;
}
static <G extends Geometry> G setCRS( G geometry ) {
geometry.setUserData( crs("4326") );
return geometry;
}
static CoordinateReferenceSystem crs( String srid ) {
try {
return CRS.decode( "EPSG:4326" );
}
catch (Exception e) {
throw new RuntimeException( e );
}
}
static Element multiPointProperty(Document document, Node parent) {
Element multiPointProperty = element(GML.multiPointProperty, document, parent);
multiPoint(document, multiPointProperty);
return multiPointProperty;
}
static MultiLineString multiLineString() {
return gf.createMultiLineString(new LineString[] { lineString(), lineString() });
}
static Element multiLineString(Document document, Node parent) {
Element multiLineString = element(GML.MultiLineString, document, parent);
Element lineStringMember = element(GML.lineStringMember, document, multiLineString);
lineString(document, lineStringMember);
lineStringMember = element(GML.lineStringMember, document, multiLineString);
lineString(document, lineStringMember);
return multiLineString;
}
static Element multiLineStringProperty(Document document, Node parent) {
Element multiLineStringProperty = element(GML.multiLineStringProperty, document, parent);
multiLineString(document, multiLineStringProperty);
return multiLineStringProperty;
}
static MultiPolygon multiPolygon() {
return gf.createMultiPolygon(new Polygon[] { polygon(), polygon() });
}
static Element multiPolygon(Document document, Node parent) {
Element multiPolygon = element(GML.MultiPolygon, document, parent);
Element polygonMember = element(GML.polygonMember, document, multiPolygon);
polygon(document, polygonMember);
polygonMember = element(GML.polygonMember, document, multiPolygon);
polygon(document, polygonMember);
return multiPolygon;
}
static Element multiPolygonProperty(Document document, Node parent) {
Element multiPolygonProperty = element(GML.multiPolygonProperty, document, parent);
multiPolygon(document, multiPolygonProperty);
return multiPolygonProperty;
}
//
// features
//
static Element feature(Document document, Node parent) {
Element feature = element(TEST.TestFeature, document, parent);
Element geom = element(new QName(TEST.NAMESPACE, "geom"), document, feature);
point(document, geom);
Element count = element(new QName(TEST.NAMESPACE, "count"), document, feature);
count.appendChild(document.createTextNode("1"));
return feature;
}
static SimpleFeature feature() throws Exception {
SimpleFeatureTypeBuilder typeBuilder = new SimpleFeatureTypeBuilder();
typeBuilder.setName(TEST.TestFeature.getLocalPart());
typeBuilder.setNamespaceURI(TEST.TestFeature.getNamespaceURI());
typeBuilder.add("name", String.class);
typeBuilder.add("description", String.class);
typeBuilder.add("geom", Point.class);
typeBuilder.add("count", Integer.class);
typeBuilder.add("date", Date.class);
SimpleFeatureType type = (SimpleFeatureType) typeBuilder.buildFeatureType();
SimpleFeatureBuilder builder = new SimpleFeatureBuilder(type);
builder.add("theName");
builder.add("theDescription");
builder.add(point());
builder.add(new Integer(1));
builder.add(new Date());
return (SimpleFeature) builder.buildFeature("fid.1");
}
static Element featureMember(Document document, Node parent) {
Element featureMember = element(GML.featureMember, document, parent);
feature(document, featureMember);
return featureMember;
}
static Element element(QName name, Document document, Node parent) {
Element element = document.createElementNS(name.getNamespaceURI(), name.getLocalPart());
if (parent != null) {
parent.appendChild(element);
}
return element;
}
}