package org.embulk; import java.io.IOException; import java.net.URL; import java.security.CodeSource; import java.security.ProtectionDomain; import java.util.jar.Attributes; import java.util.jar.JarFile; import java.util.jar.Manifest; public final class EmbulkVersion { private EmbulkVersion() { } // Expecting Embulk is always packaged in the embulk-cli jar whenever the Embulk version is checked in Java. static { VERSION = getImplementationVersion(getSelfJarManifest(), "[embulk-version-unavailable]"); } private static Manifest getSelfJarManifest() { try { final ProtectionDomain protectionDomain; try { protectionDomain = EmbulkVersion.class.getProtectionDomain(); } catch (SecurityException ex) { System.err.println("Embulk version unavailable due to ProtectionDomain inaccessible."); ex.printStackTrace(); return null; } final CodeSource codeSource = protectionDomain.getCodeSource(); if (codeSource == null) { System.err.println("Embulk version unavailable due to CodeSource unavailable."); return null; } final URL selfJarUrl = codeSource.getLocation(); if (selfJarUrl == null) { System.err.println("Embulk version unavailable due to the location of CodeSource unavailable."); return null; } else if (!selfJarUrl.getProtocol().equals("file")) { System.err.println("Embulk version unavailable as the location of CodeSource is not local."); return null; } final String selfJarPathString = selfJarUrl.getPath(); if (selfJarPathString == null) { System.err.println("Embulk version unavailable due to the path of CodeSource unavailable."); return null; } else if (selfJarPathString.isEmpty()) { System.err.println("Embulk version unavailable due to the path of CodeSource empty."); return null; } try (final JarFile selfJarFile = new JarFile(selfJarPathString)) { try { return selfJarFile.getManifest(); } catch (IllegalStateException ex) { System.err.println("Embulk version unavailable due to the jar file closed unexpectedly."); ex.printStackTrace(); return null; } catch (IOException ex) { System.err.println("Embulk version unavailable due to failure to get the manifst in the jar file."); ex.printStackTrace(); return null; } } catch (SecurityException ex) { System.err.println("Embulk version unavailable due to the jar file inaccessible."); ex.printStackTrace(); return null; } catch (IOException ex) { System.err.println("Embulk version unavailable due to failure to access the jar file."); ex.printStackTrace(); return null; } } catch (Throwable ex) { System.err.println("Embulk version unavailable due to an unknown exception."); ex.printStackTrace(); return null; } } private static String getImplementationVersion(final Manifest manifest, final String defaultVersion) { if (manifest == null) { return defaultVersion; } final Attributes mainAttributes = manifest.getMainAttributes(); final String implementationVersion = mainAttributes.getValue(Attributes.Name.IMPLEMENTATION_VERSION); if (implementationVersion == null) { System.err.println("Embulk version unavailable due to the manifest not containing Implementation-Version."); return defaultVersion; } return implementationVersion; } public static final String VERSION; }