Write Java class files in gzip format

This means our names match those expected by javac
This commit is contained in:
Chris Smowton
2021-10-01 16:37:49 +01:00
committed by Ian Lynagh
parent 4a18705d73
commit 6de5a36cdc
2 changed files with 12 additions and 11 deletions

View File

@@ -184,18 +184,18 @@ public class OdasaOutput {
return null;
return FileUtil.appendAbsolutePath(
currentSpecFileEntry.getTrapFolder(),
JARS_DIR + "/" + PathTransformer.std().fileAsDatabaseString(jarFile) + ".trap");
JARS_DIR + "/" + PathTransformer.std().fileAsDatabaseString(jarFile) + ".trap.gz");
}
private File getTrapFileForModule(String moduleName) {
return FileUtil.appendAbsolutePath(
currentSpecFileEntry.getTrapFolder(),
MODULES_DIR + "/" + moduleName + ".trap");
MODULES_DIR + "/" + moduleName + ".trap.gz");
}
private File trapFileFor(File file) {
return FileUtil.appendAbsolutePath(currentSpecFileEntry.getTrapFolder(),
PathTransformer.std().fileAsDatabaseString(file) + ".trap");
PathTransformer.std().fileAsDatabaseString(file) + ".trap.gz");
}
private File getTrapFileForClassFile(IrClass sym) {
@@ -221,7 +221,7 @@ public class OdasaOutput {
result = CLASSES_DIR + "/" +
dots.matcher(classId).replaceAll("/") +
".members" +
".trap";
".trap.gz";
memberTrapPaths.put(classId, result);
}
return result;
@@ -235,10 +235,10 @@ public class OdasaOutput {
File trap = trapFileForClass(sym);
if (trap.exists()) {
trap.delete();
File depFile = new File(trap.getParentFile(), trap.getName().replace(".trap", ".dep"));
File depFile = new File(trap.getParentFile(), trap.getName().replace(".trap.gz", ".dep"));
if (depFile.exists())
depFile.delete();
File metadataFile = new File(trap.getParentFile(), trap.getName().replace(".trap", ".metadata"));
File metadataFile = new File(trap.getParentFile(), trap.getName().replace(".trap.gz", ".metadata"));
if (metadataFile.exists())
metadataFile.delete();
}
@@ -290,7 +290,7 @@ public class OdasaOutput {
}
private TrapFileManager trapWriter(File trapFile, IrClass sym) {
if (!trapFile.getName().endsWith(".trap"))
if (!trapFile.getName().endsWith(".trap.gz"))
throw new CatastrophicError("OdasaOutput only supports writing to compressed trap files");
String relative = FileUtil.relativePath(trapFile, currentSpecFileEntry.getTrapFolder());
trapFile.getParentFile().mkdirs();
@@ -328,7 +328,7 @@ public class OdasaOutput {
writeTrapDependencies(trapDependenciesForClass);
// Record major/minor version information for extracted class files.
// This is subsequently used to determine whether to re-extract (a newer version of) the same class.
File metadataFile = new File(trapFile.getAbsolutePath().replace(".trap", ".metadata"));
File metadataFile = new File(trapFile.getAbsolutePath().replace(".trap.gz", ".metadata"));
try {
Map<String, String> versionMap = new LinkedHashMap<>();
TrapClassVersion tcv = TrapClassVersion.fromSymbol(sym);
@@ -341,7 +341,7 @@ public class OdasaOutput {
}
}
private void writeTrapDependencies(TrapDependencies trapDependencies) {
String dep = trapDependencies.trapFile().replace(".trap", ".dep");
String dep = trapDependencies.trapFile().replace(".trap.gz", ".dep");
trapDependencies.save(
currentSpecFileEntry.getTrapFolder().toPath().resolve(dep));
}
@@ -541,7 +541,7 @@ public class OdasaOutput {
int majorVersion = 0;
int minorVersion = 0;
long lastModified = 0;
File metadataFile = new File(trap.getAbsolutePath().replace(".trap", ".metadata"));
File metadataFile = new File(trap.getAbsolutePath().replace(".trap.gz", ".metadata"));
if (metadataFile.exists()) {
Map<String,String> metadataMap = FileUtil.readPropertiesCSV(metadataFile);
try {

View File

@@ -22,6 +22,7 @@ import java.io.StringWriter
import java.nio.file.Files
import java.nio.file.Paths
import java.util.*
import java.util.zip.GZIPOutputStream
import com.intellij.openapi.vfs.StandardFileSystems
import com.semmle.extractor.java.OdasaOutput
import com.semmle.extractor.java.OdasaOutput.TrapFileManager
@@ -193,7 +194,7 @@ class ExternalClassExtractor(val logger: FileLogger, val sourceFilePath: String,
logger.info("Skipping extracting class ${irClass.name}")
return
}
manager.getFile().bufferedWriter().use { trapFileBW ->
GZIPOutputStream(manager.getFile().outputStream()).bufferedWriter().use { trapFileBW ->
val tw = ClassFileTrapWriter(TrapLabelManager(), trapFileBW, getIrClassBinaryPath(irClass))
val fileExtractor = KotlinFileExtractor(logger, tw, manager, this, pluginContext)
fileExtractor.extractClassSource(irClass)