package com.link_intersystems.gitdirstat.domain;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import org.eclipse.jgit.lib.RefDatabase;
import org.eclipse.jgit.lib.Repository;
public class RefFactory {
static final String PREFIX_LOCAL = "refs/heads/";
static final String PREFIX_REMOTE = "refs/remotes/";
static final String PREFIX_TAG = "refs/tags";
private GitRepository gitRepository;
public RefFactory(GitRepository gitRepository) {
this.gitRepository = gitRepository;
}
public List<String> getRefPrefixes(Class<? extends Ref> refType) {
List<String> refPrefixes = new ArrayList<String>();
if (Ref.class.equals(refType)) {
refPrefixes.add(RefDatabase.ALL);
} else if (Branch.class.equals(refType)) {
refPrefixes.addAll(getLocalBranchRefs());
refPrefixes.addAll(getRemoteBranchRefs());
} else if (LocalBranch.class.equals(refType)) {
refPrefixes.addAll(getLocalBranchRefs());
} else if (RemoteBranch.class.equals(refType)) {
refPrefixes.addAll(getRemoteBranchRefs());
}
return refPrefixes;
}
private List<String> getRemoteBranchRefs() {
List<String> remoteBranchRefs = new ArrayList<String>();
Repository repository = gitRepository.getRepository();
Set<String> remoteNames = repository.getRemoteNames();
for (String remoteName : remoteNames) {
remoteBranchRefs.add(PREFIX_REMOTE + remoteName + "/");
}
return remoteBranchRefs;
}
private List<String> getLocalBranchRefs() {
return Collections.singletonList(PREFIX_LOCAL);
}
@SuppressWarnings("unchecked")
public <T extends Ref> T create(org.eclipse.jgit.lib.Ref jgitRef) {
Ref ref = null;
String name = jgitRef.getName();
if (name.startsWith(PREFIX_LOCAL)) {
ref = new LocalBranch(gitRepository, jgitRef);
} else if (name.startsWith(PREFIX_REMOTE)) {
boolean symbolic = jgitRef.isSymbolic();
if (!symbolic) {
ref = new RemoteBranch(gitRepository, jgitRef);
}
} else if (name.startsWith(PREFIX_TAG)) {
ref = new Tag(gitRepository, jgitRef);
} else {
ref = new NamedRef(gitRepository, jgitRef);
}
return (T) ref;
}
}