1 package org.apache.maven.plugins.shade.resource;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.io.ByteArrayInputStream;
23 import java.io.ByteArrayOutputStream;
24 import java.io.IOException;
25 import java.io.InputStream;
26 import java.util.HashMap;
27 import java.util.Iterator;
28 import java.util.List;
29 import java.util.Map;
30 import java.util.jar.JarEntry;
31 import java.util.jar.JarOutputStream;
32
33 import org.codehaus.plexus.util.IOUtil;
34
35
36
37
38
39
40
41
42
43
44 public class ServicesResourceTransformer
45 implements ResourceTransformer
46 {
47
48 private static final String SERVICES_PATH = "META-INF/services";
49
50 private Map serviceEntries = new HashMap();
51
52 public boolean canTransformResource( String resource )
53 {
54 if ( resource.startsWith( SERVICES_PATH ) )
55 {
56 return true;
57 }
58
59 return false;
60 }
61
62 public void processResource( String resource, InputStream is, List relocators )
63 throws IOException
64 {
65 ServiceStream out = (ServiceStream) serviceEntries.get( resource );
66 if ( out == null )
67 {
68 out = new ServiceStream();
69 serviceEntries.put( resource, out );
70 }
71
72 out.append( is );
73 is.close();
74 }
75
76 public boolean hasTransformedResource()
77 {
78 return serviceEntries.size() > 0;
79 }
80
81 public void modifyOutputStream( JarOutputStream jos )
82 throws IOException
83 {
84 for ( Iterator i = serviceEntries.keySet().iterator(); i.hasNext(); )
85 {
86 String key = (String) i.next();
87 ServiceStream data = (ServiceStream) serviceEntries.get( key );
88 jos.putNextEntry( new JarEntry( key ) );
89 IOUtil.copy( data.toInputStream(), jos );
90 data.reset();
91 }
92 }
93
94 static class ServiceStream
95 extends ByteArrayOutputStream
96 {
97
98 public ServiceStream()
99 {
100 super( 1024 );
101 }
102
103 public void append( InputStream is )
104 throws IOException
105 {
106 if ( count > 0 && buf[count - 1] != '\n' && buf[count - 1] != '\r' )
107 {
108 write( '\n' );
109 }
110
111 IOUtil.copy( is, this );
112 }
113
114 public InputStream toInputStream()
115 {
116 return new ByteArrayInputStream( buf, 0, count );
117 }
118
119 }
120
121 }