Skip to content

Commit ab85642

Browse files
committed
refactor: modernize codebase to Java 21 idioms and improve type safety
- Add final to 22 concrete classes per project convention - Replace wildcard imports with explicit imports across 20 files - Replace Log string concatenation with SLF4J {} placeholders (13 instances) - Modernize Collections: unmodifiableList -> List.copyOf, Arrays.asList -> List.of - Modernize File I/O: FileInputStream -> Files.newInputStream, java.io.File -> Path - Convert 6 context/data classes to records (PingRequestContext, RegistrationRequestContext, AuthRequestContext, DumpRequestContext, ResolveUuidRequestContext, ProblemSink.Problem) - Add @FunctionalInterface to Pipeline, PostProcessor, PlatformFeatures - Fix unchecked casts: pattern matching instanceof, EnumAdapter raw types, adapter Object guards, PlayersArgumentType raw List - Replace lambda with method reference (Bukkit::isPrimaryThread) - Remove dangling semicolon, fix e.printStackTrace() -> Log.error - Replace Stream-to-Iterable idiom with files.filter().toList()
1 parent c0169d3 commit ab85642

70 files changed

Lines changed: 328 additions & 240 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

README.md

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -123,12 +123,7 @@ git checkout v3
123123
- [ ] ...
124124

125125
- [ ] **Developer API**
126-
- [ ] Public API module
127-
- [ ] Custom pipeline stages
128-
- [ ] Command lifecycle event hooks
129-
- [ ] Custom argument type registration
130-
- [ ] Custom message type registration
131-
- [ ] Documentation and examples
126+
- [ ] ...
132127

