You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by cs...@apache.org on 2021/08/09 13:45:51 UTC

[maven-shade-plugin] branch master updated: [MSHADE-401] Improve ServiceResourceTransformer

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

cstamas pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-shade-plugin.git


The following commit(s) were added to refs/heads/master by this push:
     new c18d3d3  [MSHADE-401] Improve ServiceResourceTransformer
c18d3d3 is described below

commit c18d3d3e36f4d37aba98a18983bd4e56eba79327
Author: Tamas Cservenak <ta...@cservenak.net>
AuthorDate: Mon Aug 9 15:44:23 2021 +0200

    [MSHADE-401] Improve ServiceResourceTransformer
    
    Changes:
    - radically simplify ServiceResourceTransformer
    - fix MavenJDOMWriter to be consistent (do not mix) line endings in XML
---
 .../maven/plugins/shade/pom/MavenJDOMWriter.java   | 18 +++--
 .../resource/ServicesResourceTransformer.java      | 81 ++++------------------
 .../resource/ServiceResourceTransformerTest.java   | 11 +--
 3 files changed, 33 insertions(+), 77 deletions(-)

diff --git a/src/main/java/org/apache/maven/plugins/shade/pom/MavenJDOMWriter.java b/src/main/java/org/apache/maven/plugins/shade/pom/MavenJDOMWriter.java
index f712eb0..20ce9e5 100644
--- a/src/main/java/org/apache/maven/plugins/shade/pom/MavenJDOMWriter.java
+++ b/src/main/java/org/apache/maven/plugins/shade/pom/MavenJDOMWriter.java
@@ -29,6 +29,7 @@ import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 
 import org.apache.maven.model.ActivationFile;
 import org.apache.maven.model.ActivationOS;
@@ -90,17 +91,22 @@ public class MavenJDOMWriter
     /**
      * Field factory
      */
-    private DefaultJDOMFactory factory;
+    private final DefaultJDOMFactory factory;
 
     /**
      * Field lineSeparator
      */
-    private String lineSeparator;
+    private final String lineSeparator;
 
     public MavenJDOMWriter()
     {
-        factory = new DefaultJDOMFactory();
-        lineSeparator = "\n";
+        this( "\n" );
+    }
+
+    public MavenJDOMWriter( final String lineSeparator )
+    {
+        this.factory = new DefaultJDOMFactory();
+        this.lineSeparator = Objects.requireNonNull( lineSeparator );
     }
 
     /**
@@ -2126,7 +2132,7 @@ public class MavenJDOMWriter
         updateModel( project, "project", new Counter( 0 ), document.getRootElement() );
         XMLOutputter outputter = new XMLOutputter();
         Format format = Format.getPrettyFormat();
-        format.setIndent( "    " ).setLineSeparator( System.getProperty( "line.separator" ) );
+        format.setIndent( "    " ).setLineSeparator( lineSeparator );
         outputter.setFormat( format );
         outputter.output( document, stream );
     }
@@ -2143,7 +2149,7 @@ public class MavenJDOMWriter
         throws IOException
     {
         Format format = Format.getRawFormat();
-        format.setEncoding( writer.getEncoding() ).setLineSeparator( System.getProperty( "line.separator" ) );
+        format.setEncoding( writer.getEncoding() ).setLineSeparator( lineSeparator );
         write( project, document, writer, format );
     }
 
diff --git a/src/main/java/org/apache/maven/plugins/shade/resource/ServicesResourceTransformer.java b/src/main/java/org/apache/maven/plugins/shade/resource/ServicesResourceTransformer.java
index b2f5dd6..1edc153 100644
--- a/src/main/java/org/apache/maven/plugins/shade/resource/ServicesResourceTransformer.java
+++ b/src/main/java/org/apache/maven/plugins/shade/resource/ServicesResourceTransformer.java
@@ -19,19 +19,14 @@ package org.apache.maven.plugins.shade.resource;
  * under the License.
  */
 
-import java.io.BufferedReader;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
-import java.io.StringReader;
-import java.io.Writer;
 import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Scanner;
 import java.util.jar.JarEntry;
 import java.util.jar.JarOutputStream;
 
@@ -51,7 +46,7 @@ public class ServicesResourceTransformer
 
     private static final String SERVICES_PATH = "META-INF/services";
 
-    private Map<String, ServiceStream> serviceEntries = new HashMap<>();
+    private final Map<String, ArrayList<String>> serviceEntries = new HashMap<>();
 
     private List<Relocator> relocators;
 
