public static List convert()

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;
    }