/*
* Copyright (C) 2009 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.exoplatform.services.jcr.util;
/**
* Created by The eXo Platform SAS
*
* 31.08.2006
*
* @author <a href="mailto:peter.nedonosko@exoplatform.com.ua">Peter Nedonosko</a>
* @version $Id: StringNumberParser.java 34445 2009-07-24 07:51:18Z dkatayev $
*/
public class StringNumberParser
{
/**
* Parse given text as long. <br>
*
* <br>E.g. '2k' will be returned as 2048 number.
*
* <br>Next formats are supported (case insensitive): <br>kilobytes - k,kb <br>megabytes - m,mb
* <br>gigabytes - g,gb <br>terabytes - t,tb
*
* @param longText
* @return
* @throws NumberFormatException
*/
static public long parseLong(final String longText) throws NumberFormatException
{
return parseNumber(longText).longValue();
}
/**
* Serialize given long as text. <br>
*
* <br>E.g. 2048 long will be returned as "2kb".
*
* <br>Next formats are supported (case insensitive): <br>kilobytes - k,kb <br>megabytes - m,mb
* <br>gigabytes - g,gb <br>terabytes - t,tb
*
* @param longValue
* - long
* @return String
* long representation as text
* @throws NumberFormatException
*/
static public String serializeLong(final long longValue) throws NumberFormatException
{
return serializeNumber(longValue);
}
/**
* Parse given text as int. <br>
*
* <br>E.g. '2k' will be returned as 2048 number.
*
* <br>Next formats are supported (case insensitive): <br>kilobytes - k,kb <br>megabytes - m,mb
* <br>gigabytes - g,gb <br>terabytes - t,tb
*
* @param integerText
* @return
* @throws NumberFormatException
*/
static public int parseInt(final String integerText) throws NumberFormatException
{
return parseNumber(integerText).intValue();
}
/**
* Serialize given int as text. <br>
*
* <br>E.g. 2048 nubber will be returned as "2kb".
*
* <br>Next formats are supported (case insensitive): <br>kilobytes - k,kb <br>megabytes - m,mb
* <br>gigabytes - g,gb <br>terabytes - t,tb
*
* @param integerValue
* - int
* @return String
* integer representation as text
* @throws NumberFormatException
*/
static public String serializeInt(final int integerValue) throws NumberFormatException
{
return serializeNumber(integerValue);
}
/**
* Parse given text as double. <br>
*
* <br>E.g. '2k' will be returned as 2048 number.
*
* <br>Next formats are supported (case insensitive): <br>kilobytes - k,kb <br>megabytes - m,mb
* <br>gigabytes - g,gb <br>terabytes - t,tb
*
* <br>NOTE: floating point supported, e.g. 1.5m = 1.5 * 1024 * 1024
*
* @param doubleText
* @return
* @throws NumberFormatException
*/
static public double parseDouble(final String doubleText) throws NumberFormatException
{
return parseNumber(doubleText).doubleValue();
}
/**
* Parse given text as number representation. <br>
*
* <br>E.g. '2k' will be returned as 2048 number.
*
* <br>Next formats are supported (case insensitive): <br>kilobytes - k,kb <br>megabytes - m,mb
* <br>gigabytes - g,gb <br>terabytes - t,tb
*
* <br>NOTE: floating point supported, e.g. 1.5m = 1.5 * 1024 * 1024, <br>WARN: floating point
* delimiter depends on OS settings
*
* @param numberText
* @return
* @throws NumberFormatException
*/
static public Number parseNumber(final String numberText) throws NumberFormatException
{
final String text = numberText.toLowerCase().toUpperCase();
if (text.endsWith("K"))
{
return Double.valueOf(text.substring(0, text.length() - 1)) * 1024d;
}
else if (text.endsWith("KB"))
{
return Double.valueOf(text.substring(0, text.length() - 2)) * 1024d;
}
else if (text.endsWith("M"))
{
return Double.valueOf(text.substring(0, text.length() - 1)) * 1048576d; // 1024 * 1024
}
else if (text.endsWith("MB"))
{
return Double.valueOf(text.substring(0, text.length() - 2)) * 1048576d; // 1024 * 1024
}
else if (text.endsWith("G"))
{
return Double.valueOf(text.substring(0, text.length() - 1)) * 1073741824d; // 1024 * 1024 *
// 1024
}
else if (text.endsWith("GB"))
{
return Double.valueOf(text.substring(0, text.length() - 2)) * 1073741824d; // 1024 * 1024 *
// 1024
}
else if (text.endsWith("T"))
{
return Double.valueOf(text.substring(0, text.length() - 1)) * 1099511627776d; // 1024 * 1024 *
// 1024 * 1024
}
else if (text.endsWith("TB"))
{
return Double.valueOf(text.substring(0, text.length() - 2)) * 1099511627776d; // 1024 * 1024 *
// 1024 * 1024
}
else
{
return Double.valueOf(text);
}
}
/**
* Serialize given number to text as number representation. <br>
*
* <br>E.g. 2048 number will be returned as 2kb.
*
* <br>Next formats are supported: <br>kilobytes - k,kb <br>megabytes - m,mb
* <br>gigabytes - g,gb <br>terabytes - t,tb
*
* @param number
* - long
* @return String
* - number representation
* @throws NumberFormatException
*/
static public String serializeNumber(final long number) throws NumberFormatException
{
if ((number >= 1099511627776l) && (number % 1099511627776l) == 0)
{
return String.valueOf(number / 1099511627776l) + "TB";
}
else if ((number >= 1073741824l) && (number % 1073741824l) == 0)
{
return String.valueOf(number / 1073741824l) + "GB";
}
else if ((number >= 1048576l) && (number % 1048576l) == 0)
{
return String.valueOf(number / 1048576l) + "MB";
}
else if ((number >= 1024l) && (number % 1024l) == 0)
{
return String.valueOf(number / 1024l) + "KB";
}
else
{
return String.valueOf(number);
}
}
/**
* Parse given text as formated time and return a time in milliseconds. <br> <br>Formats
* supported: <br>milliseconds - ms <br>seconds - without sufix <br>minutes - m <br>hours - h
* <br>days - d <br>weeks - w
*
* @param text
* - String
* @return time in milliseconds
* @throws NumberFormatException
*/
static public long parseTime(final String text) throws NumberFormatException
{
if (text.endsWith("ms"))
{
return Long.valueOf(text.substring(0, text.length() - 2));
}
else if (text.endsWith("s"))
{
return Long.valueOf(text.substring(0, text.length() - 1)) * 1000L;
}
else if (text.endsWith("m"))
{
return Long.valueOf(text.substring(0, text.length() - 1)) * 60000L; // 1000 * 60
}
else if (text.endsWith("h"))
{
return Long.valueOf(text.substring(0, text.length() - 1)) * 3600000L; // 1000 * 60 * 60
}
else if (text.endsWith("d"))
{
return Long.valueOf(text.substring(0, text.length() - 1)) * 86400000L; // 1000 * 60 * 60 * 24
}
else if (text.endsWith("w"))
{
return Long.valueOf(text.substring(0, text.length() - 1)) * 604800000L; // 1000 * 60 * 60 * 24
// * 7
}
else
{ // seconds by default
return Long.valueOf(text) * 1000L;
}
}
/**
* Serialize given time in milliseconds and return a time as formated time in ms, s, h,d,w.
* Formats : ms - milliseconds, s - seconds, h hours, w - weeks.
*
* @param millisecondTime
* - time in milliseconds
* @return String
* - time as formated time in milliseconds
* @throws NumberFormatException
*/
static public String serializeTime(final long millisecondTime) throws NumberFormatException
{
if (millisecondTime >= 604800000 && (millisecondTime % 604800000) == 0)
{
return String.valueOf(millisecondTime / 604800000) + "w";
}
else if (millisecondTime >= 86400000 && (millisecondTime % 86400000) == 0)
{
return String.valueOf(millisecondTime / 86400000) + "d";
}
else if (millisecondTime >= 3600000 && (millisecondTime % 3600000) == 0)
{
return String.valueOf(millisecondTime / 3600000) + "h";
}
else if (millisecondTime >= 60000 && (millisecondTime % 60000) == 0)
{
return String.valueOf(millisecondTime / 60000) + "m";
}
else if (millisecondTime >= 1000 && (millisecondTime % 1000) == 0)
{
return String.valueOf(millisecondTime / 1000) + "s";
}
return String.valueOf(millisecondTime) + "ms";
}
}