import java.net.*;
import java.io.*;
import java.sql.*;
import java.math.BigDecimal;
import java.util.Properties;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

interface MyntListener
{
	void mynt(String myntnafn, String kaupgengi, String midgengi, String solugengi);
}

class MyntParser extends DefaultHandler
{
	private static final int IGNORE    = 0;
	private static final int MYNTNAFN  = 1;
	private static final int KAUPGENGI = 2;
	private static final int MIDGENGI  = 3;
	private static final int SOLUGENGI = 4;

	private StringBuffer myntnafn;
	private StringBuffer kaupgengi, midgengi, solugengi;
	private MyntListener listener;
	private int state;

	public MyntParser(MyntListener listener)
	{
		myntnafn = new StringBuffer();
		kaupgengi = new StringBuffer();
		midgengi = new StringBuffer();
		solugengi = new StringBuffer();
		state = IGNORE;
		this.listener = listener;
	}

	public void startElement(String uri, String localName, String qName, Attributes attr) throws SAXException
	{
		if (qName.equalsIgnoreCase("mynt"))
		{
			myntnafn.setLength(0);
			kaupgengi.setLength(0);
			midgengi.setLength(0);
			solugengi.setLength(0);
		}
		else if (qName.equalsIgnoreCase("myntnafn"))
			state = MYNTNAFN;
		else if (qName.equalsIgnoreCase("kaupgengi"))
			state = KAUPGENGI;
		else if (qName.equalsIgnoreCase("midgengi"))
			state = MIDGENGI;
		else if (qName.equalsIgnoreCase("solugengi"))
			state = SOLUGENGI;
		else
			state = IGNORE;
	}

	public void endElement(String uri, String localName, String qName) throws SAXException
	{
		if (qName.equalsIgnoreCase("mynt"))
		{
			listener.mynt(myntnafn.toString(), kaupgengi.toString(), midgengi.toString(), solugengi.toString());
		}

		state = IGNORE;
	}

	public void characters(char ch[], int start, int length) throws SAXException
	{
		String data = new String(ch, start, length);

		switch (state)
		{
			case MYNTNAFN:
				myntnafn.append(data.trim());
				break;
			case KAUPGENGI:
				kaupgengi.append(data.trim());
				break;
			case MIDGENGI:
				midgengi.append(data.trim());
				break;
			case SOLUGENGI:
				solugengi.append(data.trim());
				break;
		}
	}
}

class Loader implements MyntListener
{
	private String[] myntir = {"USD", "GBP", "JPY", "CHF"};
	private Connection c;
	private PreparedStatement s;
	private String dags;

	public Loader(String dags, Connection c) throws SQLException
	{
		this.dags = dags;
		this.c = c;
		this.s = c.prepareStatement("INSERT INTO gengi (dags,myntnafn,kaupgengi,midgengi,solugengi) VALUES (to_date(?, 'YYYY-mm-dd'),?,?,?,?);");
	}

	private boolean contains(String s)
	{
		for (int i = 0; i < myntir.length; i++)
			if (s.equals(myntir[i]))
				return true;

		return false;
	}

	public void mynt(String myntnafn, String kaupgengi, String midgengi, String solugengi)
	{
		if (!contains(myntnafn))
			return;

		try
		{
			s.setString(1, dags);
			s.setString(2, myntnafn.toString());
			s.setObject(3, new BigDecimal(kaupgengi.toString()));
			s.setObject(4, new BigDecimal(midgengi.toString()));
			s.setObject(5, new BigDecimal(solugengi.toString()));
			s.executeUpdate();

		} catch (Exception e)
		{
			e.printStackTrace();
		}	
	}
}

public class Gengi
{
	public static void main(String[] args) throws Exception
	{
		if (args.length != 1)
		{
			System.err.println("Usage: java Gengi <yyyy-mm-dd>");
			System.exit(1);
		}

		String dags = args[0];
		String[] fields = dags.split("-");
		String sd = fields[2] + "." + fields[1] + "." + fields[0];

		try
		{
			URL gengi = new URL("http://www.sedlabanki.is/?PageID=289&dagar=" + sd);

			InputStream is = gengi.openStream();

			Connection c = getConnection();

			c.setAutoCommit(false);

			SAXParserFactory factory = SAXParserFactory.newInstance();
			SAXParser saxParser = factory.newSAXParser();

			Loader loader = new Loader(dags, c);
			DefaultHandler parser = new MyntParser(loader);
			saxParser.parse(is, parser);

			c.commit();

		} catch (Exception e)
		{
			e.printStackTrace();
		}
	}

	public static Connection getConnection() throws SQLException, IOException
	{    
		Properties props = new Properties();
		FileInputStream in = new FileInputStream("database.properties");
		props.load(in);
		in.close();

		String drivers = props.getProperty("jdbc.drivers");

		if (drivers != null)
			System.setProperty("jdbc.drivers", drivers);

		String url = props.getProperty("jdbc.url");
		String username = props.getProperty("jdbc.username");
		String password = props.getProperty("jdbc.password");

		return DriverManager.getConnection(url, username, password);
	}
}