// Copyright (C) 2003-2009 by Object Mentor, Inc. All rights reserved. // Released under the terms of the CPL Common Public License version 1.0. package fitnesse.responders.run; import java.io.IOException; import java.net.Socket; import fit.FitProtocol; import fitnesse.FitNesseContext; import fitnesse.Responder; import fitnesse.http.Request; import fitnesse.http.Response; import fitnesse.http.ResponseSender; public class SocketCatchingResponder implements Responder, SocketDoner, ResponsePuppeteer { private int ticketNumber; private SocketDealer dealer; private Socket socket; private ResponseSender sender; private PuppetResponse response; public Response makeResponse(FitNesseContext context, Request request) { dealer = context.socketDealer; ticketNumber = Integer.parseInt(request.getInput("ticket").toString()); response = new PuppetResponse(this); return response; } public void readyToSend(ResponseSender sender) { socket = sender.getSocket(); this.sender = sender; try { if (dealer.isWaiting(ticketNumber)) dealer.dealSocketTo(ticketNumber, this); else { String errorMessage = "There are no clients waiting for a socket with ticketNumber " + ticketNumber; FitProtocol.writeData(errorMessage, socket.getOutputStream()); response.setStatus(404); sender.close(); } } catch (Exception e) { throw new RuntimeException(e); } } public Socket donateSocket() { return socket; } public void finishedWithSocket() { sender.close(); } }