/*
* RHQ Management Platform
* Copyright (C) 2005-2009 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.agent;
import java.io.InputStream;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Properties;
/**
* 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 = "Product-Name";
/**
* Version property whose value is the product version.
*/
public static final String PROP_PRODUCT_VERSION = "Product-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-Date";
/**
* 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 = "Build-Jdk-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 = "Build-Jdk";
/**
* Version property whose value identifies the build machine's operating system.
*/
public static final String PROP_BUILD_OS_NAME = "Build-OS-Name";
/**
* Version property whose value is the build machine's operating system version.
*/
public static final String PROP_BUILD_OS_VERSION = "Build-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>";
} else if (PROP_BUILD_DATE.equals(key)) {
Date date = getVersionPropertyAsDate(value);
if (date != null) {
value = date.toString();
}
}
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 4.9.0.JON320GA [734bd56] or Update 02[RHQ 4.9.0.JON320GA Update 02 [734bd56]]
if (updatePortion.trim().length() == 0){
return "" + name + " " + version;
} else {
String[] versionElements = version.split(" ");
if (versionElements.length==2){
return "" + name + " " + versionElements[0] + " " + updatePortion + " " + versionElements[1];
}else{
return "" + name + " " + version + " " + updatePortion;
}
}
}
/**
* 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, or <code>null</code> if the date could not be determined due to an invalid date
* format
*/
public static Date getBuildDate() {
Properties props = getVersionProperties();
String build_date = props.getProperty(PROP_BUILD_DATE);
Date date = getVersionPropertyAsDate(build_date);
return 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 file found in the current thread's class loader
*/
public static Properties getVersionProperties() {
if (propertiesCache == null) {
ClassLoader cl = Version.class.getClassLoader();
InputStream stream = cl.getResourceAsStream("rhq-agent-version.properties");
Properties newProps = new Properties();
try {
try {
newProps.load(stream);
} finally {
stream.close();
}
} catch (Exception e) {
throw new RuntimeException(e);
}
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();
Date date = getBuildDate();
if (date != null) {
props.setProperty(PROP_BUILD_DATE, date.toString()); // just puts date in a more appropriate form
}
String updateVersion = getUpdateVersion();
if ((updateVersion != null) && (!updateVersion.trim().isEmpty())) {
String current = props.getProperty("Module-Version");
props.setProperty("Module-Version", current + " " + updateVersion); // just postPends Ex. Update 02
}
return StringUtil.justifyKeyValueStrings(props);
}
/**
* When a version property represents a date, this method will take that date string and convert it to a <code>
* java.util.Date</code> object.
*
* <p>Assumes the date string is in the en.US locale based form of <code>dd.MMM.yyyy HH.mm.ss z</code></p>
*
* @param date_string the version property date string to convert
*
* @return the converted <code>dataString</code> as a <code>java.util.Date</code> object or <code>null</code> if the
* date string was in an invalid format
*/
public static Date getVersionPropertyAsDate(String date_string) {
Date ret_date = null;
if (date_string != null) {
SimpleDateFormat format = new SimpleDateFormat("dd.MMM.yyyy HH.mm.ss z", Locale.US);
ret_date = format.parse(date_string, new ParsePosition(0));
}
return ret_date;
}
// Update property which records update/patch version: Ex. update-1, cp1, etc.
public static String getUpdateVersion() {
return "";
}
}