X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Flogging%2Fbridge%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Flogging%2Fbridge%2Finternal%2FActivator.java;h=b231faf15307b558cebc629524ee185c12c89a97;hp=6bafee0b2cdb053c09401f653dbbd5dcc56d3dbd;hb=fa8dda6d4645b95fe12d9a236c078f28aa5751a9;hpb=65dcba73cc07b3f29e6a6ad547ab5105f1ab9bde diff --git a/opendaylight/logging/bridge/src/main/java/org/opendaylight/controller/logging/bridge/internal/Activator.java b/opendaylight/logging/bridge/src/main/java/org/opendaylight/controller/logging/bridge/internal/Activator.java index 6bafee0b2c..b231faf153 100644 --- a/opendaylight/logging/bridge/src/main/java/org/opendaylight/controller/logging/bridge/internal/Activator.java +++ b/opendaylight/logging/bridge/src/main/java/org/opendaylight/controller/logging/bridge/internal/Activator.java @@ -1,4 +1,3 @@ - /* * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. * @@ -6,15 +5,16 @@ * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ - package org.opendaylight.controller.logging.bridge.internal; import org.osgi.service.log.LogEntry; + +import java.lang.Thread.UncaughtExceptionHandler; import java.util.Enumeration; + import org.osgi.framework.BundleContext; import org.osgi.framework.BundleException; import org.osgi.framework.BundleActivator; -import org.osgi.framework.ServiceRegistration; import org.osgi.framework.ServiceReference; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -22,7 +22,11 @@ import org.slf4j.ILoggerFactory; import org.osgi.service.log.LogReaderService; public class Activator implements BundleActivator { + private static final String UNCAUGHT_EXCEPTION_POLICY_PROP = "controller.uncaughtExceptionPolicy"; + private static final UncaughtExceptionPolicy DEFAULT_UNCAUGHT_EXCEPTION_POLICY = UncaughtExceptionPolicy.IGNORE; + private LogListenerImpl listener = null; + private ShutdownHandler shutdownHandler = null; private Logger log = null; @Override @@ -56,23 +60,32 @@ public class Activator implements BundleActivator { this.listener.logged(entry); } } - + /* * Install the default exception handler so that the uncaught * exceptions are handled by our customized handler. This new * handler will display the exceptions to OSGI console as well * as log to file. */ - Thread.setDefaultUncaughtExceptionHandler(new org.opendaylight. - controller.logging.bridge.internal.UncaughtExceptionHandler()); - + UncaughtExceptionHandler handler = DEFAULT_UNCAUGHT_EXCEPTION_POLICY; + final String policy = context.getProperty(UNCAUGHT_EXCEPTION_POLICY_PROP); + if (policy != null) { + try { + handler = UncaughtExceptionPolicy.valueOf(policy.toUpperCase()); + } catch (IllegalArgumentException ex) { + log.warn("Invalid policy name \"{}\", defaulting to {}", policy, handler); + } + } + log.info("Setting uncaught exception policy to {}", handler); + Thread.setDefaultUncaughtExceptionHandler(handler); + /* * Install the Shutdown handler. This will intercept SIGTERM signal and * close the system bundle. This allows for a graceful closing of OSGI * framework. */ - - Runtime.getRuntime().addShutdownHook(new shutdownHandler(context)); + shutdownHandler = new ShutdownHandler(context); + Runtime.getRuntime().addShutdownHook(shutdownHandler); } else { this.log.error("Cannot register the LogListener because " + "cannot retrieve LogReaderService"); @@ -91,25 +104,31 @@ public class Activator implements BundleActivator { LogReaderService reader = (LogReaderService) service; reader.removeLogListener(this.listener); } - + if (this.shutdownHandler != null) { + Runtime.getRuntime().removeShutdownHook(this.shutdownHandler); + } this.listener = null; this.log = null; + this.shutdownHandler = null; } - - private class shutdownHandler extends Thread { + + private class ShutdownHandler extends Thread { BundleContext bundlecontext; - public shutdownHandler(BundleContext ctxt) { + public ShutdownHandler(BundleContext ctxt) { this.bundlecontext = ctxt; } - + + @Override public void run () { try { this.bundlecontext.getBundle(0).stop(); log.debug("shutdown handler thread called"); } catch (BundleException e) { log.debug("Bundle couldn't be stopped"); + } catch (Exception e) { + log.debug("Unhandled exception"); } - } + } } }