/**
* Licensed to the Austrian Association for Software Tool Integration (AASTI)
* under one or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information regarding copyright
* ownership. The AASTI licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.openengsb.core.api.l10n;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.text.MessageFormat;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Properties;
import org.apache.commons.lang.LocaleUtils;
import org.osgi.framework.Bundle;
import org.osgi.framework.Constants;
/**
* Localization helper to lookup string resources from the bundle's localization entries.
*/
@SuppressWarnings("serial")
public class BundleStrings implements StringLocalizer {
private HashMap<String, Properties> entries;
public BundleStrings() {
}
public BundleStrings(Bundle bundle) {
setBundle(bundle);
}
@Override
public LocalizableString getString(final String key, final String... parameters) {
return new LocalizableString() {
@Override
public String getString(Locale locale) {
return BundleStrings.this.getString(key, locale, parameters);
}
@Override
public String getKey() {
return key;
}
};
}
@Override
public String getString(String key, Locale locale, String... parameters) {
@SuppressWarnings("unchecked")
List<Locale> locales = LocaleUtils.localeLookupList(locale, new Locale(""));
for (Locale l : locales) {
Properties p = entries.get(buildEntryFilename(l));
if (p == null) {
continue;
}
if (p.containsKey(key)) {
String property = p.getProperty(key);
String format = MessageFormat.format(property, (Object[]) parameters);
return format;
}
}
return null;
}
private String buildEntryFilename(Locale locale) {
String name = "";
if (!locale.getLanguage().isEmpty()) {
name += '_' + locale.getLanguage();
if (!locale.getCountry().isEmpty()) {
name += '_' + locale.getCountry();
if (!locale.getVariant().isEmpty()) {
name += '_' + locale.getVariant();
}
}
}
return name;
}
public void setBundle(Bundle bundle) {
String path = (String) bundle.getHeaders().get(Constants.BUNDLE_LOCALIZATION);
if (path == null) {
path = Constants.BUNDLE_LOCALIZATION_DEFAULT_BASENAME;
}
path = path.trim();
int idx = path.lastIndexOf('/');
if (idx == -1) {
buildEntriesMap(bundle, "/", path);
} else if (idx == 0) {
buildEntriesMap(bundle, "/", path.substring(1));
} else {
buildEntriesMap(bundle, path.substring(0, idx), path.substring(idx + 1));
}
}
private void buildEntriesMap(Bundle bundle, String directory, String basename) {
@SuppressWarnings("unchecked")
Enumeration<URL> resources = bundle.findEntries(directory, basename + "*.properties", false);
entries = new HashMap<String, Properties>();
while (resources != null && resources.hasMoreElements()) {
URL url = resources.nextElement();
String name = new File(url.toString()).getName().substring(basename.length());
name = name.substring(0, name.length() - ".properties".length());
Properties p = loadProperties(url);
if (p != null) {
entries.put(name, p);
}
}
}
private Properties loadProperties(URL url) {
InputStream in = null;
try {
in = url.openStream();
Properties p = new Properties();
p.load(in);
return p;
} catch (IOException e) {
return null;
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
// nop
}
}
}
}
}