package com.aol.micro.server.application.registry; import java.io.InputStream; import java.util.HashMap; import java.util.Map; import java.util.function.Supplier; import java.util.jar.Attributes; import java.util.jar.Manifest; import cyclops.function.FluentFunctions; import cyclops.stream.ReactiveSeq; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import lombok.AccessLevel; import lombok.NoArgsConstructor; @NoArgsConstructor(access = AccessLevel.PRIVATE) public class ManifestLoader { private final Logger logger = LoggerFactory.getLogger(getClass()); public final static ManifestLoader instance = new ManifestLoader(); Supplier<Map<String, String>> fn = FluentFunctions.of(this::manifest) .memoize(); public Map<String, String> getManifest() { return fn.get(); } private Map<String, String> manifest() { try { return ReactiveSeq.of("META-INF/MANIFEST.MF") .map(url -> this.getClass() .getClassLoader() .getResourceAsStream(url)) .map(this::getManifest) .singleOptional() .orElse(null); } catch (Exception e) { logger.warn("Warning : can't load manifest due to exception {}", e.getMessage()); } return null; } public Map<String, String> getManifest(final InputStream input) { final Map<String, String> retMap = new HashMap<String, String>(); try { Manifest manifest = new Manifest(); manifest.read(input); final Attributes attributes = manifest.getMainAttributes(); for (final Map.Entry attribute : attributes.entrySet()) { retMap.put(attribute.getKey() .toString(), attribute.getValue() .toString()); } } catch (final Exception ex) { logger.error("Failed to load manifest ", ex); } return retMap; } }