///////////////////////////////////////////////////////////////////////
// STANFORD LOGIC GROUP //
// General Game Playing Project //
// //
// Sample Player Implementation //
// //
// (c) 2007. See LICENSE and CONTRIBUTORS. //
///////////////////////////////////////////////////////////////////////
/**
*
*/
package stanfordlogic.network;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.util.logging.Logger;
import stanfordlogic.game.GameManager;
import stanfordlogic.gdl.GdlExpression;
import stanfordlogic.gdl.GdlList;
import stanfordlogic.network.RequestHandler.HttpHeader;
import stanfordlogic.util.LengthInputStream;
import stanfordlogic.util.LineInputStream;
/**
*
*/
public abstract class RequestHandlerFactory
{
private static final Logger logger_ = Logger.getLogger("stanfordlogic.network");
synchronized public RequestHandler createRequestHandler(
ConnectionManager manager,
Socket socket )
throws Exception
{
LineInputStream input = new LineInputStream(socket.getInputStream());
// The first thing is to read the header from the socket.
HttpHeader header = readHeader(input);
// HttpHeader header = readHeader( reader );
// Now parse the content, only reading as much as contentLength
InputStream contentInput;
contentInput = new LengthInputStream(input, header.contentLength_);
GdlExpression content = GameManager.getParser().parse(contentInput);
RequestHandler handler;
// Find out what kind of message it was, and create the appropriate
// RequestHandler subclass
if ( content instanceof GdlList )
handler = createFromList(socket, header, (GdlList) content);
else
{
throw new IllegalArgumentException("Can't handle gdl expression of type "
+ content.getClass().getName()
+ " during request handling");
}
handler.setManager(manager);
return handler;
}
private HttpHeader readHeader( LineInputStream input ) throws IOException
{
HttpHeader result = new HttpHeader();
String line;
logger_.fine("Parsing message header.");
while ( ( line = input.readLine() ) != null )
{
logger_.finer("Got line: " + line);
if ( line.trim().compareTo("") == 0 )
break;
if ( line.startsWith("Sender:") )
result.receiver_ = line.substring(8);
else if ( line.startsWith("Receiver:") )
result.receiver_ = line.substring(10);
else if ( line.startsWith("Content-length:")
|| line.startsWith("Content-Length:") )
result.contentLength_ = Integer.parseInt(line.substring(16));
}
logger_.fine("Done parsing message header. Content length: "
+ result.contentLength_);
return result;
}
protected abstract RequestHandler createFromList( Socket socket, HttpHeader header,
GdlList list ) throws Exception;
}