/*
* Copyright 2009-2012 Jose Luis Martin.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jdal.text;
import java.text.ParseException;
import java.util.Locale;
import java.util.Scanner;
import java.util.concurrent.TimeUnit;
import org.springframework.format.Formatter;
/**
* Formatter for periods of time in millis. Parse a
* print time periods in format "%d d %d h %d m %d s" for
* days, hours, minutes and sconds.
*
* @author Jose Luis Martin - (jlm@joseluismartin.info)
*/
public class PeriodFormatter implements Formatter<Number> {
private static final String DAYS = "d";
private static final String HOURS = "h";
private static final String MINUTES = "m";
private static final String SECONDS = "s";
/**
* {@inheritDoc}
*/
public String print(Number number, Locale locale) {
long period = number.longValue();
long days = TimeUnit.MILLISECONDS.toDays(period);
long left = period - TimeUnit.DAYS.toMillis(days);
long hours = TimeUnit.MILLISECONDS.toHours(left);
left -= TimeUnit.HOURS.toMillis(hours);
long minutes = TimeUnit.MILLISECONDS.toMinutes(left);
left -= TimeUnit.MINUTES.toMillis(minutes);
long seconds = TimeUnit.MILLISECONDS.toSeconds(left);
StringBuilder sb = new StringBuilder();
if (days != 0)
append(sb, days, DAYS);
if (hours != 0)
append(sb, hours, HOURS);
if (minutes != 0)
append(sb, minutes, MINUTES);
if (seconds != 0)
append(sb, seconds, SECONDS);
return sb.toString();
}
/**
* Append period and time unit to a StringBuffer
* @param sb string buffer
* @param period time period
* @param unit time unit
*/
private void append(StringBuilder sb, long period, String unit) {
if (sb.length() > 0)
sb.append(" ");
sb.append(period);
sb.append(" ");
sb.append(unit);
}
/**
* {@inheritDoc}
*/
public Number parse(String text, Locale locale) throws ParseException {
long value = 0;
Scanner scanner = new Scanner(text);
while(scanner.hasNext())
value += parse(scanner.nextLong(), scanner.next("[dhms]"));
scanner.close();
return value;
}
/**
* convert period and unit to millis
* @param value period value
* @param unit time unit
* @return value in millis.
*/
private long parse(long value, String unit) {
if (DAYS.equalsIgnoreCase(unit))
return TimeUnit.DAYS.toMillis(value);
else if (HOURS.equalsIgnoreCase(unit))
return TimeUnit.HOURS.toMillis(value);
else if (MINUTES.equalsIgnoreCase(unit))
return TimeUnit.MINUTES.toMillis(value);
else if (SECONDS.equalsIgnoreCase(unit))
return TimeUnit.SECONDS.toMillis(value);
return 0;
}
}