package com.felix.util; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintStream; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.Iterator; import java.util.Map; import java.util.Random; import java.util.UUID; import java.util.Vector; import com.felix.util.logging.Log4JLogger; import com.felix.util.logging.LoggerInterface; /** * Several helper methods. * * @author felix * */ public class Util { public final static int PROGRESS_MODULO = 10; /** * Test if an object is null or doesnt contain values. * * @param o * The object, e.g. "" * @return The outcome, e.g. true. */ public static final boolean isEmpty(Object o) { if (null == o) return true; if (o instanceof String && ((String) o).length() == 0) return true; if (o instanceof Vector<?> && ((Vector<?>) o).size() == 0) return true; if (o instanceof Map && ((Map) o).size() == 0) return true; return false; } /** * Print a dot to stdout once in a while. * */ public static void printProgress(int counter) { if (counter % PROGRESS_MODULO == 0) System.out.print("."); } /** * Test if some String is contained in an array of Strings. * * @param key * The key, e.g. "a". * @param array * The array, e.g. {"A", "b" "c"} * @return The result, e.g. "true". */ public static boolean isStringContainedInArray(String key, String array[]) { for (int i = 0; i < array.length; i++) { if (array[i].compareTo(key) == 0) return true; } return false; } /** * Get an array of unique random integers distributed between 0 and num. * * @param num * The max integer. * @return The array. */ public static int[] getRandomInts(int num) { int[] a = new int[num]; for (int i = num - 1; i >= 0; --i) { a[i] = i; } return getRandomIntArray(a); } /** * Get an array of randomized integers. * * @param src * The ordered integer array. * @return The randomized array. */ public static int[] getRandomIntArray(int[] src) { if (src == null) { return null; } Random rd = new Random(); int[] tmp = new int[src.length]; int num = src.length; int index; for (int i = 0; i < src.length; i++) { index = Math.abs(rd.nextInt()) % num; tmp[i] = src[index]; src[index] = src[num - 1]; num--; } return tmp; } public static int getRandomInteger(int max) { return new Random().nextInt(max); } /** * Return a random alphanumeric identifer * * @param length * The string length. * @return The identifier. */ public static String getRandomId(int length) { Random random = new Random(); return UUID.randomUUID().toString().replace("-", "") .substring(0, length); } /** * Print stacktrace and report to logger. * * @param msg * The message. * @param logger * The logger. */ public static void reportError(Exception e, Log4JLogger logger) { e.printStackTrace(); logger.error(e.getMessage()); } /** * Print msg to system.err and logger.error * * @param msg * The message. * @param logger * The logger. */ public static void errorToSystem(String msg, Log4JLogger logger) { System.err.println(msg); logger.error(msg); } /** * Return a subset of an array. * * @param in * @param start * @param end * @return */ public static Object[] subArray(Object in[], int start, int end) { Object[] ret = new Object[end - start + 1]; int j = 0; for (int i = start; i <= end; i++) { ret[j++] = in[i]; } return ret; } /** * Return a subset of an array. * * @param in * @param start * @param end * @return */ public static String[] subStringArray(String in[], int start, int end) { String[] ret = new String[end - start]; int j = 0; for (int i = start; i < end; i++) { ret[j++] = in[i]; } return ret; } /** * Report an error (print stack and log). * * @param e * @param logger */ public static void errorOut(Exception e, LoggerInterface logger) { logger.error(e.getMessage()); e.printStackTrace(); } /** * Return array string values as blank separated string. * * @param in * @return */ public static String arrayToString(String in[]) { if (in == null) return null; String ret = ""; for (int i = 0; i < in.length; i++) { ret += in[i] + " "; } return ret.trim(); } /** * Wait for some milliseconds. * * @param millis */ public static void sleep(long millis) { try { Thread.sleep(millis); } catch (Exception e) { e.printStackTrace(); } } /** * Restrain double to maximum two after comma numbers. * * @param d * @return */ public static double cutDouble(double d) { return Math.round(d * 100) / 100.0; } /** * Restrain double to maximum one after comma numbers. * * @param d * @return */ public static double cutDoubleToOne(double d) { return Math.round(d * 10) / 10.0; } /** * Restrain double to maximum two after comma numbers. * * @param d * @return */ public static double cutDoubleToTwo(double d) { return Math.round(d * 100) / 100.0; } /** * Restrain double to maximum three after comma numbers. * * @param d * @return */ public static double cutDoubleToThree(double d) { return Math.round(d * 1000) / 1000.0; } /** * Restrain double to maximum four after comma numbers. * * @param d * @return */ public static double cutDoubleToFour(double d) { return Math.round(d * 10000) / 10000.0; } /** * Get percentage value of fraction as integer, e.g. 1/2 = 50. * * @param part * @param whole * @return */ public static int percentage(int part, int whole) { return (int) (((double) part * 100.0) / (double) whole); } /** * Print to system.out. * * @param msg * @param newLine */ public static void printOut(String msg, boolean newLine) { System.out.print(msg); if (newLine) { System.out.println(); } } /** * Return a date representation in the form DD.MM.YYYY-HH:MM:SS * * @return */ public static String getDate() { GregorianCalendar g = new GregorianCalendar(); int year = g.get(Calendar.YEAR); int month = g.get(Calendar.MONTH) + 1; int day = g.get(Calendar.DAY_OF_MONTH); int hour = g.get(Calendar.HOUR_OF_DAY); int min = g.get(Calendar.MINUTE); int sec = g.get(Calendar.SECOND); String mS = String.valueOf(month); String dS = String.valueOf(day); String hS = String.valueOf(hour); String minS = String.valueOf(min); String sS = String.valueOf(sec); mS = mS.length() < 2 ? "0" + mS : mS; dS = dS.length() < 2 ? "0" + dS : dS; hS = hS.length() < 2 ? "0" + hS : hS; minS = minS.length() < 2 ? "0" + minS : minS; sS = sS.length() < 2 ? "0" + sS : sS; return dS + "." + mS + "." + year + "-" + hS + ":" + minS + ":" + sS; } /** * Get a date string in local format for a specific date. * * @param date * The date in millis. * @return The formatted date string. */ public static String getDate(long date) { GregorianCalendar g = new GregorianCalendar(); g.setTimeInMillis(date); int year = g.get(Calendar.YEAR); int month = g.get(Calendar.MONTH) + 1; int day = g.get(Calendar.DAY_OF_MONTH); String mS = String.valueOf(month); String dS = String.valueOf(day); mS = mS.length() < 2 ? "0" + mS : mS; dS = dS.length() < 2 ? "0" + dS : dS; return dS + "." + mS + "." + year; } /** * Get a date string in local format for a specific date. * * @param date * The date in millis. * @return The formatted date string. */ public static String getTime(long date) { GregorianCalendar g = new GregorianCalendar(); g.setTimeInMillis(date); int hour = g.get(Calendar.HOUR_OF_DAY); int min = g.get(Calendar.MINUTE); int sec = g.get(Calendar.SECOND); String hS = String.valueOf(hour); String minS = String.valueOf(min); String sS = String.valueOf(sec); hS = hS.length() < 2 ? "0" + hS : hS; minS = minS.length() < 2 ? "0" + minS : minS; sS = sS.length() < 2 ? "0" + sS : sS; return hS + ":" + minS + ":" + sS; } /** * Get a date string in local format for a specific date. * * @param date * The date in millis. * @return The formatted date string. */ public static String getDateAndTime(long date) { GregorianCalendar g = new GregorianCalendar(); g.setTimeInMillis(date); int year = g.get(Calendar.YEAR); int month = g.get(Calendar.MONTH) + 1; int day = g.get(Calendar.DAY_OF_MONTH); int hour = g.get(Calendar.HOUR_OF_DAY); int min = g.get(Calendar.MINUTE); int sec = g.get(Calendar.SECOND); String mS = String.valueOf(month); String dS = String.valueOf(day); String hS = String.valueOf(hour); String minS = String.valueOf(min); String sS = String.valueOf(sec); mS = mS.length() < 2 ? "0" + mS : mS; dS = dS.length() < 2 ? "0" + dS : dS; hS = hS.length() < 2 ? "0" + hS : hS; minS = minS.length() < 2 ? "0" + minS : minS; sS = sS.length() < 2 ? "0" + sS : sS; return dS + "." + mS + "." + year + "-" + hS + ":" + minS + ":" + sS; } /** * Get the date in format dd.mm.yyyy hh.mm" * * @param date * The date to be formatted * @return */ public static String getDateAndTimeNoSeconds(long date) { GregorianCalendar g = new GregorianCalendar(); g.setTimeInMillis(date); int year = g.get(Calendar.YEAR); int month = g.get(Calendar.MONTH) + 1; int day = g.get(Calendar.DAY_OF_MONTH); int hour = g.get(Calendar.HOUR_OF_DAY); int min = g.get(Calendar.MINUTE); String mS = String.valueOf(month); String dS = String.valueOf(day); String hS = String.valueOf(hour); String minS = String.valueOf(min); mS = mS.length() < 2 ? "0" + mS : mS; dS = dS.length() < 2 ? "0" + dS : dS; hS = hS.length() < 2 ? "0" + hS : hS; minS = minS.length() < 2 ? "0" + minS : minS; return dS + "." + mS + "." + year + " " + hS + ":" + minS; } /** * Return today as String dd.mm.yyyy * * @return */ public static String getTodayDayString() { GregorianCalendar calendar = new GregorianCalendar(); return getDateDay(calendar.getTimeInMillis()); } /** * Return a date as String dd.mm.yyyy * * @param date * @return */ public static String getDateDay(long date) { GregorianCalendar g = new GregorianCalendar(); g.setTimeInMillis(date); int year = g.get(Calendar.YEAR); int month = g.get(Calendar.MONTH) + 1; int day = g.get(Calendar.DAY_OF_MONTH); String mS = String.valueOf(month); String dS = String.valueOf(day); mS = mS.length() < 2 ? "0" + mS : mS; dS = dS.length() < 2 ? "0" + dS : dS; return dS + "." + mS + "." + year; } /** * Get the date in format dd.mm.yyyy hh.mm" * * @return */ public static String getDateAndTimeNoSeconds() { return getDateAndTimeNoSeconds(new GregorianCalendar() .getTimeInMillis()); } public static String getFutureDate(int daysPlusToday) { GregorianCalendar g = new GregorianCalendar(); g.add(Calendar.DAY_OF_MONTH, daysPlusToday); return getDateAndTimeNoSeconds(g.getTimeInMillis()); } /** * Return date string without time for day in future. * * @param daysPlusToday * The increase in days. * @return E-g "23.12.2012" */ public static String getFutureDay(int daysPlusToday) { GregorianCalendar g = new GregorianCalendar(); g.add(Calendar.DAY_OF_MONTH, daysPlusToday); return getDateDay(g.getTimeInMillis()); } /** * Return a date representation in the form YYYY.MM.DD-HH:MM:SS * * @return */ public static String getDateSortable() { GregorianCalendar g = new GregorianCalendar(); int year = g.get(Calendar.YEAR); int month = g.get(Calendar.MONTH) + 1; int day = g.get(Calendar.DAY_OF_MONTH); int hour = g.get(Calendar.HOUR_OF_DAY); int min = g.get(Calendar.MINUTE); int sec = g.get(Calendar.SECOND); String mS = String.valueOf(month); String dS = String.valueOf(day); String hS = String.valueOf(hour); String minS = String.valueOf(min); String sS = String.valueOf(sec); mS = mS.length() < 2 ? "0" + mS : mS; dS = dS.length() < 2 ? "0" + dS : dS; hS = hS.length() < 2 ? "0" + hS : hS; minS = minS.length() < 2 ? "0" + minS : minS; sS = sS.length() < 2 ? "0" + sS : sS; return year + "." + mS + "." + dS + "-" + hS + ":" + minS + ":" + sS; } /** * Return a date representation in the form YYYY.MM.DD-HH:MM:SS usable as * filename * * @return */ public static String getDateSortableName() { GregorianCalendar g = new GregorianCalendar(); int year = g.get(Calendar.YEAR); int month = g.get(Calendar.MONTH) + 1; int day = g.get(Calendar.DAY_OF_MONTH); int hour = g.get(Calendar.HOUR_OF_DAY); int min = g.get(Calendar.MINUTE); int sec = g.get(Calendar.SECOND); String mS = String.valueOf(month); String dS = String.valueOf(day); String hS = String.valueOf(hour); String minS = String.valueOf(min); String sS = String.valueOf(sec); mS = mS.length() < 2 ? "0" + mS : mS; dS = dS.length() < 2 ? "0" + dS : dS; hS = hS.length() < 2 ? "0" + hS : hS; minS = minS.length() < 2 ? "0" + minS : minS; sS = sS.length() < 2 ? "0" + sS : sS; return year + "." + mS + "." + dS + "-" + hS + "." + minS + "." + sS; } /** * Get a String derived from current date and time usable as unique * filename. Format "YYYY.MM.DD-HH.MM.SS" . * * @return The String. */ public static String getDateName() { GregorianCalendar g = new GregorianCalendar(); int year = g.get(Calendar.YEAR); int month = g.get(Calendar.MONTH) + 1; int day = g.get(Calendar.DAY_OF_MONTH); int hour = g.get(Calendar.HOUR_OF_DAY); int min = g.get(Calendar.MINUTE); int sec = g.get(Calendar.SECOND); String mS = String.valueOf(month); String dS = String.valueOf(day); String hS = String.valueOf(hour); String minS = String.valueOf(min); String sS = String.valueOf(sec); mS = mS.length() < 2 ? "0" + mS : mS; dS = dS.length() < 2 ? "0" + dS : dS; hS = hS.length() < 2 ? "0" + hS : hS; minS = minS.length() < 2 ? "0" + minS : minS; sS = sS.length() < 2 ? "0" + sS : sS; return year + "." + mS + "." + dS + "-" + hS + "." + minS + "." + sS; } /** * Execute a command on the system and report on logger. * * @param cmd * @param logger * @return Exit code. * @throws Exception */ public static int execCmd(String cmd, LoggerInterface logger) throws Exception { logger.debug("executing: " + cmd); Process proc = Runtime.getRuntime().exec(cmd); // any error message? StreamGobbler errorGobbler = new StreamGobbler(proc.getErrorStream(), "ERROR", logger); StreamGobbler outputGobbler = new StreamGobbler(proc.getInputStream(), "OUTPUT", logger); errorGobbler.start(); outputGobbler.start(); return proc.waitFor(); } /** * Execute a command on the system. * * @param cmd * @return Output of the command. * @throws Exception */ public static String execCmd(String cmd) throws Exception { Process proc = Runtime.getRuntime().exec(cmd); // any error message? StreamGobbler errorGobbler = new StreamGobbler(proc.getErrorStream()); StreamGobbler outputGobbler = new StreamGobbler(proc.getInputStream()); errorGobbler.start(); outputGobbler.start(); return outputGobbler.getOutput() + "\n" + errorGobbler.getOutput(); } private static class StreamGobbler extends Thread { InputStream is; String type; LoggerInterface _logger = null; String _ret = ""; public StreamGobbler(InputStream is) { this.is = is; } public StreamGobbler(InputStream is, String type, LoggerInterface logger) { this.is = is; this.type = type; _logger = logger; } public void run() { try { InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String line = null; if (_logger != null) { while ((line = br.readLine()) != null) if (type.compareTo("ERROR") == 0) { _logger.error(line); } else { _logger.debug(line); } } else { while ((line = br.readLine()) != null) _ret += line + "\n"; } } catch (IOException ioe) { ioe.printStackTrace(); } } public String getOutput() { return _ret; } } /** * Force an integer as string to take at least three chars space. * * @param i * @return */ public static String forceThreeChars(int i) { String s = String.valueOf(i); if (s.length() == 1) s = " " + s; if (s.length() == 2) s = " " + s; return s; } /** * Copy elements of an array into a vector. * * @param array * @return a new vector. * @throws Exception * If array was null. */ public static Vector<Object> arrayToVector(Object[] array) throws Exception { Vector<Object> ret = new Vector<Object>(); for (int i = 0; i < array.length; i++) { ret.add(array[i]); } return ret; } /** * Print elements of a Vector blank-separated to a Printstream. * * @param vec * The vector. * @param out * The printStream. */ public static void printVec(Vector<String> vec, PrintStream out) { for (Iterator<String> iter = vec.iterator(); iter.hasNext();) { Object element = (Object) iter.next(); out.print(element.toString() + " "); } } /** * Print all elements of a vector in a row. * * @param vec * The vector of elements. * @return The output of toString() method in a row. */ public static String printVec(Vector<String> vec) { String ret = ""; for (Iterator<String> iter = vec.iterator(); iter.hasNext();) { Object element = (Object) iter.next(); ret += element.toString() + " "; } return ret; } /** * Use all toString() methods linewise on a vector. * * @param in * The Vector * @param out * The print stream, e.g. System.out. */ public static void printToString(Vector<Object> in, PrintStream out) { for (Iterator<Object> iter = in.iterator(); iter.hasNext();) { Object element = (Object) iter.next(); out.println(element.toString()); } } public static void main(String[] args) { System.out.println(getRandomInteger(6)); } }