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