package org.geotools.demo.feature;

import org.geotools.feature.AttributeType;
import org.geotools.feature.AttributeTypeFactory;
import org.geotools.feature.FeatureType;
import org.geotools.feature.FeatureTypeBuilder;
import org.geotools.feature.FeatureTypeFactory;
import org.geotools.feature.GeometryAttributeType;
import org.geotools.referencing.crs.DefaultGeographicCRS;
import org.opengis.feature.simple.SimpleFeature;

import com.vividsolutions.jts.geom.Point;

/**
 * You may of noticed that the use of DataUtilities.createType in the Csv2Shape
 * was a bit of a hack.
 * <p>
 * Here is why we only use the createType method in examples and test cases:
 * <ul>
 * <li>It did not let us specify the projection; you saw we needed to use
 * ShapefileDataStore explicity in order to call an extra method to "force" the
 * projection to to WSG84.
 * <li>It did not let us specify any constrains (say maximum length of the
 * name field).
 * <li>We did not make use of a "Factory", so our code has no opportunity to be
 * context sensitive (choosing the appropriate implementation for the type we
 * are representing)
 * </ul>
 * The following example code can be used as a reference when fixing up
 * Csv2Shape on your own.
 * 
 * @author Jody Garnett (Refractions Research)
 */
public class FeatureTypeExample {

	/**
	 * This class shows how to create a FeatureType from scratch using an
	 * AttributeTypeFactory and a FeatureTypeFactory.
	 * <p>
	 * A couple of notes; AttributeTypeFactory.newAttributeType is used to
	 * create both AttributeTypes and GeometryAttributeTypes. The factory will
	 * create a GoemetryAttributeType when a JTS Geometry class is used, and you
	 * can use the "metdata" paramters to specify the
	 * CoordinateRefernenceSystem.
	 * <p>
	 * The AttributeTypeFactory implementation is a bit messed up, you can
	 * <b>only</b> use the static final methods to get anything done. This is
	 * something we are fixing for GeoTools 2.5.
	 */
	public FeatureType createUsingFactory() throws Exception {
		final AttributeType LOCATION = AttributeTypeFactory.newAttributeType(
				"Location",
				Point.class,
				false,
				0,
				null,
				DefaultGeographicCRS.WGS84); 		
		final AttributeType NAME = AttributeTypeFactory.newAttributeType(
				"Name",        // name of attirbute type
				String.class,  // attribute type binding
				true,          // nillable
				15             // 15 characters allowed
		);
		
		FeatureTypeBuilder builder = FeatureTypeBuilder.newInstance("Landmarks");
		builder.addType( LOCATION );
		builder.addType( NAME );
		
		FeatureType schema = builder.getFeatureType();
		
		return schema;
	}

	/**
	 * In GeoTools 2.5 we will switch to using the GeoAPI
	 * SimpleFeatureTypeFactory interface for the "raw" create methods (a task
	 * made easier with a "builder" as documented here.
	 * 
	 * @return <code>null</code>
	 */
	public SimpleFeature createUsingBuilder() {
		return null;
	}
}