package cz.agents.dbtokmlexporter.darptestbed.kmlitembuilder;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.commons.lang.ArrayUtils;
import org.apache.log4j.Logger;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.Point;
import cz.agents.agentpolis.tools.geovisio.database.connection.DatabaseConnection;
import cz.agents.dbtokmlexporter.HeatMapKmlItem;
import cz.agents.dbtokmlexporter.kmlitem.builder.KmlItemBuilder;
import cz.agents.resultsvisio.kml.KmlItem;
/**
*
* @author Marek Cuchy
*
*/
public class RequestHeatMapKmlItemBuilder extends KmlItemBuilder {
private static final Logger logger = Logger.getLogger(RequestHeatMapKmlItemBuilder.class);
private final String[] heatmapRequestStatuses;
public RequestHeatMapKmlItemBuilder(DatabaseConnection connection, String schemaName, long interval,
String fileName, String... heatmapRequestStatuses) {
super(connection, schemaName, interval, fileName, true);
this.heatmapRequestStatuses = heatmapRequestStatuses;
}
public static RequestHeatMapKmlItemBuilder createSuccessRequestHeatMapKmlItemBuilder(DatabaseConnection connection,
String schemaName, long interval) {
return new RequestHeatMapKmlItemBuilder(connection, schemaName, interval, "heatmap_successful.kmz",
"OUT_OF_VEHICLE");
}
public static RequestHeatMapKmlItemBuilder createFailRequestHeatMapKmlItemBuilder(DatabaseConnection connection,
String schemaName, long interval) {
return new RequestHeatMapKmlItemBuilder(connection, schemaName, interval, "heatmap_failed.kmz",
"OUT_OF_VEHICLE_WITH_DELAYED_ARRIVAL", "REJECTED");
}
@Override
public KmlItem buildKmlItem() throws SQLException {
logger.info("Preparing visualizations: " + this.getClass().getSimpleName()
+ " (This may take a while. Please wait.)");
HeatMapKmlItem kmlItem = new HeatMapKmlItem(schemaName);
String sql = "SELECT * FROM " + schemaName + ".passengers ORDER BY agentid, from_time";
ResultSet resultSet = connection.executeQuery(sql);
Record previousRecord;
if (resultSet.next()) {
previousRecord = new Record(resultSet);
if (ArrayUtils.contains(heatmapRequestStatuses, previousRecord.status)) {
kmlItem.addPoint(previousRecord.point);
}
} else {
logger.warn("Request heatmap can't be built. Passenger logs are empty.");
return kmlItem;
}
while (resultSet.next()) {
Record record = new Record(resultSet);
if (ArrayUtils.contains(heatmapRequestStatuses, record.status)
&& !previousRecord.status.equals(record.status) && record.agentId.equals(previousRecord.agentId)) {
kmlItem.addPoint(record.point);
}
if (ArrayUtils.contains(heatmapRequestStatuses, record.status)
&& !record.agentId.equals(previousRecord.agentId)) {
kmlItem.addPoint(record.point);
}
previousRecord = record;
}
return kmlItem;
}
private static class Record {
public final Point point;
public final String status;
public final long time;
public final String agentId;
public Record(ResultSet resultSet) throws SQLException {
super();
Geometry geometry = (Geometry) resultSet.getObject("geom");
this.point = (Point) geometry;
this.status = resultSet.getString("request_status");
this.time = resultSet.getTimestamp("from_time").getTime();
this.agentId = resultSet.getString("agentid");
}
@Override
public String toString() {
return "Record [point=" + point + ", status=" + status + ", time=" + time + ", agentId=" + agentId + "]";
}
}
}