com.subgraph.orchid.config.TorConfigInterval Maven / Gradle / Ivy
package com.subgraph.orchid.config;
import java.util.concurrent.TimeUnit;
public class TorConfigInterval {
public static TorConfigInterval createFrom(String s) {
final String[] ss = s.split(" ");
final long n = Long.parseLong(ss[0]);
if(ss.length == 1) {
return new TorConfigInterval(n, TimeUnit.SECONDS);
} else {
return createForValueAndUnit(n, ss[1]);
}
}
private static TorConfigInterval createForValueAndUnit(long value, String unitName) {
if(stringMatchesUnit(unitName, "week")) {
return new TorConfigInterval(value * 7, TimeUnit.DAYS);
} else {
final TimeUnit unit = stringToUnit(unitName);
return new TorConfigInterval(value, unit);
}
}
private static TimeUnit stringToUnit(String s) {
if(stringMatchesUnit(s, "day")) {
return TimeUnit.DAYS;
} else if(stringMatchesUnit(s, "hour")) {
return TimeUnit.HOURS;
} else if(stringMatchesUnit(s, "minute")) {
return TimeUnit.MINUTES;
} else if(stringMatchesUnit(s, "second")) {
return TimeUnit.SECONDS;
} else if(stringMatchesUnit(s, "millisecond")) {
return TimeUnit.MILLISECONDS;
} else {
throw new IllegalArgumentException();
}
}
private static boolean stringMatchesUnit(String s, String unitType) {
if(s == null) {
return false;
} else {
return s.equalsIgnoreCase(unitType) || s.equalsIgnoreCase(unitType + "s");
}
}
private final TimeUnit timeUnit;
private final long value;
public TorConfigInterval(long value, TimeUnit timeUnit) {
this.timeUnit = getTimeUnitFor(value, timeUnit);
this.value = getValueFor(value, timeUnit);
}
public long getMilliseconds() {
return TimeUnit.MILLISECONDS.convert(value, timeUnit);
}
private static TimeUnit getTimeUnitFor(long value, TimeUnit timeUnit) {
if(timeUnit == TimeUnit.NANOSECONDS || timeUnit == TimeUnit.MICROSECONDS) {
return TimeUnit.MILLISECONDS;
} else {
return timeUnit;
}
}
private static long getValueFor(long value, TimeUnit timeUnit) {
if(timeUnit == TimeUnit.NANOSECONDS || timeUnit == TimeUnit.MICROSECONDS) {
return TimeUnit.MILLISECONDS.convert(value, timeUnit);
} else {
return value;
}
}
public String toString() {
if(timeUnit == TimeUnit.DAYS && (value % 7 == 0)) {
final long weeks = value / 7;
return (weeks == 1) ? "1 week" : (weeks + " weeks");
}
final StringBuilder sb = new StringBuilder();
sb.append(value);
sb.append(" ");
sb.append(unitToString(timeUnit));
if(value != 1) {
sb.append("s");
}
return sb.toString();
}
private static String unitToString(TimeUnit unit) {
switch(unit) {
case MILLISECONDS:
return "millisecond";
case SECONDS:
return "second";
case MINUTES:
return "minute";
case HOURS:
return "hour";
case DAYS:
return "days";
default:
throw new IllegalArgumentException();
}
}
}