/* * Copyright 2009 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; import com.google.inject.Inject; import com.google.jstestdriver.CapturedBrowsers; import com.google.jstestdriver.Lock; import com.google.jstestdriver.SlaveBrowser; import com.google.jstestdriver.Time; import com.google.jstestdriver.annotations.ResponseWriter; import com.google.jstestdriver.requesthandlers.RequestHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.io.PrintWriter; import java.util.UUID; import javax.servlet.http.HttpServletRequest; /** * @author jeremiele@google.com (Jeremie Lenfant-Engelmann) */ class FileSetGetHandler implements RequestHandler { private static final Logger logger = LoggerFactory.getLogger(FileSetGetHandler.class); private static final int HEARTBEAT_TIMEOUT = 2000; private final HttpServletRequest request; private final PrintWriter writer; private final CapturedBrowsers capturedBrowsers; private final Time time; @Inject public FileSetGetHandler( HttpServletRequest request, @ResponseWriter PrintWriter writer, CapturedBrowsers capturedBrowsers, Time time) { this.request = request; this.writer = writer; this.capturedBrowsers = capturedBrowsers; this.time = time; } @SuppressWarnings("unused") @Override public void handleIt() throws IOException { String id = request.getParameter("id"); String session = request.getParameter("session"); String sessionId = request.getParameter("sessionId"); if (session == null && sessionId != null) { sessionHeartBeat(id, sessionId, writer); } else { if (session.equals("start")) { startSession(id, writer); } else if (session.equals("stop")) { stopSession(id, sessionId, writer); } } } private void sessionHeartBeat(String id, String sessionId, PrintWriter writer) { SlaveBrowser browser = capturedBrowsers.getBrowser(id); if (browser == null) { logger.error("heartbeat to a dead session:" + id + "browsers:" + capturedBrowsers.getBrowsers()); writer.write("LOST"); return; } browser.heartBeatLock(sessionId); } public void stopSession(String id, String sessionId, PrintWriter writer) { SlaveBrowser browser = capturedBrowsers.getBrowser(id); try { browser.unlock(sessionId); browser.clearCommandRunning(); } finally { writer.flush(); } } public void startSession(String id, PrintWriter writer) { logger.debug("trying to start session for {}", id); SlaveBrowser browser = capturedBrowsers.getBrowser(id); String sessionId = UUID.randomUUID().toString(); SlaveBrowser slaveBrowser = capturedBrowsers.getBrowser(id); if (browser.tryLock(sessionId)) { logger.debug("got session lock {} for {}", sessionId, id); writer.write(sessionId); slaveBrowser.resetCommandQueue(); slaveBrowser.clearResponseQueue(); browser.heartBeatLock(sessionId); } else { logger.debug("checking session status for {}", id); // session is probably stalled if (!browser.inUse()) { logger.debug("forcing unlock for {}", id); browser.forceUnlock(); slaveBrowser.resetCommandQueue(); slaveBrowser.clearResponseQueue(); writer.write(browser.tryLock(sessionId) ? sessionId : "FAILED"); } else { logger.debug("session unvailable for {}", id); writer.write("FAILED"); } } writer.flush(); } }