blob: 8600b36269befbd916e4abe483f6a277a6fa7e39 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2015 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
* Lars Vogel <Lars.Vogel@vogella.com> - Bug 473427
*******************************************************************************/
package org.eclipse.core.internal.localstore;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.internal.resources.*;
import org.eclipse.core.internal.utils.Messages;
import org.eclipse.core.resources.IResourceStatus;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.*;
import org.eclipse.osgi.util.NLS;
//
/**
* Visits a unified tree, and collects local sync information in
* a multi-status. At the end of the visit, the resource tree will NOT
* be synchronized with the file system, but all discrepancies between
* the two will be recorded in the returned status.
*/
public class CollectSyncStatusVisitor extends RefreshLocalVisitor {
protected List<Resource> affectedResources;
/**
* Determines how to treat cases where the resource is missing from
* the local file system. When performing a deletion with force=false,
* we don't care about files that are out of sync because they do not
* exist in the file system.
*/
private boolean ignoreLocalDeletions = false;
protected MultiStatus status;
/**
* Creates a new visitor, whose sync status will have the given title.
*/
public CollectSyncStatusVisitor(String multiStatusTitle, IProgressMonitor monitor) {
super(monitor);
status = new MultiStatus(ResourcesPlugin.PI_RESOURCES, IStatus.INFO, multiStatusTitle, null);
}
protected void changed(Resource target) {
String message = NLS.bind(Messages.localstore_resourceIsOutOfSync, target.getFullPath());
status.add(new ResourceStatus(IResourceStatus.OUT_OF_SYNC_LOCAL, target.getFullPath(), message));
if (affectedResources == null)
affectedResources = new ArrayList<>(20);
affectedResources.add(target);
resourceChanged = true;
}
@Override
protected void createResource(UnifiedTreeNode node, Resource target) {
changed(target);
}
@Override
protected void deleteResource(UnifiedTreeNode node, Resource target) {
if (!ignoreLocalDeletions)
changed(target);
}
@Override
protected void fileToFolder(UnifiedTreeNode node, Resource target) {
changed(target);
}
@Override
protected void folderToFile(UnifiedTreeNode node, Resource target) {
changed(target);
}
/**
* Returns the list of resources that were not synchronized with
* the local file system, or <code>null</code> if all resources
* are synchronized.
*/
public List<Resource> getAffectedResources() {
return affectedResources;
}
/**
* Returns the sync status that has been collected as a result of this visit.
*/
public MultiStatus getSyncStatus() {
return status;
}
@Override
protected void makeLocal(UnifiedTreeNode node, Resource target) {
changed(target);
}
@Override
protected void refresh(Container parent) {
changed(parent);
}
@Override
protected void resourceChanged(UnifiedTreeNode node, Resource target) {
changed(target);
}
/**
* Instructs this visitor to ignore changes due to local deletions
* in the file system.
*/
public void setIgnoreLocalDeletions(boolean value) {
this.ignoreLocalDeletions = value;
}
}