From 09077e4ece9ea6d8e0b442084a80103bd5733b4b Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Thu, 20 Jun 2024 17:37:35 +0200 Subject: [PATCH] Keep Require-Capability headers --- src/org/argeo/build/Repackage.java | 141 ++++++++++++++++------------- 1 file changed, 76 insertions(+), 65 deletions(-) diff --git a/src/org/argeo/build/Repackage.java b/src/org/argeo/build/Repackage.java index 02158ad..ee5072c 100644 --- a/src/org/argeo/build/Repackage.java +++ b/src/org/argeo/build/Repackage.java @@ -23,6 +23,7 @@ import static org.argeo.build.Repackage.ManifestHeader.BUNDLE_VERSION; import static org.argeo.build.Repackage.ManifestHeader.ECLIPSE_SOURCE_BUNDLE; import static org.argeo.build.Repackage.ManifestHeader.EXPORT_PACKAGE; import static org.argeo.build.Repackage.ManifestHeader.IMPORT_PACKAGE; +import static org.argeo.build.Repackage.ManifestHeader.REQUIRE_CAPABILITY; //import static org.argeo.build.Repackage.ManifestHeader.REQUIRE_BUNDLE; import static org.argeo.build.Repackage.ManifestHeader.SPDX_LICENSE_IDENTIFIER; @@ -149,6 +150,8 @@ public class Repackage { EXPORT_PACKAGE("Export-Package"), // /** OSGi imported packages list. */ IMPORT_PACKAGE("Import-Package"), // + /** Require capability. */ + REQUIRE_CAPABILITY("Require-Capability"), // // /** OSGi required bundles. */ // REQUIRE_BUNDLE("Require-Bundle"), // // /** OSGi path to embedded jar. */ @@ -333,19 +336,22 @@ public class Repackage { void processCategory(Path categoryRelativePath) { try { Path targetCategoryBase = descriptorsBase.resolve(categoryRelativePath); - DirectoryStream bnds = Files.newDirectoryStream(targetCategoryBase, + try (DirectoryStream bnds = Files.newDirectoryStream(targetCategoryBase, (p) -> p.getFileName().toString().endsWith(".bnd") && !p.getFileName().toString().equals(COMMON_BND) - && !p.getFileName().toString().equals(MERGE_BND)); - for (Path p : bnds) { - processSingleM2ArtifactDistributionUnit(p); + && !p.getFileName().toString().equals(MERGE_BND))) { + for (Path p : bnds) { + processSingleM2ArtifactDistributionUnit(p); + } } - DirectoryStream dus = Files.newDirectoryStream(targetCategoryBase, (p) -> Files.isDirectory(p)); - for (Path duDir : dus) { - if (duDir.getFileName().toString().startsWith("eclipse-")) { - processEclipseArchive(duDir); - } else { - processM2BasedDistributionUnit(duDir); + try (DirectoryStream dus = Files.newDirectoryStream(targetCategoryBase, + (p) -> Files.isDirectory(p))) { + for (Path duDir : dus) { + if (duDir.getFileName().toString().startsWith("eclipse-")) { + processEclipseArchive(duDir); + } else { + processM2BasedDistributionUnit(duDir); + } } } } catch (IOException e) { @@ -430,57 +436,59 @@ public class Repackage { } m2Version = m2Version.substring(1); - DirectoryStream ds = Files.newDirectoryStream(duDir, + try (DirectoryStream ds = Files.newDirectoryStream(duDir, (p) -> p.getFileName().toString().endsWith(".bnd") && !p.getFileName().toString().equals(COMMON_BND) - && !p.getFileName().toString().equals(MERGE_BND)); - for (Path p : ds) { - Properties fileProps = new Properties(); - try (InputStream in = Files.newInputStream(p)) { - fileProps.load(in); - } - String m2Coordinates = fileProps.getProperty(ARGEO_ORIGIN_M2.toString()); - M2Artifact artifact = new M2Artifact(m2Coordinates); - if (artifact.getVersion() == null) { - artifact.setVersion(m2Version); - } else { - logger.log(DEBUG, p.getFileName() + " : Using version " + artifact.getVersion() - + " specified in descriptor rather than " + m2Version + " specified in " + COMMON_BND); - } - - // prepare manifest entries - Properties mergedProps = new Properties(); - mergedProps.putAll(commonProps); + && !p.getFileName().toString().equals(MERGE_BND))) { + for (Path p : ds) { + Properties fileProps = new Properties(); + try (InputStream in = Files.newInputStream(p)) { + fileProps.load(in); + } + String m2Coordinates = fileProps.getProperty(ARGEO_ORIGIN_M2.toString()); + M2Artifact artifact = new M2Artifact(m2Coordinates); + if (artifact.getVersion() == null) { + artifact.setVersion(m2Version); + } else { + logger.log(DEBUG, p.getFileName() + " : Using version " + artifact.getVersion() + + " specified in descriptor rather than " + m2Version + " specified in " + COMMON_BND); + } - fileEntries: for (Object key : fileProps.keySet()) { - if (ARGEO_ORIGIN_M2.toString().equals(key)) - continue fileEntries; - String value = fileProps.getProperty(key.toString()); - Object previousValue = mergedProps.put(key.toString(), value); - if (previousValue != null) { - logger.log(WARNING, - commonBnd + ": " + key + " was " + previousValue + ", overridden with " + value); + // prepare manifest entries + Properties mergedProps = new Properties(); + mergedProps.putAll(commonProps); + + fileEntries: for (Object key : fileProps.keySet()) { + if (ARGEO_ORIGIN_M2.toString().equals(key)) + continue fileEntries; + String value = fileProps.getProperty(key.toString()); + Object previousValue = mergedProps.put(key.toString(), value); + if (previousValue != null) { + logger.log(WARNING, + commonBnd + ": " + key + " was " + previousValue + ", overridden with " + value); + } + } + mergedProps.put(ARGEO_ORIGIN_M2.toString(), artifact.toM2Coordinates()); + if (!mergedProps.containsKey(BUNDLE_SYMBOLICNAME.toString())) { + // use file name as symbolic name + String symbolicName = p.getFileName().toString(); + symbolicName = symbolicName.substring(0, symbolicName.length() - ".bnd".length()); + mergedProps.put(BUNDLE_SYMBOLICNAME.toString(), symbolicName); } - } - mergedProps.put(ARGEO_ORIGIN_M2.toString(), artifact.toM2Coordinates()); - if (!mergedProps.containsKey(BUNDLE_SYMBOLICNAME.toString())) { - // use file name as symbolic name - String symbolicName = p.getFileName().toString(); - symbolicName = symbolicName.substring(0, symbolicName.length() - ".bnd".length()); - mergedProps.put(BUNDLE_SYMBOLICNAME.toString(), symbolicName); - } - // download - Path downloaded = downloadMaven(mergedProps, artifact); + // download + Path downloaded = downloadMaven(mergedProps, artifact); - boolean doNotModify = Boolean.parseBoolean( - mergedProps.getOrDefault(ARGEO_ORIGIN_DO_NOT_MODIFY.toString(), "false").toString()); - if (doNotModify) { - processNotModified(targetCategoryBase, downloaded, mergedProps, artifact); - } else { - A2Origin origin = new A2Origin(); - Path targetBundleDir = processBndJar(downloaded, targetCategoryBase, mergedProps, artifact, origin); - downloadAndProcessM2Sources(mergedProps, artifact, targetBundleDir, false, false); - createJar(targetBundleDir, origin); + boolean doNotModify = Boolean.parseBoolean( + mergedProps.getOrDefault(ARGEO_ORIGIN_DO_NOT_MODIFY.toString(), "false").toString()); + if (doNotModify) { + processNotModified(targetCategoryBase, downloaded, mergedProps, artifact); + } else { + A2Origin origin = new A2Origin(); + Path targetBundleDir = processBndJar(downloaded, targetCategoryBase, mergedProps, artifact, + origin); + downloadAndProcessM2Sources(mergedProps, artifact, targetBundleDir, false, false); + createJar(targetBundleDir, origin); + } } } } catch (IOException e) { @@ -658,7 +666,7 @@ public class Repackage { case "Created-By": continue keys; } - if ("Require-Capability".equals(key.toString()) + if (REQUIRE_CAPABILITY.toString().equals(key.toString()) && value.toString().equals("osgi.ee;filter:=\"(&(osgi.ee=JavaSE)(version=1.1))\"")) { origin.deleted.add("MANIFEST header " + key); continue keys;// hack for very old classes @@ -732,7 +740,7 @@ public class Repackage { case "Created-By": continue keys; } - if ("Require-Capability".equals(key.toString()) + if (REQUIRE_CAPABILITY.toString().equals(key.toString()) && value.toString().equals("osgi.ee;filter:=\"(&(osgi.ee=JavaSE)(version=1.1))\"")) { origin.deleted.add("MANIFEST header " + key); continue keys;// !! hack for very old classes @@ -957,12 +965,13 @@ public class Repackage { } }); - DirectoryStream dirs = Files.newDirectoryStream(targetCategoryBase, (p) -> Files.isDirectory(p) - && p.getFileName().toString().indexOf('.') >= 0 && !p.getFileName().toString().endsWith(".src")); - for (Path bundleDir : dirs) { - A2Origin origin = origins.get(bundleDir); - Objects.requireNonNull(origin, "No A2 origin found for " + bundleDir); - createJar(bundleDir, origin); + try (DirectoryStream dirs = Files.newDirectoryStream(targetCategoryBase, (p) -> Files.isDirectory(p) + && p.getFileName().toString().indexOf('.') >= 0 && !p.getFileName().toString().endsWith(".src"))) { + for (Path bundleDir : dirs) { + A2Origin origin = origins.get(bundleDir); + Objects.requireNonNull(origin, "No A2 origin found for " + bundleDir); + createJar(bundleDir, origin); + } } } catch (IOException e) { throw new RuntimeException("Cannot process " + duDir, e); @@ -1190,6 +1199,8 @@ public class Repackage { if (wasDifferent) { if (SPDX_LICENSE_IDENTIFIER.toString().equals(key) && previousValue != null) keepPrevious = true; + if (REQUIRE_CAPABILITY.toString().equals(key) && previousValue != null) + keepPrevious = true; else if (BUNDLE_VERSION.toString().equals(key) && wasDifferent) if (previousValue.equals(value + ".0")) // typically a Maven first release keepPrevious = true; @@ -1216,7 +1227,7 @@ public class Repackage { } // !! hack to remove unresolvable - if (key.equals("Provide-Capability") || key.equals("Require-Capability")) + if (key.equals("Provide-Capability") || key.equals(REQUIRE_CAPABILITY.toString())) if (nameVersion.getName().equals("osgi.core") || nameVersion.getName().equals("osgi.cmpn")) { manifest.getMainAttributes().remove(key); origin.deleted.add("MANIFEST header " + key); -- 2.39.2