package httpserver;

import java.io.*;
import java.net.*;
import java.lang.reflect.*;
import java.util.logging.Logger;

public class HttpRequestDispatcher extends Thread {
    static private Logger logger = Logger.getLogger("http");

    private Socket sock;
    private HttpRequestHandler handler;

    public HttpRequestDispatcher(
        Socket sock, HttpRequestHandler handler )
    {
        this.sock = sock;
        this.handler = handler;
        start();
    }

    public void run() {
        BufferedReader rd = null;
        try {
            // XXX assumes a character encoding
            rd = new BufferedReader(
                    new InputStreamReader( sock.getInputStream() ));
            HttpRequest request = new HttpRequest( rd );
	    HttpResponse response = new HttpResponse(sock.getOutputStream());
            handler.handleRequest( request, response );
        }
        catch( Exception e ) {
            logger.warning( e.getMessage() );
        }
        finally {
            try {
                if ( rd != null ) rd.close();
                sock.close();
            }
            catch( Exception e ) {
                logger.warning( e.getMessage() );
            }
        }
    }

    public static HttpRequestHandler getHandler( String className ) {
        try {
            Class c = Class.forName( className );
            Constructor cons = c.getConstructor();
            Object obj = cons.newInstance();
            return (HttpRequestHandler)obj;
        }
        catch( Exception ex ) {
            logger.warning( ex.getMessage() );
            return null;
        }
    }

    public static void main( String[] args ) {
        if ( args.length != 1 ) {
            System.out.println("java HttpRequestDispatcher handler");
            System.exit( 1 );
        }
        Runtime.getRuntime().addShutdownHook(
	    new Thread() {
		public void run() {
		    logger.info("shutting down");
		}
            } );
        HttpRequestHandler handler = getHandler( args[0] );
        if ( handler == null ) {
            System.out.println("bad handler");
            System.exit( 1 );
        }
        logger.info("start");
        try {
            ServerSocket listen = new ServerSocket( 8888 );

            while ( true ) {
                Socket sock = listen.accept();
                new HttpRequestDispatcher( sock, handler);
            }
        }
        catch( IOException e ) {
            logger.warning( e.getMessage() );
        }
    }
}
