1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package io.earcam.instrumental.archive.osgi.auto;
20
21 import static io.earcam.instrumental.module.auto.Classpaths.allClasspaths;
22 import static io.earcam.instrumental.module.osgi.BundleManifestHeaders.BUNDLE_SYMBOLICNAME;
23 import static java.util.stream.Collectors.toList;
24
25 import java.io.IOException;
26 import java.nio.file.Path;
27 import java.util.List;
28 import java.util.Objects;
29 import java.util.jar.JarInputStream;
30 import java.util.jar.Manifest;
31
32 import io.earcam.instrumental.module.osgi.BundleInfo;
33 import io.earcam.instrumental.module.osgi.BundleInfoBuilder;
34 import io.earcam.unexceptional.Exceptional;
35 import io.earcam.utilitarian.io.ExplodedJarInputStream;
36
37
38
39
40
41
42 public class ClasspathBundles extends AbstractPackageBundleMapper {
43
44 @Override
45 protected List<BundleInfo> bundles()
46 {
47 return allClasspaths()
48 .map(Exceptional.uncheckFunction(ClasspathBundles::bundleInfoFrom))
49 .filter(Objects::nonNull)
50 .collect(toList());
51 }
52
53
54 private static BundleInfo bundleInfoFrom(Path classpathElement) throws IOException
55 {
56 try(JarInputStream jin = ExplodedJarInputStream.jarInputStreamFrom(classpathElement)) {
57 Manifest manifest = jin.getManifest();
58 if(manifest == null || manifest.getMainAttributes().getValue(BUNDLE_SYMBOLICNAME.header()) == null) {
59 return null;
60 }
61 return BundleInfoBuilder.bundleFrom(manifest).construct();
62 }
63 }
64 }