Skip to content

Commit 39793e5

Browse files
committed
Add a PlatformSpecific annotation to limit commands and configuration nodes to specific platforms
1 parent 1cd2ecd commit 39793e5

File tree

6 files changed

+97
-6
lines changed

6 files changed

+97
-6
lines changed

core/src/main/java/dev/triassic/template/TemplateImpl.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
package dev.triassic.template;
1111

12+
import dev.triassic.template.annotation.PlatformSpecific;
1213
import dev.triassic.template.command.CommandRegistry;
1314
import dev.triassic.template.command.Commander;
1415
import dev.triassic.template.configuration.ConfigurationManager;
@@ -49,18 +50,20 @@ public TemplateImpl(final TemplatePlugin plugin) {
4950
/**
5051
* Called when the bootstrapped plugin is done initializing.
5152
*/
53+
@PlatformSpecific(PlatformType.BUKKIT)
5254
public void initialize() {
5355
final long startTime = System.currentTimeMillis();
5456

5557
try {
56-
this.config = ConfigurationManager.load(dataDirectory, TemplateConfiguration.class);
58+
this.config = ConfigurationManager.load(
59+
dataDirectory, TemplateConfiguration.class, platformType);
5760
} catch (IOException e) {
5861
logger.error("Failed to load configuration", e);
5962
return;
6063
}
6164

6265
this.commandRegistry = new CommandRegistry(this, commandManager);
63-
commandRegistry.registerAll();
66+
commandRegistry.registerAll(platformType);
6467

6568
logger.info("Enabled in {}ms", System.currentTimeMillis() - startTime);
6669
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/*
2+
* SPDX-License-Identifier: CC0-1.0
3+
*
4+
* Dedicated to the public domain under CC0 1.0 Universal.
5+
*
6+
* You can obtain a full copy of the license at:
7+
* https://creativecommons.org/publicdomain/zero/1.0/
8+
*/
9+
10+
package dev.triassic.template.annotation;
11+
12+
import dev.triassic.template.util.PlatformType;
13+
import java.lang.annotation.ElementType;
14+
import java.lang.annotation.Retention;
15+
import java.lang.annotation.RetentionPolicy;
16+
import java.lang.annotation.Target;
17+
18+
/**
19+
* Marks a class, method, or field as being specific to one or more platforms.
20+
* Can be used for runtime checks or documentation.
21+
*/
22+
@Retention(RetentionPolicy.RUNTIME)
23+
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR})
24+
public @interface PlatformSpecific {
25+
26+
/**
27+
* The platforms this class/method/field is intended for.
28+
*/
29+
PlatformType[] value();
30+
}

core/src/main/java/dev/triassic/template/command/CommandRegistry.java

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@
1010
package dev.triassic.template.command;
1111

