package org.ultramine.bootstrap.maven;
import org.apache.commons.io.FileUtils;
import org.ultramine.bootstrap.deps.IRepository;
import org.ultramine.bootstrap.deps.AbstractDownloadable;
import org.ultramine.bootstrap.exceptions.ApplicationErrorException;
import org.ultramine.bootstrap.util.HashUtil;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ConnectException;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;
import java.util.List;
public class MavenDownloadable extends AbstractDownloadable
{
private final List<IRepository> repositories;
private final MavenDependency dependency;
public MavenDownloadable(List<IRepository> repositories, MavenDependency dependency)
{
this.repositories = repositories;
this.dependency = dependency;
}
@Override
public void download() throws IOException
{
String artifactName = dependency.getArtifactFilename();
File output = new File(outputDir, artifactName);
File checkSumFile = new File(checkSumsDir, artifactName+".sha1");
if(output.isFile() && checkSumFile.isFile())
{
if(HashUtil.sha1Str(output).equals(FileUtils.readFileToString(checkSumFile)))
return;
}
ensureFileWritable(output);
ensureFileWritable(checkSumFile);
String path = dependency.getArtifactPath();
for(IRepository repo : repositories)
if(tryDownload(output, checkSumFile, path, repo))
return;
throw new FileNotFoundException("Maven dependency not found in any repositories: "+dependency);
}
private boolean tryDownload(File output, File checkSumFile, String path, IRepository repo) throws IOException
{
try
{
InputStream resolved = repo.resolve(path);
if(resolved == null)
return false;
System.out.println("Downloading " + dependency.getArtifactName() + " from " + repo + "/" + path);
String computedCheckSum = copyAndDigest(resolved, new FileOutputStream(output));
String loadedCheckSum = repo.resolveCheckSum(path);
if(loadedCheckSum != null && !loadedCheckSum.equals(computedCheckSum))
throw new RuntimeException("CheckSums failed for " + dependency + "("+computedCheckSum + " != " + loadedCheckSum + ")");
FileUtils.writeStringToFile(checkSumFile, computedCheckSum);
return true;
} catch (UnknownHostException e)
{
throw new ApplicationErrorException(e, "error.unavailable.host", e.getMessage());
} catch (SocketTimeoutException | ConnectException e)
{
throw new ApplicationErrorException(e, "error.unavailable.maven", repo.toString());
}
}
@Override
public String toString()
{
return dependency.toString();
}
}