/*
* Geotoolkit - An Open Source Java GIS Toolkit
* http://www.geotoolkit.org
*
* (C) 2012, Geomatys
*
* 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; either
* version 2.1 of the License, or (at your option) any later version.
*
* 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.geotoolkit.gml.xml;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.sis.util.NullArgumentException;
import org.opengis.temporal.Instant;
import org.opengis.temporal.Period;
//import org.opengis.temporal.Position;
/**
*
* @author Guilhem Legal (Geomatys)
*/
public class GMLXmlFactory {
public static Point buildPoint(final String version, final String id, final org.opengis.geometry.DirectPosition pos) {
if ("3.2.1".equals(version)) {
return new org.geotoolkit.gml.xml.v321.PointType(id, pos);
} else if ("3.1.1".equals(version)) {
return new org.geotoolkit.gml.xml.v311.PointType(id, pos);
} else {
throw new IllegalArgumentException("unexpected gml version number:" + version);
}
}
public static org.opengis.geometry.DirectPosition buildDirectPosition(final String version, final String srsName, final Integer srsDimension, final List<Double> value) {
if ("3.2.1".equals(version)) {
return new org.geotoolkit.gml.xml.v321.DirectPositionType(srsName, srsDimension, value);
} else if ("3.1.1".equals(version)) {
return new org.geotoolkit.gml.xml.v311.DirectPositionType(srsName, srsDimension, value);
} else {
throw new IllegalArgumentException("unexpected gml version number:" + version);
}
}
public static MultiPoint buildMultiPoint(final String version, final List<Point> points, final String srsName) {
if ("3.2.1".equals(version)) {
final List<org.geotoolkit.gml.xml.v321.PointPropertyType> pointList = new ArrayList<org.geotoolkit.gml.xml.v321.PointPropertyType>();
for (Point pt : points) {
pointList.add(new org.geotoolkit.gml.xml.v321.PointPropertyType((org.geotoolkit.gml.xml.v321.PointType)pt));
}
return new org.geotoolkit.gml.xml.v321.MultiPointType(srsName, pointList);
} else if ("3.1.1".equals(version)) {
final List<org.geotoolkit.gml.xml.v311.PointPropertyType> pointList = new ArrayList<org.geotoolkit.gml.xml.v311.PointPropertyType>();
for (Point pt : points) {
pointList.add(new org.geotoolkit.gml.xml.v311.PointPropertyType((org.geotoolkit.gml.xml.v311.PointType)pt));
}
return new org.geotoolkit.gml.xml.v311.MultiPointType(srsName, pointList);
} else {
throw new IllegalArgumentException("unexpected gml version number:" + version);
}
}
public static LineString buildLineString(final String version, final String id, final String srsName, final List<org.opengis.geometry.DirectPosition> pos) {
if ("3.2.1".equals(version)) {
return new org.geotoolkit.gml.xml.v321.LineStringType(id, srsName, pos);
} else if ("3.1.1".equals(version)) {
return new org.geotoolkit.gml.xml.v311.LineStringType(id, srsName, pos);
} else {
throw new IllegalArgumentException("unexpected gml version number:" + version);
}
}
public static AbstractGeometricAggregate buildMultiLineString(final String version, final List<LineString> lines, final String srsName) {
if ("3.2.1".equals(version)) {
final List<org.geotoolkit.gml.xml.v321.CurvePropertyType> lineList = new ArrayList<org.geotoolkit.gml.xml.v321.CurvePropertyType>();
for (LineString ls : lines) {
lineList.add(new org.geotoolkit.gml.xml.v321.CurvePropertyType((org.geotoolkit.gml.xml.v321.LineStringType)ls));
}
return new org.geotoolkit.gml.xml.v321.MultiCurveType(srsName, lineList);
} else if ("3.1.1".equals(version)) {
final List<org.geotoolkit.gml.xml.v311.LineStringPropertyType> lineList = new ArrayList<org.geotoolkit.gml.xml.v311.LineStringPropertyType>();
for (LineString ls : lines) {
lineList.add(new org.geotoolkit.gml.xml.v311.LineStringPropertyType((org.geotoolkit.gml.xml.v311.LineStringType)ls));
}
return new org.geotoolkit.gml.xml.v311.MultiLineStringType(srsName, lineList);
} else {
throw new IllegalArgumentException("unexpected gml version number:" + version);
}
}
public static AbstractGeometricAggregate buildMultiPolygon(final String version, final List<Polygon> polygons, final String srsName) {
if ("3.2.1".equals(version)) {
final List<org.geotoolkit.gml.xml.v321.SurfacePropertyType> polyList = new ArrayList<org.geotoolkit.gml.xml.v321.SurfacePropertyType>();
for (Polygon p : polygons) {
polyList.add(new org.geotoolkit.gml.xml.v321.SurfacePropertyType((org.geotoolkit.gml.xml.v321.PolygonType) p));
}
return new org.geotoolkit.gml.xml.v321.MultiSurfaceType(srsName, polyList);
} else if ("3.1.1".equals(version)) {
final List<org.geotoolkit.gml.xml.v311.PolygonPropertyType> polyList = new ArrayList<org.geotoolkit.gml.xml.v311.PolygonPropertyType>();
for (Polygon p : polygons) {
polyList.add(new org.geotoolkit.gml.xml.v311.PolygonPropertyType((org.geotoolkit.gml.xml.v311.PolygonType)p));
}
return new org.geotoolkit.gml.xml.v311.MultiPolygonType(srsName, polyList);
} else {
throw new IllegalArgumentException("unexpected gml version number:" + version);
}
}
public static LinearRing buildLinearRing(final String version, final List<Double> coordList, final String srsName) {
if ("3.2.1".equals(version)) {
final org.geotoolkit.gml.xml.v321.DirectPositionListType dpList = new org.geotoolkit.gml.xml.v321.DirectPositionListType(coordList);
//no srsName on linear ring in this version
return new org.geotoolkit.gml.xml.v321.LinearRingType(null, dpList);
} else if ("3.1.1".equals(version)) {
final org.geotoolkit.gml.xml.v311.DirectPositionListType dpList = new org.geotoolkit.gml.xml.v311.DirectPositionListType(coordList);
return new org.geotoolkit.gml.xml.v311.LinearRingType(srsName, dpList);
} else {
throw new IllegalArgumentException("unexpected gml version number:" + version);
}
}
public static Polygon buildPolygon(final String version, final AbstractRing gmlExterior, final List<AbstractRing> gmlInterior, final String srsName) {
if ("3.2.1".equals(version)) {
final List<org.geotoolkit.gml.xml.v321.AbstractRingType> interiors = new ArrayList<>();
if (gmlInterior != null) {
for (AbstractRing ar : gmlInterior) {
if (ar != null && !(ar instanceof org.geotoolkit.gml.xml.v321.AbstractRingType)) {
throw new IllegalArgumentException("unexpected gml version for interior ring.(" + ar.getClass().getName()+ ")");
} else if (ar != null) {
interiors.add((org.geotoolkit.gml.xml.v321.AbstractRingType) ar);
}
}
}
return new org.geotoolkit.gml.xml.v321.PolygonType(srsName, (org.geotoolkit.gml.xml.v321.AbstractRingType) gmlExterior, interiors);
} else if ("3.1.1".equals(version)) {
final List<org.geotoolkit.gml.xml.v311.AbstractRingType> interiors = new ArrayList<>();
if (gmlInterior != null) {
for (AbstractRing ar : gmlInterior) {
if (ar != null && !(ar instanceof org.geotoolkit.gml.xml.v311.AbstractRingType)) {
throw new IllegalArgumentException("unexpected gml version for interior ring.");
} else if (ar != null) {
interiors.add((org.geotoolkit.gml.xml.v311.AbstractRingType)ar);
}
}
}
return new org.geotoolkit.gml.xml.v311.PolygonType(srsName, (org.geotoolkit.gml.xml.v311.AbstractRingType)gmlExterior, interiors);
} else {
throw new IllegalArgumentException("unexpected gml version number:" + version);
}
}
public static Envelope buildEnvelope(final String version, final String id, final double minx, final double miny, final double maxx, final double maxy, final String srs) {
if ("3.2.1".equals(version)) {
final org.geotoolkit.gml.xml.v321.DirectPositionType lowerCorner = new org.geotoolkit.gml.xml.v321.DirectPositionType(minx, miny);
final org.geotoolkit.gml.xml.v321.DirectPositionType upperCorner = new org.geotoolkit.gml.xml.v321.DirectPositionType(maxx, maxy);
return new org.geotoolkit.gml.xml.v321.EnvelopeType(lowerCorner, upperCorner, srs);
} else if ("3.1.1".equals(version)) {
final org.geotoolkit.gml.xml.v311.DirectPositionType lowerCorner = new org.geotoolkit.gml.xml.v311.DirectPositionType(minx, miny);
final org.geotoolkit.gml.xml.v311.DirectPositionType upperCorner = new org.geotoolkit.gml.xml.v311.DirectPositionType(maxx, maxy);
return new org.geotoolkit.gml.xml.v311.EnvelopeType(id, lowerCorner, upperCorner, srs);
} else {
throw new IllegalArgumentException("unexpected gml version number:" + version);
}
}
public static Period createTimePeriod(final String version, final String id, final String dateBegin, final String dateEnd) {
if ("3.2.1".equals(version)) {
if (dateEnd == null) {
return new org.geotoolkit.gml.xml.v321.TimePeriodType(id, dateBegin);
} else {
return new org.geotoolkit.gml.xml.v321.TimePeriodType(id, dateBegin, dateEnd);
}
} else if ("3.1.1".equals(version)) {
if (dateEnd == null) {
return new org.geotoolkit.gml.xml.v311.TimePeriodType(id, dateBegin);
} else {
return new org.geotoolkit.gml.xml.v311.TimePeriodType(id, dateBegin, dateEnd);
}
} else {
throw new IllegalArgumentException("unexpected gml version number:" + version);
}
}
public static Period createTimePeriod(final String version, final Date dateBegin, final Date dateEnd) {
if ("3.2.1".equals(version)) {
if (dateEnd == null) {
return new org.geotoolkit.gml.xml.v321.TimePeriodType(dateBegin);
} else {
return new org.geotoolkit.gml.xml.v321.TimePeriodType(dateBegin, dateEnd);
}
} else if ("3.1.1".equals(version)) {
if (dateEnd == null) {
return new org.geotoolkit.gml.xml.v311.TimePeriodType(dateBegin);
} else {
return new org.geotoolkit.gml.xml.v311.TimePeriodType(dateBegin, dateEnd);
}
} else {
throw new IllegalArgumentException("unexpected gml version number:" + version);
}
}
public static Period createTimePeriod(final String version, final AbstractTimePosition dateBegin, final AbstractTimePosition dateEnd) {
if ("3.2.1".equals(version)) {
if (dateEnd != null && !(dateEnd instanceof org.geotoolkit.gml.xml.v321.TimePositionType)) {
throw new IllegalArgumentException("unexpected gml version for date end.");
}
if (dateBegin != null && !(dateBegin instanceof org.geotoolkit.gml.xml.v321.TimePositionType)) {
throw new IllegalArgumentException("unexpected gml version for date begin.");
}
if (dateEnd == null) {
return new org.geotoolkit.gml.xml.v321.TimePeriodType((org.geotoolkit.gml.xml.v321.TimePositionType)dateBegin);
} else {
return new org.geotoolkit.gml.xml.v321.TimePeriodType((org.geotoolkit.gml.xml.v321.TimePositionType)dateBegin,
(org.geotoolkit.gml.xml.v321.TimePositionType)dateEnd);
}
} else if ("3.1.1".equals(version)) {
if (dateEnd != null && !(dateEnd instanceof org.geotoolkit.gml.xml.v311.TimePositionType)) {
throw new IllegalArgumentException("unexpected gml version for date end.");
}
if (dateBegin != null && !(dateBegin instanceof org.geotoolkit.gml.xml.v311.TimePositionType)) {
throw new IllegalArgumentException("unexpected gml version for date begin.");
}
if (dateEnd == null) {
return new org.geotoolkit.gml.xml.v311.TimePeriodType((org.geotoolkit.gml.xml.v311.TimePositionType)dateBegin);
} else {
return new org.geotoolkit.gml.xml.v311.TimePeriodType(
new org.geotoolkit.gml.xml.v311.TimeInstantType((org.geotoolkit.gml.xml.v311.TimePositionType)dateBegin),
new org.geotoolkit.gml.xml.v311.TimeInstantType((org.geotoolkit.gml.xml.v311.TimePositionType)dateEnd));
}
} else {
throw new IllegalArgumentException("unexpected gml version number:" + version);
}
}
public static Instant createTimeInstant(final String version, final AbstractTimePosition date) {
if ("3.2.1".equals(version)) {
if (date != null && !(date instanceof org.geotoolkit.gml.xml.v321.TimePositionType)) {
throw new IllegalArgumentException("unexpected gml version for date position.");
}
return new org.geotoolkit.gml.xml.v321.TimeInstantType((org.geotoolkit.gml.xml.v321.TimePositionType)date);
} else if ("3.1.1".equals(version)) {
if (date != null && !(date instanceof org.geotoolkit.gml.xml.v311.TimePositionType)) {
throw new IllegalArgumentException("unexpected gml version for date end.");
}
return new org.geotoolkit.gml.xml.v311.TimeInstantType((org.geotoolkit.gml.xml.v311.TimePositionType)date);
} else {
throw new IllegalArgumentException("unexpected gml version number:" + version);
}
}
public static Instant createTimeInstant(final String version, final String id, final String date) {
if ("3.2.1".equals(version)) {
return new org.geotoolkit.gml.xml.v321.TimeInstantType(id, date);
} else if ("3.1.1".equals(version)) {
return new org.geotoolkit.gml.xml.v311.TimeInstantType(id, date);
} else {
throw new IllegalArgumentException("unexpected gml version number:" + version);
}
}
public static Instant createTimeInstant(final String version, final Date date) {
if ("3.2.1".equals(version)) {
return new org.geotoolkit.gml.xml.v321.TimeInstantType(date);
} else if ("3.1.1".equals(version)) {
return new org.geotoolkit.gml.xml.v311.TimeInstantType(date);
} else {
throw new IllegalArgumentException("unexpected gml version number:" + version);
}
}
public static Period createTimePeriod(final String version, final TimeIndeterminateValueType dateBegin, final AbstractTimePosition dateEnd) {
if ("3.2.1".equals(version)) {
if (dateEnd != null && !(dateEnd instanceof org.geotoolkit.gml.xml.v321.TimePositionType)) {
throw new IllegalArgumentException("unexpected gml version for date end.");
}
return new org.geotoolkit.gml.xml.v321.TimePeriodType(dateBegin, (org.geotoolkit.gml.xml.v321.TimePositionType)dateEnd);
} else if ("3.1.1".equals(version)) {
if (dateEnd != null && !(dateEnd instanceof org.geotoolkit.gml.xml.v311.TimePositionType)) {
throw new IllegalArgumentException("unexpected gml version for date end.");
}
return new org.geotoolkit.gml.xml.v311.TimePeriodType(dateBegin, (org.geotoolkit.gml.xml.v311.TimePositionType)dateEnd);
} else {
throw new IllegalArgumentException("unexpected gml version number:" + version);
}
}
public static Period createTimePeriod(final String version, final AbstractTimePosition dateBegin, final TimeIndeterminateValueType dateEnd) {
if ("3.2.1".equals(version)) {
if (dateBegin != null && !(dateBegin instanceof org.geotoolkit.gml.xml.v321.TimePositionType)) {
throw new IllegalArgumentException("unexpected gml version for date begin.");
}
return new org.geotoolkit.gml.xml.v321.TimePeriodType((org.geotoolkit.gml.xml.v321.TimePositionType)dateBegin, dateEnd);
} else if ("3.1.1".equals(version)) {
if (dateBegin != null && !(dateBegin instanceof org.geotoolkit.gml.xml.v311.TimePositionType)) {
throw new IllegalArgumentException("unexpected gml version for date end.");
}
return new org.geotoolkit.gml.xml.v311.TimePeriodType((org.geotoolkit.gml.xml.v311.TimePositionType)dateBegin, dateEnd);
} else {
throw new IllegalArgumentException("unexpected gml version number:" + version);
}
}
public static Period createTimePeriod(final String version, final TimeIndeterminateValueType dateBegin, final Date dateEnd) {
if (dateEnd == null)
throw new NullArgumentException("dateEnd");
if ("3.2.1".equals(version)) {
// if (dateEnd != null && !(dateEnd instanceof org.geotoolkit.gml.xml.v321.TimePositionType)) {
// throw new IllegalArgumentException("unexpected gml version for date end.");
// }
return new org.geotoolkit.gml.xml.v321.TimePeriodType(dateBegin, new org.geotoolkit.gml.xml.v321.TimePositionType(dateEnd));
} else if ("3.1.1".equals(version)) {
// if (dateEnd != null && !(dateEnd instanceof org.geotoolkit.gml.xml.v311.TimePositionType)) {
// throw new IllegalArgumentException("unexpected gml version for date end.");
// }
return new org.geotoolkit.gml.xml.v311.TimePeriodType(dateBegin, new org.geotoolkit.gml.xml.v311.TimePositionType(dateEnd));
} else {
throw new IllegalArgumentException("unexpected gml version number:" + version);
}
}
public static Period createTimePeriod(final String version, final Date dateBegin, final TimeIndeterminateValueType dateEnd) {
if (dateBegin == null)
throw new NullArgumentException("dateBegin");
if ("3.2.1".equals(version)) {
// if (dateBegin != null && !(dateBegin instanceof org.geotoolkit.gml.xml.v321.TimePositionType)) {
// throw new IllegalArgumentException("unexpected gml version for date begin.");
// }
return new org.geotoolkit.gml.xml.v321.TimePeriodType(new org.geotoolkit.gml.xml.v321.TimePositionType(dateBegin), dateEnd);
} else if ("3.1.1".equals(version)) {
// if (dateBegin != null && !(dateBegin instanceof org.geotoolkit.gml.xml.v311.TimePositionType)) {
// throw new IllegalArgumentException("unexpected gml version for date end.");
// }
return new org.geotoolkit.gml.xml.v311.TimePeriodType(new org.geotoolkit.gml.xml.v311.TimePositionType(dateBegin), dateEnd);
} else {
throw new IllegalArgumentException("unexpected gml version number:" + version);
}
}
public static FeatureCollection createFeatureCollection(final String version, final String id, final String name, final String description,
final List<FeatureProperty> features) {
if ("3.2.1".equals(version)) {
final List<org.geotoolkit.gml.xml.v321.FeaturePropertyType> features321 = new ArrayList<org.geotoolkit.gml.xml.v321.FeaturePropertyType>();
if (features != null) {
for (FeatureProperty fp : features) {
if (fp != null && !(fp instanceof org.geotoolkit.gml.xml.v321.FeaturePropertyType)) {
throw new IllegalArgumentException("unexpected gml version for feature property.");
} else if (fp != null) {
features321.add((org.geotoolkit.gml.xml.v321.FeaturePropertyType)fp);
}
}
}
return new org.geotoolkit.gml.xml.v321.FeatureCollectionType(id, name, description, features321);
} else if ("3.1.1".equals(version)) {
final List<org.geotoolkit.gml.xml.v311.FeaturePropertyType> features311 = new ArrayList<org.geotoolkit.gml.xml.v311.FeaturePropertyType>();
if (features != null) {
for (FeatureProperty fp : features) {
if (fp != null && !(fp instanceof org.geotoolkit.gml.xml.v311.FeaturePropertyType)) {
throw new IllegalArgumentException("unexpected gml version for feature property.");
} else if (fp != null) {
features311.add((org.geotoolkit.gml.xml.v311.FeaturePropertyType)fp);
}
}
}
return new org.geotoolkit.gml.xml.v311.FeatureCollectionType(id, name, description, features311);
} else {
throw new IllegalArgumentException("unexpected gml version number:" + version);
}
}
}