blob: 1cb39e7c61fbe659c11d02815b5b99d585c6c942 [file] [log] [blame]
/*
* Copyright 2014 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.gwt.dev.codeserver;
import com.google.gwt.dev.codeserver.Job.Result;
import com.google.gwt.dev.json.JsonArray;
import com.google.gwt.dev.json.JsonObject;
import java.io.File;
import java.util.Arrays;
import java.util.SortedMap;
/**
* Creates JSON descriptions of the code server's internal objects.
* The code server uses JSON when rendering HTML templates and in its
* JavaScript API's.
*/
class JsonExporter {
private final Options options;
private final OutboxTable outboxTable;
JsonExporter(Options options, OutboxTable outboxTable) {
this.options = options;
this.outboxTable = outboxTable;
}
// === API responses ===
/**
* Creates the response to a /recompile request.
*/
JsonObject exportRecompileResponse(Result result) {
JsonObject out = JsonObject.create();
out.put("status", result.isOk() ? "ok" : "failed");
// This doesn't seem to be used but was there in 2.6.1.
// TODO: consider removing for 2.7?
out.put("moduleNames", exportOutputModuleNames());
return out;
}
/**
* Creates the response to a /progress request.
*/
JsonObject exportProgressResponse(JobEvent progress) {
// TODO: upgrade for multiple compiles and finalize API for 2.7.
JsonObject out = new JsonObject();
out.put("jobId", progress.getJobId());
out.put("status", progress.getStatus().jsonName);
out.put("message", progress.getMessage());
out.put("inputModule", progress.getInputModuleName());
out.put("bindings", exportMap(progress.getBindings()));
return out;
}
// === page template variables ===
/**
* Exports the template variables for frontpage.html.
*/
JsonObject exportFrontPageVars() {
JsonObject out = JsonObject.create();
out.put("moduleNames", exportOutputModuleNames()); // TODO: rename
return out;
}
/**
* Exports the template variables for modulepage.html.
*/
JsonObject exportModulePageVars(Outbox box) {
JsonObject result = new JsonObject();
result.put("moduleName", box.getOutputModuleName()); // TODO: rename
result.put("files", exportOutputFiles(box));
result.put("isCompiled", !box.containsStubCompile());
return result;
}
/**
* Exports the template variables for success.
*/
JsonObject exportOk(String message) {
JsonObject out = JsonObject.create();
out.put("status", "ok");
out.put("message", message);
return out;
}
/**
* Exports the template variables for failure.
*/
JsonObject exportError(String message) {
JsonObject out = JsonObject.create();
out.put("status", "error");
out.put("message", message);
return out;
}
/**
* Returns a JSON representation of the directories containing at least one source file
* in the source map.
* (These directories are relative to a classpath entry or -sourceDir argument.)
* Used in directorylist.html.
*/
JsonObject exportSourceMapDirectoryListVars(Outbox box, SourceMap map) {
JsonObject out = new JsonObject();
out.put("moduleName", box.getOutputModuleName()); // TODO: rename
JsonArray directories = new JsonArray();
for (String name : map.getSourceDirectories()) {
JsonObject dir = new JsonObject();
dir.put("name", name);
dir.put("link", name + "/");
directories.add(dir);
}
out.put("directories", directories);
return out;
}
/**
* Returns a JSON representation of the files in one directory in the source map.
* Used in filelist.html.
* @param directory A directory name ending with "/".
*/
JsonObject exportSourceMapFileListVars(Outbox box, SourceMap map,
String directory) {
JsonObject out = new JsonObject();
out.put("moduleName", box.getOutputModuleName()); // TODO: rename
out.put("directory", directory);
JsonArray files = new JsonArray();
for (String name : map.getSourceFilesInDirectory(directory)) {
JsonObject file = new JsonObject();
file.put("name", name);
file.put("link", name + "?html");
files.add(file);
}
out.put("files", files);
return out;
}
// === JSON used in JavaScript files ===
/**
* Exports the template variables for dev_mode_on.js.
*/
JsonObject exportDevModeOnVars() {
JsonObject out = JsonObject.create();
out.put("moduleNames", exportOutputModuleNames()); // TODO: rename
out.put("warnings", exportWarnings());
return out;
}
// === utility methods ===
private JsonArray exportOutputModuleNames() {
JsonArray moduleNames = new JsonArray();
for (String module : outboxTable.getOutputModuleNames()) {
moduleNames.add(module);
}
return moduleNames;
}
private JsonArray exportWarnings() {
JsonArray out = new JsonArray();
// Add warnings if any
return out;
}
/**
* Lists the files that the last successful GWT compiler generated in an outbox.
*/
private JsonArray exportOutputFiles(Outbox box) {
File[] files = new File(box.getWarDir(), box.getOutputModuleName()).listFiles();
if (files == null) {
return new JsonArray();
}
Arrays.sort(files);
JsonArray result = new JsonArray();
for (File file : files) {
if (file.isFile()) {
JsonObject map = new JsonObject();
map.put("name", file.getName());
map.put("link", file.getName());
result.add(map);
}
}
return result;
}
private JsonObject exportMap(SortedMap<String, String> bindings) {
JsonObject out = new JsonObject();
for (String name : bindings.keySet()) {
out.put(name, bindings.get(name));
}
return out;
}
}