private Stream read()

in winegrower-core/src/main/java/org/apache/winegrower/scanner/manifest/HeaderManifestContributor.java [74:119]


    private Stream<KeyValue> read(final ClassLoader loader, final Class<?> clazz) {
        try (final InputStream stream = loader.getResourceAsStream(clazz.getName().replace('.', '/') + ".class")) {
            final ClassReader reader = new ClassReader(stream);
            final Collection<KeyValue> headers = new ArrayList<>();
            final Supplier<AnnotationVisitor> newHeaderVisitor = () -> new AnnotationVisitor(ASM9) {
                private final KeyValue header = new KeyValue();

                @Override
                public void visit(final String name, final Object value) {
                    switch (name) {
                        case "name":
                            header.name = String.valueOf(value);
                            break;
                        case "value":
                            header.value = String.valueOf(value)
                                    .replace("${@class}", clazz.getName());
                            break;
                        default:
                    }
                }

                @Override
                public void visitEnd() {
                    headers.add(header);
                }
            };

            reader.accept(new ClassVisitor(ASM9) {
                @Override
                public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) {
                    switch (descriptor) {
                        case "Lorg/osgi/annotation/bundle/Headers;":
                            return new PluralAnnotationVisitor("Lorg/osgi/annotation/bundle/Header;", newHeaderVisitor);
                        case "Lorg/osgi/annotation/bundle/Header;":
                            return newHeaderVisitor.get();
                        default:
                            return super.visitAnnotation(descriptor, visible);
                    }
                }
            }, SKIP_CODE + SKIP_DEBUG + SKIP_FRAMES);

            return headers.stream();
        } catch (final Exception e) {
            return Stream.empty();
        }
    }