/*******************************************************************************
* 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.ui.internal.synchronize.model;
import java.util.Map;
import org.eclipse.compare.structuremergeviewer.Differencer;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.egit.core.synchronize.GitCommitsModelCache.Change;
import org.eclipse.egit.ui.internal.UIText;
import org.eclipse.egit.ui.internal.synchronize.model.TreeBuilder.FileModelFactory;
import org.eclipse.egit.ui.internal.synchronize.model.TreeBuilder.TreeModelFactory;
import org.eclipse.jgit.lib.Repository;
/**
* Git cache representation in EGit Change Set
*/
public class GitModelCache extends GitModelObjectContainer {
private final Path location;
private final Repository repo;
private GitModelObject[] children;
/**
* Constructs model node that represents current status of Git cache.
*
* @param parent
* parent object
*
* @param repo
* repository associated with this object
* @param cache
* cache containing all changed objects
*/
public GitModelCache(GitModelRepository parent, Repository repo,
Map<String, Change> cache) {
this(parent, repo, cache, new FileModelFactory() {
@Override
public GitModelBlob createFileModel(
GitModelObjectContainer objParent, Repository nestedRepo,
Change change, IPath path) {
return new GitModelCacheFile(objParent, nestedRepo, change,
path);
}
@Override
public boolean isWorkingTree() {
return false;
}
});
}
/**
* @param parent
* parent object
* @param repo
* repository associated with this object
* @param changes
* list of changes associated with this object
* @param fileFactory
* leaf instance factory
*/
protected GitModelCache(GitModelRepository parent, final Repository repo,
Map<String, Change> changes, final FileModelFactory fileFactory) {
super(parent);
this.repo = repo;
this.location = new Path(repo.getWorkTree().toString());
this.children = TreeBuilder.build(this, repo, changes, fileFactory,
new TreeModelFactory() {
@Override
public GitModelTree createTreeModel(
GitModelObjectContainer parentObject,
IPath fullPath,
int kind) {
return new GitModelCacheTree(parentObject, repo,
fullPath, fileFactory);
}
});
}
@Override
public String getName() {
return UIText.GitModelIndex_index;
}
@Override
public GitModelObject[] getChildren() {
return children;
}
@Override
public int getKind() {
return Differencer.CHANGE | Differencer.RIGHT;
}
@Override
public int repositoryHashCode() {
return repo.getWorkTree().hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj == this)
return true;
if (obj instanceof GitModelCache
&& !(obj instanceof GitModelWorkingTree)) {
GitModelCache left = (GitModelCache) obj;
return left.getParent().equals(getParent());
}
return false;
}
@Override
public int hashCode() {
return repositoryHashCode();
}
@Override
public IPath getLocation() {
return location;
}
@Override
public String toString() {
return "ModelCache"; //$NON-NLS-1$
}
@Override
public void dispose() {
if (children != null) {
for (GitModelObject object : children)
object.dispose();
children = null;
}
}
}