/*******************************************************************************
* Copyright (C) 2010, 2013 Dariusz Luksza <dariusz@luksza.org> 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
*******************************************************************************/
package org.eclipse.egit.core.synchronize.dto;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IPath;
/**
*
*/
public class GitSynchronizeDataSet implements Iterable<GitSynchronizeData> {
private boolean containsFolderLevelSynchronizationRequest = false;
private final Set<GitSynchronizeData> gsdSet;
private final Map<String, GitSynchronizeData> projectMapping;
private final boolean forceFetch;
/**
* Constructs GitSynchronizeDataSet.
*/
public GitSynchronizeDataSet() {
this(false);
}
/**
* Constructs GitSynchronizeDataSet.
*
* @param forceFetch
* {@code true} for forcing fetch action before synchronization
*/
public GitSynchronizeDataSet(boolean forceFetch) {
this.forceFetch = forceFetch;
gsdSet = new HashSet<GitSynchronizeData>();
projectMapping = new HashMap<String, GitSynchronizeData>();
}
/**
* Constructs GitSynchronizeDataSet and adds given element to set.
*
* @param data
*/
public GitSynchronizeDataSet(GitSynchronizeData data) {
this();
add(data);
}
/**
* @param data
*/
public void add(GitSynchronizeData data) {
gsdSet.add(data);
if (data.getIncludedResources() != null
&& data.getIncludedResources().size() > 0)
containsFolderLevelSynchronizationRequest = true;
for (IProject proj : data.getProjects()) {
projectMapping.put(proj.getName(), data);
}
}
/**
* @param project
* @return <code>true</code> if project has corresponding data
*/
public boolean contains(IProject project) {
return projectMapping.containsKey(project.getName());
}
/**
* @return {@code true} when at least one {@link GitSynchronizeData} is
* configured to include changes only for particular folder,
* {@code false} otherwise
*/
public boolean containsFolderLevelSynchronizationRequest() {
return containsFolderLevelSynchronizationRequest;
}
/**
* @return number of {@link GitSynchronizeData} that are included in this
* set
*/
public int size() {
return gsdSet.size();
}
/**
* @param projectName
* @return <code>null</code> if project does not have corresponding data
*/
public GitSynchronizeData getData(String projectName) {
return projectMapping.get(projectName);
}
/**
* @param project
* @return <code>null</code> if project does not have corresponding data
*/
public GitSynchronizeData getData(IProject project) {
return projectMapping.get(project.getName());
}
@Override
public Iterator<GitSynchronizeData> iterator() {
return gsdSet.iterator();
}
/**
* @return list of all resources
*/
public IProject[] getAllProjects() {
Set<IProject> resource = new HashSet<IProject>();
for (GitSynchronizeData data : gsdSet) {
resource.addAll(data.getProjects());
}
return resource.toArray(new IProject[resource.size()]);
}
/**
* @param res
* @return whether the given resource should be included in the
* synchronization.
*/
public boolean shouldBeIncluded(IResource res) {
final IProject project = res.getProject();
if (project == null)
return false;
final GitSynchronizeData syncData = getData(project);
if (syncData == null)
return false;
final Set<IResource> includedResources = syncData
.getIncludedResources();
if (includedResources == null)
return true;
IPath path = res.getLocation();
if (path != null) {
for (IResource resource : includedResources) {
IPath inclResourceLocation = resource.getLocation();
if (inclResourceLocation != null
&& inclResourceLocation.isPrefixOf(path))
return true;
}
}
return false;
}
/**
* @return {@code true} when fetch action should be forced before
* synchronization, {@code false} otherwise.
*/
public boolean forceFetch() {
return forceFetch;
}
/**
* Disposes all nested resources
*/
public void dispose() {
if (projectMapping != null)
projectMapping.clear();
if (gsdSet != null)
for (GitSynchronizeData gsd : gsdSet)
gsd.dispose();
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
for (GitSynchronizeData data : gsdSet) {
builder.append(data.getRepository().getWorkTree());
builder.append(" "); //$NON-NLS-1$
}
return builder.toString();
}
}