package storm.applications.spout.parser; import com.google.common.collect.ImmutableList; import storm.applications.util.stream.StreamValues; import java.util.Date; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * * @author Maycon Viana Bordin <mayconbordin@gmail.com> */ public class DublinBusTraceParser extends Parser { private static final Logger LOG = LoggerFactory.getLogger(DublinBusTraceParser.class); private static final int TIMESTAMP_FIELD = 0; private static final int LINE_ID_FIELD = 1; private static final int DIRECTION_FIELD = 2; private static final int JOURNEY_PATTERN_ID_FIELD = 3; private static final int TIME_FRAME_FIELD = 4; private static final int VEHICLE_JOURNEY_ID_FIELD = 5; private static final int OPERATOR_FIELD = 6; private static final int CONGESTION_FIELD = 7; private static final int LONGITUDE_FIELD = 8; private static final int LATITUDE_FIELD = 9; private static final int DELAY_FIELD = 10; private static final int BLOCK_ID_FIELD = 11; private static final int VEHICLE_ID_FIELD = 12; private static final int STOP_ID_FIELD = 13; private static final int AT_STOP_FIELD = 14; @Override public List<StreamValues> parse(String input) { String[] fields = input.split(","); if (fields.length != 7) return null; try { String carId = fields[VEHICLE_ID_FIELD]; Date date = new Date(Long.parseLong(fields[TIMESTAMP_FIELD])/1000); boolean occ = true; double lat = Double.parseDouble(fields[LATITUDE_FIELD]); double lon = Double.parseDouble(fields[LONGITUDE_FIELD]); int speed = 0; int bearing = Integer.parseInt(fields[DIRECTION_FIELD]); int msgId = String.format("%s:%s", carId, date.toString()).hashCode(); StreamValues values = new StreamValues(carId, date, occ, speed, bearing, lat, lon); values.setMessageId(msgId); return ImmutableList.of(values); } catch (NumberFormatException ex) { LOG.warn("Error parsing numeric value", ex); } catch (IllegalArgumentException ex) { LOG.warn("Error parsing date/time value", ex); } return null; } }