Author: krosenvold
Date: Thu Nov 12 09:24:06 2015
New Revision: 1713986

URL: http://svn.apache.org/viewvc?rev=1713986&view=rev
Log:
Fixed shoddy handling of closing streams upon errors, might be cause of 
MSHADE-171

Modified:
    
maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java

Modified: 
maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java
URL: 
http://svn.apache.org/viewvc/maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java?rev=1713986&r1=1713985&r2=1713986&view=diff
==============================================================================
--- 
maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java
 (original)
+++ 
maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java
 Thu Nov 12 09:24:06 2015
@@ -19,6 +19,23 @@ package org.apache.maven.plugins.shade;
  * under the License.
  */
 
+import com.google.common.base.Joiner;
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.Multimap;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugins.shade.filter.Filter;
+import org.apache.maven.plugins.shade.relocation.Relocator;
+import org.apache.maven.plugins.shade.resource.ManifestResourceTransformer;
+import org.apache.maven.plugins.shade.resource.ResourceTransformer;
+import org.codehaus.plexus.component.annotations.Component;
+import org.codehaus.plexus.logging.AbstractLogEnabled;
+import org.codehaus.plexus.util.IOUtil;
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.commons.Remapper;
+import org.objectweb.asm.commons.RemappingClassAdapter;
+
 import java.io.BufferedOutputStream;
 import java.io.File;
 import java.io.FileOutputStream;
@@ -41,24 +58,6 @@ import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.zip.ZipException;
 
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugins.shade.filter.Filter;
-import org.apache.maven.plugins.shade.relocation.Relocator;
-import org.apache.maven.plugins.shade.resource.ManifestResourceTransformer;
-import org.apache.maven.plugins.shade.resource.ResourceTransformer;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.logging.AbstractLogEnabled;
-import org.codehaus.plexus.util.IOUtil;
-import org.objectweb.asm.ClassReader;
-import org.objectweb.asm.ClassVisitor;
-import org.objectweb.asm.ClassWriter;
-import org.objectweb.asm.commons.Remapper;
-import org.objectweb.asm.commons.RemappingClassAdapter;
-
-import com.google.common.base.Joiner;
-import com.google.common.collect.HashMultimap;
-import com.google.common.collect.Multimap;
-
 /**
  * @author Jason van Zyl
  */
@@ -89,16 +88,69 @@ public class DefaultShader
         RelocatorRemapper remapper = new RelocatorRemapper( 
shadeRequest.getRelocators() );
 
         // noinspection ResultOfMethodCallIgnored
-        shadeRequest.getUberJar().getParentFile().mkdirs();
+        shadeRequest.getUberJar()
+                    .getParentFile()
+                    .mkdirs();
         FileOutputStream fileOutputStream = new FileOutputStream( 
shadeRequest.getUberJar() );
         JarOutputStream jos = new JarOutputStream( new BufferedOutputStream( 
fileOutputStream ) );
 
