Copyright (c) 2000, 2015 IBM Corporation and others.
This program and the accompanying materials
are made available under the terms of the Eclipse Public License 2.0
which accompanies this distribution, and is available at
https://www.eclipse.org/legal/epl-2.0/
SPDX-License-Identifier: EPL-2.0
Contributors:
IBM Corporation - initial API and implementation
/*******************************************************************************
* Copyright (c) 2000, 2015 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.core.internal.runtime;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.core.runtime.*;
import org.eclipse.equinox.log.*;
import org.osgi.framework.Bundle;
import org.osgi.service.log.LogEntry;
/**
*
*/
public class Log implements ILog, SynchronousLogListener, LogFilter {
final Bundle bundle;
private final Logger logger;
private final Set<ILogListener> logListeners = new HashSet<>(5);
public Log(Bundle plugin, Logger logger) {
if (plugin == null)
throw new IllegalArgumentException("Logging bundle must not be null."); //$NON-NLS-1$
this.bundle = plugin;
this.logger = logger;
}
Adds the given log listener to this log. Subsequently the log listener will
receive notification of all log events passing through this log.
See Also: - addLogListener.addLogListener(ILogListener)
/**
* Adds the given log listener to this log. Subsequently the log listener will
* receive notification of all log events passing through this log.
*
* @see Platform#addLogListener(ILogListener)
*/
@Override
public void addLogListener(ILogListener listener) {
synchronized (logListeners) {
logListeners.add(listener);
}
}
Returns the plug-in with which this log is associated.
/**
* Returns the plug-in with which this log is associated.
*/
@Override
public Bundle getBundle() {
return bundle;
}
Logs the given status. The status is distributed to the log listeners
installed on this log and then to the log listeners installed on the platform.
See Also: - getLog.getLog()
/**
* Logs the given status. The status is distributed to the log listeners
* installed on this log and then to the log listeners installed on the platform.
*
* @see Plugin#getLog()
*/
@Override
public void log(final IStatus status) {
// Log to the logger
logger.log(PlatformLogWriter.getLog(status), PlatformLogWriter.getLevel(status), status.getMessage(), status.getException());
}
Removes the given log listener to this log. Subsequently the log listener will
no longer receive notification of log events passing through this log.
See Also: - removeLogListener.removeLogListener(ILogListener)
/**
* Removes the given log listener to this log. Subsequently the log listener will
* no longer receive notification of log events passing through this log.
*
* @see Platform#removeLogListener(ILogListener)
*/
@Override
public void removeLogListener(ILogListener listener) {
synchronized (logListeners) {
logListeners.remove(listener);
}
}
@Override
public void logged(LogEntry entry) {
logToListeners(PlatformLogWriter.convertToStatus(entry));
}
private void logToListeners(final IStatus status) {
// create array to avoid concurrent access
ILogListener[] listeners;
synchronized (logListeners) {
listeners = logListeners.toArray(new ILogListener[logListeners.size()]);
}
for (final ILogListener listener : listeners) {
ISafeRunnable code = new ISafeRunnable() {
@Override
public void run() throws Exception {
listener.logging(status, bundle.getSymbolicName());
}
@Override
public void handleException(Throwable e) {
//Ignore
}
};
SafeRunner.run(code);
}
}
@Override
public boolean isLoggable(Bundle loggingBundle, String loggerName, int logLevel) {
return PlatformLogWriter.EQUINOX_LOGGER_NAME.equals(loggerName) && bundle.getBundleId() == loggingBundle.getBundleId();
}
}