/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.sling.testing.mock.osgi;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Collection;
import java.util.Enumeration;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.jar.Attributes;
import java.util.jar.JarFile;
import java.util.jar.Manifest;

import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Scan METAINF/MANIFEST.MF files.
 */
public final class ManifestScanner {
    
    private static final Logger log = LoggerFactory.getLogger(ManifestScanner.class);
    
    private ManifestScanner() {
        // static methods only
    }

    /**
     * Get all bundle header values stored in MANIFEST.MF files as attributes.
     * Attributes values from all manifest files are collected, and values separated by "," are returned individually.
     * The order of the values from each entry is preserved, but the overall order when multiple bundles define such an entry
     * is not deterministic. Duplicate values are eliminated.
     * @param attributeName Attribute / Bundle header name.
     * @return List of values.
     */
    public static @NotNull Collection<String> getValues(@NotNull final String attributeName) {
        Set<String> values = new LinkedHashSet<String>();
        try {
            Enumeration<URL> resEnum = ManifestScanner.class.getClassLoader().getResources(JarFile.MANIFEST_NAME);
            while (resEnum.hasMoreElements()) {
                try {
                    URL url = (URL)resEnum.nextElement();
                    InputStream is = url.openStream();
                    if (is != null) {
                        try {
                            Manifest manifest = new Manifest(is);
                            Attributes mainAttribs = manifest.getMainAttributes();
                            String valueList = mainAttribs.getValue(attributeName);
                            String[] valueArray = StringUtils.split(valueList, ",");
                            if (valueArray != null) {
                                for (String value : valueArray) {
                                    if (!StringUtils.isBlank(value)) {
                                        values.add(StringUtils.trim(value));
                                    }
                                }
                            }
                        }
                        finally {
                            is.close();
                        }
                    }
                }
                catch (Throwable ex) {
                    log.warn("Unable to read JAR manifest.", ex);
                }
            }
        }
        catch (IOException ex) {
            log.warn("Unable to read JAR manifests.", ex);
        }
        return values; 
    }

}
