look for local cache first when running onos-lib-gen

Change-Id: I7dc6cef377154a87d43a18307398cad61d8e2e21
This commit is contained in:
Yuta HIGUCHI 2017-08-18 12:02:18 -07:00 committed by Yuta HIGUCHI
parent a2c7c20553
commit e278ccc8ef

View File

@ -28,6 +28,8 @@ import java.io.InputStream;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.time.Instant;
@ -36,6 +38,8 @@ import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Stream;
/**
* Generates a BUCK file from a JSON file containing third-party library
@ -103,7 +107,7 @@ public class BuckLibGenerator {
System.out.flush();
BuckArtifact buckArtifact;
if (uri.startsWith("http")) {
String sha = getHttpSha(uri);
String sha = getHttpSha(name, uri);
buckArtifact = BuckArtifact.getArtifact(name, uri, sha);
} else if (uri.startsWith("mvn")) {
uri = uri.replaceFirst("mvn:", "");
@ -198,16 +202,49 @@ public class BuckLibGenerator {
}
}
String getHttpSha(String url) {
//TODO look in buck-out/gen first
String getHttpSha(String name, String urlStr) {
//FIXME need http download cache
try {
URLConnection connection = new URL(url).openConnection();
MessageDigest md = MessageDigest.getInstance("SHA-1");
byte[] buffer = new byte[8192];
URL url = new URL(urlStr);
String fname = new File(url.getPath()).getName();
// naively look for cache in buck-out/gen/
// only works for `buck fetch`-ed artifacts
// (=doesn't work for bndexe unless manually fetched)
Optional<File> cache = Optional.ofNullable(System.getenv("ONOS_ROOT"))
.map(Paths::get)
.map(Stream::of)
.orElseGet(Stream::empty)
// look for remote_file, remote_jar path
.flatMap(root -> Stream.of(root.resolve("buck-out/gen/lib/" + name + "/" + fname),
root.resolve("buck-out/gen/lib/" + fname + "/" + fname)))
.map(Path::toFile)
.filter(File::canRead)
.findAny();
if (cache.isPresent()) {
try (FileInputStream stream = new FileInputStream(cache.get())) {
int read;
while ((read = stream.read(buffer)) >= 0) {
md.update(buffer, 0, read);
}
StringBuilder result = new StringBuilder();
byte[] digest = md.digest();
for (byte b : digest) {
result.append(String.format("%02x", b));
}
return result.toString();
} catch (IOException e) {
// fall back to regular download
}
}
URLConnection connection = url.openConnection();
connection.connect();
InputStream stream = connection.getInputStream();
MessageDigest md = MessageDigest.getInstance("SHA-1");
byte[] buffer = new byte[8192];
int read;
while ((read = stream.read(buffer)) >= 0) {
md.update(buffer, 0, read);