Browse Source

[ci skip] Some cleanup for Platform class and other platform-specific stuff (#201)

* Ensure paths returned by Platform are absolute, add javadocs to Platform

Signed-off-by: Max <maxh2709@gmail.com>

* Use putIfAbsent for event buses to clean up some minor nastyness

Signed-off-by: Max <maxh2709@gmail.com>

* Remove explicit NotNull annotation
Max 3 years ago
parent
commit
5d276f04ed

+ 71 - 1
common/src/main/java/me/shedaniel/architectury/platform/Platform.java

@@ -29,6 +29,7 @@ import org.jetbrains.annotations.ApiStatus;
 
 import java.nio.file.Path;
 import java.util.Collection;
+import java.util.NoSuchElementException;
 import java.util.Optional;
 
 public final class Platform {
@@ -77,49 +78,118 @@ public final class Platform {
         return SharedConstants.getCurrentVersion().getId();
     }
     
+    /**
+     * Gets the root directory for the current instance of Minecraft.
+     * <p>
+     * The returned path is guaranteed to be <b>absolute</b>.
+     */
     @ExpectPlatform
     public static Path getGameFolder() {
         throw new AssertionError();
     }
     
+    /**
+     * Gets the main <code>config</code> folder for the current instance of Minecraft.
+     * <p>
+     * The returned path is guaranteed to be <b>absolute</b>.
+     */
     @ExpectPlatform
     public static Path getConfigFolder() {
         throw new AssertionError();
     }
     
+    /**
+     * Gets the <code>mods</code> folder of the current instance of Minecraft.
+     * <p>
+     * The returned path is guaranteed to be <b>absolute</b>.
+     */
+    @ExpectPlatform
+    public static Path getModsFolder() {
+        throw new AssertionError();
+    }
+    
+    /**
+     * Returns the current Environment the game is running in,
+     * being one of either <code>CLIENT</code> or <code>SERVER</code>.
+     * <p>
+     * The class returned is a platform-agnostic wrapper around the
+     * <code>EnvType</code> and <code>Dist</code> enums, respectively.
+     *
+     * @return The current Environment, as an instance of {@link Env}
+     * @see Env
+     * @see #getEnv()
+     */
     @ExpectPlatform
     public static Env getEnvironment() {
         throw new AssertionError();
     }
     
+    /**
+     * Returns the current Environment the game is running in,
+     * as a member of the {@link EnvType} enum. This is remapped
+     * on Forge to be the <code>Dist</code> enum, instead.
+     *
+     * @return The current Environment, as an instance of {@link EnvType}
+     * (or <code>Dist</code> on Forge)
+     */
     @ExpectPlatform
     public static EnvType getEnv() {
         throw new AssertionError();
     }
     
+    /**
+     * Checks whether a mod with the given mod ID is present.
+     *
+     * @param id The mod ID to check.
+     * @return <code>true</code> if the mod is loaded, <code>false</code> otherwise.
+     */
     @ExpectPlatform
     public static boolean isModLoaded(String id) {
         throw new AssertionError();
     }
     
+    /**
+     * Gets a {@link Mod} container by its mod ID.
+     *
+     * @param id The mod ID to look for.
+     * @return The mod container, if found.
+     * @throws NoSuchElementException if no mod with the given ID exists
+     */
     @ExpectPlatform
     public static Mod getMod(String id) {
         throw new AssertionError();
     }
     
+    /**
+     * Optionally gets a {@link Mod} container by its mod ID if it exists.
+     *
+     * @param id The mod ID to look for.
+     * @return An optional representing the mod container, if found,
+     * or an empty optional otherwise.
+     */
     public static Optional<Mod> getOptionalMod(String id) {
         try {
             return Optional.of(getMod(id));
-        } catch (NullPointerException e) {
+        } catch (NoSuchElementException e) {
             return Optional.empty();
         }
     }
     
+    /**
+     * Gets a collection of {@link Mod} containers for all currently-loaded mods.
+     *
+     * @return A collection of mod containers.
+     */
     @ExpectPlatform
     public static Collection<Mod> getMods() {
         throw new AssertionError();
     }
     
+    /**
+     * Gets a collection of Strings representing the mod IDs of all currently-loaded mods.
+     *
+     * @return A collection of all loaded mod IDs.
+     */
     @ExpectPlatform
     public static Collection<String> getModIds() {
         throw new AssertionError();

+ 3 - 3
fabric/src/main/java/me/shedaniel/architectury/platform/fabric/PlatformImpl.java

@@ -41,11 +41,11 @@ public class PlatformImpl {
     private static final Map<String, Mod> mods = new ConcurrentHashMap<>();
     
     public static Path getGameFolder() {
-        return FabricLoader.getInstance().getGameDir();
+        return FabricLoader.getInstance().getGameDir().toAbsolutePath();
     }
     
     public static Path getConfigFolder() {
-        return FabricLoader.getInstance().getConfigDir();
+        return FabricLoader.getInstance().getConfigDir().toAbsolutePath();
     }
     
     public static Path getModsFolder() {
@@ -88,7 +88,7 @@ public class PlatformImpl {
         private final ModMetadata metadata;
         
         public ModImpl(String id) {
-            this.container = FabricLoader.getInstance().getModContainer(id).get();
+            this.container = FabricLoader.getInstance().getModContainer(id).orElseThrow();
             this.metadata = this.container.getMetadata();
         }
         

+ 1 - 3
forge/src/main/java/me/shedaniel/architectury/platform/forge/EventBuses.java

@@ -32,9 +32,7 @@ public final class EventBuses {
     private static final Map<String, List<Consumer<IEventBus>>> ON_REGISTERED = new HashMap<>();
     
     public static void registerModEventBus(String modId, IEventBus bus) {
-        IEventBus previous = EVENT_BUS_MAP.put(modId, bus);
-        if (previous != null) {
-            EVENT_BUS_MAP.put(modId, previous);
+        if (EVENT_BUS_MAP.putIfAbsent(modId, bus) != bus) {
             throw new IllegalStateException("Can't register event bus for mod '" + modId + "' because it was previously registered!");
         }
         

+ 2 - 2
forge/src/main/java/me/shedaniel/architectury/platform/forge/PlatformImpl.java

@@ -91,11 +91,11 @@ public class PlatformImpl {
         private final ModInfo info;
         
         public ModImpl(String id) {
-            this.container = ModList.get().getModContainerById(id).get();
+            this.container = ModList.get().getModContainerById(id).orElseThrow();
             this.info = ModList.get().getMods().stream()
                     .filter(modInfo -> Objects.equals(modInfo.getModId(), id))
                     .findAny()
-                    .get();
+                    .orElseThrow();
         }
         
         @Override