package com.forgeessentials.commons;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.jar.JarFile;
import java.util.jar.Manifest;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonIOException;
import com.google.gson.JsonObject;
import com.google.gson.JsonSyntaxException;
public abstract class BuildInfo
{
private static String buildHash = "N/A";
private static int buildNumber = 0;
private static int buildNumberLatest = 0;
private static Thread checkVersionThread;
public static final String VERSION = "1.4.1"; // update manually because gradle is a derp
static
{
// Check for latest version asap
checkLatestVersion();
}
public static void getBuildInfo(File jarFile)
{
try
{
if (jarFile != null)
{
try (JarFile jar = new JarFile(jarFile))
{
Manifest manifest = jar.getManifest();
buildHash = manifest.getMainAttributes().getValue("BuildID");
try
{
buildNumber = Integer.parseInt(manifest.getMainAttributes().getValue("Build-Number"));
}
catch (NumberFormatException e)
{
buildNumber = 0;
}
}
}
else
{
System.err.println(String.format("Unable to get FE version information (dev env / %s)", VERSION));
}
}
catch (IOException e1)
{
System.err.println(String.format("Unable to get FE version information (%s)", VERSION));
}
}
public static void checkLatestVersion()
{
if (checkVersionThread != null && checkVersionThread.isAlive())
return;
checkVersionThread = new Thread(new Runnable() {
@Override
public void run()
{
doCheckLatestVersion();
}
});
checkVersionThread.start();
}
private static void doCheckLatestVersion()
{
try
{
URL buildInfoUrl = new URL("http://ci.forgeessentials.com/job/FE/lastSuccessfulBuild/api/json");
URLConnection con = buildInfoUrl.openConnection();
con.setConnectTimeout(6);
con.setReadTimeout(12);
con.connect();
try (InputStreamReader is = new InputStreamReader(con.getInputStream()))
{
JsonObject versionInfo = new GsonBuilder().create().fromJson(is, JsonObject.class);
buildNumberLatest = versionInfo.get("number").getAsInt();
}
// TODO update to support milestone/recommended releases
}
catch (JsonSyntaxException | JsonIOException e)
{
System.err.println("Unable to parse version info");
}
catch (IOException e)
{
System.err.println("Unable to retrieve version info");
}
}
private static void joinCheckThread()
{
if (checkVersionThread != null)
{
try
{
checkVersionThread.join();
checkVersionThread = null;
}
catch (InterruptedException e)
{
/* do nothing */
}
}
}
public static void cancelVersionCheck()
{
// Set to null, which will disable joining of the thread and kill any possible delay
checkVersionThread = null;
}
public static String getBuildHash()
{
return buildHash;
}
public static int getBuildNumber()
{
return buildNumber;
}
public static int getBuildNumberLatest()
{
joinCheckThread();
return buildNumberLatest;
}
public static boolean isOutdated()
{
joinCheckThread();
return buildNumber > 0 && buildNumberLatest > buildNumber;
}
}