From f7f95ed9ecbb01c5e10b51f7f2f54642e12e9df2 Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Wed, 1 Jun 2016 10:22:22 +0200 Subject: [PATCH] Code simplifications by integrating threading logic in the abstract loader --- .../impl/FixLoadingTask.java | 79 ------------------- .../logtracker/AbstractRaceLogFixTracker.java | 75 +++++++++++++++--- 2 files changed, 65 insertions(+), 89 deletions(-) delete mode 100644 java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogsensortracking/impl/FixLoadingTask.java diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogsensortracking/impl/FixLoadingTask.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogsensortracking/impl/FixLoadingTask.java deleted file mode 100644 index b53d5537eb0..00000000000 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogsensortracking/impl/FixLoadingTask.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.sap.sailing.domain.racelogsensortracking.impl; - -import java.util.logging.Logger; - -import com.sap.sailing.domain.common.TrackedRaceStatusEnum; -import com.sap.sailing.domain.racelog.tracking.GPSFixStore; -import com.sap.sailing.domain.tracking.DynamicTrackedRace; -import com.sap.sailing.domain.tracking.TrackingDataLoader; -import com.sap.sailing.domain.tracking.impl.TrackedRaceStatusImpl; -import com.sap.sse.concurrent.LockUtil; -import com.sap.sse.concurrent.NamedReentrantReadWriteLock; - -public class FixLoadingTask implements TrackingDataLoader { - private static final Logger logger = Logger.getLogger(FixLoadingTask.class.getName()); - - private final NamedReentrantReadWriteLock loadingFromFixStoreLock; - private final DynamicTrackedRace trackedRace; - private boolean loadingFromGPSFixStore; - - public FixLoadingTask(DynamicTrackedRace trackedRace, String lockName) { - this.trackedRace = trackedRace; - loadingFromFixStoreLock = new NamedReentrantReadWriteLock(lockName, false); - } - - public void loadFixesForLog(Runnable loadingAction, String description) { - Thread t = new Thread(description) { - @Override - public void run() { - trackedRace.lockForSerializationRead(); - setStatusAndProgress(TrackedRaceStatusEnum.LOADING, 0.5); - LockUtil.lockForWrite(loadingFromFixStoreLock); - synchronized (FixLoadingTask.this) { - loadingFromGPSFixStore = true; // indicates that the serialization lock is now safely held - FixLoadingTask.this.notifyAll(); - } - - try { - loadingAction.run(); - } finally { - synchronized (FixLoadingTask.this) { - loadingFromGPSFixStore = false; - FixLoadingTask.this.notifyAll(); - } - LockUtil.unlockAfterWrite(loadingFromFixStoreLock); - setStatusAndProgress(TrackedRaceStatusEnum.TRACKING, 1.0); - trackedRace.unlockAfterSerializationRead(); - logger.info("Thread "+getName()+" done."); - } - } - }; - t.start(); -// if (waitForGPSFixesToLoad) { -// try { -// t.join(); -// } catch (InterruptedException e) { -// logger.log(Level.WARNING, "Got interrupted while waiting for loading of GPS fixes from log "+log+" to finish", e); -// } -// } - } - - public synchronized void waitForLoadingFromGPSFixStoreToFinishRunning() throws InterruptedException { - while (loadingFromGPSFixStore) { - wait(); - } - } - - /** - * Tells if currently the race is loading GPS fixes from the {@link GPSFixStore}. Clients may {@link Object#wait()} on this - * object and will be notified whenever a change of this flag's value occurs. - */ - public boolean isLoadingFromGPSFixStore() { - return loadingFromGPSFixStore; - } - - private void setStatusAndProgress(TrackedRaceStatusEnum status, double progress) { - trackedRace.onStatusChanged(this, new TrackedRaceStatusImpl(status, progress)); - } - -} diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/logtracker/AbstractRaceLogFixTracker.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/logtracker/AbstractRaceLogFixTracker.java index 143bb6c3039..ba125967ea8 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/logtracker/AbstractRaceLogFixTracker.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/logtracker/AbstractRaceLogFixTracker.java @@ -8,14 +8,19 @@ import java.util.logging.Logger; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; -import com.sap.sailing.domain.racelogsensortracking.impl.FixLoadingTask; +import com.sap.sailing.domain.common.TrackedRaceStatusEnum; +import com.sap.sailing.domain.racelog.tracking.GPSFixStore; import com.sap.sailing.domain.tracking.DynamicTrackedRace; import com.sap.sailing.domain.tracking.DynamicTrackedRegatta; import com.sap.sailing.domain.tracking.RegattaLogAttachmentListener; +import com.sap.sailing.domain.tracking.TrackingDataLoader; import com.sap.sailing.domain.tracking.impl.AbstractRaceChangeListener; +import com.sap.sailing.domain.tracking.impl.TrackedRaceStatusImpl; import com.sap.sse.common.TimePoint; +import com.sap.sse.concurrent.LockUtil; +import com.sap.sse.concurrent.NamedReentrantReadWriteLock; -public abstract class AbstractRaceLogFixTracker { +public abstract class AbstractRaceLogFixTracker implements TrackingDataLoader { private static final Logger logger = Logger.getLogger(AbstractRaceLogFixTracker.class.getName()); protected final DynamicTrackedRegatta trackedRegatta; @@ -23,7 +28,8 @@ public abstract class AbstractRaceLogFixTracker { private final Set knownRegattaLogs = new HashSet<>(); - private final FixLoadingTask fixLoadingTask; + private final NamedReentrantReadWriteLock loadingFromFixStoreLock; + private boolean loadingFromGPSFixStore; // TODO: move to AbstractRaceLogFixTracker private final RegattaLogAttachmentListener regattaLogAttachmentListener = new RegattaLogAttachmentListener() { @@ -65,12 +71,12 @@ public abstract class AbstractRaceLogFixTracker { this.trackedRegatta = trackedRegatta; this.trackedRace = trackedRace; - this.fixLoadingTask = new FixLoadingTask(trackedRace, fixLoadingLockName); + loadingFromFixStoreLock = new NamedReentrantReadWriteLock(fixLoadingLockName, false); } protected void waitForLoadingFromFixStoreToFinishRunning() { try { - fixLoadingTask.waitForLoadingFromGPSFixStoreToFinishRunning(); + waitForLoadingFromGPSFixStoreToFinishRunning(); } catch (InterruptedException e) { logger.log(Level.WARNING, "Interrupted while waiting for Fixes to be loaded", e); } @@ -118,11 +124,6 @@ public abstract class AbstractRaceLogFixTracker { waitForLoadingFromFixStoreToFinishRunning(); } } - - protected void updateMappingsAndAddListeners() { - fixLoadingTask.loadFixesForLog(this::updateMappingsAndAddListenersImpl, - "Mongo sensor track loader for tracked race " + trackedRace.getRace().getName()); - } protected abstract void updateMappingsAndAddListenersImpl(); @@ -138,4 +139,58 @@ public abstract class AbstractRaceLogFixTracker { knownRegattaLogs.clear(); } } + + protected void updateMappingsAndAddListeners() { + Thread t = new Thread(this.getClass().getSimpleName() + " loader for tracked race " + trackedRace.getRace().getName()) { + @Override + public void run() { + trackedRace.lockForSerializationRead(); + setStatusAndProgress(TrackedRaceStatusEnum.LOADING, 0.5); + LockUtil.lockForWrite(loadingFromFixStoreLock); + synchronized (AbstractRaceLogFixTracker.this) { + loadingFromGPSFixStore = true; // indicates that the serialization lock is now safely held + AbstractRaceLogFixTracker.this.notifyAll(); + } + + try { + updateMappingsAndAddListenersImpl(); + } finally { + synchronized (AbstractRaceLogFixTracker.this) { + loadingFromGPSFixStore = false; + AbstractRaceLogFixTracker.this.notifyAll(); + } + LockUtil.unlockAfterWrite(loadingFromFixStoreLock); + setStatusAndProgress(TrackedRaceStatusEnum.TRACKING, 1.0); + trackedRace.unlockAfterSerializationRead(); + logger.info("Thread "+getName()+" done."); + } + } + }; + t.start(); +// if (waitForGPSFixesToLoad) { +// try { +// t.join(); +// } catch (InterruptedException e) { +// logger.log(Level.WARNING, "Got interrupted while waiting for loading of GPS fixes from log "+log+" to finish", e); +// } +// } + } + + private synchronized void waitForLoadingFromGPSFixStoreToFinishRunning() throws InterruptedException { + while (loadingFromGPSFixStore) { + wait(); + } + } + + /** + * Tells if currently the race is loading GPS fixes from the {@link GPSFixStore}. Clients may {@link Object#wait()} on this + * object and will be notified whenever a change of this flag's value occurs. + */ + public boolean isLoadingFromGPSFixStore() { + return loadingFromGPSFixStore; + } + + private void setStatusAndProgress(TrackedRaceStatusEnum status, double progress) { + trackedRace.onStatusChanged(this, new TrackedRaceStatusImpl(status, progress)); + } }