Java tutorial
/* * Copyright 2014 Google Inc. All rights reserved. * * 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.testing.security.firingrange.utils; import static java.nio.charset.StandardCharsets.UTF_8; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; import com.google.common.base.Splitter; import com.google.common.io.Resources; import java.io.IOException; import java.net.URL; import java.util.logging.Logger; import javax.annotation.concurrent.Immutable; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; /** * A helper class to manipulate templates. */ @Immutable public final class Templates { private static final String ERROR_TEMPLATE = "data/error.tmpl"; @VisibleForTesting static final String PAYLOAD_PLACEHOLDER = "%%PAYLOAD%%"; private static final Logger logger = Logger.getLogger(Templates.class.getCanonicalName()); private Templates() { } /** * Extract a template given an HTTP request. The last path component is the template. * @throws IOException if it cannot find the template. */ public static String getTemplate(HttpServletRequest request, Class<? extends HttpServlet> clazz) throws IOException { String firstPathPart = Splitter.on('/').splitToList(request.getPathInfo()).get(1); String templateName = firstPathPart + ".tmpl"; return getTemplate(templateName, clazz); } /** * Extracts a template given the path relative to a {@code clazz}. * @throws IOException if it cannot find the template. */ public static String getTemplate(String relativePath, Class<? extends HttpServlet> clazz) throws IOException { Preconditions.checkArgument(!relativePath.contains("..")); try { URL resource = Resources.getResource(clazz, "data/" + relativePath); return templateToString(resource); } catch (IllegalArgumentException e) { logger.info("Cannot find template for " + relativePath); throw new IOException(errorTemplate()); } } @VisibleForTesting static String errorTemplate() { // Unable to find this template. Return error template. try { return templateToString(Resources.getResource(Templates.class, ERROR_TEMPLATE)); } catch (IllegalArgumentException e2) { // Unable to find the error template! logger.severe("Cannot find error template"); return ""; } } private static String templateToString(URL resource) { try { return Resources.toString(resource, UTF_8); } catch (IOException e) { logger.severe("Cannot open template: " + resource); return "ERROR, cannot open template"; } } /** * Sets the payload in a given template. */ public static String replacePayload(String template, String payload) { return template.replace(PAYLOAD_PLACEHOLDER, payload); } }