/* * Tigase Jabber/XMPP Server * Copyright (C) 2004-2012 "Artur Hefczyc" <artur.hefczyc@tigase.org> * * This program 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, version 3 of the License. * * This program 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 this program. Look for COPYING file in the top folder. * If not, see http://www.gnu.org/licenses/. * * $Rev$ * Last modified by $Author$ * $Date$ */ package tigase.util; import java.util.Arrays; import java.util.LinkedHashMap; import java.util.Map; /** * Created: May 28, 2009 7:39:07 AM * * @author <a href="mailto:artur.hefczyc@tigase.org">Artur Hefczyc</a> * @version $Rev$ */ public class DataTypes { public static final Map<String, Character> typesMap = new LinkedHashMap<String, Character>(); static { typesMap.put(String.class.getName(), 'S'); typesMap.put(Long.class.getName(), 'L'); typesMap.put(Integer.class.getName(), 'I'); typesMap.put(Boolean.class.getName(), 'B'); typesMap.put(Float.class.getName(), 'F'); typesMap.put(Double.class.getName(), 'D'); typesMap.put(String[].class.getName(), 's'); typesMap.put(Long[].class.getName(), 'l'); typesMap.put(Integer[].class.getName(), 'i'); typesMap.put(Boolean[].class.getName(), 'b'); typesMap.put(Float[].class.getName(), 'f'); typesMap.put(Double[].class.getName(), 'd'); typesMap.put(long[].class.getName(), 'l'); typesMap.put(int[].class.getName(), 'i'); typesMap.put(boolean[].class.getName(), 'b'); typesMap.put(float[].class.getName(), 'f'); typesMap.put(double[].class.getName(), 'd'); } // public static char[] sizeChars = {'k', 'K', 'm', 'M', 'g', 'G', 't', 'T'}; public static int parseSizeInt(String size, int def) { if (size == null) { return def; } int result = def; String toParse = size; int multiplier = 1; try { switch (size.charAt(size.length() - 1)) { case 'k': case 'K': multiplier = 1024; toParse = size.substring(0, size.length() - 1); break; case 'm': case 'M': multiplier = 1024 * 1024; toParse = size.substring(0, size.length() - 1); break; case 'g': case 'G': multiplier = 1024 * 1024 * 1024; toParse = size.substring(0, size.length() - 1); break; } result = Integer.parseInt(toParse) * multiplier; } catch (Exception e) { return def; } return result; } public static boolean parseBool(final String val) { return val != null && (val.equalsIgnoreCase("yes") || val.equalsIgnoreCase("true") || val.equalsIgnoreCase("on") || val.equals("1")); } public static Object decodeValueType(char typeId, String value) throws IllegalArgumentException { Object result = value.trim(); try { switch (typeId) { case 'L': // Long value result = Long.decode(value.trim()); break; case 'I': // Integer value result = Integer.decode(value.trim()); break; case 'B': // Boolean value result = parseBool(value.trim()); break; case 'F': // Float value result = Float.parseFloat(value.trim()); break; case 'D': // Double value result = Double.parseDouble(value.trim()); break; case 's': // Comma separated, Strings array String[] s_str = value.split(","); String[] trimed_str = new String[s_str.length]; int si = 0; for (String s : s_str) { trimed_str[si++] = s.trim(); } result = trimed_str; break; case 'l': // Comma separated, long array String[] longs_str = value.split(","); long[] longs = new long[longs_str.length]; int l = 0; for (String s : longs_str) { longs[l++] = Long.parseLong(s.trim()); } result = longs; break; case 'i': // Comma separated, int array String[] ints_str = value.split(","); int[] ints = new int[ints_str.length]; int i = 0; for (String s : ints_str) { ints[i++] = Integer.parseInt(s.trim()); } result = ints; break; case 'b': // Comma separated, boolean array String[] bools_str = value.split(","); boolean[] bools = new boolean[bools_str.length]; int b = 0; for (String s : bools_str) { bools[b++] = parseBool(s.trim()); } result = bools; break; case 'f': // Comma separated, float array String[] float_str = value.split(","); float[] floats = new float[float_str.length]; int f = 0; for (String s : float_str) { floats[f++] = Float.parseFloat(s.trim()); } result = floats; break; case 'd': // Comma separated, double array String[] doubles_str = value.split(","); double[] doubles = new double[doubles_str.length]; int d = 0; for (String s : doubles_str) { doubles[d++] = Double.parseDouble(s.trim()); } result = doubles; break; default: // Do nothing, default to String break; } } catch (Exception e) { throw new IllegalArgumentException(e); } return result; } public static String valueToString(Object value) { char t = getTypeId(value); String varr = value.toString(); switch (t) { case 'l': varr = Arrays.toString((long[]) value); break; case 'i': varr = Arrays.toString((int[]) value); break; case 'b': varr = Arrays.toString((boolean[]) value); break; case 'f': varr = Arrays.toString((float[]) value); break; case 'd': varr = Arrays.toString((double[]) value); break; default: if (value.getClass().isArray()) { varr = Arrays.toString((Object[]) value); } } if (value.getClass().isArray()) { varr = varr.substring(1, varr.length() - 1); } return varr; } public static char decodeTypeIdFromName(String name) { char result = 'S'; if (name.endsWith("]")) { result = name.charAt(name.length() - 2); } return result; } public static String stripNameFromTypeId(String name) { if (name.endsWith("]")) { return name.substring(0, name.length() - 3); } else { return name; } } public static String encodeTypeIdInName(String name, Object value) { char t = DataTypes.getTypeId(value); return name + "[" + t + "]"; } public static char getTypeId(Object instance) { Character result = typesMap.get(instance.getClass().getName()); if (result == null) { result = 'S'; } return result.charValue(); } }