package com.linkedin.databus.core.util;
/*
*
* Copyright 2013 LinkedIn Corp. All rights reserved
*
* 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.
*
*/
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Helper methods for processing configs.
*/
public class ConfigHelper
{
/** Patern for parsing duration strings */
public static final Pattern DURATION_PATTERN =
Pattern.compile("\\s*(\\d+)\\s*(ns|nanos|nanosecond|nanoseconds|" +
"us|micros|microsecond|microseconds|" +
"ms|millis|millisecond|milliseconds|" +
"s|sec|second|seconds|" +
"min|minute|minutes|" +
"h|hr|hour|hours|" +
"d|day|days)?\\s*",
Pattern.CASE_INSENSITIVE);
/** Pattern for parsing size strings */
public static final Pattern BYTE_SIZE_PATTERN =
Pattern.compile("\\s*(\\d+)\\s*(k|K|m|M|g|G|t|T|p|P|e|E)?\\s*");
/**
* Parses a duration string of the format: duration_value [duration_unit]. duration_value must be
* a non-negative integer. Available duration_units are:
* <ul>
* <li>ns|nanos|nanosecond|nanoseconds - nanoseconds
* <li>us|micros|microsecond|microseconds - microseconds
* <li>ms|millis|millisecond|milliseconds - milliseconds
* <li>s|sec|second|seconds - seconds
* <li>min|minute|minutes - minutes
* <li>h|hr|hour|hours - hours
* <li>d|day|days - days
* </ul>
* @param durationStr the string to be parsed
* @param defaultUnit the unit to use if none is specified
* @return the duration in defaultUnit units
* @throws InvalidConfigException if the duration string does not follow the above pattern
* */
public static long parseDuration(String durationStr, TimeUnit defaultUnit) throws InvalidConfigException
{
if (null == durationStr) return 0;
TimeUnit unit = defaultUnit;
Matcher m = DURATION_PATTERN.matcher(durationStr);
if (!m.matches()) throw new InvalidConfigException("invalid duration string: " + durationStr);
if (1 < m.groupCount() && null != m.group(2) && 0 < m.group(2).length())
{
char unitChar1 = m.group(2).charAt(0);
switch (unitChar1)
{
case 'n':
case 'N': unit = TimeUnit.NANOSECONDS; break;
case 'u':
case 'U': unit = TimeUnit.MICROSECONDS; break;
case 'm':
case 'M':
char unitChar3 = m.group(2).length() >= 3 ? m.group(2).charAt(2) : ' ';
unit = ('n' == unitChar3 || 'N' == unitChar3) ? TimeUnit.MINUTES : TimeUnit.MILLISECONDS;
break;
case 's':
case 'S': unit = TimeUnit.SECONDS; break;
case 'h':
case 'H': unit = TimeUnit.HOURS; break;
case 'd':
case 'D': unit = TimeUnit.DAYS; break;
}
}
long value = Long.parseLong(m.group(1));
return defaultUnit.convert(value, unit);
}
/** Parses a byte-size string of the format: size_value[size_unit]. size_value must be non-
* negative. size_unit can be any of the following:
* <ul>
* <il>k - 10^3 bytes
* <il>K - 2^10 bytes
* <il>m - 10^6 bytes
* <il>M - 2^20 bytes
* <il>g - 10^9 bytes
* <il>G - 2^30 bytes
* <il>t - 10^12 bytes
* <il>T - 2^40 bytes
* <il>p - 10^15 bytes
* <il>P - 2^50 bytes
* <il>e - 10^18 bytes
* <il>E - 2^60 bytes
* </ul>*/
public static long parseByteSize(String sizeString) throws InvalidConfigException
{
if (null == sizeString) return 0;
long unit = 1L;
Matcher m = BYTE_SIZE_PATTERN.matcher(sizeString);
if (!m.matches()) throw new InvalidConfigException("invalid byte-size string: " + sizeString);
if (1 < m.groupCount() && null != m.group(2) && 0 < m.group(2).length())
{
char unitChar1 = m.group(2).charAt(0);
switch (unitChar1)
{
case 'k': unit = 1000L; break;
case 'K': unit = 1024L; break;
case 'm': unit = 1000L * 1000L; break;
case 'M': unit = 1024L * 1024L; break;
case 'g': unit = 1000L * 1000L * 1000L; break;
case 'G': unit = 1024L * 1024L * 1024L; break;
case 't': unit = 1000L * 1000L * 1000L * 1000L; break;
case 'T': unit = 1024L * 1024L * 1024L * 1024L; break;
case 'p': unit = 1000L * 1000L * 1000L * 1000L * 1000L; break;
case 'P': unit = 1024L * 1024L * 1024L * 1024L * 1024L; break;
case 'e': unit = 1000L * 1000L * 1000L * 1000L * 1000L * 1000L; break;
case 'E': unit = 1024L * 1024L * 1024L * 1024L * 1024L * 1024L; break;
}
}
long value = Long.parseLong(m.group(1));
return unit * value;
}
}