diff --git a/gradle.properties b/gradle.properties index c31a9d1..a2eb64f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ # Plugin Information version_major=1 version_minor=1 -version_patch=0 +version_patch=1 maven_group=me.hypherionmc.modutils # Dependencies diff --git a/src/main/java/me/hypherionmc/curseupload/errors/InvalidCurseVersionException.java b/src/main/java/me/hypherionmc/curseupload/errors/InvalidCurseVersionException.java new file mode 100644 index 0000000..753c25e --- /dev/null +++ b/src/main/java/me/hypherionmc/curseupload/errors/InvalidCurseVersionException.java @@ -0,0 +1,78 @@ +/* + * This file is part of CurseUpload4J, licensed under the MIT License (MIT). + * + * Copyright (c) 2023 HypherionSA and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package me.hypherionmc.curseupload.errors; + +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +import static java.util.Collections.unmodifiableList; + +/** + * @author MattSturgeon + * Thrown when using Minecraft Versions that are not supported by Curseforge + */ +public class InvalidCurseVersionException extends IllegalArgumentException { + private final List invalidVersions; + private final List validVersions; + + public static InvalidCurseVersionException of(Collection invalidVersions, Collection validVersions) { + List invalid = invalidVersions.stream().sorted().collect(Collectors.toList()); + List valid = validVersions.stream().sorted().collect(Collectors.toList()); + return new InvalidCurseVersionException(invalid, valid); + } + + private static String message(List invalid, List valid) { + StringBuilder msg = new StringBuilder(); + switch (invalid.size()) { + case 0: break; + case 1: + String v = invalid.stream().findFirst().orElse(null); + msg.append(v).append(" is not a valid game version. "); + break; + default: + msg.append("Invalid game versions: "); + msg.append(String.join(", ", invalid)); + msg.append(". "); + break; + } + msg.append("Valid versions are: "); + msg.append(String.join(", ", valid)); + return msg.toString(); + } + + private InvalidCurseVersionException(List invalidVersions, List validVersions) { + super(message(invalidVersions, validVersions)); + this.invalidVersions = unmodifiableList(invalidVersions); + this.validVersions = unmodifiableList(validVersions); + } + + public final List getInvalidVersions() { + return invalidVersions; + } + + public final List getValidVersions() { + return validVersions; + } +} diff --git a/src/main/java/me/hypherionmc/curseupload/requests/GameVersions.java b/src/main/java/me/hypherionmc/curseupload/requests/GameVersions.java index c394a4b..2346752 100644 --- a/src/main/java/me/hypherionmc/curseupload/requests/GameVersions.java +++ b/src/main/java/me/hypherionmc/curseupload/requests/GameVersions.java @@ -29,11 +29,13 @@ import gnu.trove.set.hash.TLongHashSet; import me.hypherionmc.curseupload.CurseUploadApi; import me.hypherionmc.curseupload.constants.GameType; +import me.hypherionmc.curseupload.errors.InvalidCurseVersionException; import me.hypherionmc.curseupload.schema.versions.Version; import me.hypherionmc.curseupload.schema.versions.VersionType; import me.hypherionmc.curseupload.util.HTTPUtils; import java.io.Reader; +import java.util.Arrays; import java.util.HashSet; import java.util.Set; @@ -64,9 +66,10 @@ private void fetchValidVersionTypes() { try { TLongSet validVersionTypes = new TLongHashSet(); - Reader versionReader = HTTPUtils.fetch(gameType.versionTypesEndpoint()); - VersionType[] types = HTTPUtils.gson.fromJson(versionReader, VersionType[].class); - versionReader.close(); + VersionType[] types; + try (Reader versionReader = HTTPUtils.fetch(gameType.versionTypesEndpoint())) { + types = HTTPUtils.gson.fromJson(versionReader, VersionType[].class); + } for (VersionType type : types) { if (type.slug().startsWith("minecraft") || type.slug().equals("java") || type.slug().equals("environment") || type.slug().equals("modloader") || type.slug().equals("game")) { @@ -74,15 +77,15 @@ private void fetchValidVersionTypes() { } } - Reader gameVersionJson = HTTPUtils.fetch(gameType.versionsEndpoint()); - Version[] versions = HTTPUtils.gson.fromJson(gameVersionJson, Version[].class); - gameVersionJson.close(); - - for (Version version : versions) { - if (validVersionTypes.contains(version.type())) { - version.versions().forEach(ver -> gameVersions.put(ver.name().toLowerCase(), ver.id())); - } + Version[] versions; + try (Reader gameVersionJson = HTTPUtils.fetch(gameType.versionsEndpoint())) { + versions = HTTPUtils.gson.fromJson(gameVersionJson, Version[].class); } + + Arrays.stream(versions) + .filter(version -> validVersionTypes.contains(version.type())) + .flatMap(version -> version.versions().stream()) + .forEach(data -> gameVersions.put(data.name().toLowerCase(), data.id())); } catch (Exception e) { CurseUploadApi.INSTANCE.log("Failed to fetch CurseForge Versions", e); } @@ -93,18 +96,20 @@ private void fetchValidVersionTypes() { * Used when sending a request to the API * @param objects The list of game versions to check * @return The list of game versions ID's if no error occurred + * @throws InvalidCurseVersionException If any game versions are not supported by CurseForge */ public Set resolveGameVersion(Set objects) { - Set set = new HashSet<>(); + Set ids = new HashSet<>(); + Set invalid = new HashSet<>(); objects.forEach(obj -> { - long id = gameVersions.get(obj.toLowerCase()); - if (id == 0) { - throw new IllegalArgumentException(obj + " is not a valid game version. Valid versions are: " + gameVersions.keySet()); - } - set.add(id); + String version = obj.toLowerCase(); + long id = gameVersions.get(version); + if (id == 0) invalid.add(version); + else ids.add(id); }); - return set; + if (invalid.isEmpty()) return ids; + else throw InvalidCurseVersionException.of(invalid, gameVersions.keySet()); } }