All Downloads are FREE. Search and download functionalities are using the official Maven repository.

liquibase.util.LiquibaseUtil Maven / Gradle / Ivy

There is a newer version: 4.31.1
Show newest version
package liquibase.util;

import liquibase.exception.UnexpectedLiquibaseException;
import liquibase.integration.commandline.CommandLineUtils;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.Properties;
import java.util.jar.Attributes;
import java.util.jar.Manifest;

public class LiquibaseUtil {

    public static String getBuildVersion() {
        return getBuildInfo("build.version","Bundle-Version");
    }

    public static String getBuildTime() {
        return getBuildInfo("build.timestamp", "Build-Time");
    }

    // will extract the information from either buildinfo.properties, which should be a properties file in
    // the jar file, or from the jar file's MANIFEST.MF, which should also have similar information.
    private static String getBuildInfo(String propertyId, String manifestId) {
        String buildInfoValue = "UNKNOWN";

        Class clazz = LiquibaseUtil.class;
        String className = clazz.getSimpleName() + ".class";
        String classPath = clazz.getResource(className).toString();
        if (classPath.startsWith("jar")) {
            String manifestPath = classPath.substring(0, classPath.lastIndexOf("!") + 1) +
                    "/META-INF/MANIFEST.MF";
            Manifest manifest = null;
            try {
                manifest = new Manifest(new URL(manifestPath).openStream());
            } catch (IOException e) {
                throw new UnexpectedLiquibaseException("Cannot open a URL to the manifest of our own JAR file.");
            }
            Attributes attr = manifest.getMainAttributes();
            buildInfoValue = attr.getValue(manifestId);
        }

        if (buildInfoValue.equals("UNKNOWN")) {
            Properties buildInfo = new Properties();
            ClassLoader classLoader = LiquibaseUtil.class.getClassLoader();

            URL buildInfoFile = classLoader.getResource("buildinfo.properties");
            InputStream in = null;
            try {
                if (buildInfoFile != null) {
                    URLConnection connection = buildInfoFile.openConnection();
                    connection.setUseCaches(false);
                    in = connection.getInputStream();
                    buildInfo.load(in);
                    String o = (String) buildInfo.get(propertyId);

                    if (o != null) {
                        buildInfoValue = o;
                    }
                }

            } catch (IOException e) {
                // This is not a fatal exception.
                // Build info will be returned as 'UNKNOWN'        }
            } finally {
                if (in != null) {
                    try {
                        in.close();
                    } catch (IOException e) {
                        // TODO Log this error and remove the RuntimeException.
                        throw new RuntimeException("Failed to close InputStream in LiquibaseUtil.", e);
                    }
                }
            }
        }
        return buildInfoValue;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy