Added synchronized and fixed handler registration to maps

This commit is contained in:
Papick Garcia Taboada
2016-04-05 10:36:37 +02:00
parent b032b56b73
commit 412d667dff
2 changed files with 27 additions and 30 deletions
@@ -1,5 +1,6 @@
package com.sap.sailing.domain.racelogtracking.impl;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
@@ -10,10 +11,8 @@ import com.sap.sailing.domain.tracking.RaceListener;
import com.sap.sailing.domain.tracking.TrackedRace;
public class RegattaLogSensorDataTracker {
private final ConcurrentHashMap<RegattaAndRaceIdentifier, DynamicTrackedRace> knownTrackedRaces = new ConcurrentHashMap<>();
private final ConcurrentHashMap<RegattaAndRaceIdentifier, RaceLogSensorDataTracker> dataTrackers = new ConcurrentHashMap<>();
private final Map<RegattaAndRaceIdentifier, DynamicTrackedRace> knownTrackedRaces = new ConcurrentHashMap<>();
private final Map<RegattaAndRaceIdentifier, RaceLogSensorDataTracker> dataTrackers = new ConcurrentHashMap<>();
private final DynamicTrackedRegatta trackedRegatta;
private final RaceListener raceListener;
private final SensorFixStore sensorFixStore;
@@ -26,36 +25,34 @@ public class RegattaLogSensorDataTracker {
public void raceRemoved(TrackedRace trackedRace) {
RegattaLogSensorDataTracker.this.raceRemoved(trackedRace);
}
@Override
public void raceAdded(TrackedRace trackedRace) {
RegattaLogSensorDataTracker.this.raceAdded(trackedRace);
}
};
trackedRegatta.addRaceListener(raceListener);
}
public void raceRemoved(TrackedRace trackedRace) {
removeRaceLogSensorDataTracker(trackedRace.getRaceIdentifier());
}
public void raceAdded(TrackedRace trackedRace) {
public synchronized void raceAdded(TrackedRace trackedRace) {
if (trackedRace instanceof DynamicTrackedRace) {
DynamicTrackedRace dynamicTrackedRace = (DynamicTrackedRace) trackedRace;
RegattaAndRaceIdentifier raceIdentifier = dynamicTrackedRace.getRaceIdentifier();
DynamicTrackedRace existingRace = knownTrackedRaces.putIfAbsent(raceIdentifier, dynamicTrackedRace);
DynamicTrackedRace existingRace = knownTrackedRaces.get(raceIdentifier);
if (existingRace != null) {
removeRaceLogSensorDataTracker(raceIdentifier);
} else {
RaceLogSensorDataTracker dataTracker = new RaceLogSensorDataTracker(
(DynamicTrackedRace) trackedRace, trackedRegatta,
sensorFixStore);
dataTrackers.put(raceIdentifier, dataTracker);
}
RaceLogSensorDataTracker dataTracker = new RaceLogSensorDataTracker((DynamicTrackedRace) trackedRace,
trackedRegatta, sensorFixStore);
dataTrackers.put(raceIdentifier, dataTracker);
}
}
public void stop() {
public synchronized void stop() {
trackedRegatta.removeRaceListener(raceListener);
knownTrackedRaces.keySet().forEach(raceIdentifier -> {
removeRaceLogSensorDataTracker(raceIdentifier);
@@ -71,5 +68,4 @@ public class RegattaLogSensorDataTracker {
dataTrackers.remove(currentActiveDataTracker);
}
}
}
@@ -1,7 +1,9 @@
package com.sap.sailing.domain.racelogtracking.impl;
import java.io.Serializable;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Logger;
import org.osgi.util.tracker.ServiceTracker;
@@ -11,10 +13,10 @@ import com.sap.sailing.domain.tracking.TrackedRegattaListener;
import com.sap.sailing.server.RacingEventService;
public class RegattaLogSensorDataTrackerTrackedRegattaListener implements TrackedRegattaListener {
private final ConcurrentHashMap<Serializable, TrackedRegatta> knownRegattas = new ConcurrentHashMap<Serializable, TrackedRegatta>();
private final ConcurrentHashMap<Serializable, RegattaLogSensorDataTracker> registeredTrackers = new ConcurrentHashMap<Serializable, RegattaLogSensorDataTracker>();
private static final Logger log = Logger.getLogger(RegattaLogSensorDataTrackerTrackedRegattaListener.class
.getName());
private final Map<Serializable, TrackedRegatta> knownRegattas = new ConcurrentHashMap<Serializable, TrackedRegatta>();
private final Map<Serializable, RegattaLogSensorDataTracker> registeredTrackers = new ConcurrentHashMap<Serializable, RegattaLogSensorDataTracker>();
private final ServiceTracker<RacingEventService, RacingEventService> racingEventServiceTracker;
public RegattaLogSensorDataTrackerTrackedRegattaListener(
@@ -28,16 +30,13 @@ public class RegattaLogSensorDataTrackerTrackedRegattaListener implements Tracke
if (knownRegattas.putIfAbsent(regattaId, trackedRegatta) == null) {
synchronized (knownRegattas) {
RegattaLogSensorDataTracker tracker = null;
try {
tracker = new RegattaLogSensorDataTracker((DynamicTrackedRegatta) trackedRegatta,
racingEventServiceTracker.getService().getSensorFixStore());
registeredTrackers.put(regattaId, tracker);
} finally {
if (tracker != null) {
tracker.stop();
}
}
tracker = new RegattaLogSensorDataTracker((DynamicTrackedRegatta) trackedRegatta,
racingEventServiceTracker.getService().getSensorFixStore());
registeredTrackers.put(regattaId, tracker);
log.fine("Added sensor data tracker to tracked regatta: " + trackedRegatta.getRegatta().getName());
}
} else {
log.warning("Regatta already known, not adding sensor twice");
}
}
@@ -47,7 +46,9 @@ public class RegattaLogSensorDataTrackerTrackedRegattaListener implements Tracke
Serializable regattaId = trackedRegatta.getRegatta().getId();
try {
RegattaLogSensorDataTracker tracker = registeredTrackers.get(trackedRegatta.getRegatta().getId());
tracker.stop();
if (tracker != null) {
tracker.stop();
}
} finally {
knownRegattas.remove(regattaId);
registeredTrackers.remove(regattaId);