package au.gov.amsa.ais;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import au.gov.amsa.util.nmea.NmeaMessage;
import au.gov.amsa.util.nmea.NmeaReader;
import au.gov.amsa.util.nmea.NmeaUtil;
public class TstUtil {
static void handleAisStream(InputStream is, PrintStream messagesWithTimestamp, PrintStream out,
PrintStream console) throws IOException {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
DecimalFormat df = new DecimalFormat("00");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line;
while ((line = br.readLine()) != null) {
out.println(line);
messagesWithTimestamp.println(line + "," + System.currentTimeMillis());
try {
AisNmeaMessage nmea = new AisNmeaMessage(line);
Timestamped<AisMessage> message = nmea.getTimestampedMessage();
out.println(message);
out.println("talker=" + nmea.getTalker().getDescription());
if (message.message().getMessageId() <= 3 && message.message().getMessageId() > 0) {
Communications comms = ((HasCommunications) message.message()).getCommunications();
if (comms.getMinutesUtc() != null) {
String commsTime = df.format(comms.getHourUtc()) + ":"
+ df.format(comms.getMinuteUtc());
String arrivalTime = sdf.format(new Date(message.time()));
String output = "comms,arrival=" + commsTime + "," + arrivalTime;
if (!commsTime.equals(arrivalTime)) {
console.println(output + " " + line);
}
out.println(output + "\t" + line);
}
}
} catch (RuntimeException e) {
out.println("-------------- ERROR: " + e.getMessage());
}
}
br.close();
}
public static String insertNewLines(Object s) {
return s.toString().replaceAll(",", ",\n");
}
static NmeaStreamProcessorListener createLoggingListener(final PrintStream out) {
return new NmeaStreamProcessorListener() {
int count = 0;
@Override
public void message(String line, long time) {
count++;
out.println(count + " " + line + " -> " + new Date(time));
}
@Override
public void timestampNotFound(String line, Long arrivalTime) {
String commsDate = "";
String className = "";
try {
AisNmeaMessage nmea = new AisNmeaMessage(line);
AisMessage message = nmea.getMessage();
className = message.getClass().getSimpleName();
if (message instanceof HasCommunications) {
Communications comms = ((HasCommunications) message).getCommunications();
if (comms.getMinutesUtc() != null) {
DecimalFormat df = new DecimalFormat("00");
commsDate = df.format(comms.getHourUtc()) + ":"
+ df.format(comms.getMinuteUtc());
}
}
} catch (AisParseException e) {
}
out.println(count++ + " " + line + " -> " + new Date(arrivalTime) + " NOT FOUND "
+ className + " " + commsDate);
}
@Override
public void invalidNmea(String line, long arrivalTime, String message) {
out.println("invalid nmea: " + line);
}
};
}
static void process(NmeaReader con, NmeaStreamProcessorListener listener, final PrintStream out) {
NmeaStreamProcessor p = new NmeaStreamProcessor(listener, true);
for (String line : con.read()) {
// System.out.println(line);
NmeaMessage nmea = NmeaUtil.parseNmea(line);
long time = Long.parseLong(nmea.getItems().get(nmea.getItems().size() - 1));
int i = line.lastIndexOf(",");
p.line(line.substring(0, i), time);
}
out.println("buffer remaining=" + p.getBuffer().size());
out.println("buffer=");
for (LineAndTime s : p.getBuffer())
out.println(s);
}
}