/** * 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.resources; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Created by The eXo Platform SAS . Author : Tuan Nguyen tuan08@users.sourceforge.net Date: May 14, 2004 Time: 1:12:22 PM */ @SuppressWarnings("serial") public class ResourceBundleData extends ResourceBundleDescription implements Serializable { /** . */ private static Pattern LINE_SEPARATOR = Pattern.compile("[\\r]?\\n"); /** . */ private static Pattern UNICODE_CHARACTER = Pattern.compile("\\\\u[\\p{XDigit}]{4}+"); /** . */ private String data; /** . */ Object[][] contents; public ResourceBundleData(String data) { setData(data); setResourceType("-"); setLanguage(DEFAULT_LANGUAGE); } public ResourceBundleData() { this(null); } public String getData() { return data; } public void setData(String data) { this.data = data; if (data != null) { String[] tokens = LINE_SEPARATOR.split(data); List<String[]> properties = new ArrayList<String[]>(); for (String token : tokens) { int idx = token.indexOf('='); if (idx < 0 || idx >= token.length() - 1) { continue; } String key = token.substring(0, idx); if (key.trim().startsWith("#")) { continue; } String value = convert(token.substring(idx + 1, token.length())); properties.add(new String[] { key, value }); } String[][] aProperties = new String[properties.size()][2]; contents = properties.toArray(aProperties); } else { contents = new Object[0][]; } } static String convert(String content) { Matcher matcher = UNICODE_CHARACTER.matcher(content); StringBuilder buffer = new StringBuilder(content.length()); int start = 0; while (matcher.find(start)) { buffer.append(content.substring(start, matcher.start())); buffer.append(unicode2Char(matcher.group())); start = matcher.end(); } if (start >= 0 && start < content.length()) { buffer.append(content.substring(start)); } return buffer.toString(); } static char unicode2Char(String unicodeChar) { int value = 0; char aChar; for (int i = 0; i < 4; i++) { aChar = unicodeChar.charAt(i + 2); switch (aChar) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': { value = (value << 4) + aChar - '0'; break; } case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': { value = (value << 4) + 10 + aChar - 'a'; break; } case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': { value = (value << 4) + 10 + aChar - 'A'; break; } default: { throw new IllegalArgumentException("Malformed \\uxxxx encoding."); } } } return (char) value; } }