| /* |
| * 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; |
| } |
| } |