/* * 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.core.ext.TreeLogger; import com.google.gwt.core.ext.TreeLogger.Type; import com.google.gwt.dev.json.JsonObject; import com.google.gwt.thirdparty.guava.common.io.Resources; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; import java.net.URL; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Common HTTP responses that send HTML pages. For non-HTML pages, see {@link Responses}. */ class Pages { /** * Returns an HTML page with some JSON code prepended to it. * (If the resource file isn't found, returns an ErrorPage instead.) * * @param variableName the name of the variable to set on the "window" object. * @param json the data to embed in the script. * @param resourceName the name of the HTML file to send (in the current directory) */ static Response newHtmlPage(final String variableName, final JsonObject json, final String resourceName) { final URL resource = WebServer.class.getResource(resourceName); if (resource == null) { return new ErrorPage("resource not found: " + resourceName); } else { return new HtmlPage(variableName, json, resource); } } /** * A response that will send a static HTML page with JSON data prepended. */ static class HtmlPage implements Response { final String variableName; final JsonObject json; final URL resource; /** * @see {@link #newHtmlPage}. */ private HtmlPage(String variableName, JsonObject json, URL resource) { this.variableName = variableName; this.json = json; this.resource = resource; } @Override public void send(HttpServletRequest request, HttpServletResponse response, TreeLogger logger) throws IOException { response.setStatus(HttpServletResponse.SC_OK); response.setContentType("text/html"); ServletOutputStream outBytes = response.getOutputStream(); Writer out = new OutputStreamWriter(outBytes, "UTF-8"); out.append("<!DOCTYPE html>\n"); out.append("<script>\n"); out.append("window." + variableName + " = "); json.write(out); out.append(";\n"); out.append("</script>\n"); out.flush(); Resources.copy(resource, outBytes); } } /** * A response that will send an error page. */ static class ErrorPage implements Response { final int status; final String message; ErrorPage(String message) { this(HttpServletResponse.SC_NOT_FOUND, message); } ErrorPage(int httpStatus, String message) { this.status = httpStatus; this.message = message; } @Override public void send(HttpServletRequest request, HttpServletResponse response, TreeLogger logger) throws IOException { response.setStatus(status); response.setContentType("text/html"); HtmlWriter out = new HtmlWriter(response.getWriter()); out.startTag("html").nl(); out.startTag("head").nl(); out.startTag("title").text("Unavailable (GWT Code Server)").endTag("title").nl(); out.endTag("head").nl(); out.startTag("body").nl(); out.startTag("p").text(message).endTag("p"); out.endTag("body").nl(); out.endTag("html").nl(); logger.log(Type.INFO, "Sent error page: " + message); } } }