blob: 9c1a704d6d663f693f7a2e4a6287a5e85b5819c5 [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.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);
}
}
}