Skip to content

Commit e3fe4a2

Browse files
fix: resolve warnings
1 parent 3814253 commit e3fe4a2

15 files changed

Lines changed: 156 additions & 58 deletions

File tree

bukkit/src/main/java/net/pistonmaster/pistonqueue/bukkit/PistonQueueBukkit.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828

2929
import java.io.IOException;
3030
import java.util.logging.Logger;
31+
import java.util.logging.Level;
3132

3233
@Getter
3334
public final class PistonQueueBukkit extends JavaPlugin {
@@ -140,8 +141,7 @@ public void onEnable() {
140141
log.info(ChatColor.BLUE + "You're up to date!");
141142
}
142143
} catch (IOException e) {
143-
log.severe("Could not check for updates!");
144-
e.printStackTrace();
144+
log.log(Level.SEVERE, "Could not check for updates!", e);
145145
}
146146
}
147147

bungee/src/main/java/net/pistonmaster/pistonqueue/bungee/PistonQueueBungee.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import java.util.concurrent.CompletableFuture;
5050
import java.util.concurrent.TimeUnit;
5151
import java.util.stream.Collectors;
52+
import java.util.logging.Level;
5253

5354
@Getter
5455
public final class PistonQueueBungee extends Plugin implements PistonQueuePlugin {
@@ -99,7 +100,7 @@ public void onEnable() {
99100
}
100101
} catch (IOException e) {
101102
error("Could not check for updates!");
102-
e.printStackTrace();
103+
getLogger().log(Level.SEVERE, "Update check failed", e);
103104
}
104105

105106
info(ChatColor.BLUE + "Scheduling tasks");

placeholder/src/main/java/net/pistonmaster/pistonqueue/placeholder/PistonQueuePlaceholder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import java.io.IOException;
1515
import java.util.Map;
1616
import java.util.concurrent.ConcurrentHashMap;
17+
import java.util.logging.Level;
1718
import java.util.logging.Logger;
1819

1920
@Getter
@@ -48,8 +49,7 @@ public void onEnable() {
4849
log.info(ChatColor.BLUE + "You're up to date!");
4950
}
5051
} catch (IOException e) {
51-
log.severe("Could not check for updates!");
52-
e.printStackTrace();
52+
log.log(Level.SEVERE, "Could not check for updates!", e);
5353
}
5454

5555
log.info(ChatColor.BLUE + "Successfully enabled!");

shared/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,6 @@ dependencies {
66
api("de.exlll:configlib-yaml:4.6.3")
77
compileOnly("net.pistonmaster:pistonmotd-api:5.2.7")
88
compileOnly("org.apiguardian:apiguardian-api:1.1.2")
9+
api("com.github.spotbugs:spotbugs-annotations:4.8.3")
910
compileOnly("com.google.guava:guava:33.5.0-jre")
1011
}

shared/src/main/java/net/pistonmaster/pistonqueue/shared/command/MainCommandShared.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@
3434
import java.util.*;
3535

