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/05/20 18:13:48 UTC

[maven-shade-plugin] 01/01: Improve and simplify ServicesResourceTransformer

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

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

commit 2597724283ae09806d5f91639c4cf6caad6af196
Author: Tamas Cservenak <ta...@cservenak.net>
AuthorDate: Thu May 20 20:11:45 2021 +0200

    Improve and simplify ServicesResourceTransformer
    
    Payback time: As ServicesResourceTransformer did "inspire"
    SisuIndexResourceTransformer, and the latter with elharo
    help came out rather nice, I think it is "payback
    time" and improve similarly the original inspiration as well.
---
 .../resource/ServicesResourceTransformer.java      | 81 ++++------------------
 1 file changed, 15 insertions(+), 66 deletions(-)

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 );
-        }
-
     }
-
 }