public static double parseElapsedTimeAsDouble()

in brooklyn-server/utils/common/src/main/java/org/apache/brooklyn/util/time/Time.java [443:511]


    public static double parseElapsedTimeAsDouble(final String timeStringOrig) {
        String timeString = timeStringOrig;
        if (timeString==null)
            throw new NumberFormatException("GeneralHelper.parseTimeString cannot parse a null string");
        try {
            double d = Double.parseDouble(timeString);
            return d;
        } catch (NumberFormatException e) {
            try {
                //look for a type marker
                timeString = timeString.trim();
                String s = Strings.getLastWord(timeString).toLowerCase();
                timeString = timeString.substring(0, timeString.length()-s.length()).trim();
                int i=0;
                while (s.length()>i) {
                    char c = s.charAt(i);
                    if (c=='.' || Character.isDigit(c)) i++;
                    else break;
                }
                String num = s.substring(0, i);
                if (i==0) {
                    if (Strings.isNonBlank(timeString)) {
                        num = Strings.getLastWord(timeString).toLowerCase();
                        timeString = timeString.substring(0, timeString.length()-num.length()).trim();
                    }
                } else {
                    s = s.substring(i);
                }
                long multiplier = 0;
                if (num.length()==0) {
                    //must be never or something
                    // TODO does 'never' work?
                    if (s.equalsIgnoreCase("never") || s.equalsIgnoreCase("off") || s.equalsIgnoreCase("false"))
                        return -1;
                    throw new NumberFormatException("unrecognised word  '"+s+"' in time string");
                }
                if (s.equalsIgnoreCase("ms") || s.equalsIgnoreCase("milli") || s.equalsIgnoreCase("millis")
                    || s.equalsIgnoreCase("millisec") || s.equalsIgnoreCase("millisecs")
                    || s.equalsIgnoreCase("millisecond") || s.equalsIgnoreCase("milliseconds"))
                    multiplier = 1;
                else if (s.equalsIgnoreCase("s") || s.equalsIgnoreCase("sec") || s.equalsIgnoreCase("secs")
                    || s.equalsIgnoreCase("second") || s.equalsIgnoreCase("seconds"))
                    multiplier = 1000;
                else if (s.equalsIgnoreCase("m") || s.equalsIgnoreCase("min") || s.equalsIgnoreCase("mins")
                    || s.equalsIgnoreCase("minute") || s.equalsIgnoreCase("minutes"))
                    multiplier = 60*1000;
                else if (s.equalsIgnoreCase("h") || s.equalsIgnoreCase("hr") || s.equalsIgnoreCase("hrs")
                    || s.equalsIgnoreCase("hour") || s.equalsIgnoreCase("hours"))
                    multiplier = 60*60*1000;
                else if (s.equalsIgnoreCase("d") || s.equalsIgnoreCase("day") || s.equalsIgnoreCase("days"))
                    multiplier = 24*60*60*1000;
                else
                    throw new NumberFormatException("Unknown unit '"+s+"' in time string '"+timeStringOrig+"'");
                double d = Double.parseDouble(num);
                double dd = 0;
                if (timeString.length()>0) {
                    dd = parseElapsedTimeAsDouble(timeString);
                    if (dd==-1) {
                        throw new NumberFormatException("Cannot combine '"+timeString+"' with '"+num+" "+s+"'");
                    }
                }
                return d*multiplier + dd;
            } catch (Exception ex) {
                if (ex instanceof NumberFormatException) throw (NumberFormatException)ex;
                log.trace("Details of parse failure:", ex);
                throw new NumberFormatException("Cannot parse time string '"+timeStringOrig+"'");
            }
        }
    }