/* (non-Javadoc) * @see java.text.Format#parseObject(java.lang.String, java.text.ParsePosition) */ public Object parseObject(String durationString, ParsePosition pos) { Object result = null; if (durationString.length() == 0) return null; if (durationString.charAt(pos.getIndex()) == '+') // if string begins with + sign, ignore it pos.setIndex(pos.getIndex() + 1); Number numberResult = DECIMAL_FORMAT.parse(durationString, pos); if (numberResult == null) return null; String durationPart = durationString.substring(pos.getIndex()); durationPart = durationPart.trim(); Matcher matcher; for (int i = 0; i < TYPE_COUNT; i++) { // find hte appropriate units matcher = pattern[i].matcher(durationPart); if (matcher.matches()) { int timeUnit = (matcher.group(1) != null) ? i : TimeUnit .NONE; // first group is units. If no units, then it will match, but should use // default: NONE double value = numberResult.doubleValue(); if (timeUnit == TimeUnit.PERCENT || timeUnit == TimeUnit.ELAPSED_PERCENT) value /= 100.0; if (timeUnit == TimeUnit.NONE && isWork) { if (canBeNonTemporal) timeUnit = TimeUnit.NON_TEMPORAL; else timeUnit = ScheduleOption.getInstance() .getWorkUnit(); // use default work unit if work and nothing entered } long longResult = Duration.getInstance(value, timeUnit); if (Duration.millis(longResult) > Duration.MAX_DURATION) // check for too big return null; if (matcher.group(2).length() != 0) { // second group is estimated longResult = Duration.setAsEstimated(longResult, true); } result = new Duration(longResult); return result; } } return null; }