import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Iterator;

public class CountServlet extends HttpServlet {
    private static String htmlHead = "<html><head></head><body>";
    private static String htmlTail = "</body></html>";

    private static class CountInfo {
        String host;
        int port;
        int seqNo;
        CountInfo( String host, int port, int seqNo ) {
            this.host = host;
            this.port = port;
            this.seqNo = seqNo;
        }
        public String toString() {
            return host + ":" + port + " " + seqNo;
        }
    }

    private int count = 0;
    private ArrayList<CountInfo> sites =
        new ArrayList<CountInfo>();

    private synchronized int nextCount() {
        return count++;
    }

    private synchronized void report(
        HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException
    {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println( htmlHead );
        out.println( "<ol>" );
        Iterator<CountInfo> it = sites.iterator();
        while ( it.hasNext() ) {
            out.println( "<li>" + it.next() + "</li>" );
        }
        out.println( "</ol>" );
        out.println( htmlTail );
    }

    protected void doGet(
        HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException
    {
        String path = request.getPathInfo();
        if ( path != null ) {
            if ( path.equals("/report") ) {
                report( request, response );
                return;
            }
        }

        int seq = nextCount();
        CountInfo info =
            new CountInfo(
                request.getRemoteHost(),
                request.getRemotePort(), seq );
        synchronized( this ) {
            sites.add( info );
        }
        response.setContentType("text/xml");
        PrintWriter out = response.getWriter();
        out.println( "<?xml version='1.0'?>" );
        out.println( "<count>" + seq + "</count>" );
    }
}
