package org.geotoolkit.data.mapinfo.mif.geometry;
import com.vividsolutions.jts.geom.*;
import org.apache.sis.storage.DataStoreException;
import org.geotoolkit.data.mapinfo.mif.MIFUtils;
import org.geotoolkit.util.NamesExt;
import org.opengis.util.GenericName;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.operation.MathTransform;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
import org.apache.sis.feature.DefaultAttributeType;
import org.apache.sis.feature.builder.FeatureTypeBuilder;
import org.opengis.feature.AttributeType;
import org.opengis.feature.Feature;
import org.opengis.feature.FeatureType;
/**
* Class to build feature from abstract geometry type.
*
* @author Alexis Manin (Geomatys)
* @author Mehdi Sidhoum (Geomatys)
*/
public class MIFDefaultGeometryBuilder extends MIFGeometryBuilder{
public static final GenericName NAME = NamesExt.create("GEOMETRY");
public static final GenericName GEOM_NAME = NamesExt.create("GEOMETRY");
@Override
public void buildGeometry(Scanner scanner, Feature toFill, MathTransform toApply) throws DataStoreException {
throw new IllegalStateException("building geometry with name GEOMETRY should never happen for MIF MID !");
}
@Override
public FeatureType buildType(CoordinateReferenceSystem crs, FeatureType parent) {
final FeatureTypeBuilder ftb = new FeatureTypeBuilder();
ftb.setName(NAME);
ftb.setSuperTypes(parent);
ftb.addAssociation(MIFCollectionBuilder.EMPTY_TYPE).setName(NAME).setMinimumOccurs(1).setMaximumOccurs(3);
return ftb.build();
}
@Override
public String toMIFSyntax(Feature feature) throws DataStoreException {
if(MIFUtils.getPropertySafe(feature, GEOM_NAME.toString()) != null) {
return jtsToMIFGeometry(feature);
} else if(MIFUtils.getGeometryValue(feature) instanceof Geometry) {
return jtsToMIFGeometry(feature);
} else {
throw new DataStoreException("Incompatible geometry type.");
}
}
private String jtsToMIFGeometry(Feature feature) throws DataStoreException {
final Object source = MIFUtils.getGeometryValue(feature);
for(MIFUtils.GeometryType gType : MIFUtils.GeometryType.values()) {
final Class[] bindings = gType.binding.getPossibleBindings();
for (int i=0 ; i < bindings.length; i++) {
if (bindings[i].isAssignableFrom(source.getClass())) {
return gType.binding.toMIFSyntax(feature);
}
}
}
throw new DataStoreException("Incompatible geometry type.");
}
@Override
public Class getGeometryBinding() {
return Geometry.class;
}
/**
* Here We set an empty array because this class should be use only as last resort.
* @return All possible matching types.
*/
@Override
public Class[] getPossibleBindings() {
return new Class[]{};
}
@Override
public GenericName getName() {
return NAME;
}
@Override
protected List<AttributeType> getAttributes() {
final AttributeType attType = new DefaultAttributeType(Collections.singletonMap("name", NAME), Feature.class, 1, 3, null);
return Collections.singletonList(attType);
}
}