ChestShop-3/src/main/java/com/Acrobot/ChestShop/Updater/JenkinsBuildsNotifier.java

125 lines
4.5 KiB
Java

package com.Acrobot.ChestShop.Updater;
import com.Acrobot.ChestShop.ChestShop;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.Plugin;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.logging.Level;
public class JenkinsBuildsNotifier implements Runnable {
private final Plugin plugin;
private final File configFile;
private final FileConfiguration config;
private int build;
private URL apiUrl;
public JenkinsBuildsNotifier(Plugin plugin, String jenkinsJobUrl) {
this.plugin = plugin;
configFile = new File(plugin.getDataFolder(), "jenkinsBuildsNotifier.yml");
if (configFile.exists()) {
config = YamlConfiguration.loadConfiguration(configFile);
} else {
config = new YamlConfiguration();
config.addDefault("disabled", false);
config.addDefault("jenkins-job-url-override", "");
config.options().copyDefaults(true);
saveConfig();
}
if (config.getBoolean("disabled")) {
return;
}
build = getBuildNumber();
if (build < 1) {
plugin.getLogger().log(Level.WARNING, "Unable to parse plugin build from version string! (" + plugin.getDescription().getVersion() + ")");
return;
}
String jenkinsJobUrlOverride = config.getString("jenkins-job-url-override");
if (jenkinsJobUrlOverride != null && !jenkinsJobUrlOverride.isEmpty()) {
jenkinsJobUrl = jenkinsJobUrlOverride;
}
try {
apiUrl = new URL(jenkinsJobUrl + "api/json");
ChestShop.runInAsyncThread(this);
} catch (MalformedURLException e) {
plugin.getLogger().log(Level.WARNING, "Can not check for new dev builds as " + jenkinsJobUrl + "api/json is not a valid url!", e);
}
}
private void saveConfig() {
try {
config.save(configFile);
} catch (IOException e) {
plugin.getLogger().log(Level.WARNING, "Error while saving " + configFile.getName() + "! " + e.getMessage());
}
}
private int getBuildNumber() {
String tag = "(build ";
String versionStr = plugin.getDescription().getVersion();
int start = versionStr.indexOf(tag);
int end = versionStr.indexOf(')', start);
if (start > 0 && end > start) {
try {
return Integer.parseInt(versionStr.substring(start + tag.length(), end));
} catch (NumberFormatException ignored) {}
}
return -1;
}
@Override
public void run() {
try {
JsonObject responseJson = queryJson();
if (responseJson.has("lastStableBuild") && responseJson.get("lastStableBuild").isJsonObject()) {
JsonObject lastStable = responseJson.getAsJsonObject("lastStableBuild");
int lastStableBuild = lastStable.get("number").getAsInt();
if (lastStableBuild > build && config.getInt("last-announced-build", 0) < lastStableBuild) {
String url = lastStable.get("url").getAsString();
plugin.getLogger().log(Level.INFO, "A new development build is available for testing: " + url);
config.set("last-announced-build", lastStableBuild);
saveConfig();
}
}
} catch (Exception e) {
plugin.getLogger().log(Level.WARNING, "Error while trying to query Jenkins API", e);
}
}
private JsonObject queryJson() throws IOException {
HttpURLConnection con = (HttpURLConnection) apiUrl.openConnection();
con.setRequestProperty("User-Agent", plugin.getName() + " " + plugin.getDescription().getVersion() + " Jenkins Builds Notifier");
con.setRequestMethod("GET");
StringBuilder msg = new StringBuilder();
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
String line;
while((line = in.readLine()) != null) {
if(msg.length() != 0) {
msg.append("\n");
}
msg.append(line);
}
in.close();
return new JsonParser().parse(msg.toString()).getAsJsonObject();
}
}