1 package au.gov.amsa.ais.rx;
2
3 import java.util.HashMap;
4 import java.util.Map;
5 import java.util.Map.Entry;
6 import java.util.TreeMap;
7
8 public class CraftProperties {
9
10 private final Map<CraftPropertyName, TreeMap<Long, String>> map;
11
12 private final Mmsi mmsi;
13
14 public CraftProperties(Mmsi mmsi,
15 Map<CraftPropertyName, TreeMap<Long, String>> map) {
16 this.mmsi = mmsi;
17 this.map = map;
18 }
19
20 public CraftProperties(Mmsi mmsi) {
21 this(mmsi, new HashMap<CraftPropertyName, TreeMap<Long, String>>());
22 }
23
24 public Map<CraftPropertyName, TreeMap<Long, String>> getMap() {
25 return map;
26 }
27
28 public Mmsi getMmsi() {
29 return mmsi;
30 }
31
32 public CraftProperties add(CraftProperty p) {
33 Map<CraftPropertyName, TreeMap<Long, String>> m = new HashMap<>(map);
34 if (m.get(p.getName()) == null)
35 m.put(p.getName(), new TreeMap<Long, String>());
36 TreeMap<Long, String> tree = m.get(p.getName());
37 Entry<Long, String> before = tree.floorEntry(p.getTime());
38 Entry<Long, String> after = tree.ceilingEntry(p.getTime());
39 if (before != null && before.getValue().equals(p.getValue()))
40 return this;
41 else {
42
43 if (after != null && after.getValue().equals(p.getValue()))
44 tree.remove(after.getKey());
45 tree.put(p.getTime(), p.getValue());
46 }
47 return new CraftProperties(mmsi, m);
48 }
49 }