RFR: Proposed jimage refresh for JDK9
Paul Sandoz
paul.sandoz at oracle.com
Mon May 18 19:42:40 UTC 2015
On May 18, 2015, at 7:07 PM, Paul Sandoz <Paul.Sandoz at oracle.com> wrote:
> jdk.internal.jimage.ImageFileCreator
> --
>
> 108 private void readAllEntries(Map<String, Set<String>> modulePackagesMap,
> 109 Set<Archive> archives) {
> 110 archives.stream().forEach((archive) -> {
> 111 List<Entry> archiveResources = new ArrayList<>();
> 112 archive.visitEntries(x-> archiveResources.add(x));
> 113 String mn = archive.moduleName();
> 114 entriesForModule.put(mn, archiveResources);
> 115 // Extract package names
> 116 List<Entry> classes = archiveResources.stream()
> 117 .filter(n -> n.type() == EntryType.CLASS_OR_RESOURCE)
> 118 .collect(Collectors.toList());
> 119 Set<String> pkgs = classes.stream().map(Entry::name)
> 120 .filter(n -> isResourcePackage(n))
> 121 .map(ImageFileCreator::toPackage)
> 122 .collect(Collectors.toSet());
> 123 modulePackagesMap.put(mn, pkgs);
> 124 });
> 125 }
>
> Do not need to create the intermediate List<Entry>.
>
> If archive.vistEntries was changed instead to:
>
> Stream<Entry> entries();
>
> The code above might flow better and, off the top of my head, you could do something like:
>
> archives.stream().forEach((archive) -> {
> Map<Boolean, List<Entry>> es = archive.entries()
> .collect(Collectors.partitioningBy(n -> n.type() == EntryType.CLASS_OR_RESOURCE));
>
I am talking nonsense here, Collectors.partitioningBy cannot be used, but i think the general approach of a stream returning method is still valid.
Paul.
> String mn = archive.moduleName();
> entriesForModule.put(mn, es.get(false));
>
> // Extract package names
> Set<String> pkgs = es.get(true).stream().map(Entry::name)
> .filter(n -> isResourcePackage(n))
> .map(ImageFileCreator::toPackage)
> .collect(Collectors.toSet());
> modulePackagesMap.put(mn, pkgs);
> });
>
> For recreateJimage i think you can then do:
>
> Map<String, List<Entry>> entriesForModule = archives.stream().collect(Collectors.toMap(
> Archive::moduleName,
> a -> a.entries().collect(Collectors.toList())
> ));
>
> Or derive from Map<String, Archive>
>
> entriesForModule = nameToArchive.entrySet()
> .stream()
> .collect(Collectors.toMap(e -> e.getKey(),
> e -> e.getValue().entries().collect(Collectors.toList())));
>
>
More information about the jigsaw-dev
mailing list