/*******************************************************************************
* Copyright (c) 2007, 2014 compeople AG 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
*
* Contributors:
* compeople AG - initial API and implementation
*******************************************************************************/
package org.eclipse.riena.internal.core.logging;
import java.util.ArrayList;
import java.util.List;
import org.osgi.service.log.LogListener;
import org.eclipse.equinox.log.ExtendedLogReaderService;
import org.eclipse.equinox.log.ExtendedLogService;
import org.eclipse.equinox.log.LogFilter;
import org.eclipse.equinox.log.Logger;
import org.eclipse.riena.core.RienaStatus;
import org.eclipse.riena.core.logging.CommandProviderLogFilter;
import org.eclipse.riena.core.logging.ILogCatcher;
import org.eclipse.riena.core.logging.LogServiceLogCatcher;
import org.eclipse.riena.core.logging.PlatformLogCatcher;
import org.eclipse.riena.core.logging.SynchronousLogListenerAdapter;
import org.eclipse.riena.core.logging.SysoLogListener;
import org.eclipse.riena.core.wire.InjectExtension;
import org.eclipse.riena.core.wire.InjectService;
import org.eclipse.riena.internal.core.ignore.IgnoreFindBugs;
/**
* The {@code LoggerMill} is responsible for delivering ready to use
* {@code Logger} instances and also for the configuration of the riena logging.<br>
* For the curious: There are so many LoggerFactories out there. So, not another
* one!
*/
public class LoggerMill {
private final List<LogListener> logListeners = new ArrayList<LogListener>();
private final List<ILogCatcher> logCatchers = new ArrayList<ILogCatcher>();;
private ILogListenerExtension[] listenerDefs;
private ILogCatcherExtension[] catcherDefs;
private ExtendedLogService logService;
/**
* Get the logger for the specified category.<br>
* <b>Note:</b> Use the log levels defined in
* {@link org.osgi.service.log.LogService}
*
* @param category
* logger name
* @return
*/
public Logger getLogger(final String category) {
synchronized (this) {
return isReady() ? logService.getLogger(category) : null;
}
}
/**
* Bind ExtendedLogService
*
* @param logService
*/
@InjectService(useRanking = true, order = 1)
public void bind(final ExtendedLogService logService) {
synchronized (this) {
this.logService = logService;
}
}
/**
* Unbind ExtendedLogService
*
* @param logService
*/
public void unbind(final ExtendedLogService logService) {
synchronized (this) {
this.logService = null;
}
}
/**
* Bind ExtendedLogReaderService
*
* @param logReaderService
*/
@InjectService(useRanking = true, order = 1)
public void bind(final ExtendedLogReaderService logReaderService) {
// When isDevelopment() is explicitly set to {@code false} no default logging will be used. Otherwise if
// no loggers have been defined than a default logging setup will be used.
final boolean useDefaultLogging = RienaStatus.isDevelopment();
if (listenerDefs.length == 0 && useDefaultLogging) {
listenerDefs = new ILogListenerExtension[] { new SysoLogListenerDefinition() };
}
for (final ILogListenerExtension logListenerDef : listenerDefs) {
LogListener listener = logListenerDef.createLogListener();
if (listener == null) {
// this can only happen, if the mandatory attribute is not defined, i.e. a schema violation
continue;
}
if (logListenerDef.isSynchronous()) {
listener = new SynchronousLogListenerAdapter(listener);
}
logListeners.add(listener);
final LogFilter filter = logListenerDef.createLogFilter();
if (filter == null) {
logReaderService.addLogListener(listener);
} else {
logReaderService.addLogListener(listener, filter);
}
}
if (catcherDefs.length == 0 && useDefaultLogging) {
catcherDefs = new ILogCatcherExtension[] { new PlatformLogCatcherDefinition(),
new LogServiceLogCatcherDefinition() };
}
for (final ILogCatcherExtension catcherDef : catcherDefs) {
final ILogCatcher logCatcher = catcherDef.createLogCatcher();
logCatcher.attach();
logCatchers.add(logCatcher);
}
}
/**
* Unbind ExtendedLogReaderService
*
* @param logReaderService
*/
public void unbind(final ExtendedLogReaderService logReaderService) {
for (final LogListener logListener : logListeners) {
logReaderService.removeLogListener(logListener);
}
for (final ILogCatcher logCatcher : logCatchers) {
logCatcher.detach();
}
}
@IgnoreFindBugs(value = "EI_EXPOSE_REP2", justification = "deep cloning the �listenerDefs� is too expensive")
@InjectExtension(order = 0)
public void update(final ILogListenerExtension[] listenerDefs) {
this.listenerDefs = listenerDefs;
}
@IgnoreFindBugs(value = "EI_EXPOSE_REP2", justification = "deep cloning the �catcherDefs� is too expensive")
@InjectExtension(order = 0)
public void update(final ILogCatcherExtension[] catcherDefs) {
this.catcherDefs = catcherDefs;
}
public boolean isReady() {
synchronized (this) {
return logService != null;
}
}
/**
* Definition of log listener that defines a {@code SysoLogListener} with a
* {@code CommandProviderLogFilter}.
*/
private static final class SysoLogListenerDefinition implements ILogListenerExtension {
public boolean isSynchronous() {
return true;
}
public LogFilter createLogFilter() {
return new CommandProviderLogFilter();
}
public LogListener createLogListener() {
return new SysoLogListener();
}
public String getName() {
return "DefaultLogListner"; //$NON-NLS-1$
}
}
/**
* Definition of log catcher that defines a {@code PlatformLogCatcher}.
*/
private final static class PlatformLogCatcherDefinition implements ILogCatcherExtension {
public ILogCatcher createLogCatcher() {
return new PlatformLogCatcher();
}
public String getName() {
return "DefaultPlatformLogCatcher"; //$NON-NLS-1$
}
}
/**
* Definition of log catcher that defines a {@code LogServiceLogCatcher}.
*/
private final static class LogServiceLogCatcherDefinition implements ILogCatcherExtension {
public ILogCatcher createLogCatcher() {
return new LogServiceLogCatcher();
}
public String getName() {
return "DefaultLogServiceLogCatcher"; //$NON-NLS-1$
}
}
}