use of net.minecraftforge.fart.api.Transformer in project SpongeCommon by SpongePowered.
the class InstallerMain method remapMinecraft.
private Path remapMinecraft(final Path inputJar, final Path serverMappings, final ExecutorService service) throws IOException {
Logger.info("Checking if we need to remap Minecraft...");
final Path outputJar = this.expectedRemappedLocation(inputJar);
final Path tempOutput = outputJar.resolveSibling(Constants.Libraries.MINECRAFT_SERVER_JAR_NAME + "_remapped.jar.tmp");
if (Files.exists(outputJar)) {
Logger.info("Remapped Minecraft detected, skipping...");
return outputJar;
}
Logger.info("Remapping Minecraft. This may take a while...");
final IMappingFile mappings = IMappingFile.load(serverMappings.toFile()).reverse();
Renamer.builder().input(inputJar.toFile()).output(tempOutput.toFile()).add(Transformer.parameterAnnotationFixerFactory()).add(ctx -> {
final Transformer backing = Transformer.renamerFactory(mappings).create(ctx);
return new Transformer() {
@Override
public ClassEntry process(final ClassEntry entry) {
final String name = entry.getName();
if (name.startsWith("it/unimi") || name.startsWith("com/google") || name.startsWith("com/mojang/datafixers") || name.startsWith("com/mojang/brigadier") || name.startsWith("org/apache")) {
return entry;
}
return backing.process(entry);
}
@Override
public ManifestEntry process(final ManifestEntry entry) {
return backing.process(entry);
}
@Override
public ResourceEntry process(final ResourceEntry entry) {
return backing.process(entry);
}
@Override
public Collection<? extends Entry> getExtras() {
return backing.getExtras();
}
};
}).add(Transformer.recordFixerFactory()).add(Transformer.parameterAnnotationFixerFactory()).add(Transformer.sourceFixerFactory(SourceFixerConfig.JAVA)).add(Transformer.signatureStripperFactory(SignatureStripperConfig.ALL)).logger(// quiet
Logger::debug).build().run();
// Restore file
try {
Files.move(tempOutput, outputJar, StandardCopyOption.ATOMIC_MOVE, StandardCopyOption.REPLACE_EXISTING);
} catch (final AccessDeniedException ex) {
// Thanks Windows!
for (int tries = 0; tries < InstallerMain.MAX_TRIES; ++tries) {
// Pause for a bit
try {
Thread.sleep(5 * tries);
Files.move(tempOutput, outputJar, StandardCopyOption.ATOMIC_MOVE, StandardCopyOption.REPLACE_EXISTING);
} catch (final AccessDeniedException ex2) {
if (tries == InstallerMain.MAX_TRIES - 1) {
throw ex;
}
} catch (final InterruptedException exInterrupt) {
Thread.currentThread().interrupt();
throw ex;
}
}
}
return outputJar;
}
Aggregations