3636
public interface MainCommandShared {
37-
String[] commands = {"help", "version", "stats"};
38-
String[] adminCommands = {"slotstats", "reload", "shadowban", "unshadowban"};
37+
List<String> commands = List.of("help", "version", "stats");
38+
List<String> adminCommands = List.of("slotstats", "reload", "shadowban", "unshadowban");
3939

4040
default void onCommand(CommandSourceWrapper sender, String[] args, PistonQueuePlugin plugin) {
4141
Config config = plugin.getConfiguration();
@@ -111,8 +111,6 @@ default void onCommand(CommandSourceWrapper sender, String[] args, PistonQueuePl
111111
}
112112

113113
Calendar calendar = Calendar.getInstance();
114-
calendar.setTime(new Date());
115-
116114
if (args[2].toLowerCase(Locale.ROOT).endsWith("d")) {
117115
int d = Integer.parseInt(args[2].toLowerCase(Locale.ROOT).replace("d", ""));
118116

@@ -249,9 +247,9 @@ default List<String> onTab(String[] args, PermissibleWrapper wrapper, PistonQueu
249247

250248
Collections.sort(completions);
251249

252-
return completions;
250+
return List.copyOf(completions);
253251
} else {
254-
return Collections.emptyList();
252+
return List.of();
255253
}
256254
}
257255

shared/src/main/java/net/pistonmaster/pistonqueue/shared/config/Config.java

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,30 @@
2222
import de.exlll.configlib.Comment;
2323
import de.exlll.configlib.Configuration;
2424
import de.exlll.configlib.Ignore;
25+
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
2526
import net.pistonmaster.pistonqueue.shared.queue.BanType;
2627
import net.pistonmaster.pistonqueue.shared.queue.QueueGroup;
2728
import net.pistonmaster.pistonqueue.shared.queue.QueueType;
2829
import net.pistonmaster.pistonqueue.shared.wrapper.PlayerWrapper;
2930

30-
import java.util.*;
31+
import java.util.ArrayList;
32+
import java.util.Arrays;
33+
import java.util.Collection;
34+
import java.util.Collections;
35+
import java.util.Comparator;
36+
import java.util.HashMap;
37+
import java.util.IdentityHashMap;
38+
import java.util.LinkedHashMap;
39+
import java.util.List;
40+
import java.util.Locale;
41+
import java.util.Map;
42+
import java.util.Optional;
3143

3244
@Configuration
45+
@SuppressFBWarnings(
46+
value = "MS_PKGPROTECT",
47+
justification = "Fields intentionally public for ConfigLib serialization compatibility"
48+
)
3349
public final class Config {
3450
@Comment("Placeholder for %server_name%")
3551
public String SERVER_NAME = "&cexample.org";
@@ -154,7 +170,7 @@ public final class Config {
154170
private final Map<String, QueueGroup> queueGroupsByTarget = new HashMap<>();
155171

156172
@Ignore
157-
private final Map<QueueType, QueueGroup> queueGroupByType = new IdentityHashMap<>();
173+
private final IdentityHashMap<QueueType, QueueGroup> queueGroupByType = new IdentityHashMap<>();
158174

159175
@Ignore
160176
private final List<QueueType> allQueueTypes = new ArrayList<>();
@@ -266,8 +282,8 @@ private static QueueType buildQueueType(String name, QueueTypeConfiguration conf
266282
new ArrayList<>(configuration.getFooter()));
267283
}
268284

269-
private static LinkedHashMap<String, QueueTypeConfiguration> defaultQueueTypes() {
270-
LinkedHashMap<String, QueueTypeConfiguration> defaults = new LinkedHashMap<>();
285+
private static Map<String, QueueTypeConfiguration> defaultQueueTypes() {
286+
Map<String, QueueTypeConfiguration> defaults = new LinkedHashMap<>();
271287
defaults.put("REGULAR", createQueueType(
272288
3,
273289
50,
@@ -395,16 +411,21 @@ private void rebuildQueueGroups() {
395411
queueGroupByType.clear();
396412
allQueueTypes.clear();
397413

414+
QueueType[] effectiveTypes = QUEUE_TYPES;
415+
if (effectiveTypes == null) {
416+
effectiveTypes = new QueueType[0];
417+
QUEUE_TYPES = effectiveTypes;
418+
}
419+
398420
QueueGroup defaultGroup = new QueueGroup(
399421
"default",
400422
QUEUE_SERVER,
401423
Collections.singletonList(TARGET_SERVER),
402424
ENABLE_SOURCE_SERVER ? Collections.singletonList(SOURCE_SERVER) : Collections.emptyList(),
403-
QUEUE_TYPES
425+
effectiveTypes
404426
);
405427
registerGroup(defaultGroup);
406428
defaultQueueGroup = defaultGroup;
407-
QUEUE_TYPES = defaultGroup.getQueueTypes();
408429
}
409430

410431
private void registerGroup(QueueGroup group) {

shared/src/main/java/net/pistonmaster/pistonqueue/shared/config/StorageData.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@
2121

2222
import de.exlll.configlib.Comment;
2323
import de.exlll.configlib.Configuration;
24+
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
2425

26+
import java.util.Collections;
2527
import java.util.LinkedHashMap;
2628
import java.util.Map;
2729

@@ -33,6 +35,14 @@ public final class StorageData {
3335
private Map<String, String> bans = new LinkedHashMap<>();
3436

3537
public Map<String, String> getBans() {
38+
return Collections.unmodifiableMap(bans);
39+
}
40+
41+
@SuppressFBWarnings(
42+
value = "EI_EXPOSE_REP",
43+
justification = "Mutable map required for runtime updates"
44+
)
45+
public Map<String, String> getMutableBans() {
3646
return bans;
3747
}
3848
}

shared/src/main/java/net/pistonmaster/pistonqueue/shared/plugin/PistonQueuePlugin.java

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,18 @@ public interface PistonQueuePlugin {
6969

7070
default void scheduleTasks(QueueListenerShared queueListener) {
7171
Config config = getConfiguration();
72-
QueueGroup defaultGroup = config.getDefaultGroup();
72+
QueueGroup resolvedDefaultGroup = config.getDefaultGroup();
73+
if (resolvedDefaultGroup == null) {
74+
QueueType[] queueTypes = config.getAllQueueTypes().toArray(new QueueType[0]);
75+
resolvedDefaultGroup = new QueueGroup(
76+
"default",
77+
config.QUEUE_SERVER,
78+
Collections.singletonList(config.TARGET_SERVER),
79+
config.ENABLE_SOURCE_SERVER ? Collections.singletonList(config.SOURCE_SERVER) : Collections.emptyList(),
80+
queueTypes
81+
);
82+
}
83+
final QueueGroup defaultGroup = resolvedDefaultGroup;
7384
// Sends the position message and updates tab on an interval in chat
7485
schedule(() -> {
7586
boolean targetsOnline = defaultGroup.getTargetServers().stream().anyMatch(queueListener.getOnlineServers()::contains);
@@ -112,7 +123,7 @@ default void scheduleTasks(QueueListenerShared queueListener) {
112123
List<String> servers = new ArrayList<>(config.KICK_WHEN_DOWN_SERVERS);
113124
CountDownLatch latch = new CountDownLatch(servers.size());
114125
for (String server : servers) {
115-
CompletableFuture.runAsync(() -> {
126+
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
116127
try {
117128
Optional<ServerInfoWrapper> serverInfoWrapper = getServer(server);
118129

@@ -130,43 +141,51 @@ default void scheduleTasks(QueueListenerShared queueListener) {
130141
latch.countDown();
131142
}
132143
});
144+
future.exceptionally(ex -> {
145+
error("Failed to check status of server " + server + ": " + ex.getMessage());
146+
return null;
147+
});
133148
}
134149
try {
135150
latch.await();
136151
} catch (InterruptedException e) {
137-
e.printStackTrace();
152+
Thread.currentThread().interrupt();
153+
error("Server status check interrupted: " + e.getMessage());
138154
}
139155
}, 500, config.SERVER_ONLINE_CHECK_DELAY, TimeUnit.MILLISECONDS);
140156
}
141157

142158
default void sendMessage(QueueType queue, MessageType type) {
143159
Config config = getConfiguration();
144-
AtomicInteger position = new AtomicInteger();
160+
int position = 0;
145161
for (Map.Entry<UUID, QueueType.QueuedPlayer> entry : new LinkedHashMap<>(queue.getQueueMap()).entrySet()) {
146162
Optional<PlayerWrapper> player = getPlayer(entry.getKey());
147163
if (player.isEmpty()) {
148164
continue;
149165
}
150166

151167
String chatMessage = config.QUEUE_POSITION
152-
.replace("%position%", String.valueOf(position.incrementAndGet()))
168+
.replace("%position%", String.valueOf(++position))
153169
.replace("%total%", String.valueOf(queue.getQueueMap().size()));
154170

155171
player.get().sendMessage(type, chatMessage);
156172
}
157173
}
158174

159175
default void updateTab(QueueType queue) {
160-
AtomicInteger position = new AtomicInteger();
176+
int position = 0;
161177

162178
for (Map.Entry<UUID, QueueType.QueuedPlayer> entry : new LinkedHashMap<>(queue.getQueueMap()).entrySet()) {
163-
getPlayer(entry.getKey()).ifPresent(player -> {
164-
int incrementedPosition = position.incrementAndGet();
179+
Optional<PlayerWrapper> optionalPlayer = getPlayer(entry.getKey());
180+
if (optionalPlayer.isEmpty()) {
181+
continue;
182+
}
183+
PlayerWrapper player = optionalPlayer.get();
184+
int incrementedPosition = ++position;
165185

166-
player.sendPlayerList(
167-
queue.getHeader().stream().map(str -> replacePosition(str, incrementedPosition, queue)).collect(Collectors.toList()),
168-
queue.getFooter().stream().map(str -> replacePosition(str, incrementedPosition, queue)).collect(Collectors.toList()));
169-
});
186+
player.sendPlayerList(
187+
queue.getHeader().stream().map(str -> replacePosition(str, incrementedPosition, queue)).collect(Collectors.toList()),
188+
queue.getFooter().stream().map(str -> replacePosition(str, incrementedPosition, queue)).collect(Collectors.toList()));
170189
}
171190
}
172191

@@ -266,7 +285,7 @@ default void processConfig(Path dataDirectory) {
266285

267286
loadConfig(file);
268287
} catch (IOException e) {
269-
e.printStackTrace();
288+
error("Failed to process config: " + e.getMessage());
270289
}
271290
}
272291

shared/src/main/java/net/pistonmaster/pistonqueue/shared/queue/QueueGroup.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public QueueGroup(String name, String queueServer, List<String> targetServers, L
3535
this.queueServer = queueServer;
3636
this.targetServers = Collections.unmodifiableList(new ArrayList<>(targetServers));
3737
this.sourceServers = Collections.unmodifiableList(new ArrayList<>(sourceServers));
38-
this.queueTypes = queueTypes;
38+
this.queueTypes = queueTypes == null ? new QueueType[0] : queueTypes.clone();
3939
}
4040

4141
public String getName() {
@@ -55,6 +55,6 @@ public List<String> getSourceServers() {
5555
}
5656

5757
public QueueType[] getQueueTypes() {
58-
return queueTypes;
58+
return queueTypes.clone();
5959
}
6060
}

shared/src/main/java/net/pistonmaster/pistonqueue/shared/queue/QueueListenerShared.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,10 +309,24 @@ private Config currentConfig() {
309309
}
310310

311311
private QueueGroup defaultGroup() {
312-
return currentConfig().getDefaultGroup();
312+
QueueGroup group = currentConfig().getDefaultGroup();
313+
if (group != null) {
314+
return group;
315+
}
316+
QueueType[] queueTypes = currentConfig().getAllQueueTypes().toArray(new QueueType[0]);
317+
return new QueueGroup(
318+
"default",
319+
currentConfig().QUEUE_SERVER,
320+
List.of(currentConfig().TARGET_SERVER),
321+
currentConfig().ENABLE_SOURCE_SERVER ? List.of(currentConfig().SOURCE_SERVER) : List.of(),
322+
queueTypes
323+
);
313324
}
314325

315326
private QueueGroup resolveGroupForTarget(String server) {
327+
if (server == null) {
328+
return defaultGroup();
329+
}
316330
return currentConfig().findGroupByTarget(server).orElse(defaultGroup());
317331
}
318332

0 commit comments

Comments
 (0)