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
/******************************************************************************* * 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.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.mapping.ResourceMapping; import org.eclipse.core.resources.mapping.ResourceTraversal; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.ISafeRunnable; import org.eclipse.core.runtime.ListenerList; import org.eclipse.core.runtime.SafeRunner; import org.eclipse.team.core.mapping.ISynchronizationScope; import org.eclipse.team.core.mapping.ISynchronizationScopeChangeListener;
An abstract implementation of an ISynchronizationScope.
Since:3.2
/** * An abstract implementation of an {@link ISynchronizationScope}. * * @since 3.2 */
public abstract class AbstractSynchronizationScope implements ISynchronizationScope { private ListenerList<ISynchronizationScopeChangeListener> listeners = new ListenerList<>(ListenerList.IDENTITY); @Override public IResource[] getRoots() { List<IResource> result = new ArrayList<>(); ResourceTraversal[] traversals = getTraversals(); for (ResourceTraversal traversal : traversals) { IResource[] resources = traversal.getResources(); for (IResource resource : resources) { accumulateRoots(result, resource); } } return result.toArray(new IResource[result.size()]); } @Override public boolean contains(IResource resource) { ResourceTraversal[] traversals = getTraversals(); for (ResourceTraversal traversal : traversals) { if (traversal.contains(resource)) return true; } return false; } /* * Add the resource to the list if it isn't there already * or is not a child of an existing resource. */ private void accumulateRoots(List<IResource> roots, IResource resource) { IPath resourcePath = resource.getFullPath(); for (Iterator iter = roots.iterator(); iter.hasNext();) { IResource root = (IResource) iter.next(); IPath rootPath = root.getFullPath(); // If there is a higher resource in the collection, skip this one if (rootPath.isPrefixOf(resourcePath)) return; // If there are lower resources, remove them if (resourcePath.isPrefixOf(rootPath)) iter.remove(); } // There were no higher resources, so add this one roots.add(resource); }
Fire the scope change event
Params:
  • newTraversals – the new traversals (may be empty)
  • newMappings – the new mappings (may be empty)
/** * Fire the scope change event * @param newTraversals the new traversals (may be empty) * @param newMappings the new mappings (may be empty) */
public void fireTraversalsChangedEvent(final ResourceTraversal[] newTraversals, final ResourceMapping[] newMappings) { Object[] allListeners = listeners.getListeners(); for (Object listener : allListeners) { SafeRunner.run(new ISafeRunnable() { @Override public void run() throws Exception { ((ISynchronizationScopeChangeListener)listener).scopeChanged(AbstractSynchronizationScope.this, newMappings, newTraversals); } @Override public void handleException(Throwable exception) { // Logged by Platform } }); } } @Override public void addScopeChangeListener(ISynchronizationScopeChangeListener listener) { listeners.add(listener); } @Override public void removeScopeChangeListener(ISynchronizationScopeChangeListener listener) { listeners.remove(listener); } }