| /*******************************************************************************
|
| * Copyright (c) 2010, 2019 Mia-Software and others.
|
| * All rights reserved. This program and the accompanying materials
|
| * are made available under the terms of the Eclipse Public License v2.0
|
| * which accompanies this distribution, and is available at
|
| * http://www.eclipse.org/legal/epl-v20.html
|
| *
|
| * Contributors:
|
| * Gregoire DUPE (Mia-Software) - initial API and implementation
|
| *******************************************************************************/ |
| package org.eclipse.modisco.infra.common.core.internal.builder;
|
|
|
| import java.util.LinkedList;
|
|
|
| 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.modisco.infra.common.core.internal.Messages;
|
|
|
| public final class NotificationJob extends Job {
|
|
|
| private static final long DELAY = 0;
|
| private static NotificationJob instance;
|
| private final LinkedList<Runnable> actionQueue = new LinkedList<Runnable>();
|
|
|
| private NotificationJob(final String name) {
|
| super(name);
|
| }
|
|
|
| public static synchronized NotificationJob getInstance() {
|
| if (NotificationJob.instance == null) {
|
| NotificationJob.instance = new NotificationJob(Messages.NotificationJob_notificationJobName);
|
| }
|
| return NotificationJob.instance;
|
| }
|
|
|
| @Override
|
| protected IStatus run(final IProgressMonitor monitor) {
|
| while (true) {
|
| Runnable runnable;
|
| synchronized (this.actionQueue) {
|
| if (this.actionQueue.isEmpty()) {
|
| break;
|
| }
|
| runnable = this.actionQueue.removeFirst();
|
| }
|
| if (AbstractMoDiscoCatalog.SCHEDULING_DEBUG) {
|
| System.out.println(this.getClass().getSimpleName() + ": begin run: " + runnable); //$NON-NLS-1$
|
| }
|
| runnable.run();
|
| if (AbstractMoDiscoCatalog.SCHEDULING_DEBUG) {
|
| System.out.println(this.getClass().getSimpleName() + ": end run: " + runnable); //$NON-NLS-1$
|
| }
|
| }
|
| return Status.OK_STATUS;
|
| }
|
|
|
| public synchronized void addAction(final Runnable runnable) {
|
| synchronized (this.actionQueue) {
|
| this.actionQueue.addLast(runnable);
|
| }
|
| cancel();
|
| setPriority(Job.BUILD);
|
| schedule(NotificationJob.DELAY);
|
| }
|
|
|
| @Override
|
| public boolean belongsTo(final Object family) {
|
| return false;
|
| }
|
| }
|