@@ -68,18 +68,16 @@ public class JarFile extends java.util.jar.JarFile implements Iterable<JarEntryD
68
68
69
69
private final RandomAccessDataFile rootFile ;
70
70
71
- private final RandomAccessData data ;
72
-
73
71
private final String name ;
74
72
75
- private final long size ;
76
-
77
- private boolean signed ;
73
+ private final RandomAccessData data ;
78
74
79
- private List <JarEntryData > entries ;
75
+ private final List <JarEntryData > entries ;
80
76
81
77
private SoftReference <Map <AsciiBytes , JarEntryData >> entriesByName ;
82
78
79
+ private boolean signed ;
80
+
83
81
private JarEntryData manifestEntry ;
84
82
85
83
private SoftReference <Manifest > manifest ;
@@ -108,18 +106,25 @@ public JarFile(File file) throws IOException {
108
106
* @param rootFile the root jar file
109
107
* @param name the name of this file
110
108
* @param data the underlying data
111
- * @param filters an optional set of jar entry filters
112
109
* @throws IOException
113
110
*/
114
- private JarFile (RandomAccessDataFile rootFile , String name , RandomAccessData data ,
115
- JarEntryFilter ... filters ) throws IOException {
111
+ private JarFile (RandomAccessDataFile rootFile , String name , RandomAccessData data )
112
+ throws IOException {
116
113
super (rootFile .getFile ());
117
114
CentralDirectoryEndRecord endRecord = new CentralDirectoryEndRecord (data );
115
+ this .rootFile = rootFile ;
116
+ this .name = name ;
118
117
this .data = getArchiveData (endRecord , data );
118
+ this .entries = loadJarEntries (endRecord );
119
+ }
120
+
121
+ private JarFile (RandomAccessDataFile rootFile , String name , RandomAccessData data ,
122
+ List <JarEntryData > entries , JarEntryFilter ... filters ) throws IOException {
123
+ super (rootFile .getFile ());
119
124
this .rootFile = rootFile ;
120
125
this .name = name ;
121
- this .size = data . getSize () ;
122
- loadJarEntries ( endRecord , filters );
126
+ this .data = data ;
127
+ this . entries = filterEntries ( entries , filters );
123
128
}
124
129
125
130
private RandomAccessData getArchiveData (CentralDirectoryEndRecord endRecord ,
@@ -131,35 +136,47 @@ private RandomAccessData getArchiveData(CentralDirectoryEndRecord endRecord,
131
136
return data .getSubsection (offset , data .getSize () - offset );
132
137
}
133
138
134
- private void loadJarEntries (CentralDirectoryEndRecord endRecord ,
135
- JarEntryFilter [] filters ) throws IOException {
139
+ private List < JarEntryData > loadJarEntries (CentralDirectoryEndRecord endRecord )
140
+ throws IOException {
136
141
RandomAccessData centralDirectory = endRecord .getCentralDirectory (this .data );
137
142
int numberOfRecords = endRecord .getNumberOfRecords ();
138
- this . entries = new ArrayList <JarEntryData >(numberOfRecords );
143
+ List < JarEntryData > entries = new ArrayList <JarEntryData >(numberOfRecords );
139
144
InputStream inputStream = centralDirectory .getInputStream (ResourceAccess .ONCE );
140
145
try {
141
146
JarEntryData entry = JarEntryData .fromInputStream (this , inputStream );
142
147
while (entry != null ) {
143
- addJarEntry (entry , filters );
148
+ entries .add (entry );
149
+ processEntry (entry );
144
150
entry = JarEntryData .fromInputStream (this , inputStream );
145
151
}
146
152
}
147
153
finally {
148
154
inputStream .close ();
149
155
}
156
+ return entries ;
150
157
}
151
158
152
- private void addJarEntry (JarEntryData entry , JarEntryFilter [] filters ) {
153
- AsciiBytes name = entry .getName ();
154
- for (JarEntryFilter filter : filters ) {
155
- name = (filter == null || name == null ? name : filter .apply (name , entry ));
156
- }
157
- if (name != null ) {
158
- entry .setName (name );
159
- this .entries .add (entry );
160
- if (name .startsWith (META_INF )) {
161
- processMetaInfEntry (name , entry );
159
+ private List <JarEntryData > filterEntries (List <JarEntryData > entries ,
160
+ JarEntryFilter [] filters ) {
161
+ List <JarEntryData > filteredEntries = new ArrayList <JarEntryData >(entries .size ());
162
+ for (JarEntryData entry : entries ) {
163
+ AsciiBytes name = entry .getName ();
164
+ for (JarEntryFilter filter : filters ) {
165
+ name = (filter == null || name == null ? name : filter .apply (name , entry ));
162
166
}
167
+ if (name != null ) {
168
+ JarEntryData filteredCopy = entry .createFilteredCopy (this , name );
169
+ filteredEntries .add (filteredCopy );
170
+ processEntry (filteredCopy );
171
+ }
172
+ }
173
+ return filteredEntries ;
174
+ }
175
+
176
+ private void processEntry (JarEntryData entry ) {
177
+ AsciiBytes name = entry .getName ();
178
+ if (name .startsWith (META_INF )) {
179
+ processMetaInfEntry (name , entry );
163
180
}
164
181
}
165
182
@@ -322,8 +339,7 @@ public synchronized JarFile getNestedJarFile(final JarEntryData sourceEntry)
322
339
private JarFile getNestedJarFileFromDirectoryEntry (JarEntryData sourceEntry )
323
340
throws IOException {
324
341
final AsciiBytes sourceName = sourceEntry .getName ();
325
- JarEntryFilter [] filtersToUse = new JarEntryFilter [1 ];
326
- filtersToUse [0 ] = new JarEntryFilter () {
342
+ JarEntryFilter filter = new JarEntryFilter () {
327
343
@ Override
328
344
public AsciiBytes apply (AsciiBytes name , JarEntryData entryData ) {
329
345
if (name .startsWith (sourceName ) && !name .equals (sourceName )) {
@@ -334,7 +350,7 @@ public AsciiBytes apply(AsciiBytes name, JarEntryData entryData) {
334
350
};
335
351
return new JarFile (this .rootFile , getName () + "!/"
336
352
+ sourceEntry .getName ().substring (0 , sourceName .length () - 1 ), this .data ,
337
- filtersToUse );
353
+ this . entries , filter );
338
354
}
339
355
340
356
private JarFile getNestedJarFileFromFileEntry (JarEntryData sourceEntry )
@@ -355,7 +371,7 @@ private JarFile getNestedJarFileFromFileEntry(JarEntryData sourceEntry)
355
371
*/
356
372
public synchronized JarFile getFilteredJarFile (JarEntryFilter ... filters )
357
373
throws IOException {
358
- return new JarFile (this .rootFile , getName (), this .data , filters );
374
+ return new JarFile (this .rootFile , getName (), this .data , this . entries , filters );
359
375
}
360
376
361
377
private JarEntry getContainedEntry (ZipEntry zipEntry ) throws IOException {
@@ -368,7 +384,7 @@ private JarEntry getContainedEntry(ZipEntry zipEntry) throws IOException {
368
384
369
385
@ Override
370
386
public int size () {
371
- return (int ) this .size ;
387
+ return (int ) this .data . getSize () ;
372
388
}
373
389
374
390
@ Override
0 commit comments