@@ -65,20 +60,17 @@ public class ServicesResourceTransformer
     public void processResource( String resource, InputStream is, final List<Relocator> relocators, long time )
         throws IOException
     {
-        ServiceStream out = serviceEntries.get( resource );
+        ArrayList<String> out = serviceEntries.get( resource );
         if ( out == null )
         {
-            out = new ServiceStream();
+            out = new ArrayList<>();
             serviceEntries.put( resource, out );
         }
 
-        final String content = IOUtils.toString( is, StandardCharsets.UTF_8 );
-        StringReader reader = new StringReader( content );
-        BufferedReader lineReader = new BufferedReader( reader );
-        String line;
-        while ( ( line = lineReader.readLine() ) != null )
+        Scanner scanner = new Scanner( is, StandardCharsets.UTF_8.name() );
+        while ( scanner.hasNextLine() )
         {
-            String relContent = line;
+            String relContent = scanner.nextLine();
             for ( Relocator relocator : relocators )
             {
                 if ( relocator.canRelocateClass( relContent ) )
@@ -86,7 +78,7 @@ public class ServicesResourceTransformer
                     relContent = relocator.applyToSourceContent( relContent );
                 }
             }
-            out.append( relContent + "\n" );
+            out.add( relContent );
         }
 
         if ( this.relocators == null )
@@ -102,16 +94,16 @@ public class ServicesResourceTransformer
 
     public boolean hasTransformedResource()
     {
-        return serviceEntries.size() > 0;
+        return !serviceEntries.isEmpty();
     }
 
     public void modifyOutputStream( JarOutputStream jos )
         throws IOException
     {
-        for ( Map.Entry<String, ServiceStream> entry : serviceEntries.entrySet() )
+        for ( Map.Entry<String, ArrayList<String>> entry : serviceEntries.entrySet() )
         {
             String key = entry.getKey();
-            ServiceStream data = entry.getValue();
+            ArrayList<String> data = entry.getValue();
 
             if ( relocators != null )
             {
@@ -132,52 +124,9 @@ public class ServicesResourceTransformer
             jarEntry.setTime( time );
             jos.putNextEntry( jarEntry );
 
-
-            // read the content of service file for candidate classes for relocation.
-            // Specification requires that this file is encoded in UTF-8.
-            Writer writer = new OutputStreamWriter( jos, StandardCharsets.UTF_8 );
-            InputStreamReader streamReader = new InputStreamReader( data.toInputStream() );
-            BufferedReader reader = new BufferedReader( streamReader );
-            String className;
-
-            while ( ( className = reader.readLine() ) != null )
-            {
-                writer.write( className );
-                writer.write( System.lineSeparator() );
-                writer.flush();
-            }
-
-            reader.close();
-            data.reset();
-        }
-    }
-
-    static class ServiceStream
-        extends ByteArrayOutputStream
-    {
-
-        ServiceStream()
-        {
-            super( 1024 );
+            IOUtils.writeLines( data, "\n", jos, StandardCharsets.UTF_8 );
+            jos.flush();
+            data.clear();
         }
-
-        public void append( String content )
-            throws IOException
-        {
-            if ( count > 0 && buf[count - 1] != '\n' && buf[count - 1] != '\r' )
-            {
-                write( '\n' );
-            }
-
-            byte[] contentBytes = content.getBytes( StandardCharsets.UTF_8 );
-            this.write( contentBytes );
-        }
-
-        public InputStream toInputStream()
-        {
-            return new ByteArrayInputStream( buf, 0, count );
-        }
-
     }
-
 }
diff --git a/src/test/java/org/apache/maven/plugins/shade/resource/ServiceResourceTransformerTest.java b/src/test/java/org/apache/maven/plugins/shade/resource/ServiceResourceTransformerTest.java
index b87252c..8c3dd85 100644
--- a/src/test/java/org/apache/maven/plugins/shade/resource/ServiceResourceTransformerTest.java
+++ b/src/test/java/org/apache/maven/plugins/shade/resource/ServiceResourceTransformerTest.java
@@ -44,7 +44,8 @@ import org.junit.Test;
  * Test for handling META-INF/service/...
  */
 public class ServiceResourceTransformerTest {
-    
+    private final String NEWLINE = "\n";
+
     private List<Relocator> relocators = new ArrayList<Relocator>();
 
     @Test
@@ -75,8 +76,8 @@ public class ServiceResourceTransformerTest {
             assertNotNull( jarEntry );
             try ( InputStream entryStream = jarFile.getInputStream( jarEntry ) ) {
                 String xformedContent = IOUtils.toString( entryStream, "utf-8" );
-                assertEquals( "borg.foo.Service" + System.getProperty( "line.separator" )
-                    + "org.foo.exclude.OtherService" + System.getProperty( "line.separator" ), xformedContent );
+                assertEquals( "borg.foo.Service" + NEWLINE
+                    + "org.foo.exclude.OtherService" + NEWLINE, xformedContent );
             } finally {
                 jarFile.close();
             }
@@ -111,8 +112,8 @@ public class ServiceResourceTransformerTest {
             JarEntry jarEntry = jarFile.getJarEntry( contentResource );
             assertNotNull( jarEntry );
             try ( InputStream entryStream = jarFile.getInputStream( jarEntry ) ) {
-                String xformedContent = IOUtils.toString(entryStream, "utf-8");
-                assertEquals( "org.eclipse1234.osgi.launch.EquinoxFactory" + System.getProperty( "line.separator" ), xformedContent );
+                String xformedContent = IOUtils.toString(entryStream, StandardCharsets.UTF_8);
+                assertEquals( "org.eclipse1234.osgi.launch.EquinoxFactory" + NEWLINE, xformedContent );
             } finally {
                 jarFile.close();
             }