-        goThroughAllJarEntriesForManifestTransformer( shadeRequest, resources, 
manifestTransformer, jos );
+        try
+        {
+
+            goThroughAllJarEntriesForManifestTransformer( shadeRequest, 
resources, manifestTransformer, jos );
+
+            // CHECKSTYLE_OFF: MagicNumber
+            Multimap<String, File> duplicates = HashMultimap.create( 10000, 3 
);
+            // CHECKSTYLE_ON: MagicNumber
+
+            shadeJars( shadeRequest, resources, transformers, remapper, jos, 
duplicates );
+
+            // CHECKSTYLE_OFF: MagicNumber
+            Multimap<Collection<File>, String> overlapping = 
HashMultimap.create( 20, 15 );
+            // CHECKSTYLE_ON: MagicNumber
+
+            for ( String clazz : duplicates.keySet() )
+            {
+                Collection<File> jarz = duplicates.get( clazz );
+                if ( jarz.size() > 1 )
+                {
+                    overlapping.put( jarz, clazz );
+                }
+            }
+
+            // Log a summary of duplicates
+            logSummaryOfDuplicates( overlapping );
+
+            if ( overlapping.keySet()
+                            .size() > 0 )
+            {
+                showOverlappingWarning();
+            }
 
-        // CHECKSTYLE_OFF: MagicNumber
-        Multimap<String, File> duplicates = HashMultimap.create( 10000, 3 );
-        // CHECKSTYLE_ON: MagicNumber
+            for ( ResourceTransformer transformer : transformers )
+            {
+                if ( transformer.hasTransformedResource() )
+                {
+                    transformer.modifyOutputStream( jos );
+                }
+            }
 
+        }
+        finally
+        {
+            IOUtil.close( jos );
+        }
+
+        for ( Filter filter : shadeRequest.getFilters() )
+        {
+            filter.finished();
+        }
+    }
+
+    private void shadeJars( ShadeRequest shadeRequest, Set<String> resources, 
List<ResourceTransformer> transformers,
+                            RelocatorRemapper remapper, JarOutputStream jos, 
Multimap<String, File> duplicates )
+        throws IOException, MojoExecutionException
+    {
         for ( File jar : shadeRequest.getJars() )
         {
 
@@ -108,107 +160,95 @@ public class DefaultShader
 
             JarFile jarFile = newJarFile( jar );
 
-            for ( Enumeration<JarEntry> j = jarFile.entries(); 
j.hasMoreElements(); )
+            try
             {
-                JarEntry entry = j.nextElement();
-
-                String name = entry.getName();
-
-                if ( "META-INF/INDEX.LIST".equals( name ) )
-                {
-                    // we cannot allow the jar indexes to be copied over or the
-                    // jar is useless. Ideally, we could create a new one
-                    // later
-                    continue;
-                }
 
-                if ( !entry.isDirectory() && !isFiltered( jarFilters, name ) )
+                for ( Enumeration<JarEntry> j = jarFile.entries(); 
j.hasMoreElements(); )
                 {
-                    InputStream is = jarFile.getInputStream( entry );
+                    JarEntry entry = j.nextElement();
 
-                    String mappedName = remapper.map( name );
+                    String name = entry.getName();
 
-                    int idx = mappedName.lastIndexOf( '/' );
-                    if ( idx != -1 )
+                    if ( "META-INF/INDEX.LIST".equals( name ) )
                     {
-                        // make sure dirs are created
-                        String dir = mappedName.substring( 0, idx );
-                        if ( !resources.contains( dir ) )
-                        {
-                            addDirectory( resources, jos, dir );
-                        }
+                        // we cannot allow the jar indexes to be copied over 
or the
+                        // jar is useless. Ideally, we could create a new one
+                        // later
+                        continue;
                     }
 
-                    if ( name.endsWith( ".class" ) )
-                    {
-                        duplicates.put( name, jar );
-                        addRemappedClass( remapper, jos, jar, name, is );
-                    }
-                    else if ( shadeRequest.isShadeSourcesContent() && 
name.endsWith( ".java" ) )
+                    if ( !entry.isDirectory() && !isFiltered( jarFilters, name 
) )
                     {
-                        // Avoid duplicates
-                        if ( resources.contains( mappedName ) )
-                        {
-                            continue;
-                        }
-
-                        addJavaSource( resources, jos, mappedName, is, 
shadeRequest.getRelocators() );
-                    }
-                    else
-                    {
-                        if ( !resourceTransformed( transformers, mappedName, 
is, shadeRequest.getRelocators() ) )
-                        {
-                            // Avoid duplicates that aren't accounted for by 
the resource transformers
-                            if ( resources.contains( mappedName ) )
-                            {
-                                continue;
-                            }
-
-                            addResource( resources, jos, mappedName, is );
-                        }
+                        shadeSingleJar( shadeRequest, resources, transformers, 
remapper, jos, duplicates, jar, jarFile,
+                                        entry, name );
                     }
-
-                    IOUtil.close( is );
                 }
-            }
-
-            jarFile.close();
-        }
 
-        // CHECKSTYLE_OFF: MagicNumber
-        Multimap<Collection<File>, String> overlapping = HashMultimap.create( 
20, 15 );
-        // CHECKSTYLE_ON: MagicNumber
-
-        for ( String clazz : duplicates.keySet() )
-        {
-            Collection<File> jarz = duplicates.get( clazz );
-            if ( jarz.size() > 1 )
+            }
+            finally
             {
-                overlapping.put( jarz, clazz );
+                jarFile.close();
             }
         }
