/*
jBilling - The Enterprise Open Source Billing System
Copyright (C) 2003-2011 Enterprise jBilling Software Ltd. and Emiliano Conde
This file is part of jbilling.
jbilling is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
jbilling 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 Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with jbilling. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* Created on Aug 11, 2004
*/
package com.sapienter.jbilling.server.util;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;
import org.apache.log4j.Logger;
import com.sapienter.jbilling.common.SessionInternalError;
import com.sapienter.jbilling.server.item.CurrencyBL;
import com.sapienter.jbilling.server.user.UserBL;
import com.sapienter.jbilling.server.util.db.InternationalDescriptionDAS;
import com.sapienter.jbilling.server.util.db.InternationalDescriptionDTO;
import java.math.RoundingMode;
/**
* @author Emil
*/
public class Util {
public static final String[] hexLookupTable = {
"00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "0a", "0b", "0c", "0d", "0e", "0f",
"10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "1a", "1b", "1c", "1d", "1e", "1f",
"20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "2a", "2b", "2c", "2d", "2e", "2f",
"30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "3a", "3b", "3c", "3d", "3e", "3f",
"40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "4a", "4b", "4c", "4d", "4e", "4f",
"50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "5a", "5b", "5c", "5d", "5e", "5f",
"60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "6a", "6b", "6c", "6d", "6e", "6f",
"70", "71", "72", "73", "74", "75", "76", "77", "78", "79", "7a", "7b", "7c", "7d", "7e", "7f",
"80", "81", "82", "83", "84", "85", "86", "87", "88", "89", "8a", "8b", "8c", "8d", "8e", "8f",
"90", "91", "92", "93", "94", "95", "96", "97", "98", "99", "9a", "9b", "9c", "9d", "9e", "9f",
"a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "aa", "ab", "ac", "ad", "ae", "af",
"b0", "b1", "b2", "b3", "b4", "b5", "b6", "b7", "b8", "b9", "ba", "bb", "bc", "bd", "be", "bf",
"c0", "c1", "c2", "c3", "c4", "c5", "c6", "c7", "c8", "c9", "ca", "cb", "cc", "cd", "ce", "cf",
"d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "da", "db", "dc", "dd", "de", "df",
"e0", "e1", "e2", "e3", "e4", "e5", "e6", "e7", "e8", "e9", "ea", "eb", "ec", "ed", "ee", "ef",
"f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "fa", "fb", "fc", "fd", "fe", "ff"
};
public static String formatDate(Date date, Integer userId)
throws SessionInternalError {
Locale locale;
try {
UserBL user = new UserBL(userId);
locale = user.getLocale();
} catch (Exception e) {
throw new SessionInternalError(e);
}
ResourceBundle bundle = ResourceBundle.getBundle("entityNotifications",
locale);
SimpleDateFormat df = new SimpleDateFormat(
bundle.getString("format.date"));
return df.format(date);
}
public static String formatDate(Date date, Locale locale) {
if (null == date)
{
return "";
}
ResourceBundle bundle = ResourceBundle.getBundle("entityNotifications",
locale);
SimpleDateFormat df = new SimpleDateFormat(
bundle.getString("format.date"));
return df.format(date);
}
public static String formatMoney(BigDecimal number, Integer userId, Integer currencyId, boolean forEmail)
throws SessionInternalError {
try {
// find first the right format for the number
UserBL user = new UserBL(userId);
Locale locale = user.getLocale();
ResourceBundle bundle = ResourceBundle.getBundle("entityNotifications", locale);
NumberFormat format = NumberFormat.getNumberInstance(locale);
((DecimalFormat) format).applyPattern(bundle.getString("format.float"));
// now the symbol of the currency
CurrencyBL currency = new CurrencyBL(currencyId);
String symbol = currency.getEntity().getSymbol();
if (symbol.length() >= 4 && symbol.charAt(0) == '&' &&
symbol.charAt(1) == '#') {
if (!forEmail) {
// this is an html symbol
// remove the first two digits
symbol = symbol.substring(2);
// remove the last digit (;)
symbol = symbol.substring(0, symbol.length() - 1);
// convert to a single char
Character ch = (char) Integer.valueOf(symbol).intValue();
symbol = ch.toString();
} else {
symbol = currency.getEntity().getCode();
}
}
return symbol + " " + format.format(number.doubleValue());
} catch (Exception e) {
throw new SessionInternalError(e);
}
}
public static String formatMoney(Float number, Integer userId,
Integer currencyId, boolean forEmail)
throws SessionInternalError {
Locale locale;
try {
// find first the right format for the number
UserBL user = new UserBL(userId);
locale = user.getLocale();
ResourceBundle bundle = ResourceBundle.getBundle("entityNotifications",
locale);
NumberFormat format = NumberFormat.getNumberInstance(locale);
((DecimalFormat) format).applyPattern(bundle.getString(
"format.float"));
// now the symbol of the currency
CurrencyBL currency = new CurrencyBL(currencyId);
String symbol = currency.getEntity().getSymbol();
if (symbol.length() >= 4 && symbol.charAt(0) == '&' &&
symbol.charAt(1) == '#') {
if (!forEmail) {
// this is an html symbol
// remove the first two digits
symbol = symbol.substring(2);
// remove the last digit (;)
symbol = symbol.substring(0, symbol.length() - 1);
// convert to a single char
Character ch = new Character((char)
Integer.valueOf(symbol).intValue());
symbol = ch.toString();
} else {
symbol = currency.getEntity().getCode();
}
}
return symbol + " " + format.format(number.doubleValue());
} catch (Exception e) {
throw new SessionInternalError(e);
}
}
public static String getPeriodUnitStr(Integer id, Integer language) {
Logger log = Logger.getLogger(Util.class);
InternationalDescriptionDTO inter = ((InternationalDescriptionDAS)
Context.getBean(Context.Name.DESCRIPTION_DAS)).findIt(Constants.TABLE_PERIOD_UNIT, id,
"description", language);
if (inter == null) {
log.debug("Description not set for period unit " + id + " language" +
" " + language);
return null;
}
return inter.getContent();
}
public static double round(double val, int places) {
long factor = (long) Math.pow(10, places);
// Shift the decimal the correct number of places
// to the right.
val = val * factor;
// Round to the nearest integer.
long tmp = Math.round(val);
// Shift the decimal the correct number of places
// back to the left.
return (double) tmp / factor;
}
public static float round(float val, int places) {
return (float) round((double) val, places);
}
public static String decimal2string(BigDecimal arg, Locale loc) {
if (arg == null) return null;
return NumberFormat.getInstance(loc).format(arg);
}
public static String float2string(Float arg, Locale loc) {
if (arg == null) {
return null;
}
NumberFormat nf = NumberFormat.getInstance(loc);
return nf.format(arg);
}
public static String float2string(double arg, Locale loc) {
return float2string(new Float(arg), loc);
}
public static Float string2float (String arg, Locale loc)
throws ParseException {
if (arg == null) {
return null;
}
NumberFormat nf = NumberFormat.getInstance(loc);
return new Float(nf.parse(arg).floatValue());
}
public static String binaryToString(byte[] string) {
int readBytes = string.length;
StringBuffer hexData = new StringBuffer();
for (int i=0; i < readBytes; i++) {
hexData.append(hexLookupTable[0xff & string[i]]);
}
return hexData.toString();
}
public static byte[] stringToBinary(String string) {
byte retValue[] = new byte[string.length()/2];
for (int i=0; i < retValue.length; i++) {
String digit = string.substring(i * 2, (i *2) + 2);
int hex = Integer.parseInt(digit, 16);
byte by = (byte) hex;
retValue[i] = by;
}
return retValue;
}
public static ResourceBundle getEntityNotificationsBundle(Integer userId)
throws SessionInternalError {
UserBL userBL;
ResourceBundle bundle;
try {
userBL = new UserBL(userId);
bundle = ResourceBundle.getBundle("entityNotifications",
userBL.getLocale());
} catch (Exception e) {
throw new SessionInternalError("Error getting user info or resource bundle",
Util.class, e);
}
return bundle;
}
/**
* Basic CSV line splitting that takes quotes into account.
* Doesn't do any error checking, e.g., mis-matched quotes.
*/
public static String[] csvSplitLine(String line, char fieldSeparator) {
LinkedList<String> fields = new LinkedList<String>();
boolean inQuote = false; // whether inside a quotation
String field = "";
for (int i = 0; i < line.length(); i++) {
if (line.charAt(i) == '\"') {
if (inQuote && i + 1 != line.length() && line.charAt(i + 1) == '\"') {
field += '\"';
i++; // skip over quote escape
} else {
inQuote = !inQuote;
}
} else if (!inQuote && line.charAt(i) == fieldSeparator) {
fields.add(field);
field = "";
} else {
field += line.charAt(i);
}
}
fields.add(field); // after last ','
return fields.toArray(new String[0]);
}
/**
* Joining by separator after each 'not last' value
*
* @param lst list for joining
* @param separator separator string
* @return joined string
*/
public static String join(List<String> lst, String separator) {
if (lst == null) return "";
StringBuilder str = new StringBuilder();
Iterator<String> iter = lst.iterator();
while (iter.hasNext()) {
str.append(iter.next());
if (iter.hasNext()) {
str.append(separator);
}
}
return str.toString();
}
/**
* Basic CSV line concatination with characters escaping
*
* @param values values for concatination
* @param fieldSeparator character for fields separation
* @return concatinated string
*/
public static String concatCsvLine(List<String> values, String fieldSeparator) {
if (values == null || values.isEmpty()) return null;
StringBuilder builder = new StringBuilder(escapeStringForCsvFormat(values.get(0), fieldSeparator));
for (int i = 1; i < values.size(); i++) {
//add separator for 'not last' element
builder.append(fieldSeparator);
builder.append(escapeStringForCsvFormat(values.get(i), fieldSeparator));
}
return builder.toString();
}
private static String escapeStringForCsvFormat(String str, String fieldSeparator) {
if (str == null) return "";
//is escaping fieldSeparators and line separators by quotes needed
boolean inQuotes = str.indexOf(fieldSeparator) != -1 || str.indexOf('\n') != -1;
StringBuilder builder = new StringBuilder();
if (inQuotes) builder.append('\"');
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
//escaping quote by duplicating it
if (ch == '\"') {
builder.append('\"');
}
builder.append(ch);
}
if (inQuotes) builder.append('\"');
return builder.toString();
}
}