summaryrefslogblamecommitdiffstats
path: root/dozentenmodul/src/main/java/org/openslx/dozmod/util/ClientVersion.java
blob: 9a124b1754cb65644e30d20dcec189eb3f3c82a8 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11

                                


                                 
                    




                                

                            



                                                                                   
        

                                                      

                                                    

                                    
                                   
                                                                        
         


















                                                                             





                                                               
                 

                                         






                                                                
                               

                                                     
                 
                                      
         






                                                                       
                               



                                                       
         




                                                                     






                                                                            
         



                                                                         
                                                



                                                                           

                                             







                                                                                               
                               
                 















                                                                                          
                                              
                                                                          


                                                                       
         







                                                                              



                                             
                                                     




















                                                                                             

                                                    
                                                             
                 

         





                                      

         
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;
	}
}