This is an automated email from the ASF dual-hosted git repository.

rmannibucau pushed a commit to branch 
MSHADE-350_enable-to-rewrite-manifest-with-relocations
in repository https://gitbox.apache.org/repos/asf/maven-shade-plugin.git

commit ff4dd317d5f0de24f7657e36168ad1450f78dcfc
Author: Romain Manni-Bucau <rmannibu...@gmail.com>
AuthorDate: Thu Feb 6 14:54:35 2020 +0100

    MSHADE-350 enable to rewrite the manifest
---
 .../resource/ManifestResourceTransformer.java      |  32 +++++
 .../resource/ManifestResourceTransformerTest.java  | 131 +++++++++++++++++++++
 2 files changed, 163 insertions(+)

diff --git 
a/src/main/java/org/apache/maven/plugins/shade/resource/ManifestResourceTransformer.java
 
b/src/main/java/org/apache/maven/plugins/shade/resource/ManifestResourceTransformer.java
index fd0bf48..a7e2be5 100644
--- 
a/src/main/java/org/apache/maven/plugins/shade/resource/ManifestResourceTransformer.java
+++ 
b/src/main/java/org/apache/maven/plugins/shade/resource/ManifestResourceTransformer.java
@@ -51,6 +51,8 @@ public class ManifestResourceTransformer
     // Fields
     private boolean manifestDiscovered;
 
+    private boolean skipRelocators;
+
     private Manifest manifest;
 
     public boolean canTransformResource( String resource )
@@ -72,10 +74,40 @@ public class ManifestResourceTransformer
         if ( !manifestDiscovered )
         {
             manifest = new Manifest( is );
+
+            if ( relocators != null && !relocators.isEmpty() )
+            {
+                rewriteManifest( relocators );
+            }
+
             manifestDiscovered = true;
         }
     }
 