+    }
 
-        // Log a summary of duplicates
-        logSummaryOfDuplicates( overlapping );
+    private void shadeSingleJar( ShadeRequest shadeRequest, Set<String> 
resources,
+                                 List<ResourceTransformer> transformers, 
RelocatorRemapper remapper,
+                                 JarOutputStream jos, Multimap<String, File> 
duplicates, File jar, JarFile jarFile,
+                                 JarEntry entry, String name )
+        throws IOException, MojoExecutionException
+    {
+        InputStream is = jarFile.getInputStream( entry );
 
-        if ( overlapping.keySet().size() > 0 )
+        try
         {
-            showOverlappingWarning();
-        }
 
-        for ( ResourceTransformer transformer : transformers )
-        {
-            if ( transformer.hasTransformedResource() )
+            String mappedName = remapper.map( name );
+
+            int idx = mappedName.lastIndexOf( '/' );
+            if ( idx != -1 )
             {
-                transformer.modifyOutputStream( jos );
+                // make sure dirs are created
+                String dir = mappedName.substring( 0, idx );
+                if ( !resources.contains( dir ) )
+                {
+                    addDirectory( resources, jos, dir );
+                }
             }
-        }
 
-        IOUtil.close( jos );
+            if ( name.endsWith( ".class" ) )
+            {
+                duplicates.put( name, jar );
+                addRemappedClass( remapper, jos, jar, name, is );
+            }
+            else if ( shadeRequest.isShadeSourcesContent() && name.endsWith( 
".java" ) )
+            {
+                // Avoid duplicates
+                if ( resources.contains( mappedName ) )
+                {
+                    return;
+                }
 
-        for ( Filter filter : shadeRequest.getFilters() )
+                addJavaSource( resources, jos, mappedName, is, 
shadeRequest.getRelocators() );
+            }
+            else
+            {
+                if ( !resourceTransformed( transformers, mappedName, is, 
shadeRequest.getRelocators() ) )
+                {
+                    // Avoid duplicates that aren't accounted for by the 
resource transformers
+                    if ( resources.contains( mappedName ) )
+                    {
+                        return;
+                    }
+
+                    addResource( resources, jos, mappedName, is );
+                }
+            }
+
+        }
+        finally
         {
-            filter.finished();
+            IOUtil.close( is );
         }
     }
 
@@ -268,11 +308,13 @@ public class DefaultShader
 
             for ( String clazz : overlapping.get( jarz ) )
             {
-                classes.add( clazz.replace( ".class", "" ).replace( "/", "." ) 
);
+                classes.add( clazz.replace( ".class", "" )
+                                  .replace( "/", "." ) );
             }
 
             //CHECKSTYLE_OFF: LineLength
-            getLogger().warn( Joiner.on( ", " ).join( jarzS ) + " define " + 
classes.size() + " overlapping classes: " );
+            getLogger().warn( Joiner.on( ", " )
+                                    .join( jarzS ) + " define " + 
classes.size() + " overlapping classes: " );
             //CHECKSTYLE_ON: LineLength
 
             int max = 10;
@@ -438,7 +480,8 @@ public class DefaultShader
         {
             if ( transformer.canTransformResource( name ) )
             {
-                getLogger().debug( "Transforming " + name + " using " + 
transformer.getClass().getName() );
+                getLogger().debug( "Transforming " + name + " using " + 
transformer.getClass()
+                                                                               
    .getName() );
 
                 transformer.processResource( name, is, relocators );
 


Reply via email to