From ff34cdc13bc8ba0943cded8009b9869a455894f6 Mon Sep 17 00:00:00 2001 From: Trygve Laugstøl Date: Thu, 8 Nov 2012 11:45:08 +0100 Subject: o Basic gitorious atom importer. --- .../java/io/trygvis/esper/testing/AtomDao.java | 37 ++++++++ .../io/trygvis/esper/testing/AtomImporter.java | 18 ---- src/main/java/io/trygvis/esper/testing/DbMain.java | 3 +- .../io/trygvis/esper/testing/GitoriousDao.java | 27 ++++++ .../trygvis/esper/testing/GitoriousImporter.java | 98 ++++++++++++++++++++++ src/main/java/io/trygvis/esper/testing/Main.java | 14 ++-- src/main/resources/ddl.sql | 16 ++++ 7 files changed, 188 insertions(+), 25 deletions(-) create mode 100644 src/main/java/io/trygvis/esper/testing/AtomDao.java delete mode 100644 src/main/java/io/trygvis/esper/testing/AtomImporter.java create mode 100644 src/main/java/io/trygvis/esper/testing/GitoriousDao.java create mode 100644 src/main/java/io/trygvis/esper/testing/GitoriousImporter.java create mode 100644 src/main/resources/ddl.sql (limited to 'src') diff --git a/src/main/java/io/trygvis/esper/testing/AtomDao.java b/src/main/java/io/trygvis/esper/testing/AtomDao.java new file mode 100644 index 0000000..0215545 --- /dev/null +++ b/src/main/java/io/trygvis/esper/testing/AtomDao.java @@ -0,0 +1,37 @@ +package io.trygvis.esper.testing; + +import java.sql.*; + +public class AtomDao { + private final PreparedStatement selectLastUpdate; + private final PreparedStatement insertAtomFeed; + private final PreparedStatement updateAtomFeed; + + public AtomDao(Connection c) throws SQLException { + selectLastUpdate = c.prepareStatement("SELECT last_update FROM atom_feed WHERE url=?"); + insertAtomFeed = c.prepareStatement("INSERT INTO atom_feed(url, last_update) VALUES(?, ?)"); + updateAtomFeed = c.prepareStatement("UPDATE atom_feed SET last_update=? WHERE url=?"); + } + + public Timestamp getAtomFeed(String url) throws SQLException { + selectLastUpdate.setString(1, url); + ResultSet rs = selectLastUpdate.executeQuery(); + if (!rs.next()) { + return null; + } + + return rs.getTimestamp(1); + } + + public void insertAtomFeed(String url, Timestamp lastUpdate) throws SQLException { + insertAtomFeed.setString(1, url); + insertAtomFeed.setTimestamp(2, lastUpdate); + insertAtomFeed.executeUpdate(); + } + + public void updateAtomFeed(String url, Timestamp lastUpdate) throws SQLException { + updateAtomFeed.setTimestamp(1, lastUpdate); + updateAtomFeed.setString(2, url); + updateAtomFeed.executeUpdate(); + } +} diff --git a/src/main/java/io/trygvis/esper/testing/AtomImporter.java b/src/main/java/io/trygvis/esper/testing/AtomImporter.java deleted file mode 100644 index 7e70715..0000000 --- a/src/main/java/io/trygvis/esper/testing/AtomImporter.java +++ /dev/null @@ -1,18 +0,0 @@ -package io.trygvis.esper.testing; - -import org.apache.abdera.*; -import org.apache.abdera.protocol.client.*; -import org.apache.abdera.protocol.client.cache.*; - -public class AtomImporter { - public static void main(String[] args) { - Abdera abdera = new Abdera(); - AbderaClient abderaClient = new AbderaClient(abdera, new LRUCache(abdera, 1000)); - - while(true) { - ClientResponse response = abderaClient.get("http://gitorious.org/qt.atom"); - -// response. - } - } -} diff --git a/src/main/java/io/trygvis/esper/testing/DbMain.java b/src/main/java/io/trygvis/esper/testing/DbMain.java index 635e3cc..345d7a7 100644 --- a/src/main/java/io/trygvis/esper/testing/DbMain.java +++ b/src/main/java/io/trygvis/esper/testing/DbMain.java @@ -5,7 +5,8 @@ import org.h2.tools.*; import java.sql.*; public class DbMain { - private static final String JDBC_URL = "jdbc:h2:mem:esper;DB_CLOSE_DELAY=-1"; +// public static final String JDBC_URL = "jdbc:h2:mem:esper;DB_CLOSE_DELAY=-1"; + public static final String JDBC_URL = "jdbc:postgresql://localhost/esper"; public static void main(String[] args) throws Exception { Server server = Server.createTcpServer(args).start(); diff --git a/src/main/java/io/trygvis/esper/testing/GitoriousDao.java b/src/main/java/io/trygvis/esper/testing/GitoriousDao.java new file mode 100644 index 0000000..bf5d954 --- /dev/null +++ b/src/main/java/io/trygvis/esper/testing/GitoriousDao.java @@ -0,0 +1,27 @@ +package io.trygvis.esper.testing; + +import java.sql.*; + +public class GitoriousDao { + private final PreparedStatement countEntryId; + private final PreparedStatement insertChange; + + public GitoriousDao(Connection c) throws SQLException { + countEntryId = c.prepareStatement("SELECT count(entry_id) FROM gitorious_change WHERE entry_id=?"); + insertChange = c.prepareStatement("INSERT INTO gitorious_change(entry_id, text) VALUES(?, ?)"); + } + + public int countEntryId(String entryId) throws SQLException { + countEntryId.setString(1, entryId); + try(ResultSet rs = countEntryId.executeQuery()) { + rs.next(); + return rs.getInt(1); + } + } + + public void insertChange(String entryId, String text) throws SQLException { + insertChange.setString(1, entryId); + insertChange.setString(2, text); + insertChange.executeUpdate(); + } +} diff --git a/src/main/java/io/trygvis/esper/testing/GitoriousImporter.java b/src/main/java/io/trygvis/esper/testing/GitoriousImporter.java new file mode 100644 index 0000000..c79d4f5 --- /dev/null +++ b/src/main/java/io/trygvis/esper/testing/GitoriousImporter.java @@ -0,0 +1,98 @@ +package io.trygvis.esper.testing; + +import org.apache.abdera.*; +import org.apache.abdera.model.*; +import org.apache.abdera.protocol.client.*; +import org.apache.abdera.protocol.client.cache.*; + +import java.sql.*; +import java.util.Date; + +public class GitoriousImporter { + private final AbderaClient abderaClient; + private final Connection connection; + private final AtomDao atomDao; + private final GitoriousDao gitoriousDao; + + public GitoriousImporter(AbderaClient abderaClient, Connection c) throws SQLException { + this.abderaClient = abderaClient; + this.connection = c; + atomDao = new AtomDao(c); + gitoriousDao = new GitoriousDao(c); + } + + public static void main(String[] args) throws InterruptedException, SQLException { + Main.configureLog4j(); + Abdera abdera = new Abdera(); + AbderaClient abderaClient = new AbderaClient(abdera, new LRUCache(abdera, 1000)); + + Connection connection = DriverManager.getConnection(DbMain.JDBC_URL, "esper", ""); + connection.setAutoCommit(false); + + new GitoriousImporter(abderaClient, connection).work(); + } + + private void work() throws SQLException, InterruptedException { + String url = "http://qt.gitorious.org/projects/show/qt.atom"; + + while (true) { + Timestamp lastUpdate = atomDao.getAtomFeed(url); + + System.out.println("Fetching " + url); + RequestOptions options = new RequestOptions(); + if(lastUpdate != null) { + options.setIfModifiedSince(lastUpdate); + } + + long start = System.currentTimeMillis(); + ClientResponse response = abderaClient.get(url, options); + long end = System.currentTimeMillis(); + System.out.println("Fetched in " + (end - start) + "ms"); + + // Use the server's timestamp + Date responseDate = response.getDateHeader("Date"); + + System.out.println("responseDate = " + responseDate); + + Document document = response.getDocument(); + Feed feed = (Feed) document.getRoot(); + + for (Entry entry : feed.getEntries()) { + String entryId = entry.getId().toASCIIString(); + Date published = entry.getPublished(); + String title = entry.getTitle(); + + // Validate element + if (entryId == null || published == null || title == null) { + continue; + } + + if (lastUpdate != null && lastUpdate.after(published)) { + System.out.println("Old entry: " + url + ":" + entryId); + continue; + } + + System.out.println("New entry: " + url + ":" + entryId); + if(gitoriousDao.countEntryId(entryId) == 0) { + gitoriousDao.insertChange(entryId, title); + } + else { + System.out.println("Already imported entry: " + entryId); + } + } + + if (lastUpdate == null) { + System.out.println("New atom feed"); + atomDao.insertAtomFeed(url, new Timestamp(responseDate.getTime())); + } else { + System.out.println("Updating atom feed"); + atomDao.updateAtomFeed(url, lastUpdate); + } + + connection.commit(); + + System.out.println("Sleeping"); + Thread.sleep(10 * 1000); + } + } +} diff --git a/src/main/java/io/trygvis/esper/testing/Main.java b/src/main/java/io/trygvis/esper/testing/Main.java index 25b3fad..69e0bce 100644 --- a/src/main/java/io/trygvis/esper/testing/Main.java +++ b/src/main/java/io/trygvis/esper/testing/Main.java @@ -9,20 +9,22 @@ public class Main { // private static final String JDBC_URL = "jdbc:h2:mem:esper;DB_CLOSE_DELAY=-1"; private static final String JDBC_URL = "jdbc:h2:tcp://127.0.0.1/esper;DB_CLOSE_DELAY=-1"; - public Main() throws Exception { + public static void main(String[] args) throws Exception { + configureLog4j(); + Main main = new Main(); + main.work(); + } + + public static void configureLog4j() { Properties properties = new Properties(); properties.setProperty("log4j.rootLogger", "DEBUG, A1"); + properties.setProperty("log4j.logger.httpclient.wire.content", "INFO"); properties.setProperty("log4j.appender.A1", "org.apache.log4j.ConsoleAppender"); properties.setProperty("log4j.appender.A1.layout", "org.apache.log4j.PatternLayout"); properties.setProperty("log4j.appender.A1.layout.ConversionPattern", "%-4r [%t] %-5p %c %x - %m%n"); PropertyConfigurator.configure(properties); } - public static void main(String[] args) throws Exception { - Main main = new Main(); - main.work(); - } - private void work() throws Exception { Configuration config = new Configuration(); diff --git a/src/main/resources/ddl.sql b/src/main/resources/ddl.sql new file mode 100644 index 0000000..f545efd --- /dev/null +++ b/src/main/resources/ddl.sql @@ -0,0 +1,16 @@ +BEGIN; + +DROP TABLE IF EXISTS gitorious_change; +DROP TABLE IF EXISTS atom_feed; + +CREATE TABLE atom_feed ( + url VARCHAR(1000) PRIMARY KEY, + last_update TIMESTAMP NOT NULL +); + +CREATE TABLE gitorious_change ( + entry_id VARCHAR(1000) PRIMARY KEY, + text VARCHAR(1000) +); + +COMMIT; -- cgit v1.2.3