/******************************************************************************* * 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.concurrent.BlockingQueue; import java.util.concurrent.TimeUnit; import org.osgi.service.log.LogService; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.equinox.log.Logger; import org.eclipse.riena.core.Log4r; import org.eclipse.riena.core.logging.ConsoleLogger; import org.eclipse.riena.internal.core.Activator; /** * The worker thread that delivers collected log events. */ public class DeferredLoggingForwarder extends Job { private final LoggerProvider loggerProvider; private final BlockingQueue<DeferredLogEvent> queue; private static final String WE_ARE_FAMILY = Activator.PLUGIN_ID; public DeferredLoggingForwarder(final LoggerProvider loggerProvider, final BlockingQueue<DeferredLogEvent> queue) { super("DeferredLoggingForwarder"); //$NON-NLS-1$ setSystem(true); this.loggerProvider = loggerProvider; this.queue = queue; } @Override public boolean belongsTo(final Object family) { return WE_ARE_FAMILY.equals(family); } @Override protected IStatus run(final IProgressMonitor monitor) { while (!monitor.isCanceled()) { DeferredLogEvent logEvent; try { logEvent = queue.poll(1, TimeUnit.MILLISECONDS); } catch (final InterruptedException e1) { Thread.currentThread().interrupt(); break; } if (logEvent == null) { continue; } while (!loggerProvider.hasReadyLoggerMill()) { try { Thread.sleep(10); } catch (final InterruptedException e) { Thread.currentThread().interrupt(); break; } } try { final Logger logger = Log4r.getLogger(Activator.getDefault(), logEvent.getLoggerName()); logger.log(logEvent.getLevel(), logEvent.toString()); } catch (final Exception e) { new ConsoleLogger(DeferredLoggingForwarder.class.getName()).log(LogService.LOG_ERROR, "Could not deliver defered log message.", e); //$NON-NLS-1$ } } return Status.CANCEL_STATUS; } }