package org.jivesoftware.sparkimpl.plugin.filetransfer.transfer.ui; /** * Provides static access to often used Time and Byte functions * * @author wolf.posdorfer * */ public class TransferUtils { /** * Calculates the speed when given a timedifference and bytedifference * * @param bytediff * in bytes * @param timediff * in milliseconds * @return <b>xx,x kB/s</b> or <b>xx,x MB/s</b> */ public static String calculateSpeed(long bytediff, long timediff) { double kB = calculateSpeedLong(bytediff, timediff); if (bytediff == 0 && timediff == 0) { return ""; } if (kB < 1024) { String KB = Double.toString(kB); // Convert 3.1415926535897932384626433832795 to 3.1 KB = splitAtDot(KB, 1); return KB + "kB/s"; } else { String MB = Double.toString((kB / 1024.0)); // Convert 3.1415926535897932384626433832795 to 3.1 MB = splitAtDot(MB, 1); return MB + "MB/s"; } } /** * Calculates the speed and returns a long in kB/s * * @param bytediff * @param timediff * @return kB/s */ public static double calculateSpeedLong(long bytediff, long timediff) { timediff = timediff == 0 ? 1 : timediff; double kB = ((bytediff / timediff) * 1000.0) / 1024.0; return kB; } /** * Calculate the estimated time of arrival * * @param currentsize * in byte * @param totalsize * in byte * @param timestart * in milliseconds * @param timenow * in milliseconds * @return time in (HH:MM:SS) */ public static String calculateEstimate(long currentsize, long totalsize, long timestart, long timenow) { long timediff = timenow - timestart; long sizeleft = totalsize - currentsize; // currentsize = timediff // sizeleft = x currentsize = currentsize == 0 ? 1L : currentsize; long x = sizeleft * timediff / currentsize; // Make it seconds x = x / 1000; return convertSecondstoHHMMSS(Math.round(x)); } /** * Converts given Seconds to HH:MM:SS * * @param second * in seconds * @return (HH:MM:SS) */ public static String convertSecondstoHHMMSS(int second) { int hours = Math.round(second / 3600); int minutes = Math.round((second / 60) % 60); int seconds = Math.round(second % 60); String hh = hours < 10 ? "0" + hours : "" + hours; String mm = minutes < 10 ? "0" + minutes : "" + minutes; String ss = seconds < 10 ? "0" + seconds : "" + seconds; return "(" + hh + ":" + mm + ":" + ss + ")"; } /** * Converts a given Byte into KB or MB or GB if applicable * @param bytes * @return "12 KB" or "27 MB" etc */ public static String getAppropriateByteWithSuffix(long bytes) { if(bytes >= 1099511627776L) { String x = splitAtDot(""+(bytes/1099511627776L),2); return x +" TB"; } else if(bytes >= 1073741824) { String x = splitAtDot(""+(bytes/1073741824L),2); return x +" GB"; } else if(bytes >= 1048576) { String x = splitAtDot(""+(bytes/1048576L),2); return x +" MB"; } else if(bytes >= 1024) { String x = splitAtDot(""+(bytes/1024L),2); return x +" KB"; } else return bytes + " B"; } /** * shorten a double or long with sig.digits<br> * splitAtDot("3.123",2) -> "3.12"<br> * does not round! * @param string * @param significantdigits * @return */ private static String splitAtDot(String string, int significantdigits) { if (string.contains(".")) { // no idea why but string.split doesnt like "." String s = string.replace(".", "T").split("T")[1]; if (s.length() >= significantdigits) { return string.substring(0, string.indexOf(".") + 1 + significantdigits); } else { return string .substring(0, string.indexOf(".") + 1 + s.length()); } } else return string; } }