Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Watson2014-12-18 21:58:39 +0000
committerThomas Watson2014-12-18 21:58:39 +0000
commit8b81822a319104b8518ca86657ae5d273539474c (patch)
treeb77109789f920f694c927b81f3fd42f5df1640d0
parent68647b50dff58eb40f1011c2668ab9f1854e16ca (diff)
downloadrt.equinox.framework-8b81822a319104b8518ca86657ae5d273539474c.tar.gz
rt.equinox.framework-8b81822a319104b8518ca86657ae5d273539474c.tar.xz
rt.equinox.framework-8b81822a319104b8518ca86657ae5d273539474c.zip
Bug 454204 - Equinox Built in Log Service has no history
-rw-r--r--bundles/org.eclipse.osgi.tests/src/org/eclipse/equinox/log/test/LogReaderServiceTest.java77
-rw-r--r--bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/EquinoxConfiguration.java1
-rw-r--r--bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/log/EquinoxLogServices.java13
-rw-r--r--bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/log/ExtendedLogReaderServiceFactory.java32
-rw-r--r--bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/log/LogServiceManager.java13
5 files changed, 125 insertions, 11 deletions
diff --git a/bundles/org.eclipse.osgi.tests/src/org/eclipse/equinox/log/test/LogReaderServiceTest.java b/bundles/org.eclipse.osgi.tests/src/org/eclipse/equinox/log/test/LogReaderServiceTest.java
index bcd1b926c..cfe80cd6a 100644
--- a/bundles/org.eclipse.osgi.tests/src/org/eclipse/equinox/log/test/LogReaderServiceTest.java
+++ b/bundles/org.eclipse.osgi.tests/src/org/eclipse/equinox/log/test/LogReaderServiceTest.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007, 2013 IBM Corporation and others All rights reserved. This
+ * Copyright (c) 2007, 2014 IBM Corporation and others All rights reserved. This
* program and the accompanying materials are made available under the terms of
* the Eclipse Public License v1.0 which accompanies this distribution, and is
* available at http://www.eclipse.org/legal/epl-v10.html
@@ -8,7 +8,10 @@
*******************************************************************************/
package org.eclipse.equinox.log.test;
-import java.util.Hashtable;
+import java.io.File;
+import java.util.*;
+import org.eclipse.osgi.internal.framework.EquinoxConfiguration;
+import org.eclipse.osgi.launch.Equinox;
import org.eclipse.osgi.tests.OSGiTestsActivator;
import org.eclipse.osgi.tests.bundles.AbstractBundleTests;
import org.osgi.framework.*;
@@ -147,4 +150,74 @@ public class LogReaderServiceTest extends AbstractBundleTests {
}
assertTrue(listener.getEntryX().getLevel() == LogService.LOG_INFO);
}
+
+ public void testLogHistory1() throws BundleException {
+ File config = OSGiTestsActivator.getContext().getDataFile(getName());
+ Map<String, Object> configuration = new HashMap<String, Object>();
+ configuration.put(Constants.FRAMEWORK_STORAGE, config.getAbsolutePath());
+ configuration.put(EquinoxConfiguration.PROP_LOG_HISTORY_MAX, "10");
+ Equinox equinox = new Equinox(configuration);
+ equinox.start();
+
+ try {
+ LogService testLog = equinox.getBundleContext().getService(equinox.getBundleContext().getServiceReference(LogService.class));
+ LogReaderService testReader = equinox.getBundleContext().getService(equinox.getBundleContext().getServiceReference(LogReaderService.class));
+ assertEquals("Expecting no logs.", 0, countLogEntries(testReader.getLog(), 0));
+ // log 9 things
+ for (int i = 0; i < 9; i++) {
+ testLog.log(LogService.LOG_WARNING, String.valueOf(i));
+ }
+ assertEquals("Wrong number of logs.", 9, countLogEntries(testReader.getLog(), 0));
+
+ // log 9 more things
+ for (int i = 9; i < 18; i++) {
+ testLog.log(LogService.LOG_WARNING, String.valueOf(i));
+ }
+
+ // should only be the last 10 logs (8 - 17)
+ assertEquals("Wrong number of logs.", 10, countLogEntries(testReader.getLog(), 8));
+ } finally {
+ try {
+ equinox.stop();
+ } catch (BundleException e) {
+ // ignore
+ }
+ }
+ }
+
+ public void testLogHistory2() throws BundleException {
+ File config = OSGiTestsActivator.getContext().getDataFile(getName());
+ Map<String, Object> configuration = new HashMap<String, Object>();
+ configuration.put(Constants.FRAMEWORK_STORAGE, config.getAbsolutePath());
+ Equinox equinox = new Equinox(configuration);
+ equinox.start();
+
+ try {
+ LogService testLog = equinox.getBundleContext().getService(equinox.getBundleContext().getServiceReference(LogService.class));
+ LogReaderService testReader = equinox.getBundleContext().getService(equinox.getBundleContext().getServiceReference(LogReaderService.class));
+ assertEquals("Expecting no logs.", 0, countLogEntries(testReader.getLog(), 0));
+ // log 9 things
+ for (int i = 0; i < 9; i++) {
+ testLog.log(LogService.LOG_WARNING, String.valueOf(i));
+ }
+ assertEquals("Wrong number of logs.", 0, countLogEntries(testReader.getLog(), 0));
+ } finally {
+ try {
+ equinox.stop();
+ } catch (BundleException e) {
+ // ignore
+ }
+ }
+ }
+
+ private int countLogEntries(Enumeration logEntries, int startingMessage) {
+ int count = 0;
+ while (logEntries.hasMoreElements()) {
+ LogEntry entry = (LogEntry) logEntries.nextElement();
+ assertEquals("Wrong log message.", String.valueOf(startingMessage), entry.getMessage());
+ startingMessage++;
+ count++;
+ }
+ return count;
+ }
}
diff --git a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/EquinoxConfiguration.java b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/EquinoxConfiguration.java
index 2925071f5..a8cfe68f9 100644
--- a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/EquinoxConfiguration.java
+++ b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/EquinoxConfiguration.java
@@ -190,6 +190,7 @@ public class EquinoxConfiguration implements EnvironmentInfo {
public static final String PROP_MODULE_LOCK_TIMEOUT = "osgi.module.lock.timeout"; //$NON-NLS-1$
public static final String PROP_ALLOW_RESTRICTED_PROVIDES = "osgi.equinox.allow.restricted.provides"; //$NON-NLS-1$
+ public static final String PROP_LOG_HISTORY_MAX = "equinox.log.history.max"; //$NON-NLS-1$
private final static Collection<String> populateInitConfig = Arrays.asList(PROP_OSGI_ARCH, PROP_OSGI_OS, PROP_OSGI_WS, PROP_OSGI_NL, FRAMEWORK_OS_NAME, FRAMEWORK_OS_VERSION, FRAMEWORK_PROCESSOR, FRAMEWORK_LANGUAGE);
diff --git a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/log/EquinoxLogServices.java b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/log/EquinoxLogServices.java
index 5740650a7..02afb004c 100644
--- a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/log/EquinoxLogServices.java
+++ b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/log/EquinoxLogServices.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2006, 2013 IBM Corporation and others.
+ * Copyright (c) 2006, 2014 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -71,7 +71,16 @@ public class EquinoxLogServices {
if ("true".equals(environmentInfo.getConfiguration(EclipseStarter.PROP_CONSOLE_LOG))) //$NON-NLS-1$
logWriter.setConsoleLog(true);
- logServiceManager = new LogServiceManager(logWriter, perfWriter);
+ String logHistoryMaxProp = environmentInfo.getConfiguration(EquinoxConfiguration.PROP_LOG_HISTORY_MAX);
+ int logHistoryMax = 0;
+ if (logHistoryMaxProp != null) {
+ try {
+ logHistoryMax = Integer.parseInt(logHistoryMaxProp);
+ } catch (NumberFormatException e) {
+ // ignore and use 0
+ }
+ }
+ logServiceManager = new LogServiceManager(logHistoryMax, logWriter, perfWriter);
eclipseLogFactory = new EquinoxLogFactory(logWriter, logServiceManager);
rootFrameworkLog = eclipseLogFactory.createFrameworkLog(null, logWriter);
}
diff --git a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/log/ExtendedLogReaderServiceFactory.java b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/log/ExtendedLogReaderServiceFactory.java
index 9f396363a..5fbf296aa 100644
--- a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/log/ExtendedLogReaderServiceFactory.java
+++ b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/log/ExtendedLogReaderServiceFactory.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2006, 2013 Cognos Incorporated, IBM Corporation and others
+ * Copyright (c) 2006, 2014 Cognos Incorporated, IBM Corporation and others
* All rights reserved. This program and the accompanying materials are made
* available under the terms of the Eclipse Public License v1.0 which
* accompanies this distribution, and is available at
@@ -53,6 +53,8 @@ public class ExtendedLogReaderServiceFactory implements ServiceFactory<ExtendedL
private ArrayMap<LogListener, Object[]> listeners = new ArrayMap<LogListener, Object[]>(5);
private LogFilter[] filters = null;
private final ThreadLocal<int[]> nestedCallCount = new ThreadLocal<int[]>();
+ private final LinkedList<LogEntry> history;
+ private final int maxHistory;
static boolean safeIsLoggable(LogFilter filter, Bundle bundle, String name, int level) {
try {
@@ -96,6 +98,15 @@ public class ExtendedLogReaderServiceFactory implements ServiceFactory<ExtendedL
}
}
+ public ExtendedLogReaderServiceFactory(int maxHistory) {
+ this.maxHistory = maxHistory;
+ if (maxHistory > 0) {
+ history = new LinkedList<LogEntry>();
+ } else {
+ history = null;
+ }
+ }
+
public ExtendedLogReaderServiceImpl getService(Bundle bundle, ServiceRegistration<ExtendedLogReaderServiceImpl> registration) {
return new ExtendedLogReaderServiceImpl(this);
}
@@ -181,6 +192,7 @@ public class ExtendedLogReaderServiceFactory implements ServiceFactory<ExtendedL
void logPrivileged(Bundle bundle, String name, Object context, int level, String message, Throwable exception) {
LogEntry logEntry = new ExtendedLogEntryImpl(bundle, name, context, level, message, exception);
+ storeEntry(logEntry);
ArrayMap<LogListener, Object[]> listenersCopy;
listenersLock.readLock();
try {
@@ -211,6 +223,17 @@ public class ExtendedLogReaderServiceFactory implements ServiceFactory<ExtendedL
}
}
+ private void storeEntry(LogEntry logEntry) {
+ if (history != null) {
+ synchronized (history) {
+ if (history.size() == maxHistory) {
+ history.removeFirst();
+ }
+ history.addLast(logEntry);
+ }
+ }
+ }
+
void addLogListener(LogListener listener, LogFilter filter) {
listenersLock.writeLock();
try {
@@ -264,6 +287,11 @@ public class ExtendedLogReaderServiceFactory implements ServiceFactory<ExtendedL
}
Enumeration<?> getLog() {
- return EMPTY_ENUMERATION;
+ if (history == null) {
+ return EMPTY_ENUMERATION;
+ }
+ synchronized (history) {
+ return Collections.enumeration(new ArrayList<LogEntry>(history));
+ }
}
}
diff --git a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/log/LogServiceManager.java b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/log/LogServiceManager.java
index e2259b6c0..788091b97 100644
--- a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/log/LogServiceManager.java
+++ b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/log/LogServiceManager.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2006, 2012 Cognos Incorporated, IBM Corporation and others
+ * Copyright (c) 2006, 2014 Cognos Incorporated, IBM Corporation and others
* All rights reserved. This program and the accompanying materials are made
* available under the terms of the Eclipse Public License v1.0 which
* accompanies this distribution, and is available at
@@ -24,12 +24,15 @@ public class LogServiceManager implements BundleListener, FrameworkListener, Ser
private ServiceRegistration<?> logReaderServiceRegistration;
private ServiceRegistration<?> logServiceRegistration;
- private final ExtendedLogReaderServiceFactory logReaderServiceFactory = new ExtendedLogReaderServiceFactory();
- private final ExtendedLogServiceFactory logServiceFactory = new ExtendedLogServiceFactory(logReaderServiceFactory);
- private final ExtendedLogServiceImpl systemBundleLog = logServiceFactory.getLogService(new MockSystemBundle());
+ private final ExtendedLogReaderServiceFactory logReaderServiceFactory;
+ private final ExtendedLogServiceFactory logServiceFactory;
+ private final ExtendedLogServiceImpl systemBundleLog;
private EventAdminAdapter eventAdminAdapter;
- public LogServiceManager(LogListener... systemListeners) {
+ public LogServiceManager(int maxHistory, LogListener... systemListeners) {
+ logReaderServiceFactory = new ExtendedLogReaderServiceFactory(maxHistory);
+ logServiceFactory = new ExtendedLogServiceFactory(logReaderServiceFactory);
+ systemBundleLog = logServiceFactory.getLogService(new MockSystemBundle());
for (LogListener logListener : systemListeners) {
if (logListener instanceof LogFilter)
logReaderServiceFactory.addLogListener(logListener, (LogFilter) logListener);

Back to the top