/*
* Chrysalix
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership. Some portions may be licensed
* to Red Hat, Inc. under one or more contributor license agreements.
* See the AUTHORS.txt file in the distribution for a full listing of
* individual contributors.
*
* Chrysalix is free software. Unless otherwise indicated, all code in Chrysalix
* is licensed to you 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.
*
* Chrysalix 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.chrysalix.common.i18n;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import org.chrysalix.common.CheckArg;
import org.chrysalix.common.I18n;
/**
* Class that loads a properties file from the classpath of the supplied {@link ClassLoader class loader}.
* <p>
* This repository for a property file by building locations of the form "path/to/class_locale.properties", where "path/to/class" is
* created from the fully-qualified classname and all "." replaced with "/" characters, "locale" is the a variant of the locale
* (first the full locale, then subsequently with the last segment removed). As soon as a property file is found, its URL is
* returned immediately.
* </p>
* named with a name that matches
*/
public final class ClasspathLocalizationRepository {
/**
* Obtain the URL to the properties file containing the localized messages given the supplied bundle name. This method is
* responsible for searching to find the most appropriate localized messages given the locale, but does not need to search using
* the {@link Locale#getDefault() default locale} (as that is done by the {@link I18n#text(Object...) calling} method.
*
* @param classLoader
* the classloader that should be used to load the localization bundles
* @param bundleName
* the name of the bundle of properties; never null
* @param locale
* the locale for which the properties file URL is desired
* @return the URL to the properties file containing the localized messages for the named bundle, or null if no such bundle
* could be found
*/
public static URL getLocalizationBundle( final ClassLoader classLoader,
final String bundleName,
final Locale locale ) {
CheckArg.notNull( classLoader, "classLoader" );
URL url = null;
final List< String > paths = getPathsToSearchForBundle( bundleName, locale );
for ( final String path : paths ) {
url = classLoader.getResource( path );
if ( url != null ) {
return url;
}
}
return url;
}
/**
* Returns a list of paths (as string) of the different bundles searched in the
* {@link ClasspathLocalizationRepository#getLocalizationBundle(ClassLoader, String, java.util.Locale)} method.
*
* @param bundleName
* the name of the bundle of properties; never null
* @param locale
* the locale for which the properties file URL is desired
* @return a list of paths which the repository would look at.
*/
public static List< String > getPathsToSearchForBundle( final String bundleName,
final Locale locale ) {
final List< String > result = new ArrayList<>();
final String pathPrefix = bundleName.replaceAll( "\\.", "/" );
String localeVariant = '_' + locale.toString();
int ndx = localeVariant.lastIndexOf( '_' );
while ( ndx >= 0 ) {
final String path = pathPrefix + localeVariant + ".properties";
result.add( path );
localeVariant = localeVariant.substring( 0, ndx );
ndx = localeVariant.lastIndexOf( '_' );
}
result.add( pathPrefix + localeVariant + ".properties" );
return result;
}
private ClasspathLocalizationRepository() {}
}