@@ -60,6 +60,20 @@ public abstract class AbstractJarWriter implements LoaderClassesWriter {
60
60
61
61
private final Set <String > writtenEntries = new HashSet <>();
62
62
63
+ private Layers layers ;
64
+
65
+ private LayersIndex layersIndex ;
66
+
67
+ /**
68
+ * Update this writer to use specific layers.
69
+ * @param layers the layers to use
70
+ * @param layersIndex the layers index to update
71
+ */
72
+ void useLayers (Layers layers , LayersIndex layersIndex ) {
73
+ this .layers = layers ;
74
+ this .layersIndex = layersIndex ;
75
+ }
76
+
63
77
/**
64
78
* Write the specified manifest.
65
79
* @param manifest the manifest to write
@@ -89,7 +103,7 @@ final void writeEntries(JarFile jarFile, EntryTransformer entryTransformer, Unpa
89
103
EntryWriter entryWriter = new InputStreamEntryWriter (inputStream );
90
104
JarArchiveEntry transformedEntry = entryTransformer .transform (entry );
91
105
if (transformedEntry != null ) {
92
- writeEntry (transformedEntry , entryWriter , unpackHandler );
106
+ writeEntry (transformedEntry , entryWriter , unpackHandler , true );
93
107
}
94
108
}
95
109
}
@@ -144,7 +158,15 @@ public void writeNestedLibrary(String location, Library library) throws IOExcept
144
158
entry .setTime (getNestedLibraryTime (library ));
145
159
new CrcAndSize (library ::openStream ).setupStoredEntry (entry );
146
160
try (InputStream inputStream = library .openStream ()) {
147
- writeEntry (entry , new InputStreamEntryWriter (inputStream ), new LibraryUnpackHandler (library ));
161
+ writeEntry (entry , new InputStreamEntryWriter (inputStream ), new LibraryUnpackHandler (library ), false );
162
+ updateLayerIndex (entry .getName (), library );
163
+ }
164
+ }
165
+
166
+ private void updateLayerIndex (String name , Library library ) {
167
+ if (this .layers != null ) {
168
+ Layer layer = this .layers .getLayer (library );
169
+ this .layersIndex .add (layer , name );
148
170
}
149
171
}
150
172
@@ -225,7 +247,7 @@ private boolean isClassEntry(JarEntry entry) {
225
247
}
226
248
227
249
private void writeEntry (JarArchiveEntry entry , EntryWriter entryWriter ) throws IOException {
228
- writeEntry (entry , entryWriter , UnpackHandler .NEVER );
250
+ writeEntry (entry , entryWriter , UnpackHandler .NEVER , true );
229
251
}
230
252
231
253
/**
@@ -234,10 +256,11 @@ private void writeEntry(JarArchiveEntry entry, EntryWriter entryWriter) throws I
234
256
* @param entry the entry to write
235
257
* @param entryWriter the entry writer or {@code null} if there is no content
236
258
* @param unpackHandler handles possible unpacking for the entry
259
+ * @param updateLayerIndex if the layer index should be updated
237
260
* @throws IOException in case of I/O errors
238
261
*/
239
- private void writeEntry (JarArchiveEntry entry , EntryWriter entryWriter , UnpackHandler unpackHandler )
240
- throws IOException {
262
+ private void writeEntry (JarArchiveEntry entry , EntryWriter entryWriter , UnpackHandler unpackHandler ,
263
+ boolean updateLayerIndex ) throws IOException {
241
264
String name = entry .getName ();
242
265
writeParentDirectoryEntries (name );
243
266
if (this .writtenEntries .add (name )) {
@@ -248,18 +271,28 @@ private void writeEntry(JarArchiveEntry entry, EntryWriter entryWriter, UnpackHa
248
271
entry .setSize (entryWriter .size ());
249
272
}
250
273
entryWriter = addUnpackCommentIfNecessary (entry , entryWriter , unpackHandler );
274
+ if (updateLayerIndex ) {
275
+ updateLayerIndex (entry );
276
+ }
251
277
writeToArchive (entry , entryWriter );
252
278
}
253
279
}
254
280
281
+ private void updateLayerIndex (JarArchiveEntry entry ) {
282
+ if (this .layers != null && !entry .getName ().endsWith ("/" )) {
283
+ Layer layer = this .layers .getLayer (entry .getName ());
284
+ this .layersIndex .add (layer , entry .getName ());
285
+ }
286
+ }
287
+
255
288
protected abstract void writeToArchive (ZipEntry entry , EntryWriter entryWriter ) throws IOException ;
256
289
257
290
private void writeParentDirectoryEntries (String name ) throws IOException {
258
291
String parent = name .endsWith ("/" ) ? name .substring (0 , name .length () - 1 ) : name ;
259
292
while (parent .lastIndexOf ('/' ) != -1 ) {
260
293
parent = parent .substring (0 , parent .lastIndexOf ('/' ));
261
294
if (!parent .isEmpty ()) {
262
- writeEntry (new JarArchiveEntry (parent + "/" ), null , UnpackHandler .NEVER );
295
+ writeEntry (new JarArchiveEntry (parent + "/" ), null , UnpackHandler .NEVER , false );
263
296
}
264
297
}
265
298
}
0 commit comments