1 package org.apache.maven.plugins.assembly.filter;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import org.apache.maven.plugins.assembly.utils.AssemblyFileUtils;
23 import org.codehaus.plexus.archiver.Archiver;
24 import org.codehaus.plexus.archiver.ArchiverException;
25 import org.codehaus.plexus.archiver.ResourceIterator;
26 import org.codehaus.plexus.archiver.UnArchiver;
27 import org.codehaus.plexus.components.io.fileselectors.FileInfo;
28
29 import java.io.BufferedReader;
30 import java.io.File;
31 import java.io.FileOutputStream;
32 import java.io.IOException;
33 import java.io.InputStreamReader;
34 import java.io.OutputStreamWriter;
35 import java.io.PrintWriter;
36 import java.nio.file.Files;
37 import java.util.ArrayList;
38 import java.util.HashMap;
39 import java.util.List;
40 import java.util.Map;
41
42 abstract class AbstractLineAggregatingHandler
43 implements ContainerDescriptorHandler
44 {
45
46 private Map<String, List<String>> catalog = new HashMap<>();
47
48 private boolean excludeOverride = false;
49
50 protected abstract String getOutputPathPrefix( final FileInfo fileInfo );
51
52 protected abstract boolean fileMatches( final FileInfo fileInfo );
53
54 String getEncoding()
55 {
56 return "UTF-8";
57 }
58
59 @Override
60 public void finalizeArchiveCreation( final Archiver archiver )
61 {
62
63
64
65
66
67 for ( final ResourceIterator it = archiver.getResources(); it.hasNext(); )
68 {
69 it.next();
70 }
71
72 addToArchive( archiver );
73 }
74
75 void addToArchive( final Archiver archiver )
76 {
77 for ( final Map.Entry<String, List<String>> entry : catalog.entrySet() )
78 {
79 final String name = entry.getKey();
80 final String fname = new File( name ).getName();
81
82 File f;
83 try
84 {
85 f = Files.createTempFile( "assembly-" + fname, ".tmp" ).toFile();
86 f.deleteOnExit();
87
88 try ( PrintWriter writer =
89 new PrintWriter( new OutputStreamWriter( new FileOutputStream( f ), getEncoding() ) ) )
90 {
91 for ( final String line : entry.getValue() )
92 {
93 writer.println( line );
94 }
95 }
96 }
97 catch ( final IOException e )
98 {
99 throw new ArchiverException(
100 "Error adding aggregated content for: " + fname + " to finalize archive creation. Reason: "
101 + e.getMessage(), e );
102 }
103
104 excludeOverride = true;
105 archiver.addFile( f, name );
106 excludeOverride = false;
107 }
108 }
109
110 @Override
111 public void finalizeArchiveExtraction( final UnArchiver unArchiver )
112 {
113 }
114
115 @Override
116 public List<String> getVirtualFiles()
117 {
118 return new ArrayList<>( catalog.keySet() );
119 }
120
121 @Override
122 public boolean isSelected( final FileInfo fileInfo )
123 throws IOException
124 {
125 if ( excludeOverride )
126 {
127 return true;
128 }
129
130 String name = AssemblyFileUtils.normalizeFileInfo( fileInfo );
131
132 if ( fileInfo.isFile() && fileMatches( fileInfo ) )
133 {
134 name = getOutputPathPrefix( fileInfo ) + new File( name ).getName();
135
136 List<String> lines = catalog.get( name );
137 if ( lines == null )
138 {
139 lines = new ArrayList<>();
140 catalog.put( name, lines );
141 }
142
143 readLines( fileInfo, lines );
144
145 return false;
146 }
147
148 return true;
149 }
150
151 void readLines( final FileInfo fileInfo, final List<String> lines )
152 throws IOException
153 {
154 try ( BufferedReader reader =
155 new BufferedReader( new InputStreamReader( fileInfo.getContents(), getEncoding() ) ) )
156 {
157 for ( String line = reader.readLine(); line != null; line = reader.readLine() )
158 {
159 if ( !lines.contains( line ) )
160 {
161 lines.add( line );
162 }
163 }
164 }
165 }
166
167 protected final Map<String, List<String>> getCatalog()
168 {
169 return catalog;
170 }
171
172 protected final void setCatalog( final Map<String, List<String>> catalog )
173 {
174 this.catalog = catalog;
175 }
176
177 }