package au.gov.amsa.navigation.ais;
import rx.functions.Func2;
import au.gov.amsa.ais.AisMessage;
import au.gov.amsa.ais.message.AisPositionBExtended;
import au.gov.amsa.ais.message.AisShipStaticA;
import au.gov.amsa.ais.rx.Streams.TimestampedAndLine;
import com.google.common.base.Optional;
public final class AisMessageAndVesselData {
private Optional<TimestampedAndLine<AisMessage>> message;
private VesselData data;
public AisMessageAndVesselData(Optional<TimestampedAndLine<AisMessage>> message, VesselData data) {
this.message = message;
this.data = data;
}
public AisMessageAndVesselData() {
this(Optional.<TimestampedAndLine<AisMessage>> absent(), new VesselData());
}
public Optional<TimestampedAndLine<AisMessage>> message() {
return message;
}
public VesselData data() {
return data;
}
public static Func2<AisMessageAndVesselData, TimestampedAndLine<AisMessage>, AisMessageAndVesselData> aggregate = (
messageAndData, message) -> {
if (!message.getMessage().isPresent())
throw new RuntimeException("unexpected");
Optional<String> line = Optional.of(message.getLine());
AisMessage m = message.getMessage().get().message();
if (m instanceof AisShipStaticA)
return new AisMessageAndVesselData(Optional.of(message), messageAndData.data().add(
(AisShipStaticA) m, line));
else if (m instanceof AisPositionBExtended)
return new AisMessageAndVesselData(Optional.of(message), messageAndData.data().add(
(AisPositionBExtended) m, line));
else
return new AisMessageAndVesselData(Optional.of(message), messageAndData.data());
};
}