package jenkins.util; import org.apache.commons.beanutils.Converter; import org.kohsuke.stapler.QueryParameter; import java.util.concurrent.TimeUnit; import javax.annotation.CheckForNull; /** * Represents a length of something, like {@code 3sec}. * * This supports parameter injection, such as via {@link QueryParameter}. * * @author Kohsuke Kawaguchi * @since 1.489 */ public class TimeDuration { private final long millis; public TimeDuration(long millis) { this.millis = millis; } public int getTime() { return (int)millis; } public long getTimeInMillis() { return millis; } public long as(TimeUnit t) { return t.convert(millis,TimeUnit.MILLISECONDS); } public static @CheckForNull TimeDuration fromString(@CheckForNull String delay) { if (delay==null) return null; try { // TODO: more unit handling if(delay.endsWith("sec")) delay=delay.substring(0,delay.length()-3); if(delay.endsWith("secs")) delay=delay.substring(0,delay.length()-4); return new TimeDuration(Long.parseLong(delay)); } catch (NumberFormatException e) { throw new IllegalArgumentException("Invalid time duration value: "+delay); } } public static class StaplerConverterImpl implements Converter { public Object convert(Class type, Object value) { if (value==null) return null; if (value instanceof String) { return fromString((String) value); } throw new UnsupportedOperationException(); } } }