package it.paspiz85.nanobot.util;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Enumeration;
import java.util.jar.JarFile;
import java.util.jar.Manifest;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
import org.kohsuke.github.GHRepository;
import org.kohsuke.github.GitHub;
/**
* Build information retriever.
*
* @author paspiz85
*
*/
public final class BuildInfo {
private static final String AD_URL = "http://paspiz85.altervista.org/nanobot/ad.php";
private static final String DONATE_URL = "https://cdn.rawgit.com/paspiz85/nanobot/master/src/site/resources/donate.html";
private static final String GITHUB_URL = "https://github.com/";
private static final String NAME = "NanoBot";
private static final String RELEASES_LATEST_PATH = "/releases/latest";
private static final String REPOSITORY_NAME = "paspiz85/nanobot";
public static BuildInfo instance() {
return Utils.singleton(BuildInfo.class, () -> new BuildInfo());
}
private final Logger logger = Logger.getLogger(getClass().getName());
private final Manifest manifest;
private BuildInfo() {
Manifest manifest = null;
try {
final Enumeration<URL> resources = getClass().getClassLoader().getResources(JarFile.MANIFEST_NAME);
while (resources.hasMoreElements()) {
final URL url = resources.nextElement();
logger.finer("Searching manifest in " + url);
try (InputStream in = url.openStream()) {
final Manifest man = new Manifest(in);
if (NAME.toLowerCase().equals(man.getMainAttributes().getValue("Build-Name"))) {
manifest = man;
logger.finer("Manifest found");
break;
}
}
}
} catch (final IOException e) {
logger.log(Level.SEVERE, e.getMessage(), e);
}
this.manifest = manifest;
}
public String checkForUpdate() {
logger.finer("checkForUpdate");
String result = null;
final String current = getVersion();
final String release = getLatestVersion();
if (current != null && release != null) {
logger.finer("Comparing current and release versions");
final DefaultArtifactVersion currentVersion = new DefaultArtifactVersion(current);
final DefaultArtifactVersion releaseVersion = new DefaultArtifactVersion(release);
final int compare = currentVersion.compareTo(releaseVersion);
logger.finer("Comparing result is " + compare);
if (compare != 0) {
result = release;
}
}
logger.finer("checkForUpdate result is " + result);
return result;
}
public String getAdUrl() {
return AD_URL;
}
public String getDonateUrl() {
return DONATE_URL;
}
public String getFullName() {
String buildName;
final String version = getVersion();
if (version == null) {
buildName = "Development build";
} else {
buildName = NAME + " v" + version;
}
return buildName;
}
public String getLatestVersion() {
String result = null;
try {
final GitHub github = GitHub.connectAnonymously();
final GHRepository repository = github.getRepository(REPOSITORY_NAME);
result = repository.listReleases().asList().stream().map((r) -> r.getName().substring(1)).max((a, b) -> {
return new DefaultArtifactVersion(a).compareTo(new DefaultArtifactVersion(b));
}).orElse(null);
} catch (final IOException e) {
logger.log(Level.WARNING, "Unable to get latest version", e);
}
return result;
}
public String getLatestVersionUrl() {
return GITHUB_URL + REPOSITORY_NAME + RELEASES_LATEST_PATH;
}
private String getManifestAttribute(final String name) {
String result = null;
if (manifest != null) {
result = manifest.getMainAttributes().getValue(name);
}
return result;
}
public String getName() {
return NAME;
}
public String getRepositoryUrl() {
return GITHUB_URL + REPOSITORY_NAME;
}
public String getTimestamp() {
return getManifestAttribute("Build-Timestamp");
}
public String getVersion() {
return getManifestAttribute("Build-Version");
}
}