package org.radargun.utils;
import java.lang.reflect.Type;
import java.util.concurrent.TimeUnit;
import org.radargun.config.Converter;
/**
* Converts string in format number (ns|us|ms|s|m) into number of nanoseconds.
*
* @author Radim Vansa <rvansa@redhat.com>
*/
public class NanoTimeConverter implements Converter<Long> {
@Override
public Long convert(String string, Type type) {
string = string.trim();
TimeUnit timeUnit;
if (string.endsWith("ns")) {
timeUnit = TimeUnit.NANOSECONDS;
string = string.substring(0, string.length() - 2);
} else if (string.endsWith("us")) {
timeUnit = TimeUnit.MICROSECONDS;
string = string.substring(0, string.length() - 2);
} else if (string.endsWith("ms")) {
timeUnit = TimeUnit.MILLISECONDS;
string = string.substring(0, string.length() - 2);
} else if (string.endsWith("s")) {
timeUnit = TimeUnit.SECONDS;
string = string.substring(0, string.length() - 1);
} else if (string.endsWith("m")) {
timeUnit = TimeUnit.MINUTES;
string = string.substring(0, string.length() - 1);
} else {
throw new IllegalArgumentException("No unit specified: " + string);
}
string = string.trim();
try {
long longValue = Long.parseLong(string);
return timeUnit.toNanos(longValue);
} catch (NumberFormatException e) {
try {
double doubleValue = Double.parseDouble(string);
return timeUnit.toNanos((long) (doubleValue * 1000000)) / 1000000;
} catch (NumberFormatException e2) {
throw new IllegalArgumentException("Cannot parse value: " + string, e);
}
}
}
@Override
public String convertToString(Long value) {
return value == null ? "null" : String.valueOf(value) + " ns";
}
@Override
public String allowedPattern(Type type) {
return "[0-9]*(\\.[0-9]*)?\\s*(ns|us|ms|s|m)";
}
}