/******************************************************************************* * Copyright (c) 2015 IBH SYSTEMS GmbH. * 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: * IBH SYSTEMS GmbH - initial API and implementation *******************************************************************************/ package org.eclipse.packagedrone.repo.manage.todo; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class DefaultTaskProvider implements TaskProvider { private final static Logger logger = LoggerFactory.getLogger ( DefaultTaskProvider.class ); private final Set<TaskListener> listeners = new HashSet<> (); private Set<Task> tasks = new CopyOnWriteArraySet<> (); public DefaultTaskProvider () { } protected void fireNotify () { final Collection<? extends Task> current = getTasks (); for ( final TaskListener listener : this.listeners ) { try { listener.tasksChanged ( current ); } catch ( final Exception e ) { logger.warn ( "Failed to notify task change", e ); } } } protected synchronized void addTask ( final Task task ) { if ( this.tasks.add ( task ) ) { fireNotify (); } } protected synchronized void removeTask ( final Task task ) { if ( this.tasks.remove ( task ) ) { fireNotify (); } } protected synchronized void setTasks ( final Collection<Task> tasks ) { this.tasks = new CopyOnWriteArraySet<> ( tasks ); fireNotify (); } @Override public synchronized Collection<? extends Task> getTasks () { return Collections.unmodifiableCollection ( this.tasks ); } @Override public synchronized void addListener ( final TaskListener listener ) { this.listeners.add ( listener ); } @Override public synchronized void removeListener ( final TaskListener listener ) { this.listeners.remove ( listener ); } }