From 8b81822a319104b8518ca86657ae5d273539474c Mon Sep 17 00:00:00 2001 From: Thomas Watson Date: Thu, 18 Dec 2014 15:58:39 -0600 Subject: Bug 454204 - Equinox Built in Log Service has no history Change-Id: I286c3648239168c09cc374e8890040ae6909bfcb --- .../equinox/log/test/LogReaderServiceTest.java | 77 +++++++++++++++++++++- .../internal/framework/EquinoxConfiguration.java | 1 + .../osgi/internal/log/EquinoxLogServices.java | 13 +++- .../log/ExtendedLogReaderServiceFactory.java | 32 ++++++++- .../osgi/internal/log/LogServiceManager.java | 13 ++-- 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 configuration = new HashMap(); + 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 configuration = new HashMap(); + 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 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 listeners = new ArrayMap(5); private LogFilter[] filters = null; private final ThreadLocal nestedCallCount = new ThreadLocal(); + private final LinkedList 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 0) { + history = new LinkedList(); + } else { + history = null; + } + } + public ExtendedLogReaderServiceImpl getService(Bundle bundle, ServiceRegistration registration) { return new ExtendedLogReaderServiceImpl(this); } @@ -181,6 +192,7 @@ public class ExtendedLogReaderServiceFactory implements ServiceFactory listenersCopy; listenersLock.readLock(); try { @@ -211,6 +223,17 @@ public class ExtendedLogReaderServiceFactory implements ServiceFactory getLog() { - return EMPTY_ENUMERATION; + if (history == null) { + return EMPTY_ENUMERATION; + } + synchronized (history) { + return Collections.enumeration(new ArrayList(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); -- cgit v1.2.1