package com.revolsys.geometry.graph.process;
import java.util.ArrayList;
import java.util.List;
import com.revolsys.geometry.graph.Edge;
import com.revolsys.geometry.graph.RecordGraph;
import com.revolsys.geometry.model.Geometry;
import com.revolsys.geometry.model.GeometryFactory;
import com.revolsys.geometry.model.LineString;
import com.revolsys.logging.Logs;
import com.revolsys.parallel.channel.Channel;
import com.revolsys.parallel.process.BaseInOutProcess;
import com.revolsys.record.Record;
import com.revolsys.util.ObjectProcessor;
public class GraphProcessor extends BaseInOutProcess<Record, Record> {
private RecordGraph graph;
private GeometryFactory precisionModel;
private List<ObjectProcessor<RecordGraph>> processors = new ArrayList<>();
public GeometryFactory getPrecisionModel() {
return this.precisionModel;
}
public List<ObjectProcessor<RecordGraph>> getProcessors() {
return this.processors;
}
@Override
protected void init() {
super.init();
this.graph = new RecordGraph();
if (this.precisionModel != null) {
this.graph.setPrecisionModel(this.precisionModel);
}
}
@Override
protected void postRun(final Channel<Record> in, final Channel<Record> out) {
if (out != null) {
processGraph();
for (final Edge<Record> edge : this.graph.getEdges()) {
final Record object = edge.getObject();
out.write(object);
}
}
}
@Override
protected void process(final Channel<Record> in, final Channel<Record> out, final Record object) {
final Geometry geometry = object.getGeometry();
if (geometry instanceof LineString) {
final LineString line = (LineString)geometry;
this.graph.addEdge(object, line);
} else {
if (out != null) {
out.write(object);
}
}
}
private void processGraph() {
if (this.graph != null) {
for (final ObjectProcessor<RecordGraph> processor : this.processors) {
Logs.info(this, processor.getClass().getName());
processor.process(this.graph);
}
}
}
public void setPrecisionModel(final GeometryFactory precisionModel) {
this.precisionModel = precisionModel;
}
public void setProcessors(final List<ObjectProcessor<RecordGraph>> processors) {
this.processors = processors;
}
}