package org.dcache.util; import com.google.common.base.Optional; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.security.CodeSource; import java.security.ProtectionDomain; import java.util.jar.Attributes; import java.util.jar.JarInputStream; import java.util.jar.Manifest; public class Version { private final Optional<String> _version; private final Optional<String> _buildTime; private final Optional<String> _buildNumber; private final Optional<String> _branch; public Version(Optional<String> buildTime, Optional<String> version, Optional<String> buildNumber, Optional<String> branch) { _buildTime = buildTime; _buildNumber = buildNumber; _version = version; _branch = branch; } public static Version of(Class<?> clazz) { Optional<String> buildTime = Optional.absent(); Optional<String> version = Optional.absent(); Optional<String> buildNumber = Optional.absent(); Optional<String> branch = Optional.absent(); ProtectionDomain pd = clazz.getProtectionDomain(); CodeSource cs = pd.getCodeSource(); URL u = cs.getLocation(); try (InputStream is = u.openStream()) { JarInputStream jis = new JarInputStream(is); Manifest m = jis.getManifest(); if (m != null) { Attributes as = m.getMainAttributes(); buildTime = Optional.fromNullable(as.getValue("Build-Time")); version = Optional.fromNullable(as.getValue("Implementation-Version")); buildNumber = Optional.fromNullable(as.getValue("Implementation-Build")); branch = Optional.fromNullable(as.getValue("Implementation-Branch")); } } catch (IOException ignored) { } return new Version(buildTime, version, buildNumber, branch); } public static Version of(Object object) { return of(object.getClass()); } public String getVersion() { return _version.or("undefined"); } public String getBuildTime() { return _buildTime.or("undefined"); } public String getBuild() { return _buildNumber.or("undefined"); } public String getBranch() { return _branch.or("undefined"); } public static void main(String[] args) throws IOException { System.out.println(Version.of(Version.class).getVersion()); } }