// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.data;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.tools.LanguageInfo;
/**
* Provides basic information about the currently used JOSM build.
*
*/
public class Version {
/** constant to indicate that the currnt build isn't assigned a JOSM version number */
static public final int JOSM_UNKNOWN_VERSION = 0;
/** the unique instance */
private static Version instance;
/**
* Load the specified resource as string.
*
* @param resource the resource url to load
* @return the content of the resource file; null, if an error occurred
*/
static public String loadResourceFile(URL resource) {
if (resource == null) return null;
BufferedReader in;
String s = null;
try {
in = new BufferedReader(new InputStreamReader(resource.openStream()));
StringBuffer sb = new StringBuffer();
for (String line = in.readLine(); line != null; line = in.readLine()) {
sb.append(line).append("\n");
}
s = sb.toString();
} catch (IOException e) {
System.err.println(tr("Failed to load resource ''{0}'', error is {1}.", resource.toString(), e.toString()));
e.printStackTrace();
}
return s;
}
/**
* Replies the unique instance of the version information
*
* @return the unique instance of the version information
*/
static public Version getInstance() {
if (instance == null) {
instance = new Version();
instance.init();
}
return instance;
}
private int version;
private String revision;
private String time;
private boolean isLocalBuild;
protected HashMap<String, String> parseManifestStyleFormattedString(String content) {
HashMap<String, String> properties = new HashMap<String, String>();
if (content == null) return properties;
Pattern p = Pattern.compile("^([^:]+):(.*)$");
for (String line: content.split("\n")) {
if (line == null || line.trim().equals("")) {
continue;
}
if (line.matches("^\\s*#.*$")) {
continue;
}
Matcher m = p.matcher(line);
if (m.matches()) {
properties.put(m.group(1), m.group(2));
}
}
return properties;
}
/**
* Initializes the version infos from the revision resource file
*
* @param revisionInfo the revision info loaded from a revision resource file
*/
protected void initFromRevisionInfo(String revisionInfo) {
if (revisionInfo == null) {
this.revision = tr("UNKNOWN");
this.version = JOSM_UNKNOWN_VERSION;
this.time = null;
return;
}
HashMap<String, String> properties = parseManifestStyleFormattedString(revisionInfo);
String value = properties.get("Revision");
if (value != null) {
value = value.trim();
try {
version = Integer.parseInt(value);
} catch(NumberFormatException e) {
version = 0;
System.err.println(tr("Warning: unexpected JOSM version number in revison file, value is ''{0}''", value));
}
} else {
version = JOSM_UNKNOWN_VERSION;
}
// the last changed data
//
time = properties.get("Last Changed Date");
if (time == null) {
time = properties.get("Build-Date");
}
// is this a local build ?
//
isLocalBuild = false;
value = properties.get("Is-Local-Build");
if (value != null && value.trim().toLowerCase().equals("true")) {
isLocalBuild = true;
}
// the revision info
//
StringBuffer sb = new StringBuffer();
for(Entry<String,String> property: properties.entrySet()) {
sb.append(property.getKey()).append(":").append(property.getValue()).append("\n");
}
revision = sb.toString();
}
public void init() {
URL u = Main.class.getResource("/REVISION");
if (u == null) {
System.err.println(tr("Warning: the revision file ''/REVISION'' is missing."));
version = 0;
revision = "";
return;
}
initFromRevisionInfo(loadResourceFile(u));
System.out.println(revision);
}
/**
* Replies the version string. Either the SVN revision "1234" (as string) or the
* the I18n equivalent of "UNKNOWN".
*
* @return the JOSM version
*/
public String getVersionString() {
return version == 0 ? tr("UNKNOWN") : Integer.toString(version);
}
/**
* Replies a text with the release attributes
*
* @return a text with the release attributes
*/
public String getReleaseAttributes() {
return revision;
}
/**
* Replies the build date as string
*
* @return the build date as string
*/
public String getTime() {
return time;
}
/**
* Replies the JOSM version. Replies {@see #JOSM_UNKNOWN_VERSION} if the version isn't known.
* @return the JOSM version
*/
public int getVersion() {
return version;
}
/**
* Replies true if this is a local build, i.e. an inofficial development build.
*
* @return true if this is a local build, i.e. an inofficial development build.
*/
public boolean isLocalBuild() {
return isLocalBuild;
}
public String getAgentString() {
int v = getVersion();
String s = (v == JOSM_UNKNOWN_VERSION) ? "UNKNOWN" : Integer.toString(v);
if (isLocalBuild() && v != JOSM_UNKNOWN_VERSION) {
s += " SVN";
}
return "JOSM/1.5 ("+ s+" "+LanguageInfo.getJOSMLocaleCode()+")";
}
}