import java.net.*;
import java.io.*;

public class CountServer extends Thread
{
	private static int countVal = 0;
	private static int portNumber = 4123;
	private static String filename = "count.txt";
	
	private ServerSocket serverSock = null;
	
	public CountServer()
	{	try
		{	serverSock = new ServerSocket(portNumber);
			start();
		}
		catch(IOException e)
		{	System.out.println("Server did not start.");
			System.exit(1);
		}
	}
	
	private String urlBase = "~bergin";
	private String urlBase2 = "%7Ebergin";
	private String fileBase = "/sd2/users/bergin/public_html";
	
	private File URLtoFile(URL in)
	{	String result = in.getFile();
		String proto = in.getProtocol();
		if (proto.equalsIgnoreCase("http"))
		{	int where = result.indexOf(urlBase);
			if (where >= 0)	
			{	result = fileBase + result.substring(where + urlBase.length());
			}	
			else
			{	where = result.indexOf(urlBase2);
				if (where >= 0)	
				{	result = fileBase + result.substring(where + urlBase2.length());
				}	
				
			}
		}
		return new File(result);	
	}
	
	public void run()
	{	while (true)
		{	try
			{	Socket incoming = serverSock.accept();
				ObjectInputStream where = new ObjectInputStream(incoming.getInputStream());
				URL countFileURL = (URL)where.readObject();	
				File countFile = null;			
				if (countFileURL == null)
				{	countFile = new File(filename);
				}
				else
				{	countFile = URLtoFile(countFileURL);
				}
	//		System.out.println(countFile);
				if (!countFile.exists())
				{	FileWriter temp = new FileWriter(countFile);
					temp.write('0');
					temp.close();	
				}
				BufferedReader in = new BufferedReader(new FileReader(countFile));
				String inline = in.readLine();
	//		System.out.println(inline);
				countVal = Integer.parseInt(inline);
				in.close();
				PrintWriter client = new PrintWriter(incoming.getOutputStream());
				client.println(inline);
				client.flush();
				BufferedWriter out = new BufferedWriter(new FileWriter(countFile));
				out.write(""+(countVal+1));
				out.newLine();
				out.close();
			}
			catch(Exception e)
			{	System.out.println("Count server failed. " + e);
			}		
		}
	}
	
	private static CountServer server;
	
	public static void main(String [] args) //throws Exception
	{	if(args.length > 0)
			portNumber = Integer.parseInt(args[0]);
		if(args.length > 1)
			filename = args[1];	
			server = new CountServer();		
	//		System.out.println(server.URLtoFile(new URL("http://csis.pace.edu/~bergin/foo/bar.html")));
	}
}