+    private void rewriteManifest( List<Relocator> relocators )
+    {
+        if ( skipRelocators )
+        {
+            return;
+        }
+        for ( final Map.Entry<Object, Object> entry : 
manifest.getMainAttributes().entrySet() )
+        {
+            final Object value = entry.getValue();
+            if ( value instanceof  String )
+            {
+                String relContent = String.valueOf( value );
+                for ( final Relocator relocator : relocators )
+                {
+                    relContent = relocator.applyToSourceContent( relContent );
+                }
+                if ( !relContent.equals( value ) )
+                {
+                    entry.setValue( relContent );
+                }
+            }
+        }
+    }
+
     public boolean hasTransformedResource()
     {
         return true;
diff --git 
a/src/test/java/org/apache/maven/plugins/shade/resource/ManifestResourceTransformerTest.java
 
b/src/test/java/org/apache/maven/plugins/shade/resource/ManifestResourceTransformerTest.java
new file mode 100644
index 0000000..daa28aa
--- /dev/null
+++ 
b/src/test/java/org/apache/maven/plugins/shade/resource/ManifestResourceTransformerTest.java
@@ -0,0 +1,131 @@
+package org.apache.maven.plugins.shade.resource;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.OutputStream;
+import java.lang.reflect.Field;
+import java.util.Collections;
+import java.util.jar.Attributes;
+import java.util.jar.JarFile;
+import java.util.jar.JarInputStream;
+import java.util.jar.JarOutputStream;
+import java.util.jar.Manifest;
+
+import org.apache.maven.plugins.shade.relocation.Relocator;
+import org.apache.maven.plugins.shade.relocation.SimpleRelocator;
+import org.junit.Test;
+
+public class ManifestResourceTransformerTest
+{
+    @Test
+    public void rewriteManifestEntries() throws Exception
+    {
+        final ManifestResourceTransformer transformer = new 
ManifestResourceTransformer();
+        final Field skipRelocators = 
ManifestResourceTransformer.class.getDeclaredField("skipRelocators");
+        skipRelocators.setAccessible(true);
+        skipRelocators.set(transformer, false);
+
+        final Manifest manifest = new Manifest();
+        final Attributes attributes = manifest.getMainAttributes();
+        attributes.put(Attributes.Name.MANIFEST_VERSION, "1.0");
+        attributes.putValue("Export-Package",
+                
"javax.decorator;version=\"2.0\";uses:=\"javax.enterprise.inject\"," +
+                        
"javax.enterprise.context;version=\"2.0\";uses:=\"javax.enterprise.util,javax.inject\"");
+        attributes.putValue("Import-Package",
+                "javax.el,javax.enterprise.context;version=\"[2.0,3)\"");
+        attributes.putValue("Provide-Capability",
+                "osgi.contract;osgi.contract=JavaCDI;uses:=\"" +
+                        
"javax.enterprise.context,javax.enterprise.context.spi,javax.enterprise.context.control,"
 +
+                        
"javax.enterprise.util,javax.enterprise.inject,javax.enterprise.inject.spi," +
+                        
"javax.enterprise.inject.spi.configurator,javax.enterprise.inject.literal," +
+                        
"javax.enterprise.inject.se,javax.enterprise.event,javax.decorator\";" +
+                        "version:List<Version>=\"2.0,1.2,1.1,1.0\"");
+        attributes.putValue("Require-Capability",
+                "osgi.serviceloader;" +
+                        
"filter:=\"(osgi.serviceloader=javax.enterprise.inject.se.SeContainerInitializer)\";"
 +
+                        "cardinality:=multiple," +
+                        "osgi.serviceloader;" +
+                        
"filter:=\"(osgi.serviceloader=javax.enterprise.inject.spi.CDIProvider)\";" +
+                        "cardinality:=multiple,osgi.extender;" +
+                        
"filter:=\"(osgi.extender=osgi.serviceloader.processor)\"," +
+                        
"osgi.contract;osgi.contract=JavaEL;filter:=\"(&(osgi.contract=JavaEL)(version=2.2.0))\","
 +
+                        "osgi.contract;osgi.contract=JavaInterceptor;" +
+                        
"filter:=\"(&(osgi.contract=JavaInterceptor)(version=1.2.0))\"," +
+                        "osgi.contract;osgi.contract=JavaInject;" +
+                        
"filter:=\"(&(osgi.contract=JavaInject)(version=1.0.0))\"," +
+                        
"osgi.ee;filter:=\"(&(osgi.ee=JavaSE)(version=1.8))\"");
+        final ByteArrayOutputStream mboas = new ByteArrayOutputStream();
+        try (final OutputStream mos = mboas)
+        {
+            manifest.write(mos);
+        }
+        transformer.processResource(
+                JarFile.MANIFEST_NAME,
+                new ByteArrayInputStream(mboas.toByteArray()),
+                Collections.<Relocator>singletonList(new SimpleRelocator(
+                        "javax", "jakarta",
+                        Collections.<String>emptyList(), 
Collections.<String>emptyList())));
+
+        final ByteArrayOutputStream out = new ByteArrayOutputStream();
+        try (final JarOutputStream jarOutputStream = new JarOutputStream(out))
+        {
+            transformer.modifyOutputStream(jarOutputStream);
+        }
+
+        try (final JarInputStream jis = new JarInputStream(new 
ByteArrayInputStream(out.toByteArray())))
+        {
+            final Attributes attrs = jis.getManifest().getMainAttributes();
+            assertEquals(
+                    
"jakarta.decorator;version=\"2.0\";uses:=\"jakarta.enterprise.inject\"," +
+                    
"jakarta.enterprise.context;version=\"2.0\";uses:=\"jakarta.enterprise.util," +
+                    "jakarta.inject\"",
+                    attrs.getValue("Export-Package"));
+            
assertEquals("jakarta.el,jakarta.enterprise.context;version=\"[2.0,3)\"",
+                    attrs.getValue("Import-Package"));
+            assertEquals(
+                    "osgi.contract;osgi.contract=JavaCDI;" +
+                            "uses:=\"jakarta.enterprise.context," +
+                            
"jakarta.enterprise.context.spi,jakarta.enterprise.context.control," +
+                            
"jakarta.enterprise.util,jakarta.enterprise.inject,jakarta.enterprise.inject.spi,"
 +
+                            
"jakarta.enterprise.inject.spi.configurator,jakarta.enterprise.inject.literal," 
+
+                            
"jakarta.enterprise.inject.se,jakarta.enterprise.event," +
+                            
"jakarta.decorator\";version:List<Version>=\"2.0,1.2,1.1,1.0\"",
+                    attrs.getValue("Provide-Capability"));
+            assertEquals(
+                    "osgi.serviceloader;" +
+                            
"filter:=\"(osgi.serviceloader=jakarta.enterprise.inject.se.SeContainerInitializer)\";"
 +
+                            "cardinality:=multiple,osgi.serviceloader;" +
+                            
"filter:=\"(osgi.serviceloader=jakarta.enterprise.inject.spi.CDIProvider)\";" +
+                            "cardinality:=multiple,osgi.extender;" +
+                            
"filter:=\"(osgi.extender=osgi.serviceloader.processor)\"," +
+                            
"osgi.contract;osgi.contract=JavaEL;filter:=\"(&(osgi.contract=JavaEL)(version=2.2.0))\","
 +
+                            "osgi.contract;osgi.contract=JavaInterceptor;" +
+                            
"filter:=\"(&(osgi.contract=JavaInterceptor)(version=1.2.0))\"," +
+                            "osgi.contract;osgi.contract=JavaInject;" +
+                            
"filter:=\"(&(osgi.contract=JavaInject)(version=1.0.0))\"," +
+                            
"osgi.ee;filter:=\"(&(osgi.ee=JavaSE)(version=1.8))\"",
+                    attrs.getValue("Require-Capability"));
+        }
+    }
+}

Reply via email to