/* * Copyright 2010 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.jstestdriver.server.handlers.pages; import static com.google.jstestdriver.server.handlers.CaptureHandler.RUNNER_TYPE; import com.google.common.base.Joiner; import com.google.common.collect.Lists; import com.google.jstestdriver.CapturedBrowsers; import com.google.jstestdriver.SlaveBrowser; import com.google.jstestdriver.model.HandlerPathPrefix; import com.google.jstestdriver.runner.RunnerType; import com.google.jstestdriver.server.handlers.CaptureHandler; import com.google.jstestdriver.util.HtmlWriter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; /** * Wrapper for the HttpServletRequest object with Page specific logic. * * @author corbinrsmith@gmail.com (Cory Smith) */ public class SlavePageRequest { public static final String PAGE = "page"; public static final String ID = "id"; public static final String MODE = "mode"; public static final String TIMEOUT = "timeout"; public static final String UPLOAD_SIZE = "upload_size"; public static final String LOAD_TYPE = "load_type"; public static final String TESTCASE_ID = "testcase_id"; public static final String REFRESH = "refresh"; private static final Logger logger = LoggerFactory.getLogger(SlavePageRequest.class); private final Map<String, String> parameters; private final HttpServletRequest request; private final HandlerPathPrefix prefix; private final CapturedBrowsers browsers; public SlavePageRequest(Map<String, String> parameters, HttpServletRequest request, HandlerPathPrefix prefix, CapturedBrowsers browsers) { this.parameters = parameters; this.request = request; this.prefix = prefix; this.browsers = browsers; } public HtmlWriter writeDTD(HtmlWriter writer) throws IOException { if ("strict".equals(parameters.get(MODE))) { writer.writeStrictDtd(); } else { writer.writeQuirksDtd(); } return writer; } public String createCaptureUrl(RunnerType type) { List<String> urlParts = Lists.newArrayList("/capture"); addParameterToUrlParts(MODE, urlParts); addParameterToUrlParts(UPLOAD_SIZE, urlParts); addParameterToUrlParts(RUNNER_TYPE, urlParts); addParameterToUrlParts(TESTCASE_ID, urlParts); final String url = Joiner.on("/").join(urlParts); return prefix.prefixPath(Joiner.on("/").join(urlParts)); } public String createCaptureUrl() { try { return createCaptureUrl( RunnerType.valueOf( parameters.get(CaptureHandler.RUNNER_TYPE).toUpperCase())); } catch (NullPointerException e) { logger.error("Invalid/No runner type specified: {} falling back to BROWSER", parameters.get(CaptureHandler.RUNNER_TYPE)); } return createCaptureUrl(RunnerType.BROWSER); } public String createPageUrl(PageType page) { List<String> urlParts = Lists.<String>newArrayList("/slave"); addToUrlParts(PAGE, page.name(), urlParts); addParameterToUrlParts(ID, urlParts); addParameterToUrlParts(MODE, urlParts); addParameterToUrlParts(UPLOAD_SIZE, urlParts); addParameterToUrlParts(TESTCASE_ID, urlParts); final String url = Joiner.on("/").join(urlParts); logger.trace("creating new url: {} for {}", url, page); return prefix.prefixPath(url); } private void addParameterToUrlParts(String key, List<String> urlParts) { addToUrlParts(key, parameters.get(key), urlParts); } private void addToUrlParts(String key, String value, List<String> urlParts) { if (value == null || value.isEmpty()) { return; } urlParts.add(key); urlParts.add(value); } public SlaveBrowser getBrowser() { String id = parameters.get(ID); if (id == null) { return null; } return browsers.getBrowser(id); } public PageType getPageType() { return PageType.valueOf(parameters.get(PAGE).toUpperCase()); } public String getUserAgent() { return request.getHeader("User-Agent"); } public String getTestCaseId() { return getParameter(TESTCASE_ID); } @Override public String toString() { return "SlavePageRequest [parameters=" + parameters + "]"; } public String getParameter(String key) { return parameters.get(key); } }