diff --git a/apps/addressbook/java/src/net/i2p/addressbook/Servlet.java b/apps/addressbook/java/src/net/i2p/addressbook/Servlet.java
index 8f26788e4e..c5239609e5 100644
--- a/apps/addressbook/java/src/net/i2p/addressbook/Servlet.java
+++ b/apps/addressbook/java/src/net/i2p/addressbook/Servlet.java
@@ -21,24 +21,43 @@
package net.i2p.addressbook;
-import javax.servlet.GenericServlet;
+import java.util.Random;
+
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
/**
* A wrapper for addressbook to allow it to be started as a web application.
*
+ * This was a GenericServlet, we make it an HttpServlet solely to provide a hook
+ * for SusiDNS to wake us up when the subscription list changes.
+ *
* @author Ragnarok
*
*/
-public class Servlet extends GenericServlet {
+public class Servlet extends HttpServlet {
+ private Thread _thread;
+ private String _nonce;
+ private static final String PROP_NONCE = "addressbook.nonce";
- /* (non-Javadoc)
- * @see javax.servlet.Servlet#service(javax.servlet.ServletRequest, javax.servlet.ServletResponse)
+ /**
+ * Hack to allow susidns to kick the daemon when the subscription list changes.
+ * URL must be /addressbook/ with wakeup param set, and nonce param set from system property.
+ *
+ * (non-Javadoc)
+ * see javax.servlet.Servlet#service(javax.servlet.ServletRequest, javax.servlet.ServletResponse)
*/
- public void service(ServletRequest request, ServletResponse response) {
+ public void service(HttpServletRequest request, HttpServletResponse response) {
+ //System.err.println("Got request nonce = " + request.getParameter("nonce"));
+ if (_thread != null && request.getParameter("wakeup") != null &&
+ _nonce != null && _nonce.equals(request.getParameter("nonce"))) {
+ //System.err.println("Sending interrupt");
+ _thread.interrupt();
+ }
+ // no output
}
/* (non-Javadoc)
@@ -49,15 +68,19 @@ public class Servlet extends GenericServlet {
try {
super.init(config);
} catch (ServletException exp) {
+ System.err.println("Addressbook init exception: " + exp);
}
+ _nonce = "" + Math.abs((new Random()).nextLong());
+ // put the nonce where susidns can get it
+ System.setProperty(PROP_NONCE, _nonce);
String[] args = new String[1];
args[0] = config.getInitParameter("home");
- DaemonThread thread = new DaemonThread(args);
- thread.setDaemon(true);
- thread.setName("Addressbook");
- thread.start();
+ _thread = new DaemonThread(args);
+ _thread.setDaemon(true);
+ _thread.setName("Addressbook");
+ _thread.start();
System.out.println("INFO: Starting Addressbook " + Daemon.VERSION);
- System.out.println("INFO: config root under " + args[0]);
+ //System.out.println("INFO: config root under " + args[0]);
}
}
diff --git a/apps/addressbook/web.xml b/apps/addressbook/web.xml
index 0c3548c68d..c5fe302a6b 100644
--- a/apps/addressbook/web.xml
+++ b/apps/addressbook/web.xml
@@ -13,4 +13,10 @@
1
+
+
+ addressbook
+ /
+
+
diff --git a/apps/susidns/src/java/src/i2p/susi/dns/SubscriptionsBean.java b/apps/susidns/src/java/src/i2p/susi/dns/SubscriptionsBean.java
index 56a42208b3..b860e23930 100644
--- a/apps/susidns/src/java/src/i2p/susi/dns/SubscriptionsBean.java
+++ b/apps/susidns/src/java/src/i2p/susi/dns/SubscriptionsBean.java
@@ -128,7 +128,19 @@ public class SubscriptionsBean
if( lastSerial != null && serial != null && serial.compareTo( lastSerial ) == 0 ) {
if( action.compareToIgnoreCase( "save") == 0 ) {
save();
- message = "Subscriptions saved.";
+ String nonce = System.getProperty("addressbook.nonce");
+ if (nonce != null) {
+ // Yes this is a hack.
+ // No it doesn't work on a text-mode browser.
+ // Fetching from the addressbook servlet
+ // with the correct parameters will kick off a
+ // config reload and fetch.
+ message = "Subscriptions saved, updating addressbook from subscription sources now." +
+ "
";
+ } else {
+ message = "Subscriptions saved.";
+ }
}
else if( action.compareToIgnoreCase( "reload") == 0 ) {
reload();