java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/NOAADeclinationImportTest.java
... ...
@@ -1,9 +1,11 @@
1 1
package com.sap.sailing.declination.test;
2 2
3 3
import org.junit.jupiter.api.BeforeEach;
4
+import org.junit.jupiter.api.Disabled;
4 5
5 6
import com.sap.sailing.declination.impl.NOAAImporterForTesting;
6 7
8
+@Disabled("US Government Shutdown around 2025-10-01")
7 9
public class NOAADeclinationImportTest extends DeclinationImportTest<NOAAImporterForTesting> {
8 10
@BeforeEach
9 11
public void setUp() {
java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/NOAADeclinationServiceTest.java
... ...
@@ -1,9 +1,11 @@
1 1
package com.sap.sailing.declination.test;
2 2
3 3
import org.junit.jupiter.api.BeforeEach;
4
+import org.junit.jupiter.api.Disabled;
4 5
5 6
import com.sap.sailing.declination.impl.NOAAImporter;
6 7
8
+@Disabled("US Government Shutdown around 2025-10-01")
7 9
public class NOAADeclinationServiceTest extends DeclinationServiceTest<NOAAImporter> {
8 10
@Override
9 11
@BeforeEach
java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/NOAADeclinationStoreTest.java
... ...
@@ -1,9 +1,11 @@
1 1
package com.sap.sailing.declination.test;
2 2
3 3
import org.junit.jupiter.api.BeforeEach;
4
+import org.junit.jupiter.api.Disabled;
4 5
5 6
import com.sap.sailing.declination.impl.NOAAImporter;
6 7
8
+@Disabled("US Government Shutdown around 2025-10-01")
7 9
public class NOAADeclinationStoreTest extends DeclinationStoreTest<NOAAImporter> {
8 10
@Override
9 11
@BeforeEach
java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/NOAASimpleDeclinationTest.java
... ...
@@ -1,9 +1,11 @@
1 1
package com.sap.sailing.declination.test;
2 2
3 3
import org.junit.jupiter.api.BeforeEach;
4
+import org.junit.jupiter.api.Disabled;
4 5
5 6
import com.sap.sailing.declination.impl.NOAAImporter;
6 7
8
+@Disabled("US Government Shutdown around 2025-10-01")
7 9
public class NOAASimpleDeclinationTest extends SimpleDeclinationTest<NOAAImporter> {
8 10
@BeforeEach
9 11
public void setUp() {
java/com.sap.sailing.domain.swisstimingadapter.test/src/com/sap/sailing/domain/swisstimingadapter/test/ui/EditCAM.java
... ...
@@ -56,9 +56,7 @@ public class EditCAM extends javax.swing.JDialog {
56 56
*/
57 57
58 58
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
59
- @SuppressWarnings("serial")
60 59
private void initComponents() {
61
-
62 60
jLabel1 = new javax.swing.JLabel();
63 61
jRaceID = new javax.swing.JTextField();
64 62
jSeparator1 = new javax.swing.JSeparator();
... ...
@@ -73,46 +71,33 @@ public class EditCAM extends javax.swing.JDialog {
73 71
jButton3 = new javax.swing.JButton();
74 72
jScrollPane1 = new javax.swing.JScrollPane();
75 73
jMarkList = new javax.swing.JList<ClockAtMarkElement>();
76
-
77 74
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
78
-
79 75
jLabel1.setText("Race ID:");
80
-
81 76
jRaceID.setText("jTextField1");
82
-
83 77
jLabel2.setText("Mark index:");
84
-
85 78
jMarkIndex.setText("0");
86
-
87 79
jLabel3.setText("Mark time:");
88
-
89 80
jMarkTime.setText("12:34:17");
90
-
91 81
jLabel4.setText("Sail number:");
92
-
93 82
jSailNumber.setText("w123");
94
-
95 83
jButton1.setText("Ok");
96 84
jButton1.addActionListener(new java.awt.event.ActionListener() {
97 85
public void actionPerformed(java.awt.event.ActionEvent evt) {
98 86
jButton1ActionPerformed(evt);
99 87
}
100 88
});
101
-
102 89
jButton2.setText("Remove");
103 90
jButton2.addActionListener(new java.awt.event.ActionListener() {
104 91
public void actionPerformed(java.awt.event.ActionEvent evt) {
105 92
jButton2ActionPerformed(evt);
106 93
}
107 94
});
108
-
109 95
jButton3.setText("Add");
110 96
jButton3.addActionListener(new java.awt.event.ActionListener() {
111 97
public void actionPerformed(java.awt.event.ActionEvent evt) {
112 98
jButton3ActionPerformed(evt);
113 99
}
114 100
});
115
-
116 101
jMarkList.setModel(new javax.swing.AbstractListModel<ClockAtMarkElement>() {
117 102
ClockAtMarkElement[] clockAtMarkElements = { new ClockAtMarkElement(1, new Date(), "Item 1"),
118 103
new ClockAtMarkElement(1, new Date(), "Item 2"), new ClockAtMarkElement(1, new Date(), "Item 3"),
java/com.sap.sailing.domain.swisstimingadapter.test/src/com/sap/sailing/domain/swisstimingadapter/test/ui/EditCCG.java
... ...
@@ -51,9 +51,7 @@ public class EditCCG extends javax.swing.JDialog {
51 51
*/
52 52
53 53
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
54
- @SuppressWarnings("serial")
55 54
private void initComponents() {
56
-
57 55
jBuoyType = new javax.swing.ButtonGroup();
58 56
jLabel1 = new javax.swing.JLabel();
59 57
jRaceID = new javax.swing.JTextField();
java/com.sap.sailing.domain.swisstimingadapter.test/src/com/sap/sailing/domain/swisstimingadapter/test/ui/EditSTL.java
... ...
@@ -49,9 +49,7 @@ public class EditSTL extends javax.swing.JDialog {
49 49
*/
50 50
51 51
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
52
- @SuppressWarnings("serial")
53 52
private void initComponents() {
54
-
55 53
jLabel1 = new javax.swing.JLabel();
56 54
jRaceID = new javax.swing.JTextField();
57 55
jSeparator1 = new javax.swing.JSeparator();
... ...
@@ -66,47 +64,34 @@ public class EditSTL extends javax.swing.JDialog {
66 64
jButton2 = new javax.swing.JButton();
67 65
jScrollPane1 = new javax.swing.JScrollPane();
68 66
jCompetitorList = new javax.swing.JList<Competitor>();
69
-
70 67
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
71
-
72 68
jLabel1.setText("Race ID:");
73
-
74 69
jRaceID.setText("jTextField1");
75
-
76 70
jLabel2.setText("Sail Number:");
77
-
78 71
jSailNumber.setText("jTextField1");
79
-
80 72
jLabel3.setText("NOC:");
81
-
82 73
jNOC.setModel(new javax.swing.DefaultComboBoxModel<String>(new String[] { "AUS", "FRA", "GBR", "GER", "ITA", "USA" }));
83 74
jNOC.setSelectedIndex(2);
84
-
85 75
jLabel4.setText("Name:");
86
-
87 76
jName.setText("jTextField1");
88
-
89 77
jButton1.setText("Add");
90 78
jButton1.addActionListener(new java.awt.event.ActionListener() {
91 79
public void actionPerformed(java.awt.event.ActionEvent evt) {
92 80
jButton1ActionPerformed(evt);
93 81
}
94 82
});
95
-
96 83
jRemove.setText("Remove");
97 84
jRemove.addActionListener(new java.awt.event.ActionListener() {
98 85
public void actionPerformed(java.awt.event.ActionEvent evt) {
99 86
jRemoveActionPerformed(evt);
100 87
}
101 88
});
102
-
103 89
jButton2.setText("Ok");
104 90
jButton2.addActionListener(new java.awt.event.ActionListener() {
105 91
public void actionPerformed(java.awt.event.ActionEvent evt) {
106 92
jButton2ActionPerformed(evt);
107 93
}
108 94
});
109
-
110 95
jCompetitorList.setModel(new javax.swing.AbstractListModel<Competitor>() {
111 96
Competitor[] competitors = { new CompetitorWithoutID("Item 1", "DEU", "Item 1"),
112 97
new CompetitorWithoutID("Item 2", "DEU", "Item 2"),
... ...
@@ -117,7 +102,6 @@ public class EditSTL extends javax.swing.JDialog {
117 102
public Competitor getElementAt(int i) { return competitors[i]; }
118 103
});
119 104
jScrollPane1.setViewportView(jCompetitorList);
120
-
121 105
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
122 106
getContentPane().setLayout(layout);
123 107
layout.setHorizontalGroup(
java/com.sap.sailing.domain.swisstimingadapter.test/src/com/sap/sailing/domain/swisstimingadapter/test/ui/EditTMD.java
... ...
@@ -54,9 +54,7 @@ public class EditTMD extends javax.swing.JDialog {
54 54
*/
55 55
56 56
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
57
- @SuppressWarnings("serial")
58 57
private void initComponents() {
59
-
60 58
jLabel1 = new javax.swing.JLabel();
61 59
jRaceId = new javax.swing.JTextField();
62 60
jLabel2 = new javax.swing.JLabel();
... ...
@@ -73,50 +71,35 @@ public class EditTMD extends javax.swing.JDialog {
73 71
jButton3 = new javax.swing.JButton();
74 72
jScrollPane1 = new javax.swing.JScrollPane();
75 73
jTmdData = new javax.swing.JList<TimingDataElement>();
76
-
77 74
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
78
-
79 75
jLabel1.setText("Race ID:");
80
-
81 76
jRaceId.setText("jTextField1");
82
-
83 77
jLabel2.setText("Sail number:");
84
-
85 78
jSailNumber.setText("jTextField2");
86
-
87 79
jLabel3.setText("Mark index:");
88
-
89 80
jMarkIndex.setText("1");
90
-
91 81
jLabel4.setText("Rank:");
92
-
93 82
jRank.setText("1");
94
-
95 83
jLabel5.setText("Time since start:");
96
-
97 84
jTimeSinceStart.setText("00:12:14");
98
-
99 85
jButton1.setText("Remove");
100 86
jButton1.addActionListener(new java.awt.event.ActionListener() {
101 87
public void actionPerformed(java.awt.event.ActionEvent evt) {
102 88
jButton1ActionPerformed(evt);
103 89
}
104 90
});
105
-
106 91
jButton2.setText("Add");
107 92
jButton2.addActionListener(new java.awt.event.ActionListener() {
108 93
public void actionPerformed(java.awt.event.ActionEvent evt) {
109 94
jButton2ActionPerformed(evt);
110 95
}
111 96
});
112
-
113 97
jButton3.setText("Ok");
114 98
jButton3.addActionListener(new java.awt.event.ActionListener() {
115 99
public void actionPerformed(java.awt.event.ActionEvent evt) {
116 100
jButton3ActionPerformed(evt);
117 101
}
118 102
});
119
-
120 103
jTmdData.setModel(new javax.swing.AbstractListModel<TimingDataElement>() {
121 104
TimingDataElement[] strings = { new TimingDataElement(1, 1, new Date()),
122 105
new TimingDataElement(2, 2, new Date()),
... ...
@@ -127,7 +110,6 @@ public class EditTMD extends javax.swing.JDialog {
127 110
public TimingDataElement getElementAt(int i) { return strings[i]; }
128 111
});
129 112
jScrollPane1.setViewportView(jTmdData);
130
-
131 113
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
132 114
getContentPane().setLayout(layout);
133 115
layout.setHorizontalGroup(
java/com.sap.sailing.domain.swisstimingadapter.test/src/com/sap/sailing/domain/swisstimingadapter/test/ui/SwissTimingRaceEditor.java
... ...
@@ -70,10 +70,8 @@ public class SwissTimingRaceEditor extends javax.swing.JFrame {
70 70
* WARNING: Do NOT modify this code. The content of this method is
71 71
* always regenerated by the Form Editor.
72 72
*/
73
- @SuppressWarnings({ "serial" })
74 73
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
75 74
private void initComponents() {
76
-
77 75
jScrollPane1 = new javax.swing.JScrollPane();
78 76
jCommandList = new javax.swing.JList<Object>();
79 77
jAdd = new javax.swing.JButton();
... ...
@@ -86,54 +84,45 @@ public class SwissTimingRaceEditor extends javax.swing.JFrame {
86 84
jImport = new javax.swing.JMenuItem();
87 85
jExport = new javax.swing.JMenuItem();
88 86
jMenuItem3 = new javax.swing.JMenuItem();
89
-
90 87
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
91 88
setTitle("SwissTiming-Sample-Race Editor");
92
-
93 89
jCommandList.setModel(new javax.swing.AbstractListModel<Object>() {
94 90
String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };
95 91
public int getSize() { return strings.length; }
96 92
public Object getElementAt(int i) { return strings[i]; }
97 93
});
98 94
jScrollPane1.setViewportView(jCommandList);
99
-
100 95
jAdd.setText("Add");
101 96
jAdd.addActionListener(new java.awt.event.ActionListener() {
102 97
public void actionPerformed(java.awt.event.ActionEvent evt) {
103 98
jAddActionPerformed(evt);
104 99
}
105 100
});
106
-
107 101
jRemove.setText("Remove");
108 102
jRemove.addActionListener(new java.awt.event.ActionListener() {
109 103
public void actionPerformed(java.awt.event.ActionEvent evt) {
110 104
jRemoveActionPerformed(evt);
111 105
}
112 106
});
113
-
114 107
jEdit.setText("Edit");
115 108
jEdit.addActionListener(new java.awt.event.ActionListener() {
116 109
public void actionPerformed(java.awt.event.ActionEvent evt) {
117 110
jEditActionPerformed(evt);
118 111
}
119 112
});
120
-
121 113
jMoveUp.setText("Up");
122 114
jMoveUp.addActionListener(new java.awt.event.ActionListener() {
123 115
public void actionPerformed(java.awt.event.ActionEvent evt) {
124 116
jMoveUpActionPerformed(evt);
125 117
}
126 118
});
127
-
128 119
jMoveDown.setText("Down");
129 120
jMoveDown.addActionListener(new java.awt.event.ActionListener() {
130 121
public void actionPerformed(java.awt.event.ActionEvent evt) {
131 122
jMoveDownActionPerformed(evt);
132 123
}
133 124
});
134
-
135 125
jMenu1.setText("File");
136
-
137 126
jImport.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_I, java.awt.event.InputEvent.CTRL_DOWN_MASK));
138 127
jImport.setText("Import");
139 128
jImport.addActionListener(new java.awt.event.ActionListener() {
... ...
@@ -142,7 +131,6 @@ public class SwissTimingRaceEditor extends javax.swing.JFrame {
142 131
}
143 132
});
144 133
jMenu1.add(jImport);
145
-
146 134
jExport.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S, java.awt.event.InputEvent.CTRL_DOWN_MASK));
147 135
jExport.setText("Export");
148 136
jExport.addActionListener(new java.awt.event.ActionListener() {
... ...
@@ -151,7 +139,6 @@ public class SwissTimingRaceEditor extends javax.swing.JFrame {
151 139
}
152 140
});
153 141
jMenu1.add(jExport);
154
-
155 142
jMenuItem3.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_ESCAPE, 0));
156 143
jMenuItem3.setText("Exit");
157 144
jMenuItem3.addActionListener(new java.awt.event.ActionListener() {
... ...
@@ -160,11 +147,8 @@ public class SwissTimingRaceEditor extends javax.swing.JFrame {
160 147
}
161 148
});
162 149
jMenu1.add(jMenuItem3);
163
-
164 150
jMenuBar1.add(jMenu1);
165
-
166 151
setJMenuBar(jMenuBar1);
167
-
168 152
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
169 153
getContentPane().setLayout(layout);
170 154
layout.setHorizontalGroup(
java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackTest.java
... ...
@@ -156,7 +156,6 @@ public class TrackTest {
156 156
* {@link Timed} objects in ascending order, this method compares those results to the ordinary explicit calls
157 157
* to {@link GPSFixTrack#getEstimatedPosition(TimePoint, boolean)}.
158 158
*/
159
- @SuppressWarnings("serial")
160 159
@Test
161 160
public void testGetEstimatedPositionSingleVsIteratedWithSmallerSteps() {
162 161
TimePoint start = gpsFix1.getTimePoint().minus((gpsFix5.getTimePoint().asMillis()-gpsFix1.getTimePoint().asMillis())/2);
... ...
@@ -170,7 +169,6 @@ public class TrackTest {
170 169
assertEqualEstimatedPositionsSingleVsIterated(timeds, /* extrapolate */ false);
171 170
}
172 171
173
- @SuppressWarnings("serial")
174 172
@Test
175 173
public void testGetEstimatedPositionSingleVsIteratedWithLargerSteps() {
176 174
TimePoint start = gpsFix1.getTimePoint().minus((gpsFix5.getTimePoint().asMillis()-gpsFix1.getTimePoint().asMillis())/2);
java/com.sap.sailing.gwt.ui/Home.css
... ...
@@ -1 +1 @@
1
-/* Not used yet because all CssResources are comming from the design templates. */
1
+/* Not used yet because all CssResources are coming from the design templates. */
java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/events/TabletAndDesktopEventsView.java
... ...
@@ -14,6 +14,7 @@ import com.sap.sailing.gwt.home.shared.places.start.StartPlace;
14 14
import com.sap.sailing.gwt.ui.client.StringMessages;
15 15
import com.sap.sse.gwt.client.breadcrumb.BreadcrumbPane;
16 16
import com.sap.sse.gwt.client.media.TakedownNoticeService;
17
+import com.sap.sse.gwt.resources.CommonControlsCSS;
17 18
18 19
public class TabletAndDesktopEventsView extends AbstractEventsView {
19 20
private static EventsPageViewUiBinder uiBinder = GWT.create(EventsPageViewUiBinder.class);
... ...
@@ -33,9 +34,7 @@ public class TabletAndDesktopEventsView extends AbstractEventsView {
33 34
this.navigator = navigator;
34 35
recentEventsWidget = new EventsOverviewRecent(navigator);
35 36
upcomingEventsWidget = new EventsOverviewUpcoming(navigator);
36
-
37 37
initWidget(uiBinder.createAndBindUi(this));
38
-
39 38
initBreadCrumbs();
40 39
}
41 40
... ...
@@ -57,6 +56,12 @@ public class TabletAndDesktopEventsView extends AbstractEventsView {
57 56
});
58 57
}
59 58
59
+ @Override
60
+ protected void onLoad() {
61
+ super.onLoad();
62
+ CommonControlsCSS.ensureInjected();
63
+ }
64
+
60 65
@Override
61 66
protected void updateEventsUI(TakedownNoticeService takedownNoticeService) {
62 67
recentEventsWidget.updateEvents(eventListView.getRecentEvents(), takedownNoticeService);
java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/whatsnew/resources/SailingAnalyticsNotes.html
... ...
@@ -13,6 +13,10 @@
13 13
<li>Bug fix: when a split-fleet series had results only entered manually as score
14 14
corrections, the progress bars for the series were not shown properly. All
15 15
fleets would be considered finished although some may not have seen results.</li>
16
+ <li>The source code of the Sailing Analytics including its companion apps (Race Manager App,
17
+ Buoy Pinger App, Sail Insight) has been published under the Apache 2.0 license on
18
+ GitHub. See <a href="https://github.com/SAP/sailing-analytics">https://github.com/SAP/sailing-analytics</a>.
19
+ Get engaged!</li>
16 20
</ul>
17 21
<h5 class="articleSubheadline">September 2025</h5>
18 22
<ul class="bulletList">
java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/MobileEntryPoint.java
... ...
@@ -35,12 +35,9 @@ public class MobileEntryPoint extends AbstractMvpEntryPoint<StringMessages, Mobi
35 35
@Override
36 36
public void doOnModuleLoad() {
37 37
Document.get().getBody().addClassName(SharedResources.INSTANCE.mainCss().mobile());
38
-
39 38
CommonControlsCSS.ensureInjected();
40
-
41 39
ServerConfigurationServiceAsync serverConfigService = GWT.create(ServerConfigurationService.class);
42 40
EntryPointHelper.registerASyncService((ServiceDefTarget) serverConfigService, RemoteServiceMappingConstants.serverConfigurationServiceRemotePath);
43
-
44 41
serverConfigService.isStandaloneServer(new AsyncCallback<Boolean>() {
45 42
@Override
46 43
public void onSuccess(Boolean result) {
java/com.sap.sailing.server.trackfiles.test/src/com/sap/sailing/server/trackfiles/test/JumpyTrackSmootheningTest.java
... ...
@@ -199,8 +199,8 @@ public class JumpyTrackSmootheningTest {
199 199
assertNotNull(markPassings);
200 200
assertEquals(13, markPassings.size());
201 201
}
202
- assertTrue(durationForAdjustedTrack.times(8).compareTo(durationForOriginalTrack) < 0,
203
- "Expected duration for mark passing analysis on adjusted track to be at least eight times less than for original track: "+
202
+ assertTrue(durationForAdjustedTrack.times(2).compareTo(durationForOriginalTrack) < 0,
203
+ "Expected duration for mark passing analysis on adjusted track to be at least two times less than for original track: "+
204 204
durationForAdjustedTrack+" vs. "+durationForOriginalTrack);
205 205
}
206 206
... ...
@@ -228,7 +228,8 @@ public class JumpyTrackSmootheningTest {
228 228
}
229 229
230 230
/**
231
- * Simulates the "Oak cliff DH Distance Race" R1 with a single competitor, Gallagher / Zelenka, sail number "1" with
231
+ * Simulates the "Oak cliff DH Distance Race" R1 (see https://my.sapsailing.com/gwt/RaceBoard.html?regattaName=Oak+cliff+DH+Distance+Race&raceName=R1&leaderboardName=Oak+cliff+DH+Distance+Race&leaderboardGroupId=a3902560-6bfa-43be-85e1-2b82a4963416&eventId=bf48a59d-f2af-47b6-a2f7-a5b78b22b9f2)
232
+ * with a single competitor, Gallagher / Zelenka, sail number "1" with
232 233
* the marks pinged statically to establish the course. The track of Gallagher / Zelenka is provided as a track of
233 234
* their GPS positions. This could be the raw track, or it may be a filtered variant of the track with outliers
234 235
* removed or adjusted.<p>
... ...
@@ -288,7 +289,7 @@ public class JumpyTrackSmootheningTest {
288 289
addFixedMarkPassingToRaceLog("2020-10-14T17:29:36Z", gallagherZelenka, 2, raceLog);
289 290
addFixedMarkPassingToRaceLog("2020-10-14T17:36:42Z", gallagherZelenka, 3, raceLog);
290 291
addFixedMarkPassingToRaceLog("2020-10-14T18:21:38Z", gallagherZelenka, 4, raceLog);
291
- trackedRace.setStatus(new TrackedRaceStatusImpl(TrackedRaceStatusEnum.LOADING, 0.0));
292
+ trackedRace.setStatus(new TrackedRaceStatusImpl(TrackedRaceStatusEnum.LOADING, 0.0)); // suspends mark passing calculator
292 293
final DynamicGPSFixTrack<Competitor, GPSFixMoving> competitorTrackInRace = trackedRace.getTrack(gallagherZelenka);
293 294
// TODO switch race into suspended mode to avoid updates during mass fix insertion:
294 295
competitorTrack.lockForRead();
... ...
@@ -299,8 +300,12 @@ public class JumpyTrackSmootheningTest {
299 300
} finally {
300 301
competitorTrack.unlockAfterRead();
301 302
}
302
- trackedRace.setStatus(new TrackedRaceStatusImpl(TrackedRaceStatusEnum.TRACKING, 1.0));
303
- // TODO resume race
303
+ trackedRace.setStatus(new TrackedRaceStatusImpl(TrackedRaceStatusEnum.TRACKING, 1.0)); // resumes mark passing calculator
304
+ // FIXME is it possible that MarkPassingCalculator.Listen has applied only a subset of the changes from its queue when this method returns?
305
+ // It scoops up a few events from the queue under the MPC write lock and collects the changes in various collections, but doesn't re-calculate while suspended;
306
+ // When the lock is released prior to fetching the next set of events from the queue, the test case calling this method may call getMarkPassings(..., true)
307
+ // and obtain the read lock, keeping the Listen thread from applying the next round of updates. Yes, the getMarkPassings(...) call may return something,
308
+ // but that may be the result of only applying a subset of the changes, with other changes still in the queue...
304 309
return trackedRace;
305 310
}
306 311
java/com.sap.sailing.www/release_notes_admin.html
... ...
@@ -37,6 +37,10 @@
37 37
<li><tt>GEONAMES_ORG_USERNAMES</tt> for <tt>geonames.org.usernames</tt></li>
38 38
</ul>
39 39
If the system property is set, it takes precedence over the environment variable.</li>
40
+ <li>The source code of the Sailing Analytics including its companion apps (Race Manager App,
41
+ Buoy Pinger App, Sail Insight) has been published under the Apache 2.0 license on
42
+ GitHub. See <a href="https://github.com/SAP/sailing-analytics">https://github.com/SAP/sailing-analytics</a>.
43
+ Get engaged!</li>
40 44
</ul>
41 45
<h2 class="articleSubheadline">September 2025</h2>
42 46
<ul class="bulletList">
java/com.sap.sailing.xrr.resultimport/META-INF/MANIFEST.MF
... ...
@@ -24,5 +24,6 @@ Require-Bundle: com.sap.sailing.domain,
24 24
com.sap.sse.common,
25 25
com.sun.xml.bind.jaxb-impl;bundle-version="2.3.0",
26 26
com.sap.sailing.domain.shared.android,
27
- com.sap.sse
27
+ com.sap.sse,
28
+ com.sap.sse.security.common
28 29
Bundle-Activator: com.sap.sailing.xrr.resultimport.impl.Activator
java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/useragent/UserAgentCheckerImpl.java
... ...
@@ -9,7 +9,6 @@ public class UserAgentCheckerImpl implements UserAgentChecker {
9 9
/**
10 10
* Version numbers indicate minimum required browser (20 = at least this version)
11 11
*/
12
- @SuppressWarnings("serial")
13 12
private static final HashMap<AgentTypes, Integer> MINIMUM_SUPPORTED_AGENTS = new HashMap<AgentTypes, Integer>() {
14 13
{
15 14
put(AgentTypes.MSIE, 9);
... ...
@@ -17,7 +16,6 @@ public class UserAgentCheckerImpl implements UserAgentChecker {
17 16
put(AgentTypes.OPERA, 10);
18 17
put(AgentTypes.FIREFOX, 10);
19 18
put(AgentTypes.CHROME, 20);
20
-
21 19
}
22 20
};
23 21