Register a framework listener in order to track possible exceptions caught by the framework, when
it invokes service listeners (The framework fires a FrameworkEvent when it catches exceptions from
service changed listener callbacks).
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1448164 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/Base.java b/dependencymanager/test/src/test/java/org/apache/felix/dm/test/Base.java
index 5615dd3..101e163 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/Base.java
+++ b/dependencymanager/test/src/test/java/org/apache/felix/dm/test/Base.java
@@ -26,72 +26,74 @@
import org.junit.After;
import org.junit.Before;
import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkEvent;
+import org.osgi.framework.FrameworkListener;
import org.osgi.framework.ServiceReference;
import org.osgi.service.log.LogService;
/**
* Base class for all test cases.
*/
-public class Base implements LogService {
+public class Base implements LogService, FrameworkListener {
public static final String OSGI_SPEC_VERSION = "4.2.0";
private final static int LOG_LEVEL = LogService.LOG_WARNING;
-
+ private volatile boolean m_errorsLogged;
+
/**
* Register us as a LogService
+ *
* @param context
*/
@Before
- public void startup(BundleContext context)
- {
+ public void startup(BundleContext context) {
context.registerService(LogService.class.getName(), this, null);
+ context.addFrameworkListener(this);
}
/**
- * Always cleanup our bundle location file (because pax seems to forget to cleanup it)
+ * Always cleanup our bundle location file (because pax seems to forget to
+ * cleanup it)
+ *
* @param context
*/
-
+
@After
- public void tearDown(BundleContext context)
- {
- // The following code forces the temporary bundle files (from /tmp/tb/*) to be deleted when jvm exits
+ public void tearDown(BundleContext context) {
+ // The following code forces the temporary bundle files (from /tmp/tb/*)
+ // to be deleted when jvm exits
// (this patch seems to be only required with pax examp 2.0.0)
- try
- {
+ try {
File f = new File(new URL(context.getBundle().getLocation()).getPath());
f.deleteOnExit();
- }
- catch (Throwable t)
- {
+ } catch (Throwable t) {
t.printStackTrace();
}
+ context.removeFrameworkListener(this);
}
/**
* Suspend the current thread for a while.
- * @param n the number of milliseconds to wait for.
+ *
+ * @param n
+ * the number of milliseconds to wait for.
*/
- protected void sleep(int ms)
- {
- try
- {
+ protected void sleep(int ms) {
+ try {
Thread.sleep(ms);
- }
- catch (InterruptedException e)
- {
+ } catch (InterruptedException e) {
}
}
- public void log(int level, String message)
- {
+ public void log(int level, String message) {
+ checkError(level, null);
if (LOG_LEVEL >= level) {
System.out.println(getLevel(level) + " " + message);
}
}
- public void log(int level, String message, Throwable exception)
- {
+ public void log(int level, String message, Throwable exception) {
+ checkError(level, exception);
if (LOG_LEVEL >= level) {
StringBuilder sb = new StringBuilder();
sb.append(getLevel(level) + " ");
@@ -101,8 +103,8 @@
}
}
- public void log(ServiceReference sr, int level, String message)
- {
+ public void log(ServiceReference sr, int level, String message) {
+ checkError(level, null);
if (LOG_LEVEL >= level) {
StringBuilder sb = new StringBuilder();
sb.append(getLevel(level) + " ");
@@ -111,8 +113,8 @@
}
}
- public void log(ServiceReference sr, int level, String message, Throwable exception)
- {
+ public void log(ServiceReference sr, int level, String message, Throwable exception) {
+ checkError(level, exception);
if (LOG_LEVEL >= level) {
StringBuilder sb = new StringBuilder();
sb.append(getLevel(level) + " ");
@@ -122,26 +124,72 @@
}
}
- private void parse(StringBuilder sb, Throwable t)
- {
- if (t != null)
- {
+ protected boolean errorsLogged() {
+ return m_errorsLogged;
+ }
+
+ private void parse(StringBuilder sb, Throwable t) {
+ if (t != null) {
sb.append(" - ");
StringWriter buffer = new StringWriter();
PrintWriter pw = new PrintWriter(buffer);
t.printStackTrace(pw);
sb.append(buffer.toString());
+ m_errorsLogged = true;
}
}
-
+
private String getLevel(int level) {
- switch(level)
- {
- case LogService.LOG_DEBUG: return "DEBUG";
- case LogService.LOG_ERROR: return "ERROR";
- case LogService.LOG_INFO: return "INFO";
- case LogService.LOG_WARNING: return "WARN";
- default: return "";
+ switch (level) {
+ case LogService.LOG_DEBUG:
+ return "DEBUG";
+ case LogService.LOG_ERROR:
+ return "ERROR";
+ case LogService.LOG_INFO:
+ return "INFO";
+ case LogService.LOG_WARNING:
+ return "WARN";
+ default:
+ return "";
+ }
+ }
+
+ private void checkError(int level, Throwable exception) {
+ if (level >= LOG_ERROR) {
+ m_errorsLogged = true;
+ }
+ if (exception != null) {
+ m_errorsLogged = true;
+ }
+ }
+
+ public void frameworkEvent(FrameworkEvent event) {
+ int eventType = event.getType();
+ String msg = getFrameworkEventMessage(eventType);
+ int level = (eventType == FrameworkEvent.ERROR) ? LOG_ERROR : LOG_WARNING;
+ if (msg != null) {
+ log(level, msg, event.getThrowable());
+ } else {
+ log(level, "Unknown fwk event: " + event);
+ }
+ }
+
+ private String getFrameworkEventMessage(int event) {
+ switch (event) {
+ case FrameworkEvent.ERROR:
+ return "FrameworkEvent: ERROR";
+ case FrameworkEvent.INFO:
+ return "FrameworkEvent INFO";
+ case FrameworkEvent.PACKAGES_REFRESHED:
+ return "FrameworkEvent: PACKAGE REFRESHED";
+ case FrameworkEvent.STARTED:
+ return "FrameworkEvent: STARTED";
+ case FrameworkEvent.STARTLEVEL_CHANGED:
+ return "FrameworkEvent: STARTLEVEL CHANGED";
+ case FrameworkEvent.WARNING:
+ return "FrameworkEvent: WARNING";
+ default:
+ return null;
}
}
}