Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
127 changes: 65 additions & 62 deletions src/main/java/net/ornithemc/meta/data/VersionDatabase.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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<List<BaseVersion>> game;
private final Int2ObjectMap<List<MavenVersion>> intermediary;
private final Int2ObjectMap<List<MavenBuildGameVersion>> feather;
private final Map<LoaderType, List<MavenBuildVersion>> loader;
private final Map<String, List<MavenVersion>> oslDependencies;
private final Map<String, List<MavenVersion>> oslModules;
public List<MavenBuildGameVersion> raven;
public List<MavenBuildGameVersion> sparrow;
public List<MavenBuildGameVersion> nests;
public List<MavenUrlVersion> installer;
public List<MavenVersion> osl;
public List<LibraryUpgrade> 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<String, PomParser> getOslModulePomParsers(List<MavenVersion> osl) {
Set<String> versions = new HashSet<>();
Map<String, PomParser> 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<String> oslModules() {
List<String> modules = new ArrayList<>();

try {
URL url = new URL(ORNITHE_MAVEN_DETAILS_URL + "net/ornithemc/osl");
Expand All @@ -123,8 +104,8 @@ public static final Map<String, PomParser> getOslModulePomParsers(List<MavenVers
JsonNode type = file.get("type");

if (name != null && name.isValueNode() && type != null && type.isValueNode()) {
if (!versions.contains(name.asText()) && "DIRECTORY".equals(type.asText())) {
parsers.put(name.asText(), new PomParser(ORNITHE_MAVEN_URL + "net/ornithemc/osl/" + name.asText() + "/maven-metadata.xml"));
if (!Character.isDigit(name.asText().charAt(0)) && "DIRECTORY".equals(type.asText())) {
modules.add(name.asText());
}
}
}
Expand All @@ -135,29 +116,54 @@ public static final Map<String, PomParser> getOslModulePomParsers(List<MavenVers
} catch (IOException e) {
}

return parsers;
return modules;
}

public final VersionManifest manifest;
private final Int2ObjectMap<List<BaseVersion>> game;
private final Int2ObjectMap<List<MavenVersion>> intermediary;
private final Int2ObjectMap<List<MavenBuildGameVersion>> feather;
private final Map<LoaderType, List<MavenBuildVersion>> loader;
private final Map<String, List<MavenVersion>> oslDependencies;
private final Map<String, List<MavenVersion>> oslModules;

public List<MavenBuildGameVersion> raven;
public List<MavenBuildGameVersion> sparrow;
public List<MavenBuildGameVersion> nests;
public List<MavenUrlVersion> installer;
public List<MavenVersion> osl;
public List<LibraryUpgrade> 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 {
long start = System.currentTimeMillis();
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);
break;
}
}
}));
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("-")) {
Expand All @@ -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<String, PomParser> 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();
Expand Down
14 changes: 7 additions & 7 deletions src/main/java/net/ornithemc/meta/data/VersionDatabaseOld.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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<BaseVersion> game;
public List<MavenVersion> calamus;
Expand All @@ -53,16 +53,16 @@ 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);
break;
}
}
});
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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<String> 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 <T extends BaseVersion> List<T> getMeta(Function<String, T> function, String prefix) throws IOException, XMLStreamException {
return getMeta(function, prefix, list -> {
public <T extends BaseVersion> List<T> getVersions(Function<String, T> function) throws IOException, XMLStreamException {
return getVersions(function, list -> {
if (!list.isEmpty()) list.get(0).setStable(true);
});
}

public <T extends BaseVersion> List<T> getMeta(Function<String, T> function, String prefix, StableVersionIdentifier stableIdentifier) throws IOException, XMLStreamException {
public <T extends BaseVersion> List<T> getVersions(Function<String, T> function, StableVersionIdentifier stableIdentifier) throws IOException, XMLStreamException {
List<T> 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<T> 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<String> 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 {
Expand Down
Loading