blob: ca446b0a3bca1efad258472cffbec143cc0a30e9 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2017 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.team.internal.core.subscribers;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.ISafeRunnable;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.core.runtime.SafeRunner;
/**
* An abstract class that managers a collection of change sets.
*/
public abstract class ChangeSetManager {
private ListenerList<IChangeSetChangeListener> listeners = new ListenerList<IChangeSetChangeListener>(ListenerList.IDENTITY);
private Set<ChangeSet> sets;
private boolean initializing;
/**
* Return the list of listeners registered with this change set manager.
* @return the list of listeners registered with this change set manager
*/
protected Object[] getListeners() {
return listeners.getListeners();
}
/**
* Method that can be invoked by subclasses when the name of
* a managed change set changes.
* @param set the set whose title has changed
*/
protected void fireNameChangedEvent(final ChangeSet set) {
if (initializing)
return;
if (contains(set)) {
Object[] listeners = getListeners();
for (int i = 0; i < listeners.length; i++) {
final IChangeSetChangeListener listener = (IChangeSetChangeListener)listeners[i];
SafeRunner.run(new ISafeRunnable() {
@Override
public void handleException(Throwable exception) {
// Exceptions are logged by the platform
}
@Override
public void run() throws Exception {
listener.nameChanged(set);
}
});
}
}
}
/**
* Method which allows subclasses to notify listeners that the default
* set has changed.
* @param oldSet the previous default
* @param defaultSet the new default
*/
protected void fireDefaultChangedEvent(final ChangeSet oldSet, final ChangeSet defaultSet) {
if (initializing)
return;
Object[] listeners = getListeners();
for (int i = 0; i < listeners.length; i++) {
final IChangeSetChangeListener listener = (IChangeSetChangeListener)listeners[i];
SafeRunner.run(new ISafeRunnable() {
@Override
public void handleException(Throwable exception) {
// Exceptions are logged by the platform
}
@Override
public void run() throws Exception {
listener.defaultSetChanged(oldSet, defaultSet);
}
});
}
}
/**
* Add the set to the list of active sets.
* @param set the set to be added
*/
public void add(final ChangeSet set) {
if (!contains(set)) {
internalGetSets().add(set);
handleSetAdded(set);
}
}
/**
* Handle the set addition by notifying listeners.
* @param set the added set
*/
protected void handleSetAdded(final ChangeSet set) {
if (initializing)
return;
Object[] listeners = getListeners();
for (int i = 0; i < listeners.length; i++) {
final IChangeSetChangeListener listener = (IChangeSetChangeListener)listeners[i];
SafeRunner.run(new ISafeRunnable() {
@Override
public void handleException(Throwable exception) {
// Exceptions are logged by the platform
}
@Override
public void run() throws Exception {
listener.setAdded(set);
}
});
}
}
/**
* Remove the set from the list of active sets.
* @param set the set to be removed
*/
public void remove(final ChangeSet set) {
if (contains(set)) {
internalGetSets().remove(set);
handleSetRemoved(set);
}
}
/**
* Handle the set removal by notifying listeners.
* @param set the removed set
*/
protected void handleSetRemoved(final ChangeSet set) {
if (initializing)
return;
Object[] listeners = getListeners();
for (int i = 0; i < listeners.length; i++) {
final IChangeSetChangeListener listener = (IChangeSetChangeListener)listeners[i];
SafeRunner.run(new ISafeRunnable() {
@Override
public void handleException(Throwable exception) {
// Exceptions are logged by the platform
}
@Override
public void run() throws Exception {
listener.setRemoved(set);
}
});
}
}
/**
* Return whether the manager contains the given commit set
* @param set the commit set being tested
* @return whether the set is contained in the manager's list of active sets
*/
public boolean contains(ChangeSet set) {
return internalGetSets().contains(set);
}
/**
* Add the listener to the set of registered listeners.
* @param listener the listener to be added
*/
public void addListener(IChangeSetChangeListener listener) {
listeners.add(listener);
}
/**
* Remove the listener from the set of registered listeners.
* @param listener the listener to remove
*/
public void removeListener(IChangeSetChangeListener listener) {
listeners.remove(listener);
}
/**
* Return the list of active commit sets.
* @return the list of active commit sets
*/
public ChangeSet[] getSets() {
Set<ChangeSet> sets = internalGetSets();
return sets.toArray(new ChangeSet[sets.size()]);
}
/**
* Dispose of any resources maintained by the manager
*/
public void dispose() {
// Nothing to do
}
/**
* Fire resource change notifications to the listeners.
* @param changeSet
* @param allAffectedResources
*/
protected void fireResourcesChangedEvent(final ChangeSet changeSet, final IPath[] allAffectedResources) {
if (initializing)
return;
Object[] listeners = getListeners();
for (int i = 0; i < listeners.length; i++) {
final IChangeSetChangeListener listener = (IChangeSetChangeListener)listeners[i];
SafeRunner.run(new ISafeRunnable() {
@Override
public void handleException(Throwable exception) {
// Exceptions are logged by the platform
}
@Override
public void run() throws Exception {
listener.resourcesChanged(changeSet, allAffectedResources);
}
});
}
}
private Set<ChangeSet> internalGetSets() {
if (sets == null) {
sets = Collections.synchronizedSet(new HashSet<>());
try {
initializing = true;
initializeSets();
} finally {
initializing = false;
}
}
return sets;
}
/**
* Initialize the sets contained in this manager.
* This method is called the first time the sets are accessed.
*/
protected abstract void initializeSets();
public boolean isInitialized() {
return sets != null;
}
}