-
/*
* Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
*
* 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;
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
.getService(service);
if (reader == null) {
this.log.error("Cannot register the LogListener because "
- + "cannot retrive LogReaderService");
+ + "cannot retrieve LogReaderService");
+ } else {
+ reader.addLogListener(this.listener);
+ // Now lets walk all the exiting messages
+ Enumeration<LogEntry> entries = reader.getLog();
+ if (entries != null) {
+ while (entries.hasMoreElements()) {
+ LogEntry entry = entries.nextElement();
+ this.listener.logged(entry);
+ }
+ }
}
- reader.addLogListener(this.listener);
- // Now lets walk all the exiting messages
- Enumeration<LogEntry> entries = reader.getLog();
- if (entries != null) {
- while (entries.hasMoreElements()) {
- LogEntry entry = (LogEntry) entries.nextElement();
- 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.
+ */
+ 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.
+ */
+ shutdownHandler = new ShutdownHandler(context);
+ Runtime.getRuntime().addShutdownHook(shutdownHandler);
} else {
this.log.error("Cannot register the LogListener because "
- + "cannot retrive LogReaderService");
+ + "cannot retrieve LogReaderService");
}
} else {
System.err
@Override
public void stop(BundleContext context) {
- ServiceReference service = null;
- service = context.getServiceReference(LogReaderService.class.getName());
- if (service != null) {
- LogReaderService reader = (LogReaderService) service;
+ ServiceReference serviceRef = context.getServiceReference(
+ LogReaderService.class.getName());
+ if (serviceRef != null) {
+ LogReaderService reader = (LogReaderService) context.getService(serviceRef);
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 {
+ BundleContext bundlecontext;
+ 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");
+ }
+ }
}
+
}