public void contribute()

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