package au.gov.amsa.navigation.ais; import static com.google.common.base.Optional.fromNullable; import static com.google.common.base.Optional.of; import java.util.concurrent.ConcurrentHashMap; import au.gov.amsa.ais.message.AisPositionBExtended; import au.gov.amsa.ais.message.AisShipStaticA; import au.gov.amsa.navigation.Identifier; import au.gov.amsa.navigation.Mmsi; import au.gov.amsa.navigation.ais.Vessel.Builder; import com.google.common.base.Optional; public class VesselData { private ConcurrentHashMap<Identifier, Vessel> map = new ConcurrentHashMap<>(); public Optional<Vessel> get(Identifier id) { return Optional.fromNullable(map.get(id)); } public VesselData add(AisShipStaticA m, Optional<String> nmea) { Identifier id = new Mmsi(m.getMmsi()); // use atomic compare and set algorithm for non-blocking concurrency while (true) { Optional<Vessel> value = fromNullable(map.get(id)); final Optional<Vessel> v; if (!value.isPresent()) { v = of(Vessel.builder().mmsi(m.getMmsi()).build()); } else v = value; Builder builder = Vessel.from(v.get()); if (m.getImo().isPresent()) builder = builder.imo(m.getImo()); if (m.getDimensionA().isPresent()) builder = builder.dimensionA(m.getDimensionA()); if (m.getDimensionB().isPresent()) builder = builder.dimensionB(m.getDimensionB()); if (m.getDimensionC().isPresent()) builder = builder.dimensionC(m.getDimensionC()); if (m.getDimensionD().isPresent()) builder = builder.dimensionD(m.getDimensionD()); if (m.getLengthMetres().isPresent()) builder = builder.lengthMetres(m.getLengthMetres()); if (nmea.isPresent()) builder = builder.nmea(nmea); builder = builder.shipType(of(m.getShipType())); Vessel vessel = builder.build(); final boolean inserted; if (value.isPresent()) inserted = map.replace(id, v.get(), vessel); else inserted = map.putIfAbsent(id, vessel) == null; if (inserted) { return this; } } } public VesselData add(AisPositionBExtended message, Optional<String> line) { //TODO implement this return this; } }