package org.eclipse.buckminster.git.internal;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Map;
import org.eclipse.buckminster.core.reader.AbstractCatalogReader;
import org.eclipse.buckminster.core.reader.IReaderType;
import org.eclipse.buckminster.core.reader.IStreamConsumer;
import org.eclipse.buckminster.core.rmap.model.Provider;
import org.eclipse.buckminster.core.version.ProviderMatch;
import org.eclipse.buckminster.core.version.VersionMatch;
import org.eclipse.buckminster.runtime.BuckminsterException;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jgit.lib.ObjectLoader;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.treewalk.TreeWalk;
public class GitReader extends AbstractCatalogReader {
private final RepositoryAccess repoAccess;
protected GitReader(IReaderType readerType, ProviderMatch providerMatch) throws CoreException {
super(readerType, providerMatch);
Provider provider = providerMatch.getProvider();
@SuppressWarnings("unchecked")
Map<String, String> props = (Map<String, String>) provider.getProperties(providerMatch.getNodeQuery().getProperties());
repoAccess = new RepositoryAccess(provider.getURI(props), props);
}
@Override
public File getLocation() throws CoreException {
return repoAccess.getLocation(getProviderMatch().getVersionMatch());
}
@Override
protected boolean innerExists(String fileName, IProgressMonitor monitor) throws CoreException {
synchronized (repoAccess.getRepositoryPath()) {
TreeWalk walk = repoAccess.getTreeWalk(getProviderMatch().getVersionMatch(), fileName, monitor);
try {
return walk.next();
} catch (IOException e) {
throw BuckminsterException.wrap(e);
} finally {
walk.close();
}
}
}
@Override
public void innerMaterialize(IPath destination, IProgressMonitor monitor) throws CoreException {
File location = getLocation();
try {
location = location.getCanonicalFile();
} catch (IOException e) {
}
File destFile = destination.toFile();
try {
destFile = destFile.getCanonicalFile();
} catch (IOException e) {
}
if (!location.equals(destFile))
throw new UnsupportedOperationException(Messages.git_reader_can_not_materialize);
}
@Override
protected <T> T innerReadFile(String fileName, IStreamConsumer<T> consumer, IProgressMonitor monitor) throws CoreException, IOException {
synchronized (repoAccess.getRepositoryPath()) {
VersionMatch vm = getProviderMatch().getVersionMatch();
TreeWalk walk = repoAccess.getTreeWalk(vm, fileName, monitor);
try {
if (!walk.next())
throw new FileNotFoundException(fileName);
Repository repo = repoAccess.getRepository(vm, monitor);
ObjectLoader ol = repo.open(walk.getObjectId(0));
byte[] bytes = ol.getBytes();
return consumer.consumeStream(this, fileName, new ByteArrayInputStream(bytes), monitor);
} finally {
walk.close();
}
}
}
@Override
public boolean isFileSystemReader() {
return true;
}
}