private Stream findRequirements()

in winegrower-core/src/main/java/org/apache/winegrower/scanner/manifest/RequirementManifestContributor.java [76:113]


    private Stream<String> findRequirements(final Class<?> aClass, final WinegrowerAnnotationFinder finder) {
        try (final InputStream bytecode = finder.getArchive().getBytecode(aClass.getName())) {
            final Collection<String> requirements = new ArrayList<>();
            final ClassReader reader = new ClassReader(bytecode);
            reader.accept(new EmptyVisitor() {
                @Override
                public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
                    switch (desc) {
                        case "Lorg/osgi/annotation/bundle/Requirement;":
                            return new RequirementAnnotationVisitor(requirements);
                        case "Lorg/osgi/annotation/bundle/Requirements;":
                            return new AnnotationVisitor(ASM9) {
                                @Override
                                public AnnotationVisitor visitAnnotation(final String name, final String descriptor) {
                                    if ("Lorg/osgi/annotation/bundle/Requirement;".equals(descriptor)) {
                                        return new RequirementAnnotationVisitor(requirements);
                                    }
                                    return super.visitAnnotation(desc, descriptor);
                                }

                                @Override
                                public AnnotationVisitor visitArray(final String name) {
                                    if ("value".equals(name)) {
                                        return this;
                                    }
                                    return super.visitArray(name);
                                }
                            };
                        default:
                            return super.visitAnnotation(desc, visible);
                    }
                }
            }, SKIP_FRAMES | SKIP_CODE | SKIP_DEBUG);
            return requirements.stream();
        } catch (final IOException | ClassNotFoundException e) {
            throw new IllegalArgumentException(e);
        }
    }