26
26
import java .util .HashMap ;
27
27
import java .util .List ;
28
28
import java .util .Map ;
29
+ import java .util .stream .Collectors ;
29
30
import javax .swing .ImageIcon ;
30
31
import javax .swing .JComponent ;
31
32
import javax .swing .JLabel ;
@@ -171,10 +172,9 @@ void setStatColumns() {
171
172
}
172
173
173
174
private synchronized void loadData () {
174
- // copy so acquire/release read lock are on the same object!
175
+ // copy so that the object doesn't change underneath us
175
176
final GameData gameData = StatPanel .this .gameData ;
176
- gameData .acquireReadLock ();
177
- try {
177
+ try (GameData .Unlocker ignored = gameData .acquireReadLock ()) {
178
178
final List <GamePlayer > players = gameData .getPlayerList ().getSortedPlayers ();
179
179
final Collection <String > alliances = gameData .getAllianceTracker ().getAlliances ();
180
180
collectedData = new String [players .size () + alliances .size ()][stats .length + 1 ];
@@ -188,7 +188,7 @@ private synchronized void loadData() {
188
188
}
189
189
row ++;
190
190
}
191
- for (final String alliance : alliances ) {
191
+ for (final String alliance : alliances . stream (). sorted (). collect ( Collectors . toList ()) ) {
192
192
collectedData [row ][0 ] = alliance ;
193
193
for (int i = 0 ; i < stats .length ; i ++) {
194
194
collectedData [row ][i + 1 ] =
@@ -197,8 +197,6 @@ private synchronized void loadData() {
197
197
}
198
198
row ++;
199
199
}
200
- } finally {
201
- gameData .releaseReadLock ();
202
200
}
203
201
}
204
202
@@ -263,18 +261,16 @@ class TechTableModel extends AbstractTableModel {
263
261
colMap .put (colList [i ], i + 1 );
264
262
}
265
263
boolean useTech = false ;
264
+ // copy so that the object doesn't change underneath us
266
265
final GameData gameData = StatPanel .this .gameData ;
267
- try {
268
- gameData .acquireReadLock ();
266
+ try (GameData .Unlocker ignored = gameData .acquireReadLock ()) {
269
267
final int numTechs = TechAdvance .getTechAdvances (gameData .getTechnologyFrontier ()).size ();
270
268
if (gameData .getResourceList ().getResource (Constants .TECH_TOKENS ) != null ) {
271
269
useTech = true ;
272
270
data = new String [numTechs + 1 ][colList .length + 2 ];
273
271
} else {
274
272
data = new String [numTechs ][colList .length + 1 ];
275
273
}
276
- } finally {
277
- gameData .releaseReadLock ();
278
274
}
279
275
/* Load the technology -> row mapping */
280
276
int row = 0 ;
@@ -313,41 +309,36 @@ private void initColList() {
313
309
314
310
void update () {
315
311
clearAdvances ();
316
- // copy so acquire/release read lock are on the same object!
312
+ // copy so that the object doesn't change underneath us
317
313
final GameData gameData = StatPanel .this .gameData ;
318
- gameData .acquireReadLock ();
319
- try {
314
+ try (GameData .Unlocker ignored = gameData .acquireReadLock ()) {
320
315
for (final GamePlayer pid : gameData .getPlayerList ().getPlayers ()) {
321
316
if (colMap .get (pid .getName ()) == null ) {
322
317
throw new IllegalStateException (
323
318
"Unexpected player in GameData.getPlayerList()" + pid .getName ());
324
319
}
325
320
final int col = colMap .get (pid .getName ());
326
321
int row = 0 ;
327
- if (StatPanel .this .gameData .getResourceList ().getResource (Constants .TECH_TOKENS )
328
- != null ) {
322
+ if (gameData .getResourceList ().getResource (Constants .TECH_TOKENS ) != null ) {
329
323
final int tokens = pid .getResources ().getQuantity (Constants .TECH_TOKENS );
330
324
data [row ][col ] = Integer .toString (tokens );
331
325
}
332
326
final List <TechAdvance > advancesAll =
333
- TechAdvance .getTechAdvances (StatPanel . this . gameData .getTechnologyFrontier ());
327
+ TechAdvance .getTechAdvances (gameData .getTechnologyFrontier ());
334
328
final List <TechAdvance > has =
335
- TechAdvance .getTechAdvances (StatPanel . this . gameData .getTechnologyFrontier (), pid );
329
+ TechAdvance .getTechAdvances (gameData .getTechnologyFrontier (), pid );
336
330
for (final TechAdvance advance : advancesAll ) {
337
331
if (!has .contains (advance )) {
338
332
row = rowMap .get (advance .getName ());
339
333
data [row ][col ] = "-" ;
340
334
}
341
335
}
342
336
for (final TechAdvance advance :
343
- TechTracker .getCurrentTechAdvances (
344
- pid , StatPanel .this .gameData .getTechnologyFrontier ())) {
337
+ TechTracker .getCurrentTechAdvances (pid , gameData .getTechnologyFrontier ())) {
345
338
row = rowMap .get (advance .getName ());
346
339
data [row ][col ] = "X" ;
347
340
}
348
341
}
349
- } finally {
350
- gameData .releaseReadLock ();
351
342
}
352
343
}
353
344
@@ -396,11 +387,8 @@ class PuStat extends ResourceStat {
396
387
397
388
private static Resource getResourcePUs (final GameData data ) {
398
389
final Resource pus ;
399
- try {
400
- data .acquireReadLock ();
390
+ try (GameData .Unlocker ignored = data .acquireReadLock ()) {
401
391
pus = data .getResourceList ().getResource (Constants .PUS );
402
- } finally {
403
- data .releaseReadLock ();
404
392
}
405
393
return pus ;
406
394
}
0 commit comments