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