blob: ec663eb4f81906cc11232e5b6ace0d890fa7a111 [file] [log] [blame]
package org.codehaus.jackson.util;
import java.io.*;
import java.util.regex.Pattern;
import org.codehaus.jackson.Version;
/**
* Functionality for supporting exposing of component {@link Version}s.
*
* @since 1.6
*/
public class VersionUtil
{
public final static String VERSION_FILE = "VERSION.txt";
private final static Pattern VERSION_SEPARATOR = Pattern.compile("[-_./;:]");
/**
* Helper method that will try to load version information for specified
* class. Implementation is simple: class loader that loaded specified
* class is asked to load resource with name "VERSION" from same
* location (package) as class itself had.
* If no version information is found, {@link Version#unknownVersion()} is
* returned.
*/
public static Version versionFor(Class<?> cls)
{
InputStream in;
Version version = null;
try {
in = cls.getResourceAsStream(VERSION_FILE);
if (in != null) {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"));
version = parseVersion(br.readLine());
} finally {
try {
in.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
} catch (IOException e) { }
return (version == null) ? Version.unknownVersion() : version;
}
public static Version parseVersion(String versionStr)
{
if (versionStr == null) return null;
versionStr = versionStr.trim();
if (versionStr.length() == 0) return null;
String[] parts = VERSION_SEPARATOR.split(versionStr);
// Let's not bother if there's no separate parts; otherwise use whatever we got
if (parts.length < 2) {
return null;
}
int major = parseVersionPart(parts[0]);
int minor = parseVersionPart(parts[1]);
int patch = (parts.length > 2) ? parseVersionPart(parts[2]) : 0;
String snapshot = (parts.length > 3) ? parts[3] : null;
return new Version(major, minor, patch, snapshot);
}
protected static int parseVersionPart(String partStr)
{
partStr = partStr.toString();
int len = partStr.length();
int number = 0;
for (int i = 0; i < len; ++i) {
char c = partStr.charAt(i);
if (c > '9' || c < '0') break;
number = (number * 10) + (c - '0');
}
return number;
}
}