44import cpw .mods .jarhandling .SecureJar ;
55import cpw .mods .niofs .union .UnionFileSystem ;
66import cpw .mods .niofs .union .UnionFileSystemProvider ;
7+ import cpw .mods .util .LambdaExceptionUtils ;
78
89import java .io .IOException ;
10+ import java .io .InputStream ;
911import java .io .UncheckedIOException ;
1012import java .lang .module .ModuleDescriptor ;
1113import java .net .URI ;
1214import java .nio .file .Files ;
1315import java .nio .file .Path ;
16+ import java .nio .file .Paths ;
1417import java .nio .file .spi .FileSystemProvider ;
1518import java .security .CodeSigner ;
1619import java .util .*;
@@ -36,6 +39,7 @@ public class Jar implements SecureJar {
3639 private final UnionFileSystem filesystem ;
3740 private final boolean isMultiRelease ;
3841 private final Map <Path , Integer > nameOverrides ;
42+ private final JarModuleDataProvider moduleDataProvider ;
3943 private Set <String > packages ;
4044 private List <Provider > providers ;
4145
@@ -47,12 +51,16 @@ public ModuleDescriptor computeDescriptor() {
4751 return metadata .descriptor ();
4852 }
4953
54+ @ Override
55+ public ModuleDataProvider moduleDataProvider () {
56+ return moduleDataProvider ;
57+ }
58+
5059 @ Override
5160 public Path getPrimaryPath () {
5261 return filesystem .getPrimaryPath ();
5362 }
5463
55- @ Override
5664 public Optional <URI > findFile (final String name ) {
5765 var rel = filesystem .getPath (name );
5866 if (this .nameOverrides .containsKey (rel )) {
@@ -72,6 +80,7 @@ public Jar(final Supplier<Manifest> defaultManifest, final Function<SecureJar, J
7280 var validPaths = Arrays .stream (paths ).filter (Files ::exists ).toArray (Path []::new );
7381 if (validPaths .length == 0 )
7482 throw new UncheckedIOException (new IOException ("Invalid paths argument, contained no existing paths: " + Arrays .toString (paths )));
83+ this .moduleDataProvider = new JarModuleDataProvider (this );
7584 this .filesystem = UFSP .newFileSystem (pathfilter , validPaths );
7685 try {
7786 Manifest mantmp = null ;
@@ -134,7 +143,6 @@ public Jar(final Supplier<Manifest> defaultManifest, final Function<SecureJar, J
134143 this .metadata = metadataFunction .apply (this );
135144 }
136145
137- @ Override
138146 public Manifest getManifest () {
139147 return manifest ;
140148 }
@@ -256,4 +264,41 @@ public Path getRootPath() {
256264 public String toString () {
257265 return "Jar[" + getURI () + "]" ;
258266 }
267+
268+ private record JarModuleDataProvider (Jar jar ) implements ModuleDataProvider {
269+ @ Override
270+ public String name () {
271+ return jar .name ();
272+ }
273+
274+ @ Override
275+ public ModuleDescriptor descriptor () {
276+ return jar .computeDescriptor ();
277+ }
278+
279+ @ Override
280+ public URI uri () {
281+ return jar .getURI ();
282+ }
283+
284+ @ Override
285+ public Optional <URI > findFile (final String name ) {
286+ return jar .findFile (name );
287+ }
288+
289+ @ Override
290+ public Optional <InputStream > open (final String name ) {
291+ return jar .findFile (name ).map (Paths ::get ).map (LambdaExceptionUtils .rethrowFunction (Files ::newInputStream ));
292+ }
293+
294+ @ Override
295+ public Manifest getManifest () {
296+ return jar .getManifest ();
297+ }
298+
299+ @ Override
300+ public CodeSigner [] verifyAndGetSigners (final String cname , final byte [] bytes ) {
301+ return jar .verifyAndGetSigners (cname , bytes );
302+ }
303+ }
259304}
0 commit comments