diff options
author | Thomas Watson | 2014-12-18 21:58:39 +0000 |
---|---|---|
committer | Thomas Watson | 2014-12-18 21:58:39 +0000 |
commit | 8b81822a319104b8518ca86657ae5d273539474c (patch) | |
tree | b77109789f920f694c927b81f3fd42f5df1640d0 | |
parent | 68647b50dff58eb40f1011c2668ab9f1854e16ca (diff) | |
download | rt.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
Change-Id: I286c3648239168c09cc374e8890040ae6909bfcb
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); |