Skip to content
Merged
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
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.HashMap;
import java.util.IdentityHashMap;
import java.util.List;
import java.util.Map;
Expand All @@ -30,7 +31,7 @@ public class SortedJarOrPathList extends ArrayList<Object> {
private static final Logger LOGGER = LogManager.getLogger();
private static final ArtifactVersion FALLBACK_VERSION = new DefaultArtifactVersion("1");
private static Function<Object, SecureJar> jarGetter;
private Function<SecureJar, JarMetadata> metadataGetter;
private final Map<Class<?>, Function<SecureJar, JarMetadata>> metadataGetters = new HashMap<>();
private BiFunction<NamedPath, SecureJar, Object> pathOrJarConstructor;

private final Map<Object, ArtifactVersion> versionCache = new IdentityHashMap<>();
Expand All @@ -53,9 +54,13 @@ public SortedJarOrPathList(CompatibilityLayer compatibilityLayer, Function<Secur
private ArtifactVersion getVersion(Object pathOrJar) {
SecureJar jar = getJar(pathOrJar);
if (jar == null) return FALLBACK_VERSION;

String version = null;

JarMetadata metadata = getMetadata(jar);
if (metadata == null) return FALLBACK_VERSION;
String version = metadata.version();
if (metadata != null) {
version = metadata.version();
}

// Some revisions of ModLauncher have a bug where they simply call `toString` on `Optional<String>`, resulting
// in versions being reported as the string "Optional.empty" or "Optional[1.2.3]" instead of `null` or "1.2.3".
Expand Down Expand Up @@ -119,13 +124,24 @@ public static SecureJar getJar(Object pathOrJar) {
}

private JarMetadata getMetadata(SecureJar jar) {
Class<? extends SecureJar> implClass = jar.getClass();
Function<SecureJar, JarMetadata> metadataGetter = metadataGetters.get(implClass);
if (metadataGetter == null) {
try {
metadataGetter = UnsafeHacks.makeGetter(jar.getClass().getDeclaredField("metadata"));
String implName = implClass.getName();
switch (implName) {
case "org.sinytra.connector.service.DummyVirtualJar":
// Used for the dummy fabric-loader mod as well as for code generated by ManninghamMills
metadataGetter = __ -> null;
break;
default: // probably the main ModLauncher-internal impl
metadataGetter = UnsafeHacks.makeGetter(implClass.getDeclaredField("metadata"));
}
} catch (Throwable t) {
LOGGER.error("Failed to get metadata from " + jar.getClass() + ":", t);
LOGGER.error("Failed to get metadata from " + implClass + ":", t);
metadataGetter = __ -> null;
}
metadataGetters.put(implClass, metadataGetter);
}
return metadataGetter.apply(jar);
}
Expand Down