in src/main/java/org/apache/sling/feature/extension/unpack/impl/converter/Converter.java [107:159]
public static List<String> convert(ArtifactId featureId, String extensionName, File featureFile, File repository, Predicate<InputStream> filter, List<String> urls) throws Exception {
Feature feature = new Feature(featureId);
List<String> unhandled = new ArrayList<>();
Extension extension = new Extension(ExtensionType.ARTIFACTS, extensionName, ExtensionState.OPTIONAL);
for (String urlString : urls) {
MessageDigest md = MessageDigest.getInstance("SHA-512");
HttpRequestRetryStrategy rs = new DefaultHttpRequestRetryStrategy(10, TimeValue.ofSeconds(1)) {
@Override
protected boolean handleAsIdempotent(HttpRequest request) {
md.reset(); // Reset message digest on retry
return super.handleAsIdempotent(request);
}
};
File tmp = File.createTempFile("unpack", ".zip");
try (CloseableHttpClient httpClient = HttpClients.custom().setRetryStrategy(rs).build()) {
HttpGet httpGet = new HttpGet(urlString);
try (CloseableHttpResponse res = httpClient.execute(httpGet)) {
HttpEntity entity = res.getEntity();
try (DigestInputStream inputStream = new DigestInputStream(entity.getContent(), md)) {
Files.copy(inputStream, tmp.toPath(), StandardCopyOption.REPLACE_EXISTING);
String digest = bytesToHex(inputStream.getMessageDigest().digest());
if (filter.test(new FileInputStream(tmp))){
Artifact artifact = new Artifact(new ArtifactId(featureId.getGroupId(), featureId.getArtifactId(), featureId.getVersion(), (featureId.getClassifier() != null ? featureId.getClassifier() + "-" : "" ) + digest, "zip"));
extension.getArtifacts().add(artifact);
File target = new File(repository, artifact.getId().toMvnPath());
if (!target.getParentFile().isDirectory() && !target.getParentFile().mkdirs()) {
throw new IOException("Unable to create parent dir: " + target.getParentFile());
}
Files.move(tmp.toPath(), target.toPath(), StandardCopyOption.REPLACE_EXISTING);
} else {
unhandled.add(urlString);
}
}
}
} finally {
tmp.delete();
}
}
feature.getExtensions().add(extension);
try (Writer writer = new OutputStreamWriter(new FileOutputStream(featureFile), StandardCharsets.UTF_8)) {
FeatureJSONWriter.write(writer, feature);
}
return unhandled;
}