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);
}
}