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.io.BufferedReader;
import java.util.Iterator;
import java.util.List;
import java.util.ArrayList;
import java.util.TreeMap;
import java.net.URLDecoder;
import java.io.UnsupportedEncodingException;

public class WeatherServlet extends HttpServlet {

    private static String htmlHead = "<html><head></head><body>";
    private static String htmlTail = "</body></html>";

    protected void doGet(
        HttpServletRequest request, HttpServletResponse response)
	throws ServletException, IOException
    {
        String path = request.getPathInfo();
        path = path.substring(1);
        String[] parts = path.split("/");
        if ( parts[0].equals("update") ) {
            updateWeatherDesc( request );
	    report( response );
        }
        else if ( parts[0].equals("list") ) {
            report( response );
        }
    }

    protected void doPost(
        HttpServletRequest request, HttpServletResponse response)
	throws ServletException, IOException
    {
        doGet( request, response);
    }

    private TreeMap<String,WeatherDesc> weather =
        new TreeMap<String,WeatherDesc>();

    private synchronized void updateWeatherDesc( 
        HttpServletRequest request )
    {
        String location = request.getParameter("location" );
        double temp = Double.NaN;
	try {
	    String t = request.getParameter("temp" );
	    if ( t != null ) {
		temp = Double.parseDouble( t );
	    }
	}
	catch( Exception ex ) {
	}
        String synopsis = request.getParameter("synopsis" );

        weather.put(
            location,
            new WeatherDesc(location,temp,synopsis) );
    }

    private void report( HttpServletResponse response )
        throws ServletException, IOException
    {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println( htmlHead );

        out.println("<table border='1'>");
        synchronized ( this ) {
            Iterator<WeatherDesc> it = weather.values().iterator();
            while ( it.hasNext() ) {
                WeatherDesc w = it.next();
                out.print("<tr>");
                out.print("<td>"+w.getLocation()+"</td>");
                out.print("<td>"+w.getTemperature()+"</td>");
                out.print("<td>"+w.getSynopsis()+"</td>");
                out.print("</tr>");
            }
        }
        out.println("</table>");
        out.println( htmlTail );
    }
}
