From 1a9f7d483e716541a32005199d5cfb417e7ff53d Mon Sep 17 00:00:00 2001 From: Josef Cacek Date: Tue, 26 Jan 2021 11:24:21 +0100 Subject: [PATCH] [BACKPORT 3.12.z] Fix the HazelcastManifestTransformer configuration (#18080) --- hazelcast-all/pom.xml | 6 ++ .../hazelcast/it/CheckAllDependenciesIT.java | 6 ++ .../HazelcastManifestTransformer.java | 44 ++++++++----- .../HazelcastManifestTransformerTest.java | 7 +-- hazelcast-client/pom.xml | 1 + .../osgi/ClientCheckDependenciesIT.java | 10 +++ hazelcast/pom.xml | 1 + .../hazelcast/osgi/CheckDependenciesIT.java | 61 +++++++++++++++---- 8 files changed, 105 insertions(+), 31 deletions(-) diff --git a/hazelcast-all/pom.xml b/hazelcast-all/pom.xml index 5ac5e3bb1d07..34382378a390 100755 --- a/hazelcast-all/pom.xml +++ b/hazelcast-all/pom.xml @@ -108,6 +108,12 @@ javax.naming.*;resolution:=optional + + Hazelcast(All) + + + + diff --git a/hazelcast-all/src/test/java/com/hazelcast/it/CheckAllDependenciesIT.java b/hazelcast-all/src/test/java/com/hazelcast/it/CheckAllDependenciesIT.java index 836fafdb2ea5..ef22be597aea 100644 --- a/hazelcast-all/src/test/java/com/hazelcast/it/CheckAllDependenciesIT.java +++ b/hazelcast-all/src/test/java/com/hazelcast/it/CheckAllDependenciesIT.java @@ -24,4 +24,10 @@ public class CheckAllDependenciesIT extends CheckDependenciesIT { protected boolean isMatching(String urlString) { return urlString.contains("hazelcast-all-") && urlString.contains("target"); } + + @Override + protected String getBundleName() { + return "Hazelcast(All)"; + } + } diff --git a/hazelcast-build-utils/src/main/java/com/hazelcast/buildutils/HazelcastManifestTransformer.java b/hazelcast-build-utils/src/main/java/com/hazelcast/buildutils/HazelcastManifestTransformer.java index 921526d3bf80..00603cd09882 100644 --- a/hazelcast-build-utils/src/main/java/com/hazelcast/buildutils/HazelcastManifestTransformer.java +++ b/hazelcast-build-utils/src/main/java/com/hazelcast/buildutils/HazelcastManifestTransformer.java @@ -32,7 +32,6 @@ import java.util.Map; import java.util.Set; import java.util.jar.Attributes; -import java.util.jar.Attributes.Name; import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.jar.JarOutputStream; @@ -62,17 +61,11 @@ public class HazelcastManifestTransformer extends ManifestResourceTransformer { private static final String IMPORT_PACKAGE = "Import-Package"; private static final String EXPORT_PACKAGE = "Export-Package"; - private static final Name AUTOMATIC_MODULE_NAME = new Name("Automatic-Module-Name"); - // configuration - @SuppressFBWarnings(value = "UWF_UNWRITTEN_FIELD", justification = "Filled by Maven") - String mainClass; - - @SuppressFBWarnings(value = "UWF_UNWRITTEN_FIELD", justification = "Filled by Maven") - Map manifestEntries; - - @SuppressFBWarnings(value = "UWF_UNWRITTEN_FIELD", justification = "Filled by Maven") - Map overrideInstructions; + private String mainClass; + private Map manifestEntries; + private Map removeEntries; + private Map overrideInstructions; private final Map importedPackages = new HashMap(); private final Map exportedPackages = new HashMap(); @@ -81,6 +74,26 @@ public class HazelcastManifestTransformer extends ManifestResourceTransformer { private Manifest shadedManifest; + @Override + public void setMainClass(String mainClass) { + this.mainClass = mainClass; + super.setMainClass(mainClass); + } + + @Override + public void setManifestEntries(Map manifestEntries) { + this.manifestEntries = manifestEntries; + super.setManifestEntries(manifestEntries); + } + + public void setOverrideInstructions(Map overrideInstructions) { + this.overrideInstructions = overrideInstructions; + } + + public void setRemoveEntries(Map removeEntries) { + this.removeEntries = removeEntries; + } + @Override public boolean canTransformResource(String resource) { return JarFile.MANIFEST_NAME.equalsIgnoreCase(resource); @@ -193,13 +206,16 @@ public void modifyOutputStream(JarOutputStream jarOutputStream) throws IOExcepti } if (manifestEntries != null) { - for (Map.Entry entry : manifestEntries.entrySet()) { + for (Map.Entry entry : manifestEntries.entrySet()) { attributes.put(new Attributes.Name(entry.getKey()), entry.getValue()); } } - // the Manifest in hazelcast-all uberjar won't have the Automatic-Module-Name - attributes.remove(AUTOMATIC_MODULE_NAME); + if (removeEntries != null) { + for (Map.Entry entry : removeEntries.entrySet()) { + attributes.remove(new Attributes.Name(entry.getKey())); + } + } jarOutputStream.putNextEntry(new JarEntry(JarFile.MANIFEST_NAME)); shadedManifest.write(jarOutputStream); diff --git a/hazelcast-build-utils/src/test/java/com/hazelcast/buildutils/HazelcastManifestTransformerTest.java b/hazelcast-build-utils/src/test/java/com/hazelcast/buildutils/HazelcastManifestTransformerTest.java index 67fc90d61ff4..708b4e63b7dc 100644 --- a/hazelcast-build-utils/src/test/java/com/hazelcast/buildutils/HazelcastManifestTransformerTest.java +++ b/hazelcast-build-utils/src/test/java/com/hazelcast/buildutils/HazelcastManifestTransformerTest.java @@ -31,7 +31,6 @@ import java.io.InputStream; import java.util.Collections; import java.util.HashMap; -import java.util.jar.Attributes; import java.util.jar.JarEntry; import java.util.jar.JarOutputStream; @@ -64,9 +63,9 @@ public void setUp() throws Exception { transformer = new HazelcastManifestTransformer(); - transformer.mainClass = "com.hazelcast.core.server.StartServer"; - transformer.manifestEntries = new HashMap(); - transformer.overrideInstructions = new HashMap(); + transformer.setMainClass("com.hazelcast.core.server.StartServer"); + transformer.setManifestEntries(new HashMap()); + transformer.setOverrideInstructions(new HashMap()); } @After diff --git a/hazelcast-client/pom.xml b/hazelcast-client/pom.xml index 89424c107e31..61ef4ed6683d 100644 --- a/hazelcast-client/pom.xml +++ b/hazelcast-client/pom.xml @@ -102,6 +102,7 @@ com.hazelcast + Hazelcast(Client) diff --git a/hazelcast-client/src/test/java/com/hazelcast/client/osgi/ClientCheckDependenciesIT.java b/hazelcast-client/src/test/java/com/hazelcast/client/osgi/ClientCheckDependenciesIT.java index 8b47beb539c6..64693d1520f4 100644 --- a/hazelcast-client/src/test/java/com/hazelcast/client/osgi/ClientCheckDependenciesIT.java +++ b/hazelcast-client/src/test/java/com/hazelcast/client/osgi/ClientCheckDependenciesIT.java @@ -24,4 +24,14 @@ public class ClientCheckDependenciesIT extends CheckDependenciesIT { protected boolean isMatching(String urlString) { return urlString.contains("hazelcast-client-") && urlString.contains("target"); } + + @Override + protected String getBundleName() { + return "Hazelcast(Client)"; + } + + @Override + protected boolean hasMainClass() { + return false; + } } diff --git a/hazelcast/pom.xml b/hazelcast/pom.xml index 042af4aae5a1..d09fac73eb60 100644 --- a/hazelcast/pom.xml +++ b/hazelcast/pom.xml @@ -142,6 +142,7 @@ org.jruby.embed.jsr223;resolution:=optional, * + Hazelcast(Core) diff --git a/hazelcast/src/test/java/com/hazelcast/osgi/CheckDependenciesIT.java b/hazelcast/src/test/java/com/hazelcast/osgi/CheckDependenciesIT.java index 7fc9b3da1c87..5473ed874554 100644 --- a/hazelcast/src/test/java/com/hazelcast/osgi/CheckDependenciesIT.java +++ b/hazelcast/src/test/java/com/hazelcast/osgi/CheckDependenciesIT.java @@ -16,24 +16,30 @@ package com.hazelcast.osgi; -import com.hazelcast.core.HazelcastInstance; -import com.hazelcast.nio.IOUtil; -import com.hazelcast.test.HazelcastParallelClassRunner; -import com.hazelcast.test.HazelcastTestSupport; -import com.hazelcast.test.annotation.QuickTest; -import org.apache.felix.utils.manifest.Clause; -import org.apache.felix.utils.manifest.Parser; -import org.junit.Test; -import org.junit.experimental.categories.Category; -import org.junit.runner.RunWith; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.fail; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.Enumeration; +import java.util.jar.Attributes; import java.util.jar.Manifest; -import static org.junit.Assert.fail; +import org.apache.felix.utils.manifest.Clause; +import org.apache.felix.utils.manifest.Parser; +import org.junit.Test; +import org.junit.experimental.categories.Category; +import org.junit.runner.RunWith; + +import com.hazelcast.core.HazelcastInstance; +import com.hazelcast.instance.BuildInfoProvider; +import com.hazelcast.nio.IOUtil; +import com.hazelcast.test.HazelcastParallelClassRunner; +import com.hazelcast.test.HazelcastTestSupport; +import com.hazelcast.test.annotation.QuickTest; +import com.hazelcast.util.StringUtil; @RunWith(HazelcastParallelClassRunner.class) @Category(QuickTest.class) @@ -55,10 +61,14 @@ public class CheckDependenciesIT extends HazelcastTestSupport { "javax.security.auth", "javax.transaction.xa", "javax.xml", + "javax.naming", // these 2 XML-related packages are part of the platform since Java SE 6 "org.xml.sax", "org.w3c.dom", + + // GSS-API (& Kerberos) related classes - part of JDK since 1.4 + "org.ietf.jgss" }; @Test @@ -75,7 +85,28 @@ public void testNoMandatoryDependencyDeclared() throws IOException, InterruptedE } } - private Manifest getHazelcastManifest() throws IOException { + /** + * Verify the {@code HazelcastManifestTransformer} was properly used. + */ + @Test + public void verifyManifestEntries() throws IOException { + Manifest mf = getHazelcastManifest(); + Attributes mainAttributes = mf.getMainAttributes(); + assertEquals("Unexpected Bundle-Name attribute value", getBundleName(), mainAttributes.getValue("Bundle-Name")); + if (hasMainClass()) { + assertNotNull("The Main-Class attribute is expected", mainAttributes.getValue("Main-Class")); + } + } + + protected boolean hasMainClass() { + return true; + } + + protected String getBundleName() { + return "Hazelcast(Core)"; + } + + protected Manifest getHazelcastManifest() throws IOException { URL hazelcastAllManifestUrl = findHazelcastManifestURL(); InputStream inputStream = null; try { @@ -133,6 +164,10 @@ protected String[] getWhitelistPrefixes() { } protected boolean isMatching(String urlString) { - return urlString.contains("hazelcast-3.") && urlString.contains("target"); + return urlString.contains("hazelcast-" + getMajorVersion() + ".") && urlString.contains("target"); + } + + protected String getMajorVersion() { + return StringUtil.tokenizeVersionString(BuildInfoProvider.getBuildInfo().getVersion())[0]; } }