diff --git a/src/main/java/net/ornithemc/meta/data/VersionDatabase.java b/src/main/java/net/ornithemc/meta/data/VersionDatabase.java index 9d5dde2..599d219 100644 --- a/src/main/java/net/ornithemc/meta/data/VersionDatabase.java +++ b/src/main/java/net/ornithemc/meta/data/VersionDatabase.java @@ -26,8 +26,8 @@ import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import net.ornithemc.meta.OrnitheMeta; import net.ornithemc.meta.utils.MinecraftLauncherMeta; -import net.ornithemc.meta.utils.PomDependencyParser; -import net.ornithemc.meta.utils.PomParser; +import net.ornithemc.meta.utils.MavenPomParser; +import net.ornithemc.meta.utils.MavenMetadataParser; import net.ornithemc.meta.utils.VersionManifest; import net.ornithemc.meta.web.LibraryUpgradesV3; import net.ornithemc.meta.web.LibraryUpgradesV3.LibraryUpgrade; @@ -51,58 +51,39 @@ public class VersionDatabase { public static final String ORNITHE_MAVEN_VERSIONS_URL = "https://maven.ornithemc.net/api/maven/versions/releases/"; public static final String MINECRAFT_LIBRARIES_URL = "https://libraries.minecraft.net/"; - public static final PomParser RAVEN_PARSER = new PomParser(ORNITHE_MAVEN_URL + "net/ornithemc/raven/maven-metadata.xml"); - public static final PomParser SPARROW_PARSER = new PomParser(ORNITHE_MAVEN_URL + "net/ornithemc/sparrow/maven-metadata.xml"); - public static final PomParser NESTS_PARSER = new PomParser(ORNITHE_MAVEN_URL + "net/ornithemc/nests/maven-metadata.xml"); - public static final PomParser FABRIC_LOADER_PARSER = new PomParser(FABRIC_MAVEN_URL + "net/fabricmc/fabric-loader/maven-metadata.xml"); - public static final PomParser QUILT_LOADER_PARSER = new PomParser(QUILT_MAVEN_URL + "org/quiltmc/quilt-loader/maven-metadata.xml"); - public static final PomParser INSTALLER_PARSER = new PomParser(ORNITHE_MAVEN_URL + "net/ornithemc/ornithe-installer/maven-metadata.xml"); - public static final PomParser OSL_PARSER = new PomParser(ORNITHE_MAVEN_URL + "net/ornithemc/osl/maven-metadata.xml"); - public static final PomDependencyParser OSL_DEPENDENCY_PARSER = new PomDependencyParser(ORNITHE_MAVEN_URL + "net/ornithemc/osl"); + public static final MavenMetadataParser RAVEN_METADATA_PARSER = new MavenMetadataParser(ORNITHE_MAVEN_URL, "net.ornithemc", "raven"); + public static final MavenMetadataParser SPARROW_METADATA_PARSER = new MavenMetadataParser(ORNITHE_MAVEN_URL, "net.ornithemc", "sparrow"); + public static final MavenMetadataParser NESTS_METADATA_PARSER = new MavenMetadataParser(ORNITHE_MAVEN_URL, "net.ornithemc", "nests"); + public static final MavenMetadataParser FABRIC_LOADER_METADATA_PARSER = new MavenMetadataParser(FABRIC_MAVEN_URL, "net.fabricmc", "fabric-loader"); + public static final MavenMetadataParser QUILT_LOADER_METADATA_PARSER = new MavenMetadataParser(QUILT_MAVEN_URL, "org.quiltmc", "quilt-loader"); + public static final MavenMetadataParser INSTALLER_METADATA_PARSER = new MavenMetadataParser(ORNITHE_MAVEN_URL, "net.ornithemc", "ornithe-installer"); + public static final MavenMetadataParser OSL_METADATA_PARSER = new MavenMetadataParser(ORNITHE_MAVEN_URL, "net.ornithemc", "osl"); + public static final MavenPomParser OSL_POM_PARSER = new MavenPomParser(ORNITHE_MAVEN_URL, "net.ornithemc", "osl"); public static ConfigV3 config; - public final VersionManifest manifest = new VersionManifest(); - private final Int2ObjectMap> game; - private final Int2ObjectMap> intermediary; - private final Int2ObjectMap> feather; - private final Map> loader; - private final Map> oslDependencies; - private final Map> oslModules; - public List raven; - public List sparrow; - public List nests; - public List installer; - public List osl; - public List libraryUpgrades; - private VersionDatabase() { - this.game = new Int2ObjectOpenHashMap<>(); - this.intermediary = new Int2ObjectOpenHashMap<>(); - this.feather = new Int2ObjectOpenHashMap<>(); - this.loader = new EnumMap<>(LoaderType.class); - this.oslDependencies = new HashMap<>(); - this.oslModules = new HashMap<>(); + private static final String modifyForIntermediaryGeneration(String s, int generation) { + return generation == 1 ? s : (s + "-gen" + generation); } - public static final PomParser intermediaryParser(int generation) { - return generation == 1 - ? new PomParser(ORNITHE_MAVEN_URL + "net/ornithemc/calamus-intermediary/maven-metadata.xml") - : new PomParser(ORNITHE_MAVEN_URL + "net/ornithemc/calamus-intermediary-gen" + generation + "/maven-metadata.xml", generation <= config.stableIntermediaryGeneration); + private static final MavenMetadataParser generationalMavenMetadataParser(int generation, String groupId, String artifactId) { + return new MavenMetadataParser(ORNITHE_MAVEN_URL, groupId, modifyForIntermediaryGeneration(artifactId, generation), generation <= config.stableIntermediaryGeneration); } - public static final PomParser featherParser(int generation) { - return generation == 1 - ? new PomParser(ORNITHE_MAVEN_URL + "net/ornithemc/feather/maven-metadata.xml") - : new PomParser(ORNITHE_MAVEN_URL + "net/ornithemc/feather-gen" + generation + "/maven-metadata.xml", generation <= config.stableIntermediaryGeneration); + public static final MavenMetadataParser intermediaryMetadataParser(int generation) { + return generationalMavenMetadataParser(generation, "net.ornithemc", "calamus-intermediary"); } - public static final Map getOslModulePomParsers(List osl) { - Set versions = new HashSet<>(); - Map parsers = new HashMap<>(); + public static final MavenMetadataParser featherMetadataParser(int generation) { + return generationalMavenMetadataParser(generation, "net.ornithemc", "feather"); + } - for (MavenVersion v : osl) { - versions.add(v.getVersion()); - } + public static final MavenMetadataParser oslModuleMetadataParser(String module) { + return new MavenMetadataParser(ORNITHE_MAVEN_URL, "net.ornithemc.osl", module); + } + + private static List oslModules() { + List modules = new ArrayList<>(); try { URL url = new URL(ORNITHE_MAVEN_DETAILS_URL + "net/ornithemc/osl"); @@ -123,8 +104,8 @@ public static final Map getOslModulePomParsers(List getOslModulePomParsers(List> game; + private final Int2ObjectMap> intermediary; + private final Int2ObjectMap> feather; + private final Map> loader; + private final Map> oslDependencies; + private final Map> oslModules; + + public List raven; + public List sparrow; + public List nests; + public List installer; + public List osl; + public List libraryUpgrades; + + private VersionDatabase() { + this.manifest = new VersionManifest(); + this.game = new Int2ObjectOpenHashMap<>(); + this.intermediary = new Int2ObjectOpenHashMap<>(); + this.feather = new Int2ObjectOpenHashMap<>(); + this.loader = new EnumMap<>(LoaderType.class); + this.oslDependencies = new HashMap<>(); + this.oslModules = new HashMap<>(); } public static VersionDatabase generate() throws Exception { @@ -143,13 +149,13 @@ public static VersionDatabase generate() throws Exception { VersionDatabase database = new VersionDatabase(); config = ConfigV3.load(); for (int generation = 1; generation <= config.latestIntermediaryGeneration; generation++) { - database.intermediary.put(generation, intermediaryParser(generation).getMeta(MavenVersion::new, generation == 1 ? "net.ornithemc:calamus-intermediary:" : String.format("net.ornithemc:calamus-intermediary-gen%d:", generation))); - database.feather.put(generation, featherParser(generation).getMeta(MavenBuildGameVersion::new, generation == 1 ? "net.ornithemc:feather:" : String.format("net.ornithemc:feather-gen%d:", generation))); + database.intermediary.put(generation, intermediaryMetadataParser(generation).getVersions(MavenVersion::new)); + database.feather.put(generation, featherMetadataParser(generation).getVersions(MavenBuildGameVersion::new)); } - database.raven = RAVEN_PARSER.getMeta(MavenBuildGameVersion::new, "net.ornithemc:raven:"); - database.sparrow = SPARROW_PARSER.getMeta(MavenBuildGameVersion::new, "net.ornithemc:sparrow:"); - database.nests = NESTS_PARSER.getMeta(MavenBuildGameVersion::new, "net.ornithemc:nests:"); - database.loader.put(LoaderType.FABRIC, FABRIC_LOADER_PARSER.getMeta(MavenBuildVersion::new, "net.fabricmc:fabric-loader:", list -> { + database.raven = RAVEN_METADATA_PARSER.getVersions(MavenBuildGameVersion::new); + database.sparrow = SPARROW_METADATA_PARSER.getVersions(MavenBuildGameVersion::new); + database.nests = NESTS_METADATA_PARSER.getVersions(MavenBuildGameVersion::new); + database.loader.put(LoaderType.FABRIC, FABRIC_LOADER_METADATA_PARSER.getVersions(MavenBuildVersion::new, list -> { for (BaseVersion version : list) { if (isPublicLoaderVersion(version)) { version.setStable(true); @@ -157,7 +163,7 @@ public static VersionDatabase generate() throws Exception { } } })); - database.loader.put(LoaderType.QUILT, QUILT_LOADER_PARSER.getMeta(MavenBuildVersion::new, "org.quiltmc:quilt-loader:", list -> { + database.loader.put(LoaderType.QUILT, QUILT_LOADER_METADATA_PARSER.getVersions(MavenBuildVersion::new, list -> { for (BaseVersion version : list) { // Quilt publishes beta versions of their loader, filter those out if (isPublicLoaderVersion(version) && !version.getVersion().contains("-")) { @@ -166,18 +172,15 @@ public static VersionDatabase generate() throws Exception { } } })); - database.installer = INSTALLER_PARSER.getMeta(MavenUrlVersion::new, "net.ornithemc:ornithe-installer:"); - database.osl = OSL_PARSER.getMeta(MavenVersion::new, "net.ornithemc:osl:"); + database.installer = INSTALLER_METADATA_PARSER.getVersions(MavenUrlVersion::new); + database.osl = OSL_METADATA_PARSER.getVersions(MavenVersion::new); for (MavenVersion version : database.osl) { - database.oslDependencies.put(version.getVersion(), OSL_DEPENDENCY_PARSER.getMeta(MavenVersion::new, "osl", version.getVersion(), v -> { + database.oslDependencies.put(version.getVersion(), OSL_POM_PARSER.getDependencies(MavenVersion::new, version.getVersion(), v -> { return v.getMaven().startsWith("net.ornithemc.osl"); })); } - for (Map.Entry e : getOslModulePomParsers(database.osl).entrySet()) { - String module = e.getKey(); - PomParser parser = e.getValue(); - - database.oslModules.put(module, parser.getMeta(MavenVersion::new, "net.ornithemc.osl:" + module + ":")); + for (String module : oslModules()) { + database.oslModules.put(module, oslModuleMetadataParser(module).getVersions(MavenVersion::new)); } database.libraryUpgrades = LibraryUpgradesV3.get(); database.loadMcData(); diff --git a/src/main/java/net/ornithemc/meta/data/VersionDatabaseOld.java b/src/main/java/net/ornithemc/meta/data/VersionDatabaseOld.java index 60e52c2..18b058c 100644 --- a/src/main/java/net/ornithemc/meta/data/VersionDatabaseOld.java +++ b/src/main/java/net/ornithemc/meta/data/VersionDatabaseOld.java @@ -20,7 +20,7 @@ import net.ornithemc.meta.OrnitheMeta; import net.ornithemc.meta.utils.MinecraftLauncherMeta; -import net.ornithemc.meta.utils.PomParser; +import net.ornithemc.meta.utils.MavenMetadataParser; import net.ornithemc.meta.web.models.BaseVersion; import net.ornithemc.meta.web.models.MavenBuildVersion; import net.ornithemc.meta.web.models.MavenUrlVersion; @@ -38,9 +38,9 @@ public class VersionDatabaseOld { public static final String ORNITHE_MAVEN_URL = "https://maven.ornithemc.net/releases/"; - public static final PomParser CALAMUS_PARSER = new PomParser(ORNITHE_MAVEN_URL + "net/ornithemc/calamus/maven-metadata.xml"); - public static final PomParser LOADER_PARSER = new PomParser(ORNITHE_MAVEN_URL + "net/ornithemc/ornithe-loader/maven-metadata.xml"); - public static final PomParser INSTALLER_PARSER = new PomParser(ORNITHE_MAVEN_URL + "net/ornithemc/ornithe-installer-old/maven-metadata.xml"); + public static final MavenMetadataParser CALAMUS_PARSER = new MavenMetadataParser(ORNITHE_MAVEN_URL, "net.ornithemc", "calamus"); + public static final MavenMetadataParser LOADER_PARSER = new MavenMetadataParser(ORNITHE_MAVEN_URL, "net.ornithemc", "ornithe-loader"); + public static final MavenMetadataParser INSTALLER_PARSER = new MavenMetadataParser(ORNITHE_MAVEN_URL, "net.ornithemc", "ornithe-installer-old"); public List game; public List calamus; @@ -53,8 +53,8 @@ private VersionDatabaseOld() { public static VersionDatabaseOld generate() throws IOException, XMLStreamException { long start = System.currentTimeMillis(); VersionDatabaseOld database = new VersionDatabaseOld(); - database.calamus = CALAMUS_PARSER.getMeta(MavenVersion::new, "net.ornithemc:calamus:"); - database.loader = LOADER_PARSER.getMeta(MavenBuildVersion::new, "net.ornithemc:ornithe-loader:", list -> { + database.calamus = CALAMUS_PARSER.getVersions(MavenVersion::new); + database.loader = LOADER_PARSER.getVersions(MavenBuildVersion::new, list -> { for (BaseVersion version : list) { if (isPublicLoaderVersion(version)) { version.setStable(true); @@ -62,7 +62,7 @@ public static VersionDatabaseOld generate() throws IOException, XMLStreamExcepti } } }); - database.installer = INSTALLER_PARSER.getMeta(MavenUrlVersion::new, "net.ornithemc:ornithe-installer-old:"); + database.installer = INSTALLER_PARSER.getVersions(MavenUrlVersion::new); database.loadMcData(); OrnitheMeta.LOGGER.info("DB update took {}ms", System.currentTimeMillis() - start); return database; diff --git a/src/main/java/net/ornithemc/meta/utils/PomParser.java b/src/main/java/net/ornithemc/meta/utils/MavenMetadataParser.java similarity index 52% rename from src/main/java/net/ornithemc/meta/utils/PomParser.java rename to src/main/java/net/ornithemc/meta/utils/MavenMetadataParser.java index 7e8b2cb..8d8b861 100644 --- a/src/main/java/net/ornithemc/meta/utils/PomParser.java +++ b/src/main/java/net/ornithemc/meta/utils/MavenMetadataParser.java @@ -33,79 +33,69 @@ import java.util.Collections; import java.util.List; import java.util.function.Function; -import java.util.stream.Collectors; -public class PomParser { +public class MavenMetadataParser { - public String path; + public String mavenUrl; + public String groupId; + public String artifactId; public boolean require; - public String latestVersion = ""; - public List versions = new ArrayList<>(); - - public PomParser(String path) { - this(path, true); + public MavenMetadataParser(String mavenUrl, String groupId, String artifactId) { + this(mavenUrl, groupId, artifactId, true); } - public PomParser(String path, boolean require) { - this.path = path; + public MavenMetadataParser(String mavenUrl, String groupId, String artifactId, boolean require) { + this.mavenUrl = mavenUrl; + this.groupId = groupId; + this.artifactId = artifactId; this.require = require; } - private void load() throws IOException, XMLStreamException { - versions.clear(); - - URL url = new URL(path); - XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(url.openStream()); - while (reader.hasNext()) { - if (reader.next() == XMLStreamConstants.START_ELEMENT && reader.getLocalName().equals("version")) { - String text = reader.getElementText(); - versions.add(text); - } - } - reader.close(); - Collections.reverse(versions); - latestVersion = versions.get(0); - } - - public List getMeta(Function function, String prefix) throws IOException, XMLStreamException { - return getMeta(function, prefix, list -> { + public List getVersions(Function function) throws IOException, XMLStreamException { + return getVersions(function, list -> { if (!list.isEmpty()) list.get(0).setStable(true); }); } - public List getMeta(Function function, String prefix, StableVersionIdentifier stableIdentifier) throws IOException, XMLStreamException { + public List getVersions(Function function, StableVersionIdentifier stableIdentifier) throws IOException, XMLStreamException { + List versions = new ArrayList<>(); + try { - load(); + URL url = new URL(mavenUrl + groupId.replace('.', '/') + "/" + artifactId + "/maven-metadata.xml"); + XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(url.openStream()); + while (reader.hasNext()) { + if (reader.next() == XMLStreamConstants.START_ELEMENT && reader.getLocalName().equals("version")) { + String version = reader.getElementText(); + String maven = String.format("%s:%s:%s", groupId, artifactId, version); + + versions.add(function.apply(maven)); + } + } + reader.close(); + Collections.reverse(versions); } catch (IOException e){ if (require) { - throw new IOException("Failed to load " + path, e); + throw new IOException("Failed to load " + mavenUrl + " " + groupId + ":" + artifactId, e); } - } - List list = versions.stream() - .map((version) -> prefix + version) - .map(function) - .collect(Collectors.toList()); + versions.clear(); + } - Path unstableVersionsPath = Paths.get(prefix - .replace(":", "_") - .replace(".", "_") - .replaceFirst(".$","") - + ".txt"); + Path unstableVersionsPath = Paths.get(groupId.replace('.', '_') + "_" + artifactId + ".txt"); if (Files.exists(unstableVersionsPath)) { // Read a file containing a new line separated list of versions that should not be marked as stable. List unstableVersions = Files.readAllLines(unstableVersionsPath); - list.stream() + versions.stream() .filter(v -> !unstableVersions.contains(v.getVersion())) .findFirst() .ifPresent(v -> v.setStable(true)); } else { - stableIdentifier.process(list); + stableIdentifier.process(versions); } - return Collections.unmodifiableList(list); + return Collections.unmodifiableList(versions); } public interface StableVersionIdentifier { diff --git a/src/main/java/net/ornithemc/meta/utils/PomDependencyParser.java b/src/main/java/net/ornithemc/meta/utils/MavenPomParser.java similarity index 68% rename from src/main/java/net/ornithemc/meta/utils/PomDependencyParser.java rename to src/main/java/net/ornithemc/meta/utils/MavenPomParser.java index 523aaeb..23ced96 100644 --- a/src/main/java/net/ornithemc/meta/utils/PomDependencyParser.java +++ b/src/main/java/net/ornithemc/meta/utils/MavenPomParser.java @@ -31,24 +31,33 @@ import java.util.List; import java.util.function.Function; -public class PomDependencyParser { +public class MavenPomParser { - public String basePath; + public String mavenUrl; + public String groupId; + public String artifactId; + public boolean require; - public PomDependencyParser(String basePath) { - this.basePath = basePath; + public MavenPomParser(String mavenUrl, String groupId, String artifactId) { + this(mavenUrl, groupId, artifactId, true); } - public List getMeta(Function factory, String prefix, String version) throws IOException, XMLStreamException { - return getMeta(factory, prefix, version, dependency -> true); + public MavenPomParser(String mavenUrl, String groupId, String artifactId, boolean require) { + this.mavenUrl = mavenUrl; + this.groupId = groupId; + this.artifactId = artifactId; + this.require = require; } - public List getMeta(Function factory, String prefix, String version, DependencyFilter filter) throws IOException, XMLStreamException { - String path = String.format("%s/%s/%s-%s.pom", basePath, version, prefix, version); + public List getDependencies(Function factory, String version) throws IOException, XMLStreamException { + return getDependencies(factory, version, dependency -> true); + } + + public List getDependencies(Function factory, String version, DependencyFilter filter) throws IOException, XMLStreamException { List versions = new ArrayList<>(); try { - URL url = new URL(path); + URL url = new URL(mavenUrl + groupId.replace('.', '/') + "/" + artifactId + "/" + version + "/" + artifactId + "-" + version + ".pom"); XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(url.openStream()); while (reader.hasNext()) { if (reader.next() == XMLStreamConstants.START_ELEMENT && reader.getLocalName().equals("dependency")) { @@ -89,7 +98,11 @@ public List getMeta(Function factory, Stri } reader.close(); } catch (IOException e){ - throw new IOException("Failed to load " + path, e); + if (this.require) { + throw new IOException("Failed to load " + mavenUrl + " " + groupId + ":" + artifactId + ":" + version, e); + } + + versions.clear(); } return Collections.unmodifiableList(versions);