in winegrower-core/src/main/java/org/apache/winegrower/scanner/manifest/HeaderManifestContributor.java [41:72]
public void contribute(final AnnotationFinder finder, final Supplier<Manifest> manifest) {
final ClassLoader loader = Thread.currentThread().getContextClassLoader();
final List<Class<?>> headerClasses;
final List<Class<?>> headersClasses;
try {
final WinegrowerAnnotationFinder waf = WinegrowerAnnotationFinder.class.cast(finder); // temp, see impl
headerClasses = waf.findAnnotatedClasses("org.osgi.annotation.bundle.Header");
headersClasses = waf.findAnnotatedClasses("org.osgi.annotation.bundle.Headers");
if (headerClasses.isEmpty() && headersClasses.isEmpty()) { // reuse the finder to ensure it exists
return;
}
} catch (final Exception | Error e) {
return;
}
// read it in the bytecode since reflection can't help here
final Map<String, String> headers = Stream.concat(headersClasses.stream(), headerClasses.stream())
.flatMap(clazz -> read(loader, clazz))
.collect(toMap(header -> header.name, header -> header.value, (a, b) -> {
throw new UnsupportedOperationException("not called normally");
}, () -> new HashMap<String, String>() {
@Override // override to access the key which is important here
public String merge(final String key, final String value,
final BiFunction<? super String, ? super String, ? extends String> ignored) {
final String oldValue = get(key);
final String newValue = oldValue == null ? value : HeaderManifestContributor.this.mergeManifestValues(key, oldValue, value);
put(key, newValue);
return newValue;
}
}));
headers.forEach((k, v) -> manifest.get().getMainAttributes().putValue(k, v));
}