diff --git a/src/main/groovy/com/github/winplay02/gitcraft/manifest/BaseMetadataProvider.java b/src/main/groovy/com/github/winplay02/gitcraft/manifest/BaseMetadataProvider.java
index 775f0ad7..91fb3c1e 100644
--- a/src/main/groovy/com/github/winplay02/gitcraft/manifest/BaseMetadataProvider.java
+++ b/src/main/groovy/com/github/winplay02/gitcraft/manifest/BaseMetadataProvider.java
@@ -93,6 +93,7 @@ protected final void writeSemverCache() {
}
/**
+ * Loads versions using given executor if they were not already loaded. Executor must be not null.
* @return A map containing all available versions, keyed by a unique name (see {@linkplain VersionInfo#id()}).
*/
@Override
@@ -101,12 +102,28 @@ public final Map getVersions(Executor executor) throws I
return Collections.unmodifiableMap(this.versionsById);
}
+ /**
+ * When calling the versions must be already loaded. Crashes if not.
+ * @return A map containing all available versions, keyed by a unique name (see {@linkplain VersionInfo#id()}).
+ */
+ @Override
+ public final Map getVersionsAssumeLoaded() {
+ if (!this.versionsLoaded) {
+ MiscHelper.panic("getVersionsAssumeLoaded() called but the versions are not loaded");
+ }
+ return Collections.unmodifiableMap(this.versionsById);
+ }
+
public final void initializeAndLoadVersions(Executor executor) throws IOException {
synchronized (this) {
if (!this.versionsLoaded) {
+ if (executor == null) {
+ MiscHelper.panic("Cannot load versions because provided executor is null");
+ }
this.loadVersions(executor);
this.postLoadVersions();
this.writeSemverCache();
+ this.versionsLoaded = true;
}
}
}
@@ -163,7 +180,6 @@ protected void loadVersions(Executor executor) throws IOException {
}
});
}
- this.versionsLoaded = true;
}
protected void postLoadVersions() {
@@ -281,12 +297,7 @@ protected final boolean isExistingVersionMetadataValid(String id, String url, St
@Override
public final OrderedVersion getVersionByVersionID(String versionId) {
- try {
- return this.getVersions(null).get(versionId);
- } catch (Exception e) {
- MiscHelper.panicBecause(e, "Could not fetch version information by id '%s'", versionId);
- return null;
- }
+ return this.getVersionsAssumeLoaded().get(versionId);
}
@Override
diff --git a/src/main/groovy/com/github/winplay02/gitcraft/manifest/MetadataProvider.java b/src/main/groovy/com/github/winplay02/gitcraft/manifest/MetadataProvider.java
index feb2f770..8c0ff0a6 100644
--- a/src/main/groovy/com/github/winplay02/gitcraft/manifest/MetadataProvider.java
+++ b/src/main/groovy/com/github/winplay02/gitcraft/manifest/MetadataProvider.java
@@ -25,10 +25,17 @@ public interface MetadataProvider> {
String getInternalName();
/**
+ * Loads versions using given executor if they were not already loaded. Executor must be not null.
* @return A map containing all available versions, keyed by a unique name (see {@linkplain VersionInfo#id VersionInfo.id}).
*/
Map getVersions(Executor executor) throws IOException;
+ /**
+ * When calling the versions must be already loaded. Crashes if not.
+ * @return A map containing all available versions, keyed by a unique name (see {@linkplain VersionInfo#id VersionInfo.id}).
+ */
+ Map getVersionsAssumeLoaded();
+
/**
* Finds parent nodes to the provided version. Used to construct the {@link com.github.winplay02.gitcraft.graph.AbstractVersionGraph}.
*
diff --git a/src/main/groovy/com/github/winplay02/gitcraft/manifest/historic/HistoricMojangLauncherMetadataProvider.java b/src/main/groovy/com/github/winplay02/gitcraft/manifest/historic/HistoricMojangLauncherMetadataProvider.java
index a28c65cb..a24700c1 100644
--- a/src/main/groovy/com/github/winplay02/gitcraft/manifest/historic/HistoricMojangLauncherMetadataProvider.java
+++ b/src/main/groovy/com/github/winplay02/gitcraft/manifest/historic/HistoricMojangLauncherMetadataProvider.java
@@ -191,10 +191,8 @@ private CompletableFuture constructMostHistoricallyTruthfulVersi
@Override
protected void loadVersions(Executor executor) throws IOException {
this.versionsById.clear();
- this.mojangLauncherMetadataProvider.initializeAndLoadVersions(executor);
- this.skyrisingMetadataProvider.initializeAndLoadVersions(executor);
- Set mojangVersionIds = this.mojangLauncherMetadataProvider.getVersions(null).keySet();
- Set skyrisingVersionIds = this.skyrisingMetadataProvider.getVersions(null).keySet();
+ Set mojangVersionIds = this.mojangLauncherMetadataProvider.getVersions(executor).keySet();
+ Set skyrisingVersionIds = this.skyrisingMetadataProvider.getVersions(executor).keySet();
Set transformedSkyrisingVersionIds = MiscHelper.concatStreams(
skyrisingVersionIds.stream().filter(SKYRISING_MOJANG_VERSION_ID_MAPPING::containsKey).map(SKYRISING_MOJANG_VERSION_ID_MAPPING::get),
skyrisingVersionIds.stream().filter(Predicate.not(SKYRISING_MOJANG_VERSION_ID_MAPPING::containsKey))
@@ -232,7 +230,6 @@ protected void loadVersions(Executor executor) throws IOException {
for (Map.Entry> futureEntry : futureVersionsMap.entrySet()) {
this.versionsById.put(futureEntry.getKey(), futureEntry.getValue().join());
}
- this.versionsLoaded = true;
}
@Override
diff --git a/src/test/groovy/com/github/winplay02/gitcraft/GitCraftTest.java b/src/test/groovy/com/github/winplay02/gitcraft/GitCraftTest.java
index e60b24c2..f87b6f96 100644
--- a/src/test/groovy/com/github/winplay02/gitcraft/GitCraftTest.java
+++ b/src/test/groovy/com/github/winplay02/gitcraft/GitCraftTest.java
@@ -1,7 +1,9 @@
package com.github.winplay02.gitcraft;
+import com.github.winplay02.gitcraft.config.ApplicationConfiguration;
import com.github.winplay02.gitcraft.config.Configuration;
import com.github.winplay02.gitcraft.exceptions.ExceptionsFlavour;
+import com.github.winplay02.gitcraft.manifest.ManifestSource;
import com.github.winplay02.gitcraft.manifest.skyrising.SkyrisingMetadataProvider;
import com.github.winplay02.gitcraft.manifest.vanilla.MojangLauncherMetadataProvider;
import com.github.winplay02.gitcraft.mappings.MappingFlavour;
@@ -122,12 +124,32 @@ public void mappingsMojang() throws IOException, URISyntaxException, Interrupted
@Test
public void mappingsParchment() throws IOException, URISyntaxException, InterruptedException {
- MojangLauncherMetadataProvider metadataBootstrap = new MojangLauncherMetadataProvider();
- Files.copy(LibraryPaths.lookupCurrentWorkingDirectory().resolve(String.format("semver-cache-%s.json", metadataBootstrap.getInternalName())), LibraryPaths.CURRENT_WORKING_DIRECTORY.resolve(String.format("semver-cache-%s.json", metadataBootstrap.getInternalName())), StandardCopyOption.REPLACE_EXISTING);
- metadataBootstrap = new MojangLauncherMetadataProvider();
+ MojangLauncherMetadataProvider metadataBootstrap1 = new MojangLauncherMetadataProvider();
+ Files.copy(LibraryPaths.lookupCurrentWorkingDirectory().resolve(String.format("semver-cache-%s.json", metadataBootstrap1.getInternalName())), LibraryPaths.CURRENT_WORKING_DIRECTORY.resolve(String.format("semver-cache-%s.json", metadataBootstrap1.getInternalName())), StandardCopyOption.REPLACE_EXISTING);
+ Configuration.editConfiguration(ApplicationConfiguration.class, (original) -> new ApplicationConfiguration(
+ ManifestSource.MOJANG,
+ original.usedMapping(),
+ original.fallbackMappings(),
+ original.usedUnpickFlavour(),
+ original.fallbackUnpickFlavours(),
+ original.singleSideVersionsOnMainBranch(),
+ original.onlyStableReleases(),
+ original.onlySnapshots(),
+ original.skipNonLinear(),
+ original.onlyVersion(),
+ original.minVersion(),
+ original.maxVersion(),
+ original.excludedVersion(),
+ original.ornitheIntermediaryGeneration(),
+ original.patchLvt(),
+ original.usedExceptions(),
+ original.usedSignatures(),
+ original.usedNests(),
+ original.enablePreening()
+ ));
MinecraftVersionGraph versionGraph;
try (ExecutorService executor = Executors.newThreadPerTaskExecutor(Thread.ofVirtual().name("Testing-Executor").factory())) {
- versionGraph = MinecraftVersionGraph.createFromMetadata(executor, metadataBootstrap);
+ versionGraph = MinecraftVersionGraph.createFromMetadata(executor, GitCraftApplication.getApplicationConfiguration().manifestSource().getMetadataProvider());
//
Path mappingsPath = MappingFlavour.MOJMAP_PARCHMENT.getPath(versionGraph.getMinecraftVersionByName("1.20.1"), MinecraftJar.MERGED).orElse(null);
assertNotNull(mappingsPath);
@@ -148,12 +170,32 @@ public void mappingsParchment() throws IOException, URISyntaxException, Interrup
@Test
public void mappingsFabricIntermediary() throws IOException, URISyntaxException, InterruptedException {
- MojangLauncherMetadataProvider metadataBootstrap = new MojangLauncherMetadataProvider();
- Files.copy(LibraryPaths.lookupCurrentWorkingDirectory().resolve(String.format("semver-cache-%s.json", metadataBootstrap.getInternalName())), LibraryPaths.CURRENT_WORKING_DIRECTORY.resolve(String.format("semver-cache-%s.json", metadataBootstrap.getInternalName())), StandardCopyOption.REPLACE_EXISTING);
- metadataBootstrap = new MojangLauncherMetadataProvider();
+ MojangLauncherMetadataProvider metadataBootstrap1 = new MojangLauncherMetadataProvider();
+ Files.copy(LibraryPaths.lookupCurrentWorkingDirectory().resolve(String.format("semver-cache-%s.json", metadataBootstrap1.getInternalName())), LibraryPaths.CURRENT_WORKING_DIRECTORY.resolve(String.format("semver-cache-%s.json", metadataBootstrap1.getInternalName())), StandardCopyOption.REPLACE_EXISTING);
+ Configuration.editConfiguration(ApplicationConfiguration.class, (original) -> new ApplicationConfiguration(
+ ManifestSource.MOJANG,
+ original.usedMapping(),
+ original.fallbackMappings(),
+ original.usedUnpickFlavour(),
+ original.fallbackUnpickFlavours(),
+ original.singleSideVersionsOnMainBranch(),
+ original.onlyStableReleases(),
+ original.onlySnapshots(),
+ original.skipNonLinear(),
+ original.onlyVersion(),
+ original.minVersion(),
+ original.maxVersion(),
+ original.excludedVersion(),
+ original.ornitheIntermediaryGeneration(),
+ original.patchLvt(),
+ original.usedExceptions(),
+ original.usedSignatures(),
+ original.usedNests(),
+ original.enablePreening()
+ ));
MinecraftVersionGraph versionGraph;
try (ExecutorService executor = Executors.newThreadPerTaskExecutor(Thread.ofVirtual().name("Testing-Executor").factory())) {
- versionGraph = MinecraftVersionGraph.createFromMetadata(executor, metadataBootstrap);
+ versionGraph = MinecraftVersionGraph.createFromMetadata(executor, GitCraftApplication.getApplicationConfiguration().manifestSource().getMetadataProvider());
//
Path mappingsPath = MappingFlavour.FABRIC_INTERMEDIARY.getPath(versionGraph.getMinecraftVersionByName("1.20"), MinecraftJar.MERGED).orElse(null);
assertNotNull(mappingsPath);
@@ -174,12 +216,32 @@ public void mappingsFabricIntermediary() throws IOException, URISyntaxException,
@Test
public void mappingsYarn() throws IOException, URISyntaxException, InterruptedException {
- MojangLauncherMetadataProvider metadataBootstrap = new MojangLauncherMetadataProvider();
- Files.copy(LibraryPaths.lookupCurrentWorkingDirectory().resolve(String.format("semver-cache-%s.json", metadataBootstrap.getInternalName())), LibraryPaths.CURRENT_WORKING_DIRECTORY.resolve(String.format("semver-cache-%s.json", metadataBootstrap.getInternalName())), StandardCopyOption.REPLACE_EXISTING);
- metadataBootstrap = new MojangLauncherMetadataProvider();
+ MojangLauncherMetadataProvider metadataBootstrap1 = new MojangLauncherMetadataProvider();
+ Files.copy(LibraryPaths.lookupCurrentWorkingDirectory().resolve(String.format("semver-cache-%s.json", metadataBootstrap1.getInternalName())), LibraryPaths.CURRENT_WORKING_DIRECTORY.resolve(String.format("semver-cache-%s.json", metadataBootstrap1.getInternalName())), StandardCopyOption.REPLACE_EXISTING);
+ Configuration.editConfiguration(ApplicationConfiguration.class, (original) -> new ApplicationConfiguration(
+ ManifestSource.MOJANG,
+ original.usedMapping(),
+ original.fallbackMappings(),
+ original.usedUnpickFlavour(),
+ original.fallbackUnpickFlavours(),
+ original.singleSideVersionsOnMainBranch(),
+ original.onlyStableReleases(),
+ original.onlySnapshots(),
+ original.skipNonLinear(),
+ original.onlyVersion(),
+ original.minVersion(),
+ original.maxVersion(),
+ original.excludedVersion(),
+ original.ornitheIntermediaryGeneration(),
+ original.patchLvt(),
+ original.usedExceptions(),
+ original.usedSignatures(),
+ original.usedNests(),
+ original.enablePreening()
+ ));
MinecraftVersionGraph versionGraph;
try (ExecutorService executor = Executors.newThreadPerTaskExecutor(Thread.ofVirtual().name("Testing-Executor").factory())) {
- versionGraph = MinecraftVersionGraph.createFromMetadata(executor, metadataBootstrap);
+ versionGraph = MinecraftVersionGraph.createFromMetadata(executor, GitCraftApplication.getApplicationConfiguration().manifestSource().getMetadataProvider());
//
Path mappingsPath = MappingFlavour.YARN.getPath(versionGraph.getMinecraftVersionByName("1.20"), MinecraftJar.MERGED).orElse(null);
assertNotNull(mappingsPath);