package org.eclipse.buckminster.subversion;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import org.eclipse.buckminster.core.RMContext;
import org.eclipse.buckminster.core.ctype.IComponentType;
import org.eclipse.buckminster.core.resolver.NodeQuery;
import org.eclipse.buckminster.core.rmap.model.Provider;
import org.eclipse.buckminster.core.version.AbstractSCCSVersionFinder;
import org.eclipse.buckminster.core.version.VersionMatch;
import org.eclipse.buckminster.core.version.VersionSelector;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
public abstract class GenericVersionFinder<SVN_ENTRY_TYPE, SVN_REVISION_TYPE> extends AbstractSCCSVersionFinder {
private final ISubversionSession<SVN_ENTRY_TYPE, SVN_REVISION_TYPE> session;
private final ISvnEntryHelper<SVN_ENTRY_TYPE> helper;
public GenericVersionFinder(Provider provider, IComponentType ctype, NodeQuery query) throws CoreException {
super(provider, ctype, query);
session = getSession(provider.getURI(query.getProperties()), null, query.getNumericRevision(), query.getTimestamp(), query.getContext());
helper = session.getSvnEntryHelper();
}
@Override
final public void close() {
session.close();
}
@Override
final protected boolean checkComponentExistence(VersionMatch versionMatch, IProgressMonitor monitor) throws CoreException {
final NodeQuery query = getQuery();
final String uri = getProvider().getURI(query.getProperties());
final VersionSelector branchOrTag = versionMatch.getBranchOrTag();
final long revision = versionMatch.getNumericRevision();
final Date timestamp = versionMatch.getTimestamp();
final RMContext context = query.getContext();
final ISubversionSession<SVN_ENTRY_TYPE, SVN_REVISION_TYPE> checkerSession = getSession(uri, branchOrTag, revision, timestamp, context);
try {
// We list the folder rather then just obtaining the entry since the
// listing
// is cached. It is very likely that we save a call later.
//
final URI url = checkerSession.getSVNUrl();
return checkerSession.listFolder(url, monitor).length > 0;
} finally {
checkerSession.close();
}
}
@Override
final protected List<RevisionEntry> getBranchesOrTags(boolean branches, IProgressMonitor monitor) throws CoreException {
monitor.beginTask(null, 200);
try {
if (!session.hasTrunkStructure())
return Collections.emptyList();
URI url = session.getSVNRootUrl(branches);
SVN_ENTRY_TYPE[] list = session.listFolder(url, monitor);
if (list.length == 0)
return Collections.emptyList();
ArrayList<RevisionEntry> entries = new ArrayList<RevisionEntry>(list.length);
for (SVN_ENTRY_TYPE e : list) {
final String path = helper.getEntryPath(e);
final long revision = helper.getEntryRevisionNumber(e);
entries.add(new RevisionEntry(path, null, revision));
}
return entries;
} finally {
monitor.done();
}
}
/**
* Implemented by subclasses. Used to retrieve a particular a concrete
* session instance.
*
* @param repositoryURI
* @param branchOrTag
* @param revision
* @param timestamp
* @param context
* @return
* @throws CoreException
*/
protected abstract ISubversionSession<SVN_ENTRY_TYPE, SVN_REVISION_TYPE> getSession(String repositoryURI, VersionSelector branchOrTag,
long revision, Date timestamp, RMContext context) throws CoreException;
@Override
final protected RevisionEntry getTrunk(IProgressMonitor monitor) throws CoreException {
SVN_ENTRY_TYPE entry = session.getRootEntry(monitor);
return entry == null ? null : new RevisionEntry(null, null, session.getSvnEntryHelper().getEntryRevisionNumber(entry));
}
}