blob: 9a124b1754cb65644e30d20dcec189eb3f3c82a8 (
plain) (
tree)
|
|
package org.openslx.dozmod.util;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.jar.Attributes;
import java.util.jar.Manifest;
import org.apache.log4j.Logger;
import com.google.gson.Gson;
// ClientVersion is a bad name, TODO find better suited one :)
public class ClientVersion {
private static final Logger LOGGER = Logger.getLogger(ClientVersion.class);
private static Long localRevisionTime = null;
private static Long remoteRevisionTime = null;
private static String localRevision = null;
private static String remoteRevision = null;
private static void init() {
loadLocalVersion();
loadRemoteVersion("http://132.230.4.25/dozmod.version");
}
/**
* Gets the local revision id if loading it worked, "???" otherwise.
*
* @return id as String
*/
public static String getLocalRevision() {
if (localRevision == null) {
init();
if (localRevision == null)
// fallback for dev purposes...
localRevision = "???";
}
return localRevision;
}
/**
* @return
*/
public static long getLocalRevTimestamp() {
if (localRevisionTime == null) {
init();
if (localRevisionTime == null)
// fallback for dev purposes...
localRevisionTime = 0L;
}
return localRevisionTime;
}
/**
* Gets the revision id of the latest remote version
*
* @return id as String if loading worked, "-" otherwise
*/
public static String getRemoteRevision() {
if (remoteRevision == null) {
init();
if (remoteRevision == null)
remoteRevision = "-";
}
return remoteRevision;
}
/**
* Gets the timestamp of the latest remote version
*
* @return timestamp as Long if loading it worked, 0L otherwise
*/
public static long getRemoteRevTimestamp() {
if (remoteRevisionTime == null) {
init();
if (remoteRevisionTime == null)
return 0L;
}
return remoteRevisionTime;
}
/**
* Checks if we are running latest bwSuite version
*
* @return true if there is no newer version, false otherwise
*/
public static boolean isNewest() {
if (localRevisionTime == null || remoteRevisionTime == null)
init();
// fallback if the above did not work: fail
if (localRevisionTime == null || remoteRevisionTime == null)
return true;
return localRevisionTime >= remoteRevisionTime;
}
/**
* Loads the local version information from the jar's MANIFEST.MF
* into the fields 'localRevision' and 'localRevisionTime'
*/
private static void loadLocalVersion() {
Class clazz = ClientVersion.class;
String className = clazz.getSimpleName() + ".class";
String classPath = clazz.getResource(className).toString();
if (!classPath.startsWith("jar")) {
// Class not from JAR
return;
}
String manifestPath = classPath.substring(0, classPath.lastIndexOf("!") + 1) +
"/META-INF/MANIFEST.MF";
Manifest manifest = null;
try {
manifest = new Manifest(new URL(manifestPath).openStream());
} catch (Exception e) {
LOGGER.error("Could not open MANIFEST", e);
return;
}
Attributes attributes = manifest.getMainAttributes();
// if attr are null, then we couldn't open the jar's MANIFEST
// since we are probably not in a jar context, just do nothing
if (attributes == null)
return;
String manifestRev = null;
String manifestRevTime = null;
try {
manifestRev = attributes.getValue("Build-Revision");
manifestRevTime = attributes.getValue("Build-Revision-Timestamp");
} catch (IllegalArgumentException e) {
LOGGER.warn("Error while reading version: ", e);
return;
}
if (manifestRev != null)
localRevision = manifestRev;
if (manifestRevTime != null) {
localRevisionTime = Long.valueOf(manifestRevTime);
// hax since we get milliseconds not seconds
localRevisionTime = localRevisionTime / 1000L;
}
}
/**
* Loads the given UrlString as JSON and saves the remote information
* into fields 'remoteRevision' and 'remoteRevisionTime'
*
* The remote JSON should have 'timestamp' and 'revision', like:
* { "timestamp": 1, "revision": 2 }
*/
private static void loadRemoteVersion(final String urlString) {
Gson gson = new Gson();
String json = null;
BufferedReader reader = null;
try {
URL url = new URL(urlString);
reader = new BufferedReader(new InputStreamReader(url.openStream()));
StringBuffer buffer = new StringBuffer();
int read;
char[] chars = new char[1024];
while ((read = reader.read(chars)) != -1)
buffer.append(chars, 0, read);
json = buffer.toString();
} catch (Exception e) {
LOGGER.error("Could not fetch remote version", e);
return;
} finally {
if (reader != null)
try {
reader.close();
} catch (IOException e) {
}
}
VersionQuery query = gson.fromJson(json, VersionQuery.class);
if (query.revision != null)
remoteRevision = query.revision;
if (query.timestamp != null) {
// seconds timestamp here...
remoteRevisionTime = query.timestamp;
}
}
/**
* Class for GSON json parsing
*/
static class VersionQuery {
Long timestamp;
String revision;
}
}
|