Package com.google.jstestdriver.server.handlers

Source Code of com.google.jstestdriver.server.handlers.FileSetGetHandler

/*
* 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();
  }
}
TOP

Related Classes of com.google.jstestdriver.server.handlers.FileSetGetHandler

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.