From ad4d73ea0d062f458245cadfb7892d3e63455b9c Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Mon, 9 Jan 2012 23:59:58 +0000
Subject: [PATCH]     - Fix class error on wrapper 3.1.1

---
 .../i2p/router/web/ConfigServiceHandler.java  | 74 +++------------
 .../net/i2p/router/web/WrapperListener.java   | 89 +++++++++++++++++++
 2 files changed, 103 insertions(+), 60 deletions(-)
 create mode 100644 apps/routerconsole/java/src/net/i2p/router/web/WrapperListener.java

diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigServiceHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigServiceHandler.java
index cf15fee894..3d5797cf2d 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigServiceHandler.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigServiceHandler.java
@@ -8,12 +8,9 @@ import net.i2p.apps.systray.UrlLauncher;
 import net.i2p.router.Router;
 import net.i2p.router.RouterContext;
 import net.i2p.router.startup.ClientAppConfig;
-import net.i2p.util.Log;
+import net.i2p.util.VersionComparator;
 
 import org.tanukisoftware.wrapper.WrapperManager;
-import org.tanukisoftware.wrapper.event.WrapperControlEvent;
-import org.tanukisoftware.wrapper.event.WrapperEvent;
-import org.tanukisoftware.wrapper.event.WrapperEventListener;
 
 /**
  * Handler to deal with form submissions from the service config form and act
@@ -22,9 +19,9 @@ import org.tanukisoftware.wrapper.event.WrapperEventListener;
  */
 public class ConfigServiceHandler extends FormHandler {
     
-    private static WrapperEventListener _signalHandler;
+    private static WrapperListener _wrapperListener;
 
-    private static final String PROP_GRACEFUL_HUP = "router.gracefulHUP";
+    private static final String LISTENER_AVAILABLE = "3.2.0";
 
     /**
      *  Register two shutdown hooks, one to rekey and/or tell the wrapper we are stopping,
@@ -137,16 +134,19 @@ public class ConfigServiceHandler extends FormHandler {
 
     /**
      *  Register a handler for signals,
-     *  so we can handle HUP from the wrapper (non-Windows only)
+     *  so we can handle HUP from the wrapper (non-Windows only, wrapper 3.2.0 or higher)
      *
      *  @since 0.8.13
      */
     synchronized static void registerSignalHandler(RouterContext ctx) {
-        if (ctx.hasWrapper() && _signalHandler == null &&
+        if (ctx.hasWrapper() && _wrapperListener == null &&
             !System.getProperty("os.name").startsWith("Win")) {
-           _signalHandler = new SignalHandler(ctx);
-           long mask = WrapperEventListener.EVENT_FLAG_CONTROL;
-           WrapperManager.addWrapperEventListener(_signalHandler, mask);
+            String wv = System.getProperty("wrapper.version");
+            if (wv != null && (new VersionComparator()).compare(wv, LISTENER_AVAILABLE) >= 0) {
+                try {
+                   _wrapperListener = new WrapperListener(ctx);
+                } catch (Throwable t) {}
+            }
         }
     }
 
@@ -156,55 +156,9 @@ public class ConfigServiceHandler extends FormHandler {
      *  @since 0.8.13
      */
     public synchronized static void unregisterSignalHandler() {
-        if (_signalHandler != null) {
-           WrapperManager.removeWrapperEventListener(_signalHandler);
-           _signalHandler = null;
-        }
-    }
-
-    /**
-     *  Catch signals.
-     *  The wrapper will potentially forward HUP, USR1, and USR2.
-     *  But USR1 and USR2 are used by the JVM GC and cannot be trapped.
-     *  So we will only get HUP.
-     *
-     *  @since 0.8.13
-     */
-    private static class SignalHandler implements WrapperEventListener {
-        private final RouterContext _ctxt;
-
-        public SignalHandler(RouterContext ctx) {
-            _ctxt = ctx;
-        }
-
-        public void fired(WrapperEvent event) {
-            if (!(event instanceof WrapperControlEvent))
-                return;
-            WrapperControlEvent wce = (WrapperControlEvent) event;
-            Log log = _ctxt.logManager().getLog(ConfigServiceHandler.class);
-            if (log.shouldLog(Log.WARN))
-                log.warn("Got signal: " + wce.getControlEventName());
-            int sig = wce.getControlEvent();
-            switch (sig) {
-              case WrapperManager.WRAPPER_CTRL_HUP_EVENT:
-                if (_ctxt.getBooleanProperty(PROP_GRACEFUL_HUP)) {
-                    wce.consume();
-                    if (!(_ctxt.router().gracefulShutdownInProgress() ||
-                          _ctxt.router().isFinalShutdownInProgress())) {
-                        System.err.println("WARN: Graceful shutdown initiated by SIGHUP");
-                        log.logAlways(Log.WARN, "Graceful shutdown initiated by SIGHUP");
-                        registerWrapperNotifier(_ctxt, Router.EXIT_GRACEFUL, false);
-                        _ctxt.router().shutdownGracefully();
-                    }
-                } else {
-                    log.log(Log.CRIT, "Hard shutdown initiated by SIGHUP");
-                    // JVM will call ShutdownHook if we don't do it ourselves
-                    //wce.consume();
-                    //registerWrapperNotifier(_ctxt, Router.EXIT_HARD, false);
-                    //_ctxt.router().shutdown(Router.EXIT_HARD);
-                }
-                break;
-            }
+        if (_wrapperListener != null) {
+            _wrapperListener.unregister();
+            _wrapperListener = null;
         }
     }
 
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/WrapperListener.java b/apps/routerconsole/java/src/net/i2p/router/web/WrapperListener.java
new file mode 100644
index 0000000000..a2bfd4dbf7
--- /dev/null
+++ b/apps/routerconsole/java/src/net/i2p/router/web/WrapperListener.java
@@ -0,0 +1,89 @@
+package net.i2p.router.web;
+
+import net.i2p.router.Router;
+import net.i2p.router.RouterContext;
+import net.i2p.util.Log;
+
+import org.tanukisoftware.wrapper.WrapperManager;
+import org.tanukisoftware.wrapper.event.WrapperControlEvent;
+import org.tanukisoftware.wrapper.event.WrapperEvent;
+import org.tanukisoftware.wrapper.event.WrapperEventListener;
+
+/**
+ *  Listen for events. Requires wrapper 3.2.0 or higher.
+ *  Hides the actual listener so that
+ *  ConfigServiceHandler can have a static field and not die on
+ *  class not found error with wrapper 3.1.1.
+ *
+ *  @since 0.8.13
+ */
+class WrapperListener {
+    private final RouterContext _context;
+    private final WrapperEventListener _listener;
+
+    private static final String PROP_GRACEFUL_HUP = "router.gracefulHUP";
+
+    /**
+     *  Wrapper must be 3.2.0 or higher, or will throw class not found error.
+     *  Registers with the wrapper in the constructor.
+     */
+    public WrapperListener(RouterContext ctx) {
+        _context = ctx;
+        _listener = new SignalHandler(ctx);
+        long mask = WrapperEventListener.EVENT_FLAG_CONTROL;
+        WrapperManager.addWrapperEventListener(_listener, mask);
+    }
+
+    /**
+     *  Unregister the handler for signals
+     */
+    public void unregister() {
+        WrapperManager.removeWrapperEventListener(_listener);
+    }
+
+    /**
+     *  Catch signals.
+     *  The wrapper will potentially forward HUP, USR1, and USR2.
+     *  But USR1 and USR2 are used by the JVM GC and cannot be trapped.
+     *  So we will only get HUP.
+     *
+     *  @since 0.8.13
+     */
+    private static class SignalHandler implements WrapperEventListener {
+        private final RouterContext _ctxt;
+
+        public SignalHandler(RouterContext ctx) {
+            _ctxt = ctx;
+        }
+
+        public void fired(WrapperEvent event) {
+            if (!(event instanceof WrapperControlEvent))
+                return;
+            WrapperControlEvent wce = (WrapperControlEvent) event;
+            Log log = _ctxt.logManager().getLog(ConfigServiceHandler.class);
+            if (log.shouldLog(Log.WARN))
+                log.warn("Got signal: " + wce.getControlEventName());
+            int sig = wce.getControlEvent();
+            switch (sig) {
+              case WrapperManager.WRAPPER_CTRL_HUP_EVENT:
+                if (_ctxt.getBooleanPropertyDefaultTrue(PROP_GRACEFUL_HUP)) {
+                    wce.consume();
+                    if (!(_ctxt.router().gracefulShutdownInProgress() ||
+                          _ctxt.router().isFinalShutdownInProgress())) {
+                        System.err.println("WARN: Graceful shutdown initiated by SIGHUP");
+                        log.logAlways(Log.WARN, "Graceful shutdown initiated by SIGHUP");
+                        ConfigServiceHandler.registerWrapperNotifier(_ctxt, Router.EXIT_GRACEFUL, false);
+                        _ctxt.router().shutdownGracefully();
+                    }
+                } else {
+                    log.log(Log.CRIT, "Hard shutdown initiated by SIGHUP");
+                    // JVM will call ShutdownHook if we don't do it ourselves
+                    //wce.consume();
+                    //registerWrapperNotifier(_ctxt, Router.EXIT_HARD, false);
+                    //_ctxt.router().shutdown(Router.EXIT_HARD);
+                }
+                break;
+            }
+        }
+    }
+}
-- 
GitLab