feat: modify MdsMod to support gradual addition of information
This commit is contained in:
parent
1daaf73554
commit
082a4f3b9c
@ -50,7 +50,7 @@ public class ModCommand extends Command {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
System.out.println("Scanning installed mods, this might take a while");
|
System.out.println("Scanning installed mods, this might take a while");
|
||||||
instance.mds().runOnce(ScanStage.UPDATE, (path, mod) -> {
|
instance.mds().runOnce(ScanStage.UPDATECHECK, (path, mod) -> {
|
||||||
boolean hasSources = !mod.getMetadata().sources().isEmpty();
|
boolean hasSources = !mod.getMetadata().sources().isEmpty();
|
||||||
boolean updatable = hasSources && mod.getMetadata().sources().values().stream().anyMatch(Optional::isPresent);
|
boolean updatable = hasSources && mod.getMetadata().sources().values().stream().anyMatch(Optional::isPresent);
|
||||||
if (filterUpdatable && !updatable) return;
|
if (filterUpdatable && !updatable) return;
|
||||||
@ -156,9 +156,9 @@ public class ModCommand extends Command {
|
|||||||
}
|
}
|
||||||
Set<Path> mods = pathSupplier.apply(args, instance.path());
|
Set<Path> mods = pathSupplier.apply(args, instance.path());
|
||||||
ModsDirScanner mds = instance.mds();
|
ModsDirScanner mds = instance.mds();
|
||||||
if (!mds.isComplete(ScanStage.UPDATE)) {
|
if (!mds.isComplete(ScanStage.UPDATECHECK)) {
|
||||||
Utils.LOGGER.error("Scanning mods dir to search for dependencies. This might take a while");
|
Utils.LOGGER.error("Scanning mods dir to search for dependencies. This might take a while");
|
||||||
mds.runOnce(ScanStage.UPDATE, (path, mod) -> System.out.println("Scanned " + path));
|
mds.runOnce(ScanStage.UPDATECHECK, (path, mod) -> System.out.println("Scanned " + path));
|
||||||
}
|
}
|
||||||
for (Path mod : mods) {
|
for (Path mod : mods) {
|
||||||
try {
|
try {
|
||||||
|
@ -1,62 +1,86 @@
|
|||||||
package io.gitlab.jfronny.inceptum.launcher.system.mds.threaded;
|
package io.gitlab.jfronny.inceptum.launcher.system.mds;
|
||||||
|
|
||||||
import io.gitlab.jfronny.inceptum.common.GsonPreset;
|
import io.gitlab.jfronny.inceptum.common.GsonPreset;
|
||||||
import io.gitlab.jfronny.inceptum.launcher.model.fabric.FabricModJson;
|
import io.gitlab.jfronny.inceptum.launcher.model.fabric.FabricModJson;
|
||||||
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.GC_ModMeta;
|
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.GC_ModMeta;
|
||||||
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.ModMeta;
|
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.ModMeta;
|
||||||
import io.gitlab.jfronny.inceptum.launcher.system.instance.*;
|
import io.gitlab.jfronny.inceptum.launcher.system.instance.ModManager;
|
||||||
import io.gitlab.jfronny.inceptum.launcher.system.mds.Mod;
|
import io.gitlab.jfronny.inceptum.launcher.system.instance.ModPath;
|
||||||
import io.gitlab.jfronny.inceptum.launcher.system.mds.ScanStage;
|
|
||||||
import io.gitlab.jfronny.inceptum.launcher.system.source.ModSource;
|
import io.gitlab.jfronny.inceptum.launcher.system.source.ModSource;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class MdsMod extends Mod {
|
public class MdsMod extends Mod {
|
||||||
private final ProtoInstance instance;
|
private final ProtoInstance instance;
|
||||||
private final Path imodPath;
|
private final Path imodPath;
|
||||||
private final Path jarPath;
|
|
||||||
private final boolean managedJar;
|
|
||||||
private final ModMeta meta;
|
private final ModMeta meta;
|
||||||
private final @Nullable FabricModJson fmj;
|
private @NotNull ScanStage scanStage = ScanStage.DISCOVER;
|
||||||
|
private @Nullable DownloadAux downloadAux = null;
|
||||||
|
|
||||||
MdsMod(ProtoInstance instance, Path imodPath, Path jarPath, boolean managedJar, ModMeta meta, @Nullable FabricModJson fmj) {
|
public MdsMod(ProtoInstance instance, Path imodPath, ModMeta meta) {
|
||||||
this.instance = instance;
|
this.instance = instance;
|
||||||
this.imodPath = imodPath;
|
this.imodPath = imodPath;
|
||||||
this.jarPath = jarPath;
|
|
||||||
this.managedJar = managedJar;
|
|
||||||
this.meta = meta;
|
this.meta = meta;
|
||||||
this.fmj = fmj;
|
}
|
||||||
|
|
||||||
|
private record DownloadAux(Path jarPath, boolean managedJar, @Nullable FabricModJson fmj) {}
|
||||||
|
|
||||||
|
public void markDownloaded(Path jarPath, boolean managedJar, @Nullable FabricModJson fmj) {
|
||||||
|
this.downloadAux = new DownloadAux(jarPath, managedJar, fmj);
|
||||||
|
this.scanStage = ScanStage.DOWNLOAD;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void markCrossReferenced() {
|
||||||
|
this.scanStage = ScanStage.CROSSREFERENCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void markUpdateChecked() {
|
||||||
|
this.scanStage = ScanStage.UPDATECHECK;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Optional<FabricModJson> getFmj() {
|
||||||
|
return Optional.ofNullable(downloadAux).map(DownloadAux::fmj);
|
||||||
|
}
|
||||||
|
|
||||||
|
private DownloadAux requireDownload() {
|
||||||
|
if (downloadAux == null) throw new NotYetScannedException(ScanStage.DOWNLOAD, getScanStage());
|
||||||
|
return downloadAux;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getName() {
|
public String getName() {
|
||||||
String fileName = imodPath.getFileName().toString();
|
return getFmj().map(fmj -> {
|
||||||
if (fmj == null) return fileName;
|
String version = fmj.version() == null ? "" : ' ' + fmj.version();
|
||||||
String name = fmj.name() == null ? fmj.id() == null ? fileName : fmj.id() : fmj.name();
|
if (fmj.name() != null) return fmj.name() + version;
|
||||||
if (fmj.version() != null) name += ' ' + fmj.version();
|
if (fmj.id() != null) return fmj.id() + version;
|
||||||
return name;
|
return null;
|
||||||
|
}).orElse(imodPath.getFileName().toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String[] getDescription() {
|
public String[] getDescription() {
|
||||||
if (fmj != null && fmj.description() != null) return fmj.description().split("\n");
|
return getFmj().map(fmj -> {
|
||||||
else return new String[]{"No description is available", "You may need to wait for its metadata to be scanned"};
|
if (fmj.description() != null) return fmj.description().split("\n");
|
||||||
|
return new String[]{"No description is available", "This mods' fabric.mod.json has no description"};
|
||||||
|
}).orElse(new String[]{"No description is available", "You may need to wait for its metadata to be scanned"});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean getNeedsInject() {
|
public boolean getNeedsInject() {
|
||||||
return managedJar;
|
return requireDownload().managedJar;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Path getJarPath() {
|
public Path getJarPath() {
|
||||||
return jarPath;
|
return requireDownload().jarPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -66,23 +90,28 @@ public class MdsMod extends Mod {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ScanStage getScanStage() {
|
public ScanStage getScanStage() {
|
||||||
return ScanStage.UPDATE;
|
return scanStage;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void delete() throws IOException {
|
public void delete() throws IOException {
|
||||||
Files.delete(imodPath);
|
Files.delete(imodPath);
|
||||||
if (!managedJar) Files.delete(jarPath);
|
if (downloadAux != null && !downloadAux.managedJar) Files.delete(downloadAux.jarPath);
|
||||||
|
scanStage = ScanStage.NONE;
|
||||||
|
downloadAux = null;
|
||||||
if (meta != null) {
|
if (meta != null) {
|
||||||
for (Mod dependency : getDependencies()) dependency.removeDependent(this);
|
for (String dependency : meta.dependencies()) {
|
||||||
for (Mod dependent : getDependents()) dependent.removeDependency(this);
|
instance.mds().get(instance.modsDir().resolve(dependency)).removeDependent(this);
|
||||||
|
}
|
||||||
|
for (String dependent : meta.dependents()) {
|
||||||
|
instance.mds().get(instance.modsDir().resolve(dependent)).removeDependency(this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Path update(ModSource update) throws IOException {
|
public Path update(ModSource update) throws IOException {
|
||||||
ModManager.DownloadMeta download = ModManager.download(update, imodPath, instance.mds());
|
ModManager.DownloadMeta download = ModManager.download(update, imodPath, instance.mds());
|
||||||
Files.delete(imodPath);
|
|
||||||
download.write();
|
download.write();
|
||||||
for (String dependency : meta.dependencies()) {
|
for (String dependency : meta.dependencies()) {
|
||||||
if (!download.meta().dependencies().contains(dependency)) {
|
if (!download.meta().dependencies().contains(dependency)) {
|
@ -32,6 +32,11 @@ public abstract class Mod implements Comparable<Mod> {
|
|||||||
return getName().compareTo(mod.getName());
|
return getName().compareTo(mod.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
return obj instanceof Mod mod && getName().equals(mod.getName());
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return getName();
|
return getName();
|
||||||
|
@ -0,0 +1,7 @@
|
|||||||
|
package io.gitlab.jfronny.inceptum.launcher.system.mds;
|
||||||
|
|
||||||
|
public class NotYetScannedException extends RuntimeException {
|
||||||
|
public NotYetScannedException(ScanStage required, ScanStage current) {
|
||||||
|
super("Mod has not been scanned to stage " + required + " yet, currently at " + current);
|
||||||
|
}
|
||||||
|
}
|
@ -1,7 +1,6 @@
|
|||||||
package io.gitlab.jfronny.inceptum.launcher.system.mds.threaded;
|
package io.gitlab.jfronny.inceptum.launcher.system.mds;
|
||||||
|
|
||||||
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.InstanceMeta;
|
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.InstanceMeta;
|
||||||
import io.gitlab.jfronny.inceptum.launcher.system.mds.ModsDirScanner;
|
|
||||||
|
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
|
|
@ -1,10 +1,10 @@
|
|||||||
package io.gitlab.jfronny.inceptum.launcher.system.mds;
|
package io.gitlab.jfronny.inceptum.launcher.system.mds;
|
||||||
|
|
||||||
public enum ScanStage {
|
public enum ScanStage implements Comparable<ScanStage> {
|
||||||
/**
|
/**
|
||||||
* The scanner has been initialized and is ready to start scanning
|
* The scanner has not yet scanned the mod(s) or it has been invalidated/deleted
|
||||||
*/
|
*/
|
||||||
INITIALIZE,
|
NONE,
|
||||||
/**
|
/**
|
||||||
* The mod(s) have been discovered and their metadata has been loaded
|
* The mod(s) have been discovered and their metadata has been loaded
|
||||||
*/
|
*/
|
||||||
@ -20,5 +20,15 @@ public enum ScanStage {
|
|||||||
/**
|
/**
|
||||||
* The mod(s) have been checked for updates
|
* The mod(s) have been checked for updates
|
||||||
*/
|
*/
|
||||||
UPDATE
|
UPDATECHECK;
|
||||||
|
|
||||||
|
public boolean isComplete(ScanStage stage) {
|
||||||
|
return ordinal() >= stage.ordinal();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void require(ScanStage required) {
|
||||||
|
if (ordinal() < required.ordinal()) {
|
||||||
|
throw new NotYetScannedException(required, this);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -48,7 +48,7 @@ public class NoopMod extends Mod {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ScanStage getScanStage() {
|
public ScanStage getScanStage() {
|
||||||
return ScanStage.UPDATE;
|
return ScanStage.UPDATECHECK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -6,7 +6,7 @@ import io.gitlab.jfronny.inceptum.launcher.model.fabric.FabricModJson;
|
|||||||
import io.gitlab.jfronny.inceptum.launcher.model.fabric.GC_FabricModJson;
|
import io.gitlab.jfronny.inceptum.launcher.model.fabric.GC_FabricModJson;
|
||||||
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.GC_ModMeta;
|
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.GC_ModMeta;
|
||||||
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.ModMeta;
|
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.ModMeta;
|
||||||
import io.gitlab.jfronny.inceptum.launcher.system.mds.Mod;
|
import io.gitlab.jfronny.inceptum.launcher.system.mds.*;
|
||||||
import io.gitlab.jfronny.inceptum.launcher.system.instance.ModPath;
|
import io.gitlab.jfronny.inceptum.launcher.system.instance.ModPath;
|
||||||
import io.gitlab.jfronny.inceptum.launcher.system.mds.noop.NoopMod;
|
import io.gitlab.jfronny.inceptum.launcher.system.mds.noop.NoopMod;
|
||||||
import io.gitlab.jfronny.inceptum.launcher.system.source.ModSource;
|
import io.gitlab.jfronny.inceptum.launcher.system.source.ModSource;
|
||||||
@ -69,6 +69,9 @@ public record FileScanTask(ProtoInstance instance, Path file, BiConsumer<Path, M
|
|||||||
else fmj = null;
|
else fmj = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
discovered.accept(imodPath, new MdsMod(instance, imodPath, jarPath, managed, meta, fmj));
|
MdsMod result = new MdsMod(instance, imodPath, meta);
|
||||||
|
result.markDownloaded(jarPath, managed, fmj);
|
||||||
|
result.markUpdateChecked();
|
||||||
|
discovered.accept(imodPath, result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -101,7 +101,7 @@ public class ThreadedMds implements ModsDirScanner {
|
|||||||
|
|
||||||
private void scanTaskInternal() {
|
private void scanTaskInternal() {
|
||||||
while (!disposed) {
|
while (!disposed) {
|
||||||
runOnce(ScanStage.UPDATE, R::nop);
|
runOnce(ScanStage.UPDATECHECK, R::nop);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user