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();
}
}