diff --git a/apps/syndie/java/src/net/i2p/syndie/BlogManager.java b/apps/syndie/java/src/net/i2p/syndie/BlogManager.java index 55d45711b..4c93be790 100644 --- a/apps/syndie/java/src/net/i2p/syndie/BlogManager.java +++ b/apps/syndie/java/src/net/i2p/syndie/BlogManager.java @@ -3,6 +3,7 @@ package net.i2p.syndie; import java.io.*; import java.text.*; import java.util.*; + import net.i2p.I2PAppContext; import net.i2p.client.naming.PetName; import net.i2p.client.naming.PetNameDB; @@ -277,6 +278,8 @@ public class BlogManager { public String getDefaultProxyHost() { return _context.getProperty("syndie.defaultProxyHost", ""); } public String getDefaultProxyPort() { return _context.getProperty("syndie.defaultProxyPort", ""); } + public int getUpdateDelay() { return Integer.parseInt(_context.getProperty("syndie.updateDelay", "1")); } + public String[] getUpdateArchives() { return _context.getProperty("syndie.updateArchives", "").split(","); } public boolean authorizeAdmin(String pass) { if (isSingleUser()) return true; diff --git a/apps/syndie/java/src/net/i2p/syndie/Updater.java b/apps/syndie/java/src/net/i2p/syndie/Updater.java new file mode 100644 index 000000000..9363acf88 --- /dev/null +++ b/apps/syndie/java/src/net/i2p/syndie/Updater.java @@ -0,0 +1,65 @@ +package net.i2p.syndie; + +import java.util.HashMap; + +import net.i2p.I2PAppContext; +import net.i2p.util.Log; +import net.i2p.syndie.web.RemoteArchiveBean; + +public class Updater { + public static final String VERSION = "1.0"; + private static final Log _log = I2PAppContext.getGlobalContext().logManager().getLog(Updater.class); + private static final Updater _instance = new Updater(); + + public void update() { + _log.debug("Update started."); + BlogManager bm = BlogManager.instance(); + User user = new User(); + RemoteArchiveBean rab = new RemoteArchiveBean(); + String[] archives = bm.getUpdateArchives(); + for (int i = 0; i < archives.length; i++) { + _log.debug("Fetching " + archives[i]); + rab.fetchIndex(user, "web", archives[i], bm.getDefaultProxyHost(), bm.getDefaultProxyPort()); + if (rab.getRemoteIndex() != null) { + _log.debug("Index fetched, getting new entries."); + HashMap parameters = new HashMap(); + parameters.put("action", "Fetch all new entries"); + //rab.fetchSelectedBulk(user, parameters); + rab.fetchAllEntries(user, parameters); + _log.debug("Update finished."); + } else { + _log.debug("Index fetch failed."); + } + } + } + + public static void main() { + _instance.run(); + } + + public void run() { + + // wait + try { + Thread.currentThread().sleep(5*60*1000); + } catch (InterruptedException ie) {} + + while (true) { + int delay = BlogManager.instance().getUpdateDelay(); + update(); + try { + synchronized (this) { + wait(delay * 60 * 60 * 1000); + } + } catch (InterruptedException exp) { + } + + } + } + + public static void wakeup() { + synchronized (_instance) { + _instance.notifyAll(); + } + } +} \ No newline at end of file diff --git a/apps/syndie/java/src/net/i2p/syndie/UpdaterServlet.java b/apps/syndie/java/src/net/i2p/syndie/UpdaterServlet.java new file mode 100644 index 000000000..70c67181e --- /dev/null +++ b/apps/syndie/java/src/net/i2p/syndie/UpdaterServlet.java @@ -0,0 +1,37 @@ +package net.i2p.syndie; + +import javax.servlet.GenericServlet; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; + +/** + * A wrapper for syndie updater to allow it to be started as a web application. + * + * @author Ragnarok + * + */ +public class UpdaterServlet extends GenericServlet { + + /* (non-Javadoc) + * @see javax.servlet.Servlet#service(javax.servlet.ServletRequest, javax.servlet.ServletResponse) + */ + public void service(ServletRequest request, ServletResponse response) { + } + + /* (non-Javadoc) + * @see javax.servlet.Servlet#init(javax.servlet.ServletConfig) + */ + public void init(ServletConfig config) { + try { + super.init(config); + } catch (ServletException exp) { + } + UpdaterThread thread = new UpdaterThread(); + thread.setDaemon(true); + thread.start(); + System.out.println("INFO: Starting Syndie Updater " + Updater.VERSION); + } + +} \ No newline at end of file diff --git a/apps/syndie/java/src/net/i2p/syndie/UpdaterThread.java b/apps/syndie/java/src/net/i2p/syndie/UpdaterThread.java new file mode 100644 index 000000000..fda8a09a5 --- /dev/null +++ b/apps/syndie/java/src/net/i2p/syndie/UpdaterThread.java @@ -0,0 +1,27 @@ +package net.i2p.syndie; + +/** + * A thread that runs the updater. + * + * @author Ragnarok + * + */ +public class UpdaterThread extends Thread { + + /** + * Construct an UpdaterThread. + */ + public UpdaterThread() { + } + + /* (non-Javadoc) + * @see java.lang.Runnable#run() + */ + public void run() { + //try { + // Thread.sleep(5 * 60 * 1000); + //} catch (InterruptedException exp) { + //} + Updater.main(); + } +} \ No newline at end of file diff --git a/apps/syndie/java/src/net/i2p/syndie/web/RemoteArchiveBean.java b/apps/syndie/java/src/net/i2p/syndie/web/RemoteArchiveBean.java index 489123276..07a3389ab 100644 --- a/apps/syndie/java/src/net/i2p/syndie/web/RemoteArchiveBean.java +++ b/apps/syndie/java/src/net/i2p/syndie/web/RemoteArchiveBean.java @@ -297,18 +297,24 @@ public class RemoteArchiveBean { _statusMessages.add("Fetching index from " + HTMLRenderer.sanitizeString(_remoteLocation) + (_proxyHost != null ? " via " + HTMLRenderer.sanitizeString(_proxyHost) + ":" + _proxyPort : "")); - File archiveFile = new File(BlogManager.instance().getTempDir(), user.getBlog().toBase64() + "_remoteArchive.txt"); + + File archiveFile; + if (user.getBlog() != null) { + archiveFile = new File(BlogManager.instance().getTempDir(), user.getBlog().toBase64() + "_remoteArchive.txt"); + } else { + archiveFile = new File(BlogManager.instance().getTempDir(), "remoteArchive.txt"); + } archiveFile.delete(); Properties etags = new Properties(); try { - etags.load(new FileInputStream(new File(BlogManager.instance().getRootDir(), "etags"))); - } catch (Exception exp) { + DataHelper.loadProps(etags, new File(BlogManager.instance().getRootDir(), "etags")); + } catch (IOException ioe) { //ignore } EepGet eep = new EepGet(I2PAppContext.getGlobalContext(), ((_proxyHost != null) && (_proxyPort > 0)), - _proxyHost, _proxyPort, 0, archiveFile.getAbsolutePath(), location, etags.getProperty(location)); + _proxyHost, _proxyPort, 0, archiveFile.getAbsolutePath(), location, true, etags.getProperty(location)); eep.addStatusListener(new IndexFetcherStatusListener(archiveFile)); eep.fetch(); @@ -316,8 +322,8 @@ public class RemoteArchiveBean { etags.setProperty(location, eep.getETag()); } try { - etags.store(new FileOutputStream(new File(BlogManager.instance().getRootDir(), "etags")), "etags"); - } catch (Exception exp) { + DataHelper.storeProps(etags, new File(BlogManager.instance().getRootDir(), "etags")); + } catch (IOException ioe) { //ignore } } diff --git a/apps/syndie/jsp/web.xml b/apps/syndie/jsp/web.xml index bb86268a5..1f5798c83 100644 --- a/apps/syndie/jsp/web.xml +++ b/apps/syndie/jsp/web.xml @@ -14,6 +14,12 @@ net.i2p.syndie.web.RSSServlet + + net.i2p.syndie.UpdaterServlet + net.i2p.syndie.UpdaterServlet + 1 + + diff --git a/history.txt b/history.txt index 631e4a382..36c43f4f0 100644 --- a/history.txt +++ b/history.txt @@ -1,4 +1,13 @@ -$Id: history.txt,v 1.276 2005/09/30 19:57:34 ragnarok Exp $ +$Id: history.txt,v 1.277 2005/10/01 14:20:10 jrandom Exp $ + +2005-10-03 ragnarok + * Implemented a Syndie auto-updater. It will automatically pull new posts + from selected syndie archives. To try it out, add + syndie.updateArchives= to your + syndie.config. Archives must be specified as the full url to archive.txt + (e.g. http://syndiemedia.i2p/archive/archive.txt). By default, it checks + for new posts every hour. This can be modified by setting + syndie.updateDelay= also in syndie.config. * 2005-10-01 0.6.1.1 released