blob: 7d10730e9f62b57de2fa17fa359bea1f83e30562 [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2002, 2003 IBM Corporation 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:
* IBM Corporation - initial API and implementation
****************************************************************************/
package org.eclipse.gmf.runtime.common.core.service;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
/**
* The abstract parent of all service providers. Implements basic support for
* thread-safe provider change notification.
* <p>
* Service implementers are expected to expose service specific provider classes
* extending this class.
* </p>
* <p>
* Service provider implementers never need to extend this class directly, they
* instead derive their provider implementation from the service specific
* provider class extending this interface.
* </p>
*/
public abstract class AbstractProvider
implements IProvider {
/**
* The provider change listeners.
*/
private final List listeners = Collections
.synchronizedList(new ArrayList());
/**
* Constructs a new abstract provider.
*/
protected AbstractProvider() {
super();
}
/**
* Retrieves the value of the <code>listeners</code> instance variable.
*
* @return The value of the <code>listeners</code> instance varible.
*/
private List getListeners() {
return listeners;
}
/**
* Adds the specified listener to the list of provider change listeners for
* this abstract provider.
*
* @param listener
* The listener to be added.
*
* @see IProvider#addProviderChangeListener(IProviderChangeListener)
*/
public void addProviderChangeListener(IProviderChangeListener listener) {
assert null != listener : "addProviderChangeListener received NULL listener as argument"; //$NON-NLS-1$
getListeners().add(listener);
}
/**
* Removes the specified listener from the list of provider change listeners
* for this abstract provider.
*
* @param listener
* The listener to be removed.
*
* @see IProvider#removeProviderChangeListener(IProviderChangeListener)
*/
public void removeProviderChangeListener(IProviderChangeListener listener) {
assert null != listener : "removeProviderChangeListener received NULL listener as argument"; //$NON-NLS-1$
getListeners().remove(listener);
}
/**
* Notifies the listeners for this abstract provider that the specified
* event has occurred.
*
* @param event
* The provider change event to be fired.
*/
protected void fireProviderChange(ProviderChangeEvent event) {
assert null != event : "fireProviderChange received NULL event as argument"; //$NON-NLS-1$
List targets = null;
synchronized (getListeners()) {
targets = new ArrayList(getListeners());
}
for (Iterator i = targets.iterator(); i.hasNext();) {
((IProviderChangeListener) i.next()).providerChanged(event);
}
}
}