package com.revolsys.gis.converter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.springframework.core.convert.converter.Converter;
import com.revolsys.geometry.model.Geometry;
import com.revolsys.geometry.model.GeometryFactory;
import com.revolsys.gis.converter.process.SourceToTargetProcess;
import com.revolsys.record.Record;
import com.revolsys.record.RecordFactory;
import com.revolsys.record.schema.RecordDefinition;
import com.revolsys.util.Strings;
public class SimpleRecordConveter implements Converter<Record, Record> {
private RecordFactory factory;
private List<SourceToTargetProcess<Record, Record>> processors = new ArrayList<>();
private RecordDefinition recordDefinition;
public SimpleRecordConveter() {
}
public SimpleRecordConveter(final RecordDefinition recordDefinition) {
setRecordDefinition(recordDefinition);
}
public SimpleRecordConveter(final RecordDefinition recordDefinition,
final List<SourceToTargetProcess<Record, Record>> processors) {
setRecordDefinition(recordDefinition);
this.processors = processors;
}
public SimpleRecordConveter(final RecordDefinition recordDefinition,
final SourceToTargetProcess<Record, Record>... processors) {
this(recordDefinition, Arrays.asList(processors));
}
public void addProcessor(final SourceToTargetProcess<Record, Record> processor) {
this.processors.add(processor);
}
@Override
public Record convert(final Record sourceObject) {
final Record targetObject = this.factory.newRecord(this.recordDefinition);
final Geometry sourceGeometry = sourceObject.getGeometry();
final GeometryFactory geometryFactory = sourceGeometry.getGeometryFactory();
final Geometry targetGeometry = geometryFactory.geometry(sourceGeometry);
targetObject.setGeometryValue(targetGeometry);
for (final SourceToTargetProcess<Record, Record> processor : this.processors) {
processor.process(sourceObject, targetObject);
}
return targetObject;
}
public List<SourceToTargetProcess<Record, Record>> getProcessors() {
return this.processors;
}
public RecordDefinition getRecordDefinition() {
return this.recordDefinition;
}
public void setProcessors(final List<SourceToTargetProcess<Record, Record>> processors) {
this.processors = processors;
}
public void setRecordDefinition(final RecordDefinition recordDefinition) {
this.recordDefinition = recordDefinition;
this.factory = recordDefinition.getRecordFactory();
}
@Override
public String toString() {
return this.recordDefinition.getPath() + "\n " + Strings.toString("\n ", this.processors);
}
}