001/*
002 * (C) Copyright 2011 Nuxeo SA (http://nuxeo.com/) and others.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *     http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 *
016 * Contributors:
017 *     Florent Guillaume
018 */
019package org.nuxeo.common.utils;
020
021/**
022 * Class containing helpers related to the expression of sizes in bytes, kilobytes, etc.
023 */
024public class SizeUtils {
025
026    private SizeUtils() {
027        // utility class
028    }
029
030    public static final long KB = 1024;
031
032    public static final long MB = KB * KB;
033
034    public static final long GB = MB * KB;
035
036    public static final long TB = GB * KB;
037
038    /**
039     * Returns the number of bytes corresponding to a string expressing a size.
040     * <p>
041     * The suffixes KB, MB, GB, TB are recognized (in any case).
042     *
043     * @param string the size as a string
044     * @return the size
045     * @throws NumberFormatException if the size cannot be parsed
046     */
047    public static long parseSizeInBytes(String string) throws NumberFormatException {
048        String digits = string;
049        if (digits.length() == 0) {
050            throw new NumberFormatException("Invalid empty string");
051        }
052        char unit = digits.charAt(digits.length() - 1);
053        if (unit == 'b' || unit == 'B') {
054            digits = digits.substring(0, digits.length() - 1);
055            if (digits.length() == 0) {
056                throw new NumberFormatException(string);
057            }
058            unit = digits.charAt(digits.length() - 1);
059        }
060        long mul;
061        switch (unit) {
062        case 'k':
063        case 'K':
064            mul = KB;
065            break;
066        case 'm':
067        case 'M':
068            mul = MB;
069            break;
070        case 'g':
071        case 'G':
072            mul = GB;
073            break;
074        case 't':
075        case 'T':
076            mul = TB;
077            break;
078        default:
079            if (!Character.isDigit(unit)) {
080                throw new NumberFormatException(string);
081            }
082            mul = 1;
083        }
084        if (mul != 1) {
085            digits = digits.substring(0, digits.length() - 1);
086            if (digits.length() == 0) {
087                throw new NumberFormatException(string);
088            }
089        }
090        try {
091            return Long.parseLong(digits.trim()) * mul;
092        } catch (NumberFormatException e) {
093            throw new NumberFormatException(string);
094        }
095    }
096
097}