package cz.agents.dbtokmlexporter.darptestbed.kmlitembuilder; import java.awt.Color; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; 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.factory.DescriptionFactory; import cz.agents.dbtokmlexporter.factory.TableColumnsDescriptionFactory; import cz.agents.dbtokmlexporter.factory.geometry.PointGeometryFactory; import cz.agents.dbtokmlexporter.factory.style.IconStyleFactory; import cz.agents.dbtokmlexporter.factory.style.StyleFactory; import cz.agents.dbtokmlexporter.kmlitem.NotificationKmlItem; import cz.agents.dbtokmlexporter.kmlitem.builder.KmlItemBuilder; import cz.agents.resultsvisio.kml.KmlItem; /** * * @author Marek Cuchy * */ public class RequestNotificationKmlItemBuilder extends KmlItemBuilder { private static final Logger logger = Logger.getLogger(RequestNotificationKmlItemBuilder.class); private String iconUrl; private final long notificationDuration; private final String[] notifiedRequestStatuses; // general constructor public RequestNotificationKmlItemBuilder(DatabaseConnection connection, String schemaName, long interval, String fileName, long notificationDuration, String iconUrl, String... notifiedRequestStatuses) { super(connection, schemaName, interval, fileName, true); this.notificationDuration = notificationDuration; this.notifiedRequestStatuses = notifiedRequestStatuses; this.iconUrl = iconUrl; } // SUCCESS notification constructor public static RequestNotificationKmlItemBuilder createSuccessNotificationKmlItemBuilder( DatabaseConnection connection, String schemaName, long interval, long notificationDuration) { return new RequestNotificationKmlItemBuilder(connection, schemaName, interval, "success_request_notification.kmz", notificationDuration, "data/success.png", "OUT_OF_VEHICLE"); } // FAIL notification constructor public static RequestNotificationKmlItemBuilder createFailNotificationKmlItemBuilder(DatabaseConnection connection, String schemaName, long interval, long notificationDuration) { return new RequestNotificationKmlItemBuilder(connection, schemaName, interval, "fail_request_notification.kmz", notificationDuration, "data/fail.png", "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.)"); List<String> additionalColumnNames = getAdditionalColumnNames(); DescriptionFactory descriptionFactory = new TableColumnsDescriptionFactory(additionalColumnNames); StyleFactory styleFactory = new IconStyleFactory(this.iconUrl, 0.75); NotificationKmlItem kmlItem = new NotificationKmlItem(styleFactory, new PointGeometryFactory(), notificationDuration); String sql = "SELECT * FROM " + schemaName + ".passengers ORDER BY agentid, from_time"; ResultSet resultSet = connection.executeQuery(sql); Record previousRecord; String description; if (resultSet.next()) { previousRecord = new Record(resultSet); description = descriptionFactory.createDescription(resultSet); if (ArrayUtils.contains(notifiedRequestStatuses, previousRecord.status)) { kmlItem.add(previousRecord.agentId, convertJTSCoordinatesToKmlCoordinates(previousRecord.point.getCoordinates()), previousRecord.time, description); } } 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(notifiedRequestStatuses, record.status) && !previousRecord.status.equals(record.status) && record.agentId.equals(previousRecord.agentId)) { kmlItem.add(record.agentId, convertJTSCoordinatesToKmlCoordinates(record.point.getCoordinates()), record.time, description); } if (ArrayUtils.contains(notifiedRequestStatuses, record.status) && !record.agentId.equals(previousRecord.agentId)) { kmlItem.add(record.agentId, convertJTSCoordinatesToKmlCoordinates(record.point.getCoordinates()), record.time, description); } previousRecord = record; description = descriptionFactory.createDescription(resultSet); } return kmlItem; } private static List<String> getAdditionalColumnNames() { List<String> additionalColumnNames = new ArrayList<>(); additionalColumnNames.add("agentid"); additionalColumnNames.add("request_status"); additionalColumnNames.add("request_departure_min"); additionalColumnNames.add("request_departure_max"); additionalColumnNames.add("request_arrival_min"); additionalColumnNames.add("request_arrival_max"); return additionalColumnNames; } private static class Record { public final Point point; public final String status; public final String agentId; public final long time; public Record(ResultSet resultSet) throws SQLException { super(); Geometry geometry = (Geometry) resultSet.getObject("geom"); this.point = (Point) geometry; this.status = resultSet.getString("request_status"); this.agentId = resultSet.getString("agentid"); this.time = resultSet.getTimestamp("from_time").getTime(); } @Override public String toString() { return "Record [point=" + point + ", status=" + status + ", agentId=" + agentId + ", time=" + time + "]"; } } }