Handle invalid JAR files more gracefully. Don't crash.

Signed-off-by: cpw <cpw+github@weeksfamily.ca>
This commit is contained in:
cpw 2019-02-13 18:33:50 -05:00
parent f1feac76b3
commit 4441935a4a
No known key found for this signature in database
GPG Key ID: 8EB3DF749553B1B7
7 changed files with 27 additions and 6 deletions

View File

@ -47,6 +47,7 @@ public class LoadingModList
private final Map<String, ModFileInfo> fileById;
private BackgroundScanHandler scanner;
private final List<EarlyLoadingException> preLoadErrors;
private List<ModFile> brokenFiles;
private LoadingModList(final List<ModFile> modFiles, final List<ModInfo> sortedList)
{
@ -131,4 +132,8 @@ public class LoadingModList
public List<EarlyLoadingException> getErrors() {
return preLoadErrors;
}
public void setBrokenFiles(final List<ModFile> brokenFiles) {
this.brokenFiles = brokenFiles;
}
}

View File

@ -39,7 +39,7 @@ import java.util.zip.ZipError;
import static net.minecraftforge.fml.loading.LogMarkers.SCAN;
public class AbstractJarFileLocator {
public abstract class AbstractJarFileLocator implements IModLocator {
private static final Logger LOGGER = LogManager.getLogger();
protected final Map<ModFile, FileSystem> modJars;
@ -51,7 +51,7 @@ public class AbstractJarFileLocator {
try {
return FileSystems.newFileSystem(modFile.getFilePath(), modFile.getClass().getClassLoader());
} catch (ZipError | IOException e) {
LOGGER.debug(SCAN,"Ignoring invalid JAR file {}", modFile.getFilePath());
LOGGER.debug(SCAN,"Invalid JAR file {} - no filesystem created", modFile.getFilePath());
return null;
}
}
@ -87,4 +87,9 @@ public class AbstractJarFileLocator {
return Optional.empty();
}
}
@Override
public boolean isValid(final ModFile modFile) {
return modJars.get(modFile) != null;
}
}

View File

@ -117,4 +117,9 @@ public class ExplodedDirectoryLocator implements IModLocator {
rootDirs.addAll(explodedTargets);
}
}
@Override
public boolean isValid(final ModFile modFile) {
return mods.get(modFile) != null;
}
}

View File

@ -42,4 +42,6 @@ public interface IModLocator {
Optional<Manifest> findManifest(Path file);
void initArguments(Map<String, ?> arguments);
boolean isValid(ModFile modFile);
}

View File

@ -28,7 +28,7 @@ import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class MavenDirectoryLocator extends AbstractJarFileLocator implements IModLocator {
public class MavenDirectoryLocator extends AbstractJarFileLocator {
private List<Path> modCoords;
@Override

View File

@ -27,6 +27,7 @@ import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
@ -67,12 +68,14 @@ public class ModDiscoverer {
FMLLoader.getLanguageLoadingProvider().addAdditionalLanguages(modFiles.get(ModFile.Type.LANGPROVIDER));
BackgroundScanHandler backgroundScanHandler = new BackgroundScanHandler();
final List<ModFile> mods = modFiles.getOrDefault(ModFile.Type.MOD, Collections.emptyList());
final List<ModFile> brokenFiles = new ArrayList<>();
for (Iterator<ModFile> iterator = mods.iterator(); iterator.hasNext(); )
{
ModFile mod = iterator.next();
if (!mod.identifyMods()) {
LOGGER.debug(SCAN, "Removing file {} from further analysis - it is invalid", mod);
if (!mod.getLocator().isValid(mod) || !mod.identifyMods()) {
LOGGER.warn(SCAN, "File {} has been ignored - it is invalid", mod.getFilePath());
iterator.remove();
brokenFiles.add(mod);
}
}
LOGGER.debug(SCAN,"Found {} mod files with {} mods", mods::size, ()->mods.stream().mapToInt(mf -> mf.getModInfos().size()).sum());
@ -80,6 +83,7 @@ public class ModDiscoverer {
loadingModList.addCoreMods();
loadingModList.addAccessTransformers();
loadingModList.addForScanning(backgroundScanHandler);
loadingModList.setBrokenFiles(brokenFiles);
return backgroundScanHandler;
}

View File

@ -37,7 +37,7 @@ import static net.minecraftforge.fml.loading.LogMarkers.SCAN;
/**
* Support loading mods located in JAR files in the mods folder
*/
public class ModsFolderLocator extends AbstractJarFileLocator implements IModLocator {
public class ModsFolderLocator extends AbstractJarFileLocator {
private static final String SUFFIX = ".jar";
private static final Logger LOGGER = LogManager.getLogger();
private final Path modFolder;