+ protected void downloadAndProcessM2Sources(DefaultArtifact artifact, Path targetBundleDir) throws IOException {
+ DefaultArtifact sourcesArtifact = new DefaultArtifact(artifact.toM2Coordinates(), "sources");
+ URL sourcesUrl = MavenConventionsUtils.mavenCentralUrl(sourcesArtifact);
+ Path sourcesDownloaded = download(sourcesUrl, originBase, artifact.toM2Coordinates() + ".sources.jar");
+ processM2SourceJar(sourcesDownloaded, targetBundleDir);
+ logger.log(Level.DEBUG, () -> "Processed " + sourcesDownloaded);
+
+ }
+
+ protected Path processBndJar(Path downloaded, Path targetCategoryBase, Properties fileProps) {
+
+ try {
+ Map<String, String> additionalEntries = new TreeMap<>();
+ boolean doNotModify = Boolean.parseBoolean(fileProps
+ .getOrDefault(ManifestConstants.SLC_ORIGIN_MANIFEST_NOT_MODIFIED.toString(), "false").toString());
+
+ if (doNotModify) {
+ fileEntries: for (Object key : fileProps.keySet()) {
+ if (ManifestConstants.SLC_ORIGIN_M2.toString().equals(key))
+ continue fileEntries;
+ String value = fileProps.getProperty(key.toString());
+ additionalEntries.put(key.toString(), value);
+ }
+ } else {
+
+ try (Analyzer bndAnalyzer = new Analyzer()) {
+ bndAnalyzer.setProperties(fileProps);
+ Jar jar = new Jar(downloaded.toFile());
+ bndAnalyzer.setJar(jar);
+ Manifest manifest = bndAnalyzer.calcManifest();
+
+ keys: for (Object key : manifest.getMainAttributes().keySet()) {
+ Object value = manifest.getMainAttributes().get(key);
+
+ switch (key.toString()) {
+ case "Tool":
+ case "Bnd-LastModified":
+ case "Created-By":
+ continue keys;
+ }
+ additionalEntries.put(key.toString(), value.toString());
+ // logger.log(DEBUG, () -> key + "=" + value);
+
+ }
+ }
+ }
+ Path targetBundleDir = processBundleJar(downloaded, targetCategoryBase, additionalEntries);
+ logger.log(Level.DEBUG, () -> "Processed " + downloaded);
+ return targetBundleDir;
+ } catch (Exception e) {
+ throw new RuntimeException("Cannot BND process " + downloaded, e);
+ }
+
+ }
+