View Javadoc

1   package org.apache.maven.plugins.shade.resource;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
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.Map;
29  import java.util.jar.JarEntry;
30  import java.util.jar.JarOutputStream;
31  
32  import org.codehaus.plexus.util.IOUtil;
33  
34  /**
35   * Resources transformer that appends entries in META-INF/services resources into
36   * a single resource. For example, if there are several META-INF/services/org.apache.maven.project.ProjectBuilder
37   * resources spread across many JARs the individual entries will all be concatenated into a single
38   * META-INF/services/org.apache.maven.project.ProjectBuilder resource packaged into the resultant JAR produced
39   * by the shading process.
40   *
41   * @author jvanzyl
42   */
43  public class ServicesResourceTransformer
44      implements ResourceTransformer
45  {
46      private static final String SERVICES_PATH = "META-INF/services";
47  
48      private ByteArrayOutputStream data;
49  
50      private Map serviceEntries = new HashMap();
51  
52      public boolean canTransformResource( String resource )
53      {
54          if ( resource.startsWith( SERVICES_PATH ) )
55          {
56              data = (ByteArrayOutputStream) serviceEntries.get( resource );
57  
58              if ( data == null )
59              {
60                  data = new ByteArrayOutputStream();
61                  serviceEntries.put( resource, data );
62              }
63  
64              return true;
65          }
66  
67          return false;
68      }
69  
70      public void processResource( InputStream is )
71          throws IOException
72      {
73          IOUtil.copy( is, data );
74          is.close();
75      }
76  
77      public boolean hasTransformedResource()
78      {
79          return serviceEntries.size() > 0;
80      }
81  
82      public void modifyOutputStream( JarOutputStream jos )
83          throws IOException
84      {
85          for ( Iterator i = serviceEntries.keySet().iterator(); i.hasNext(); )
86          {
87              String key = (String) i.next();
88              ByteArrayOutputStream data = (ByteArrayOutputStream) serviceEntries.get( key );
89              jos.putNextEntry( new JarEntry( key ) );
90              IOUtil.copy( new ByteArrayInputStream( data.toByteArray() ), jos );
91              data.reset();
92          }
93      }
94  }