package com.revolsys.gis.esri.gdb.file.test;
import java.io.File;
import java.util.List;
import org.junit.Assert;
import com.revolsys.datatype.DataType;
import com.revolsys.datatype.DataTypes;
import com.revolsys.geometry.model.Geometry;
import com.revolsys.geometry.model.GeometryFactory;
import com.revolsys.geometry.model.LinearRing;
import com.revolsys.geometry.model.Polygonal;
import com.revolsys.geometry.test.model.TestUtil;
import com.revolsys.gis.esri.gdb.file.FileGdbRecordStore;
import com.revolsys.gis.esri.gdb.file.FileGdbRecordStoreFactory;
import com.revolsys.io.FileUtil;
import com.revolsys.io.IoConstants;
import com.revolsys.io.PathName;
import com.revolsys.io.Reader;
import com.revolsys.io.Writer;
import com.revolsys.record.Record;
import com.revolsys.record.schema.RecordDefinitionImpl;
import junit.framework.Test;
import junit.framework.TestSuite;
public class FileGdbIoTest {
public static void doWriteReadTest(GeometryFactory geometryFactory, final DataType dataType,
Geometry geometry) {
if (geometry.isEmpty() || geometryFactory.getAxisCount() == 4) {
return;
}
geometryFactory = GeometryFactory.fixed(geometryFactory.getCoordinateSystemId(),
geometryFactory.getAxisCount(), 10000000.0, 10000000.0);
geometry = geometry.convertGeometry(geometryFactory);
final String geometryTypeString = dataType.toString();
String name = "/tmp/revolsystest/io/gdb/" + geometryTypeString + "_"
+ geometryFactory.getAxisCount();
if (geometry.isGeometryCollection()) {
name += "_" + geometry.getGeometryCount();
}
if (geometry instanceof Polygonal) {
name += "_" + geometry.getGeometryComponents(LinearRing.class).size();
}
final File file = new File(name + "_" + geometry.getVertexCount() + ".gdb");
FileUtil.deleteDirectory(file);
file.getParentFile().mkdirs();
try (
final FileGdbRecordStore recordStore = FileGdbRecordStoreFactory.newRecordStore(file)) {
recordStore.setCreateMissingTables(true);
recordStore.setCreateMissingRecordStore(true);
recordStore.initialize();
final PathName typePath = PathName.newPathName("/" + geometryTypeString);
final RecordDefinitionImpl recordDefinition = new RecordDefinitionImpl(typePath);
recordDefinition.addField("ID", DataTypes.INT, true);
recordDefinition.addField("NAME", DataTypes.STRING, 50, false);
recordDefinition.addField("GEOMETRY", dataType, true);
recordDefinition.setGeometryFactory(geometryFactory);
recordStore.getRecordDefinition(recordDefinition);
try (
Writer<Record> writer = recordStore.newRecordWriter()) {
writer.setProperty(IoConstants.GEOMETRY_FACTORY, geometryFactory);
writer.setProperty(IoConstants.GEOMETRY_TYPE, dataType);
final Record record = recordStore.newRecord(typePath);
record.setValue("ID", 1);
record.setGeometryValue(geometry);
writer.write(record);
}
try (
Reader<Record> reader = recordStore.getRecords(typePath)) {
final List<Record> objects = reader.toList();
Assert.assertEquals("Geometry Count", 1, objects.size());
final Geometry actual = objects.get(0).getGeometry();
Assert.assertEquals("Empty", geometry.isEmpty(), actual.isEmpty());
if (!geometry.isEmpty()) {
final int axisCount = geometry.getAxisCount();
Assert.assertEquals("Axis Count", axisCount, actual.getAxisCount());
if (!actual.equals(axisCount, geometry)) {
// Allow for conversion of multi part to single part
if (geometry.getGeometryCount() != 1
|| !actual.equals(axisCount, geometry.getGeometry(0))) {
TestUtil.failNotEquals("Geometry Equal Exact", geometry, actual);
}
}
}
}
}
}
public static Test suite() {
final TestSuite suite = new TestSuite("File GDB Geometry");
// RecordIoTestSuite.addWriteReadTest(suite, "File GDB",
// FileGdbIoTest.class, "doWriteReadTest");
return suite;
}
}