TemplateResourceBundle.java
/*
* Copyright (C) 2003-2013 eXo Platform SAS.
*
* 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; either version 3
* of the License, or (at your option) any later version.
*
* 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see<http://www.gnu.org/licenses/>.
*/
package org.exoplatform.commons.notification.template;
import java.io.IOException;
import java.io.InputStream;
import java.util.Locale;
import java.util.ResourceBundle;
import java.util.Scanner;
import org.apache.commons.lang.StringUtils;
import org.exoplatform.commons.notification.NotificationUtils;
import org.exoplatform.commons.utils.CommonsUtils;
import org.exoplatform.container.configuration.ConfigurationManager;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.services.resources.ResourceBundleData;
import org.exoplatform.services.resources.ResourceBundleService;
public class TemplateResourceBundle {
private static final Log LOG = ExoLogger.getLogger(TemplateResourceBundle.class);
private static final String CONF_LOCATION = "war:/classes/";
private String language;
private String bundlePath;
public TemplateResourceBundle(String language, String bundlePath) {
this.language = language;
this.bundlePath = bundlePath;
}
/**
* @return the language
*/
public String getLanguage() {
return language;
}
/**
* @param language the language to set
*/
public void setLanguage(String language) {
this.language = language;
}
/**
* @return the bundlePath
*/
public String getBundlePath() {
return bundlePath;
}
/**
* @param bundlePath the bundlePath to set
*/
public void setBundlePath(String bundlePath) {
this.bundlePath = bundlePath;
}
public String appRes(String key) {
return getResourceBundle(key, NotificationUtils.getLocale(language), bundlePath);
}
public String appRes(String key, String... strs) {
String value = appRes(key);
if (strs != null && strs.length > 0) {
for (int i = 0; i < strs.length; ++i) {
value = StringUtils.replace(value, "{" + i + "}", strs[i]);
}
}
return value;
}
private static ResourceBundle addResourceBundle(ResourceBundleService bundleService, String resourceLocale, Locale locale) {
String id = new StringBuffer(CONF_LOCATION).append(resourceLocale.replace(".", "/"))
.append("_").append(locale.getLanguage()).append(".properties").toString();
try {
ConfigurationManager configurationManager = CommonsUtils.getService(ConfigurationManager.class);
InputStream inputStream = configurationManager.getInputStream(id);
if (inputStream != null) {
String data = getContent(inputStream);
ResourceBundleData bundleData = new ResourceBundleData(data);
bundleData.setLanguage(locale.getLanguage());
bundleData.setName(resourceLocale);
bundleData.setCountry("");
bundleData.setVariant("");
//
bundleService.saveResourceBundle(bundleData);
return bundleService.getResourceBundle(resourceLocale, locale);
}
} catch (Exception e) {
LOG.warn("Can not add resource bundle of locale " + resourceLocale + "\n" + e.getMessage());
}
return null;
}
public static String getResourceBundle(String key, Locale locale, String resourceLocale) {
if (key == null || key.trim().length() == 0) {
return "";
}
if (locale == null || locale.getLanguage().isEmpty()) {
locale = Locale.ENGLISH;
}
ResourceBundle res = null;
ResourceBundleService bundleService = CommonsUtils.getService(ResourceBundleService.class);
if (bundleService != null) {
res = bundleService.getResourceBundle(resourceLocale, locale);
// if null, try another way
if (res == null) {
//
res = addResourceBundle(bundleService, resourceLocale, locale);
}
}
// still null
if (res == null || res.containsKey(key) == false) {
if (key.indexOf(".digest.") < 0) {
LOG.warn("Can not get resource bundle by key: " + key);
}
return key;
}
return res.getString(key);
}
static private String getContent(InputStream input) throws IOException {
StringBuilder content = new StringBuilder();
Scanner scanner = new Scanner(input, "UTF-8");
try {
while (scanner.hasNextLine()) {
if (content.length() > 0) {
content.append("\n");
}
String s = scanner.nextLine();
content.append(s);
}
} finally {
scanner.close();
input.close();
}
return content.toString();
}
}