package water.init; import org.apache.commons.io.IOUtils; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.regex.Pattern; import water.H2O; import water.util.FileUtils; abstract public class AbstractBuildVersion { // A date format use for compiledOn field static String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; // Threshold to identify too old version static int TOO_OLD_THRESHOLD = 100 /* days */; // A link to the latest version identifier static String LATEST_STABLE_URL = " http://h2o-release.s3.amazonaws.com/h2o/latest_stable"; // Pattern to extract version from URL static Pattern VERSION_EXTRACT_PATTERN = Pattern.compile(".*h2o-(.*).zip"); // Devel version has a specific patch number X.Y.Z.99999 public static String DEVEL_VERSION_PATCH_NUMBER = "99999"; abstract public String branchName(); abstract public String lastCommitHash(); abstract public String describe(); abstract public String projectVersion(); abstract public String compiledOn(); abstract public String compiledBy(); @Override public String toString() { return "H2O v"+projectVersion()+ " ("+branchName()+" - "+lastCommitHash()+")"; } public String buildNumber() { String pv = projectVersion(); if (pv.equals(UNKNOWN_VERSION_MARKER)) { return UNKNOWN_VERSION_MARKER; } String[] split_pv = pv.split("\\."); String bn = split_pv[split_pv.length-1]; return(bn); } /** Returns compile date for this H2O version or null. */ public final Date compiledOnDate() { SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT); try { return dateFormat.parse(compiledOn()); } catch (ParseException e) { return null; } } public final boolean isTooOld() { Date compileTime = compiledOnDate(); if (compileTime == null) return false; long timeDiff = System.currentTimeMillis() - compileTime.getTime(); long days = timeDiff / (24*60*60*1000L) /* msec per day */; return days > TOO_OLD_THRESHOLD; } /** Return version number of the latest stable * H2O or null if it cannot be fetched. * @return the latest H2O version or null if it cannot be fetched. */ public String getLatestH2OVersion() { InputStream is = null; try { URL url = new URL(LATEST_STABLE_URL); // Get connection explicitly and setup small timeouts URLConnection conn = url.openConnection(); conn.setConnectTimeout(1000 /* ms */); conn.setReadTimeout(1000 /* ms */); return extractVersionFromUrl(IOUtils.toString(is = conn.getInputStream())); } catch (Exception e) { return "unknown"; } finally { FileUtils.close(is); } } private static String extractVersionFromUrl(String downloadUrl) { java.util.regex.Matcher m = VERSION_EXTRACT_PATTERN.matcher(downloadUrl); if (m.find()) { return m.group(1); } else { return "unknown"; } } public boolean isDevVersion() { return projectVersion().equals(UNKNOWN_VERSION_MARKER) || projectVersion().endsWith(DEVEL_VERSION_PATCH_NUMBER); } /** Dummy version of H2O. */ private static final String UNKNOWN_VERSION_MARKER = "(unknown)"; public static final AbstractBuildVersion UNKNOWN_VERSION = new AbstractBuildVersion() { @Override public String projectVersion() { return UNKNOWN_VERSION_MARKER; } @Override public String lastCommitHash() { return UNKNOWN_VERSION_MARKER; } @Override public String describe() { return UNKNOWN_VERSION_MARKER; } @Override public String compiledOn() { return UNKNOWN_VERSION_MARKER; } @Override public String compiledBy() { return UNKNOWN_VERSION_MARKER; } @Override public String branchName() { return UNKNOWN_VERSION_MARKER; } }; }