/*
* RHQ Management Platform
* Copyright (C) 2005-2008 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.rhq.enterprise.client;
import java.io.File;
import java.net.URL;
import java.util.Map;
import java.util.Properties;
import java.util.jar.Attributes;
import java.util.jar.JarFile;
import java.util.jar.Manifest;
/**
* Utility that can be used to determine the version of the software.
*
* @author John Mazzitelli
*/
public class Version {
/**
* Version property whose value is the product name.
*/
public static final String PROP_PRODUCT_NAME = "Implementation-Title";
/**
* Version property whose value is the product version.
*/
public static final String PROP_PRODUCT_VERSION = "Implementation-Version";
/**
* Version property whose value is the source code revision number used to make the build.
*/
public static final String PROP_BUILD_NUMBER = "Build-Number";
/**
* Version property whose value is the date when this version of the product was built.
*/
public static final String PROP_BUILD_DATE = "Build-Time";
/**
* Version property whose value is the vendor of the JDK that built this version of the product.
*/
public static final String PROP_BUILD_JDK_VENDOR = "Java-Vendor";
/**
* Version property whose value is the version of the JDK that built this version of the product.
*/
public static final String PROP_BUILD_JDK_VERSION = "Java-Version";
/**
* Version property whose value identifies the build machine's operating system.
*/
public static final String PROP_BUILD_OS_NAME = "Os-Name";
/**
* Version property whose value is the build machine's operating system version.
*/
public static final String PROP_BUILD_OS_VERSION = "Os-Version";
/**
* Caches the version properties so we don't have to keep reading the file.
* These properties should never change during the lifetime of the agent, so
* we can cache these forever in memory.
*/
private static Properties propertiesCache = null;
/**
* A main method that can be used to determine the version information from a command line.
*
* @param args the version properties to print to stdout; if no arguments are given then all version properties are
* printed
*/
public static void main(String[] args) {
System.out.println("==========");
if (args.length == 0) {
System.out.println(getVersionPropertiesAsString());
} else {
Properties props = getVersionProperties();
for (int i = 0; i < args.length; i++) {
String key = args[i];
String value = props.getProperty(key);
if (value == null) {
value = "<unknown>";
}
System.out.println(key + "=" + value);
}
}
System.out.println("==========");
}
/**
* Returns the product name and its version string.
*
* @return "productName Version"
*/
public static String getProductNameAndVersion() {
Properties props = getVersionProperties();
String name = props.getProperty(PROP_PRODUCT_NAME);
String version = props.getProperty(PROP_PRODUCT_VERSION);
//Conditionally check for and apply update/patch version details
String updatePortion = getUpdateVersion();
if (updatePortion == null) {
updatePortion = "";
}
//Ex. GA[RHQ Enterprise Remote CLI 4.9.0.JON320GA] or Update 01[RHQ Enterprise Remote CLI 4.9.0.JON320GA Update 01]
return name + ' ' + version + (updatePortion.trim().length() == 0 ? "" : " " + updatePortion);
}
/**
* Returns the product name and its version string, with more build details about the version.
*
* @return "productName Version"
*/
public static String getProductNameAndVersionBuildInfo() {
Properties props = getVersionProperties();
String name = props.getProperty(PROP_PRODUCT_NAME);
String version = props.getProperty(PROP_PRODUCT_VERSION);
String buildNum = props.getProperty(PROP_BUILD_NUMBER);
String buildDate = props.getProperty(PROP_BUILD_DATE);
//Conditionally check for and apply update/patch version details
String updatePortion = getUpdateVersion();
if (updatePortion == null) {
updatePortion = "";
}
//Ex. GA[RHQ Enterprise Remote CLI 4.9.0.JON320GA (dcb8b6f:734bd56)] or Update 01[RHQ Enterprise Remote CLI 4.9.0.JON320GA Update 01 (dcb8b6f:734bd56)]
return name + ' ' + version + (updatePortion.trim().length() == 0 ? "" : " " + updatePortion) + " (" + buildNum
+ ") " + buildDate;
}
/**
* Returns just the product name.
*
* @return product name
*/
public static String getProductName() {
Properties props = getVersionProperties();
String name = props.getProperty(PROP_PRODUCT_NAME);
return name;
}
/**
* Returns just the product version.
*
* @return product version
*/
public static String getProductVersion() {
Properties props = getVersionProperties();
String version = props.getProperty(PROP_PRODUCT_VERSION);
return version;
}
/**
* Returns just the product build date.
*
* @return product build date
*/
public static String getBuildDate() {
Properties props = getVersionProperties();
String build_date = props.getProperty(PROP_BUILD_DATE);
return build_date;
}
/**
* Returns just the product build number.
*
* @return product build number
*/
public static String getBuildNumber() {
Properties props = getVersionProperties();
String build_num = props.getProperty(PROP_BUILD_NUMBER);
return build_num;
}
/**
* Returns a set of properties that can be used to identify this version of the product.
*
* @return properties identifying this version
*
* @throws RuntimeException if there is no version info found in the current thread's class loader
*/
public static Properties getVersionProperties() {
if (propertiesCache == null) {
Manifest manifest;
try {
URL jarUrl = Version.class.getProtectionDomain().getCodeSource().getLocation();
JarFile jarFile = new JarFile(new File(jarUrl.toURI()));
try {
manifest = jarFile.getManifest();
} finally {
jarFile.close();
}
} catch (Exception e) {
return new Properties();
}
Attributes mainAttributes = manifest.getMainAttributes();
Properties newProps = new Properties();
for (Map.Entry<Object, Object> entry : mainAttributes.entrySet()) {
String name = entry.getKey().toString();
String value = entry.getValue().toString();
newProps.setProperty(name, value);
}
propertiesCache = newProps;
}
Properties retProps = new Properties();
retProps.putAll(propertiesCache);
return retProps;
}
/**
* Returns the version properties in a single string with all properties on a single line separated with a newline.
*
* @return the version properties in one big string
*/
public static String getVersionPropertiesAsString() {
Properties props = getVersionProperties();
StringBuilder str = new StringBuilder();
for (Map.Entry<Object, Object> entry : props.entrySet()) {
str.append(entry.getKey().toString() + '=' + entry.getValue().toString() + '\n');
}
return str.toString();
}
// Update property which records update/patch version: Ex. update-1, cp1, etc.
public static String getUpdateVersion() {
return "";
}
}