133128
See the [open issues](https://github.com/objz/CommandBridge/issues) for features and bugs.
134129

backends/bukkit/src/main/java/dev/objz/commandbridge/bukkit/Adapter.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,10 @@ public final class Adapter implements PlatformAdapter {
4444

4545
@Override
4646
public void load(PlatformEnv env, Object plugin) throws Exception {
47-
this.plugin = (JavaPlugin) plugin;
47+
if (!(plugin instanceof JavaPlugin jp)) {
48+
throw new IllegalArgumentException("Plugin must be instance of JavaPlugin");
49+
}
50+
this.plugin = jp;
4851
this.dataDir = PathsUtil.normalizeDataDir(env.dataDir());
4952
var cfgMgr = new ConfigManager(dataDir);
5053
boolean ok = cfgMgr.load(BackendsConfig.class);
@@ -56,7 +59,7 @@ public void load(PlatformEnv env, Object plugin) throws Exception {
5659

5760
if (cfg != null) {
5861
Log.setDebug(cfg.debug());
59-
Log.info("Debug mode is " + (cfg.debug() ? "enabled" : "disabled"));
62+
Log.info("Debug mode is {}", cfg.debug() ? "enabled" : "disabled");
6063
}
6164

6265
this.commandExecutor = new BukkitExecutor(this.plugin);
@@ -84,7 +87,7 @@ public void start(PlatformEnv env) throws Exception {
8487
}
8588

8689
Log.installThreadMarshalling(
87-
() -> Bukkit.isPrimaryThread(),
90+
Bukkit::isPrimaryThread,
8891
task -> Bukkit.getScheduler().runTask(plugin, task));
8992

9093
this.client = cfg.endpointType() == EndpointType.REDIS

backends/folia/src/main/java/dev/objz/commandbridge/folia/Adapter.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,10 @@ public final class Adapter implements PlatformAdapter {
4545

4646
@Override
4747
public void load(PlatformEnv env, Object plugin) throws Exception {
48-
this.plugin = (JavaPlugin) plugin;
48+
if (!(plugin instanceof JavaPlugin jp)) {
49+
throw new IllegalArgumentException("Plugin must be instance of JavaPlugin");
50+
}
51+
this.plugin = jp;
4952
this.dataDir = PathsUtil.normalizeDataDir(env.dataDir());
5053
var cfgMgr = new ConfigManager(dataDir);
5154
boolean ok = cfgMgr.load(BackendsConfig.class);
@@ -57,7 +60,7 @@ public void load(PlatformEnv env, Object plugin) throws Exception {
5760

5861
if (cfg != null) {
5962
Log.setDebug(cfg.debug());
60-
Log.info("Debug mode is " + (cfg.debug() ? "enabled" : "disabled"));
63+
Log.info("Debug mode is {}", cfg.debug() ? "enabled" : "disabled");
6164
}
6265

6366
this.commandExecutor = new FoliaExecutor(this.plugin);

backends/paper/src/main/java/dev/objz/commandbridge/paper/Adapter.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,10 @@ public final class Adapter implements PlatformAdapter {
4444

4545
@Override
4646
public void load(PlatformEnv env, Object plugin) throws Exception {
47-
this.plugin = (JavaPlugin) plugin;
47+
if (!(plugin instanceof JavaPlugin jp)) {
48+
throw new IllegalArgumentException("Plugin must be instance of JavaPlugin");
49+
}
50+
this.plugin = jp;
4851
this.dataDir = PathsUtil.normalizeDataDir(env.dataDir());
4952
var cfgMgr = new ConfigManager(dataDir);
5053
boolean ok = cfgMgr.load(BackendsConfig.class);
@@ -56,7 +59,7 @@ public void load(PlatformEnv env, Object plugin) throws Exception {
5659

5760
if (cfg != null) {
5861
Log.setDebug(cfg.debug());
59-
Log.info("Debug mode is " + (cfg.debug() ? "enabled" : "disabled"));
62+
Log.info("Debug mode is {}", cfg.debug() ? "enabled" : "disabled");
6063
}
6164

6265
this.commandExecutor = new PaperExecutor(this.plugin);
@@ -84,7 +87,7 @@ public void start(PlatformEnv env) throws Exception {
8487
}
8588

8689
Log.installThreadMarshalling(
87-
() -> Bukkit.isPrimaryThread(),
90+
Bukkit::isPrimaryThread,
8891
task -> Bukkit.getScheduler().runTask(plugin, task));
8992

9093
this.client = cfg.endpointType() == EndpointType.REDIS

backends/src/main/java/dev/objz/commandbridge/backends/net/out/AuthRequest.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,11 @@ public SendOperation accept(AuthRequestContext ctx) {
3737
.match(reply -> reply.id().equals(env.id())
3838
&& (reply.type() == MessageType.AUTH_OK
3939
|| reply.type() == MessageType.AUTH_FAIL))
40-
.timeout(ctx.timeout);
40+
.timeout(ctx.timeout());
4141

4242
op.await().thenApply(reply -> {
4343
if (reply.type() == MessageType.AUTH_FAIL) {
44-
ctx.statusSink.accept(ClientStatus.AUTH_FAILED);
44+
ctx.statusSink().accept(ClientStatus.AUTH_FAILED);
4545
Log.error("Authentication rejected by server");
4646
return reply;
4747
}
@@ -51,7 +51,7 @@ public SendOperation accept(AuthRequestContext ctx) {
5151
sp = Envelope.MAPPER.treeToValue(reply.payload(),
5252
AuthResponsePayload.class);
5353
} catch (Exception e) {
54-
ctx.statusSink.accept(ClientStatus.AUTH_FAILED);
54+
ctx.statusSink().accept(ClientStatus.AUTH_FAILED);
5555
Log.error(e, "Authentication response malformed");
5656
return reply;
5757
}
@@ -62,16 +62,16 @@ public SendOperation accept(AuthRequestContext ctx) {
6262
serverMac);
6363

6464
if (!ok) {
65-
ctx.statusSink.accept(ClientStatus.AUTH_FAILED);
65+
ctx.statusSink().accept(ClientStatus.AUTH_FAILED);
6666
Log.error("Authentication failed: invalid server proof");
6767
} else {
68-
ctx.statusSink.accept(ClientStatus.AUTH_OK);
68+
ctx.statusSink().accept(ClientStatus.AUTH_OK);
6969
Log.success("Authenticated successfully");
7070
}
7171
return reply;
7272
})
7373
.exceptionally(ex -> {
74-
ctx.statusSink.accept(ClientStatus.AUTH_FAILED);
74+
ctx.statusSink().accept(ClientStatus.AUTH_FAILED);
7575
var cause = (ex.getCause() != null) ? ex.getCause() : ex;
7676
if (cause instanceof java.util.concurrent.TimeoutException) {
7777
Log.error("Authentication timeout");

backends/src/main/java/dev/objz/commandbridge/backends/net/out/ctx/AuthRequestContext.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@
66

77
import dev.objz.commandbridge.backends.net.connection.ClientStatus;
88

9-
public final class AuthRequestContext {
10-
public final Duration timeout;
11-
public final Consumer<ClientStatus> statusSink;
9+
public record AuthRequestContext(
10+
Duration timeout,
11+
Consumer<ClientStatus> statusSink) {
1212

13-
public AuthRequestContext(Duration timeout, Consumer<ClientStatus> statusSink) {
14-
this.timeout = Objects.requireNonNull(timeout);
15-
this.statusSink = Objects.requireNonNull(statusSink);
13+
public AuthRequestContext {
14+
Objects.requireNonNull(timeout);
15+
Objects.requireNonNull(statusSink);
1616
}
1717
}

backends/src/main/java/dev/objz/commandbridge/backends/platform/bootstrap/VelocityMain.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,9 @@ public void load() {
3232
adapter.load(env, this);
3333

3434
} catch (ClassNotFoundException e) {
35-
Log.error("Adapter class not found: dev.objz.commandbridge.velocity.Adapter. " +
36-
"Is the backends:velocity module loaded?", e);
35+
Log.error(e, "Adapter class not found: dev.objz.commandbridge.velocity.Adapter. Is the backends:velocity module loaded?");
3736
} catch (Exception e) {
38-
Log.error("Adapter load failed: {}", e.getMessage());
39-
e.printStackTrace();
37+
Log.error(e, "Adapter load failed: {}", e.getMessage());
4038
}
4139
}
4240

backends/src/main/java/dev/objz/commandbridge/backends/platform/cmd/ArgumentMapper.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,27 @@
11
package dev.objz.commandbridge.backends.platform.cmd;
22

3-
import dev.jorel.commandapi.arguments.*;
3+
import dev.jorel.commandapi.arguments.AngleArgument;
4+
import dev.jorel.commandapi.arguments.Argument;
5+
import dev.jorel.commandapi.arguments.ArgumentSuggestions;
6+
import dev.jorel.commandapi.arguments.BiomeArgument;
7+
import dev.jorel.commandapi.arguments.BooleanArgument;
8+
import dev.jorel.commandapi.arguments.DoubleArgument;
9+
import dev.jorel.commandapi.arguments.DoubleRangeArgument;
10+
import dev.jorel.commandapi.arguments.EnchantmentArgument;
11+
import dev.jorel.commandapi.arguments.EntitySelectorArgument;
12+
import dev.jorel.commandapi.arguments.EntityTypeArgument;
13+
import dev.jorel.commandapi.arguments.GreedyStringArgument;
14+
import dev.jorel.commandapi.arguments.IntegerArgument;
15+
import dev.jorel.commandapi.arguments.ItemStackArgument;
16+
import dev.jorel.commandapi.arguments.Location2DArgument;
17+
import dev.jorel.commandapi.arguments.LocationArgument;
18+
import dev.jorel.commandapi.arguments.PotionEffectArgument;
19+
import dev.jorel.commandapi.arguments.RotationArgument;
20+
import dev.jorel.commandapi.arguments.SoundArgument;
21+
import dev.jorel.commandapi.arguments.StringArgument;
22+
import dev.jorel.commandapi.arguments.TextArgument;
23+
import dev.jorel.commandapi.arguments.TimeArgument;
24+
import dev.jorel.commandapi.arguments.WorldArgument;
425
import dev.objz.commandbridge.cmd.ArgumentMapperInterface;
526
import dev.objz.commandbridge.scripting.model.enums.ArgType;
627
import dev.objz.commandbridge.scripting.model.records.mapping.ArgMapping;

backends/velocity/src/main/java/dev/objz/commandbridge/velocity/Adapter.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,9 @@ public final class Adapter implements PlatformAdapter {
4444

4545
@Override
4646
public void load(PlatformEnv env, Object plugin) throws Exception {
47-
if (!(plugin instanceof VelocityMain)) {
47+
if (!(plugin instanceof VelocityMain bootstrap)) {
4848
throw new IllegalArgumentException("Plugin must be instance of VelocityMain");
4949
}
50-
51-
VelocityMain bootstrap = (VelocityMain) plugin;
5250
this.proxy = bootstrap.getProxy();
5351
this.pluginInstance = bootstrap.getPluginInstance();
5452

@@ -62,7 +60,7 @@ public void load(PlatformEnv env, Object plugin) throws Exception {
6260
}
6361
if (cfg != null) {
6462
Log.setDebug(cfg.debug());
65-
Log.info("Debug mode is " + (cfg.debug() ? "enabled" : "disabled"));
63+
Log.info("Debug mode is {}", cfg.debug() ? "enabled" : "disabled");
6664
}
6765

6866
this.commandExecutor = new VelocityExecutor(proxy, this.pluginInstance);

core/src/main/java/dev/objz/commandbridge/config/ConfigKeys.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
import java.lang.reflect.Field;
66
import java.lang.reflect.Method;
77
import java.lang.reflect.RecordComponent;
8-
import java.util.*;
8+
import java.util.Arrays;
9+
import java.util.Locale;
10+
import java.util.Set;
911
import java.util.stream.Collectors;
1012

1113
public final class ConfigKeys {

0 commit comments

Comments
 (0)