/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.utils.common;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.osgi.framework.Bundle;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.Version;
/**
* Utility class for version-related operations.
*
* @author Robert Mischke
* @author Jan Flink
* @author Doreen Seider
*/
public final class VersionUtils {
// TODO this class needs refactoring: initialization should be done once, and the release types should be an enum - misc_ro
/**
* Release build type.
*/
public static final String VERSION_TYPE_RELEASE = "Release";
/**
* Snapshot build type.
*/
public static final String VERSION_TYPE_SNAPSHOT = "Snapshot";
/**
* RC build type.
*/
public static final String VERSION_TYPE_RELEASE_CANDIDATE = "Release_Candidate";
/**
* Development build type, e.g. running from an IDE.
*/
public static final String VERSION_TYPE_DEVELOPMENT = "Development";
private static final String VERSION_INFO_RCE_STANDARD = "de.rcenvironment.core.gui.branding.default.versioninfo";
private static final String PLATFORM_BUNDLES_PREFIX = "de.rcenvironment.platform.";
private static final Class<?> OWN_CLASS = VersionUtils.class;
private VersionUtils() {}
/**
* @return the OSGi version of the RCE "core" bundles, or <code>null</code> if it could not be determined
*/
public static Version getVersionOfCoreBundles() {
Bundle ownBundle = FrameworkUtil.getBundle(OWN_CLASS);
if (ownBundle == null) {
return null;
}
Version coreVersion = ownBundle.getVersion();
return coreVersion;
}
/**
* @return the OSGi version of the RCE "platform" bundles, or <code>null</code> if it could not be determined
*/
public static Version getVersionOfPlatformBundles() {
Log log = LogFactory.getLog(OWN_CLASS); // not a static field to conserve memory
Bundle ownBundle = FrameworkUtil.getBundle(OWN_CLASS);
Bundle[] bundles = ownBundle.getBundleContext().getBundles();
Version version = null;
if (bundles == null) {
log.error("Unexpected error: 'null' bundle list while getting platform version");
} else {
// find all platform bundles by their symbolic name
for (Bundle bundle : bundles) {
if (bundle.getSymbolicName().startsWith(PLATFORM_BUNDLES_PREFIX)) {
Version newVersion = bundle.getVersion();
// all bundles must have the same version
if (version != null && !version.equals(newVersion)) {
log.error("Found more that one platform version: " + newVersion + " and " + version);
}
version = newVersion;
}
}
}
return version;
}
/**
* @return the OSGi version of the RCE "product" determined via the product specific branding bundles, <code>null</code> if it could not
* be determined
*/
public static Version getVersionOfProduct() {
Log log = LogFactory.getLog(OWN_CLASS); // not a static field to conserve memory
Bundle ownBundle = FrameworkUtil.getBundle(OWN_CLASS);
Bundle[] bundles = ownBundle.getBundleContext().getBundles();
Version version = null;
if (bundles == null) {
log.error("Unexpected error: 'null' bundle list while getting product version");
} else {
// find bundles by their symbolic name
for (Bundle bundle : bundles) {
if (bundle.getSymbolicName().startsWith(VERSION_INFO_RCE_STANDARD)) {
version = bundle.getVersion();
break;
}
}
}
return version;
}
/**
* @param version {@link Version} to parse
* @return version number of the {@link Version} given + optional type of version (RC, Snapshot)
*/
public static String getVersionAsString(Version version) {
String versionNumber = version.getMajor() + "." + version.getMinor() + "." + version.getMicro();
String versionQualifier = version.getQualifier();
String versionType = getVersionType(versionQualifier);
if (versionType == VERSION_TYPE_RELEASE) {
return versionNumber;
} else {
return StringUtils.format("%s_%s", versionNumber, versionType);
}
}
/**
* Detects the version/build type from a given bundle version qualifier.
*
* TODO convert the return value to an enum
*
* @param versionQualifier the qualifier of the tested OSGi bundle version
* @return a string matching the version type
*/
public static String getVersionType(String versionQualifier) {
final String suffixSnapshot = "_SNAPSHOT";
final String suffixRC = "_RC";
final String suffixQualifier = "qualifier";
String versionType = VERSION_TYPE_RELEASE; // default
if (versionQualifier.endsWith(suffixRC)) {
versionType = VERSION_TYPE_RELEASE_CANDIDATE;
} else if (versionQualifier.endsWith(suffixSnapshot)) {
versionType = VERSION_TYPE_SNAPSHOT;
} else if (versionQualifier.endsWith(suffixQualifier)) {
versionType = VERSION_TYPE_DEVELOPMENT;
}
return versionType;
}
/**
* @param version {@link Version} containing the build ID
* @return build ID of the {@link Version} given or <code>null</code> if no one exists
*/
public static String getBuildIdAsString(Version version) {
if (version.getQualifier().endsWith("qualifier")) {
return null;
} else {
return version.getQualifier().split("^" + version.getMajor() + "\\." + version.getMinor() + "\\." + version.getMicro())[0];
}
}
/**
* @return true if the core bundles indicate a release or RC build
*/
public static boolean isReleaseOrReleaseCandidateBuild() {
// TODO as stated above, this class needs refactoring - misc_ro
Version version = getVersionOfCoreBundles(); // TODO review: better to use the product version instead?
String versionQualifier = version.getQualifier();
String versionType = getVersionType(versionQualifier);
return VERSION_TYPE_RELEASE.equals(versionType) || VERSION_TYPE_RELEASE_CANDIDATE.equals(versionType);
}
}