1212
import dev.triassic.template.TemplateImpl;
13+
import dev.triassic.template.annotation.PlatformSpecific;
1314
import dev.triassic.template.command.defaults.ReloadCommand;
15+
import dev.triassic.template.util.PlatformType;
1416
import java.util.List;
1517
import lombok.RequiredArgsConstructor;
1618
import org.incendo.cloud.CommandManager;
@@ -27,11 +29,31 @@ public final class CommandRegistry {
2729
/**
2830
* Registers all commands with the command manager.
2931
*/
30-
public void registerAll() {
32+
public void registerAll(PlatformType platform) {
3133
final List<TemplateCommand> commands = List.of(
3234
new ReloadCommand(instance)
3335
);
3436

35-
commands.forEach(command -> command.register(commandManager));
37+
commands.forEach(command -> {
38+
if (isSupported(command.getClass(), platform)) {
39+
command.register(commandManager);
40+
} else {
41+
System.out.println("Skipping " + command.getClass().getSimpleName()
42+
+ " (not supported on " + platform + ")");
43+
}
44+
});
45+
}
46+
47+
private static boolean isSupported(Class<?> clazz, PlatformType platform) {
48+
PlatformSpecific annotation = clazz.getAnnotation(PlatformSpecific.class);
49+
if (annotation == null) {
50+
return true;
51+
}
52+
for (PlatformType allowed : annotation.value()) {
53+
if (allowed == platform) {
54+
return true;
55+
}
56+
}
57+
return false;
3658
}
3759
}

core/src/main/java/dev/triassic/template/command/defaults/ReloadCommand.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@
1010
package dev.triassic.template.command.defaults;
1111

1212
import dev.triassic.template.TemplateImpl;
13+
import dev.triassic.template.annotation.PlatformSpecific;
1314
import dev.triassic.template.command.Commander;
1415
import dev.triassic.template.command.TemplateCommand;
1516
import dev.triassic.template.configuration.ConfigurationManager;
1617
import dev.triassic.template.configuration.TemplateConfiguration;
18+
import dev.triassic.template.util.PlatformType;
1719
import net.kyori.adventure.text.Component;
1820
import net.kyori.adventure.text.format.NamedTextColor;
1921
import org.checkerframework.checker.nullness.qual.NonNull;
@@ -23,6 +25,7 @@
2325
/**
2426
* A command that reloads the plugin's configuration.
2527
*/
28+
@PlatformSpecific({PlatformType.BUKKIT, PlatformType.PAPER})
2629
public final class ReloadCommand extends TemplateCommand {
2730

2831
private final Logger logger;

core/src/main/java/dev/triassic/template/configuration/ConfigurationManager.java

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,22 @@
1010
package dev.triassic.template.configuration;
1111

1212
import dev.triassic.template.BuildParameters;
13+
import dev.triassic.template.annotation.PlatformSpecific;
14+
import dev.triassic.template.util.PlatformType;
1315
import java.io.IOException;
1416
import java.nio.file.Files;
1517
import java.nio.file.Path;
18+
import java.util.Arrays;
1619
import java.util.concurrent.CompletableFuture;
1720
import java.util.concurrent.CompletionException;
1821
import java.util.concurrent.atomic.AtomicReference;
1922
import lombok.AccessLevel;
2023
import lombok.RequiredArgsConstructor;
2124
import org.spongepowered.configurate.CommentedConfigurationNode;
2225
import org.spongepowered.configurate.ConfigurateException;
26+
import org.spongepowered.configurate.objectmapping.ObjectMapper;
27+
import org.spongepowered.configurate.objectmapping.meta.Processor;
28+
import org.spongepowered.configurate.serialize.TypeSerializerCollection;
2329
import org.spongepowered.configurate.yaml.NodeStyle;
2430
import org.spongepowered.configurate.yaml.YamlConfigurationLoader;
2531

@@ -57,14 +63,22 @@ public final class ConfigurationManager<T> {
5763
*/
5864
public static <T> ConfigurationManager<T> load(
5965
Path path,
60-
final Class<T> clazz
66+
final Class<T> clazz,
67+
final PlatformType platform
6168
) throws IOException {
6269
path = path.resolve("config.yml");
6370

6471
final YamlConfigurationLoader loader = YamlConfigurationLoader.builder()
6572
.indent(2)
6673
.nodeStyle(NodeStyle.BLOCK)
67-
.defaultOptions(opts -> opts.header(HEADER))
74+
.defaultOptions(opts -> opts
75+
.header(HEADER)
76+
.serializers(TypeSerializerCollection.defaults().childBuilder()
77+
.registerAnnotatedObjects(ObjectMapper.factoryBuilder()
78+
.addProcessor(PlatformSpecific.class, platformSpecific(platform))
79+
.build()
80+
)
81+
.build()))
6882
.path(path)
6983
.build();
7084

@@ -78,6 +92,19 @@ public static <T> ConfigurationManager<T> load(
7892
return new ConfigurationManager<>(clazz, loader, new AtomicReference<>(config));
7993
}
8094

95+
private static Processor.Factory<PlatformSpecific, Object> platformSpecific(
96+
PlatformType currentPlatform
97+
) {
98+
return (annotation, fieldType) -> (value, destination) -> {
99+
boolean allowed = Arrays.asList(annotation.value()).contains(currentPlatform);
100+
101+
if (!allowed) {
102+
System.out.println("Removing " + destination.key());
103+
destination.parent().removeChild(destination.key());
104+
}
105+
};
106+
}
107+
81108
/**
82109
* Asynchronously reloads the configuration from disk.
83110
* The current configuration object is updated with the newly loaded data.

core/src/main/java/dev/triassic/template/configuration/TemplateConfiguration.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99

1010
package dev.triassic.template.configuration;
1111

12+
import dev.triassic.template.annotation.PlatformSpecific;
13+
import dev.triassic.template.util.PlatformType;
1214
import lombok.Getter;
1315
import org.spongepowered.configurate.objectmapping.ConfigSerializable;
1416
import org.spongepowered.configurate.objectmapping.meta.Comment;
@@ -21,6 +23,10 @@
2123
@SuppressWarnings("FieldMayBeFinal")
2224
public class TemplateConfiguration {
2325

26+
@Comment("Should only appear on Bukkit-like platforms.")
27+
@PlatformSpecific({PlatformType.BUKKIT, PlatformType.PAPER})
28+
private String exampleString = "hello, bukkit!";
29+
2430
/**
2531
* The version of the configuration file.
2632
*/

0 commit comments

Comments
 (0)