Super Dev Mode: expose output module and sourcemap locations
Adds to the public API:
JobEvent.getOutputModuleName()
JobEvent.Builder.setOutputModuleName(String)
CompileDir.findSourceMapFiles(String)
This is to make it easy to find the sizes of the sourcemap files
from outside the code server.
(Doesn't need to be in 2.7.)
Change-Id: Ic5b232a35b2ae13a3d2e0a40ab2777ba80521932
Review-Link: https://gwt-review.googlesource.com/#/c/9720/
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/CompileDir.java b/dev/codeserver/java/com/google/gwt/dev/codeserver/CompileDir.java
index 6509cc0..54d8f3c 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/CompileDir.java
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/CompileDir.java
@@ -19,10 +19,12 @@
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.thirdparty.guava.common.base.Charsets;
+import com.google.gwt.thirdparty.guava.common.collect.ImmutableList;
import com.google.gwt.thirdparty.guava.common.collect.Lists;
import com.google.gwt.thirdparty.guava.common.io.Files;
import java.io.File;
+import java.io.FilenameFilter;
import java.io.IOException;
import java.util.List;
@@ -91,12 +93,37 @@
return new File(dir, "compile.log");
}
- File findSymbolMapDir(String moduleName) {
+ /**
+ * Given the outputModuleName from the compiler, returns all the sourcemap
+ * files generated, or null if the directory couldn't be listed.
+ */
+ public List<File> findSourceMapFiles(String outputModuleName) {
+ File symbolMapsDir = findSymbolMapDir(outputModuleName);
+ if (symbolMapsDir == null) {
+ return null;
+ }
+ File mapDir = symbolMapsDir.getAbsoluteFile();
+
+ File[] files = mapDir.listFiles(new FilenameFilter() {
+ @Override
+ public boolean accept(File dir, String name) {
+ return name.endsWith(Outbox.SOURCEMAP_FILE_SUFFIX);
+ }
+ });
+
+ return files == null ? null : ImmutableList.copyOf(files);
+ }
+
+ /**
+ * Given the outputModuleName from the compiler, returns the location of
+ * the symbol maps directory, or null if not available.
+ */
+ File findSymbolMapDir(String outputModuleName) {
// The JUnit module moves the symbolMaps directory in a post linker.
// TODO(skybrian) query this information from the compiler somehow?
File[] candidates = {
- new File(getExtraDir(), moduleName + "/symbolMaps"),
- new File(getWarDir(), moduleName + "/.junit_symbolMaps")
+ new File(getExtraDir(), outputModuleName + "/symbolMaps"),
+ new File(getWarDir(), outputModuleName + "/.junit_symbolMaps")
};
for (File candidate : candidates) {
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/Job.java b/dev/codeserver/java/com/google/gwt/dev/codeserver/Job.java
index 9af7cda..2b883d3 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/Job.java
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/Job.java
@@ -80,6 +80,7 @@
private CompileDir compileDir; // non-null after the compile has started
private CompileStrategy compileStrategy; // non-null after the compile has started
+ private String outputModuleName; // non-null after successful compile
private Exception listenerFailure;
@@ -256,6 +257,7 @@
}
result.set(newResult);
+ outputModuleName = newResult.outputModuleName;
if (newResult.isOk()) {
publish(makeEvent(Status.SERVING));
} else {
@@ -284,6 +286,7 @@
out.setBindings(getBindingProperties());
out.setStatus(status);
out.setMessage(message);
+ out.setOutputModuleName(outputModuleName);
out.setCompileDir(compileDir);
out.setCompileStrategy(compileStrategy);
out.setArguments(args);
@@ -344,13 +347,19 @@
final CompileDir outputDir;
/**
+ * non-null if successful.
+ */
+ final String outputModuleName;
+
+ /**
* non-null for an error
*/
final Throwable error;
- Result(CompileDir outputDir, Throwable error) {
+ Result(CompileDir outputDir, String outputModuleName, Throwable error) {
assert (outputDir == null) != (error == null);
this.outputDir = outputDir;
+ this.outputModuleName = outputModuleName;
this.error = error;
}
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/JobEvent.java b/dev/codeserver/java/com/google/gwt/dev/codeserver/JobEvent.java
index e4582a6..bae068a 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/JobEvent.java
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/JobEvent.java
@@ -42,6 +42,7 @@
private final Status status;
private final String message;
+ private final String outputModuleName;
private final CompileDir compileDir;
private final CompileStrategy compileStrategy;
private final ImmutableList<String> arguments;
@@ -55,6 +56,7 @@
this.message = builder.message == null ? status.defaultMessage : builder.message;
// The following fields may be null.
+ this.outputModuleName = builder.outputModuleName;
this.compileDir = builder.compileDir;
this.compileStrategy = builder.compileStrategy;
this.arguments = ImmutableList.copyOf(builder.args);
@@ -101,6 +103,16 @@
}
/**
+ * Returns the module name used for the output of the GWT compiler, or null if not available.
+ * (This name is used for the name of the module directory, the nocache.js file, and in all
+ * JavaScript generated by the GWT compiler.)
+ * Only available for completed, successful compiles.
+ */
+ public String getOutputModuleName() {
+ return outputModuleName;
+ }
+
+ /**
* Returns the directory where the GWT module is being compiled, or null if not available.
* (Not available for jobs that are WAITING.)
*/
@@ -208,6 +220,7 @@
private CompileStrategy compileStrategy;
private List<String> args = ImmutableList.of();
private List<String> tags = ImmutableList.of();
+ private String outputModuleName;
/**
* A unique id for this job. Required.
@@ -260,6 +273,13 @@
}
/**
+ * The module name that the compiler returned (after rename).
+ */
+ public void setOutputModuleName(String name) {
+ this.outputModuleName = name;
+ }
+
+ /**
* The directory where the GWT compiler will write its output.
* Optional. (Not available until the compile starts.)
*/
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/Outbox.java b/dev/codeserver/java/com/google/gwt/dev/codeserver/Outbox.java
index 6527445..8e472c9 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/Outbox.java
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/Outbox.java
@@ -26,7 +26,6 @@
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
-import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
@@ -44,7 +43,7 @@
/**
* The suffix that the GWT compiler uses when writing a sourcemap file.
*/
- private static final String SOURCEMAP_FILE_SUFFIX = "_sourceMap0.json";
+ static final String SOURCEMAP_FILE_SUFFIX = "_sourceMap0.json";
private final String id;
private final Recompiler recompiler;
@@ -180,28 +179,22 @@
* @throws RuntimeException if unable
*/
File findSourceMapForOnePermutation() {
- File dir = findSymbolMapDir();
+ String moduleName = recompiler.getOutputModuleName();
- File[] sourceMapFiles = dir.listFiles(new FilenameFilter() {
- @Override
- public boolean accept(File dir, String name) {
- return name.endsWith(SOURCEMAP_FILE_SUFFIX);
- }
- });
-
+ List<File> sourceMapFiles = getOutputDir().findSourceMapFiles(moduleName);
if (sourceMapFiles == null) {
- throw new RuntimeException("Can't list contents of symbol map directory: " + dir);
+ throw new RuntimeException("Can't find sourcemap files.");
}
- if (sourceMapFiles.length > 1) {
+ if (sourceMapFiles.size() > 1) {
throw new RuntimeException("Multiple fragment 0 sourcemaps found. Too many permutations.");
}
- if (sourceMapFiles.length == 0) {
+ if (sourceMapFiles.isEmpty()) {
throw new RuntimeException("No sourcemaps found. Not enabled?");
}
- return new File(dir, sourceMapFiles[0].getName());
+ return sourceMapFiles.get(0);
}
/**
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/Recompiler.java b/dev/codeserver/java/com/google/gwt/dev/codeserver/Recompiler.java
index 85179a2..38dd1c4 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/Recompiler.java
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/Recompiler.java
@@ -122,10 +122,10 @@
} catch (UnableToCompleteException e) {
// No point in logging a stack trace for this exception
job.getLogger().log(TreeLogger.Type.WARN, "recompile failed");
- result = new Result(null, e);
+ result = new Result(null, null, e);
} catch (Throwable error) {
job.getLogger().log(TreeLogger.Type.WARN, "recompile failed", error);
- result = new Result(null, error);
+ result = new Result(null, null, error);
}
job.onFinished(result);
@@ -171,7 +171,7 @@
compileLogger.log(TreeLogger.Type.INFO,
String.format("%.3fs total -- Compile completed", elapsedTime / 1000d));
- return new Result(publishedCompileDir, null);
+ return new Result(publishedCompileDir, outputModuleName.get(), null);
}
/**
@@ -208,7 +208,7 @@
long elapsedTime = System.currentTimeMillis() - startTime;
compileLogger.log(TreeLogger.Type.INFO, "Module setup completed in " + elapsedTime + " ms");
- return new Result(compileDir, null);
+ return new Result(compileDir, module.getName(), null);
}
/**