blob: 2be980304eb009e0e923623b79cf101f15b165c7 [file] [log] [blame]
package org.apache.turbine.util;
import java.nio.charset.Charset;
import java.nio.charset.IllegalCharsetNameException;
import java.nio.charset.StandardCharsets;
import java.nio.charset.UnsupportedCharsetException;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF 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.
*/
import java.util.Locale;
import org.apache.commons.lang3.StringUtils;
import org.apache.fulcrum.mimetype.MimeTypeService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.turbine.Turbine;
import org.apache.turbine.TurbineConstants;
import org.apache.turbine.services.ServiceManager;
import org.apache.turbine.services.TurbineServices;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF 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.
*/
/**
* This class provides utilities for handling locales and charsets
*
* @author <a href="mailto:tv@apache.org">Thomas Vandahl</a>
*/
public class LocaleUtils
{
/** Logging */
private static final Logger log = LogManager.getLogger(LocaleUtils.class);
/** The default locale. */
private static Locale defaultLocale = null;
/** The default charset. */
private static Charset defaultCharSet = null;
/**
* Returns the default input encoding for the servlet.
*
* @return the default input encoding.
*/
public static String getDefaultInputEncoding()
{
// Get the default input defaultEncoding
String inputEncoding = Turbine.getConfiguration()
.getString(TurbineConstants.PARAMETER_ENCODING_KEY,
TurbineConstants.PARAMETER_ENCODING_DEFAULT);
log.debug("Input Encoding has been set to {}", inputEncoding);
return inputEncoding;
}
/**
* Gets the default locale defined by properties named "locale.default.lang"
* and "locale.default.country".
*
* This changed from earlier Turbine versions that you can rely on
* getDefaultLocale() to never return null.
*
* @return A Locale object.
*/
public static Locale getDefaultLocale()
{
if (defaultLocale == null)
{
/* Get the default locale and cache it in a static variable. */
String lang = Turbine.getConfiguration()
.getString(TurbineConstants.LOCALE_DEFAULT_LANGUAGE_KEY,
TurbineConstants.LOCALE_DEFAULT_LANGUAGE_DEFAULT);
String country = Turbine.getConfiguration()
.getString(TurbineConstants.LOCALE_DEFAULT_COUNTRY_KEY,
TurbineConstants.LOCALE_DEFAULT_COUNTRY_DEFAULT);
// We ensure that lang and country is never null
defaultLocale = new Locale(lang, country);
}
return defaultLocale;
}
/**
* Gets the default charset defined by a property named
* "locale.default.charset"
*
* @return the name of the default charset or null.
*/
@Deprecated
public static String getDefaultCharSet()
{
return getDefaultCharset().name();
}
/**
* Gets the default charset defined by a property named
* "locale.default.charset"
*
* @return the default charset, never null.
*/
public static Charset getDefaultCharset()
{
if (defaultCharSet == null)
{
/* Get the default charset and cache it in a static variable. */
String charSet = Turbine.getConfiguration()
.getString(TurbineConstants.LOCALE_DEFAULT_CHARSET_KEY,
TurbineConstants.LOCALE_DEFAULT_CHARSET_DEFAULT);
if (StringUtils.isNotEmpty(charSet))
{
defaultCharSet = charSetForName(charSet);
log.debug("defaultCharSet = {} (From Properties)", defaultCharSet);
}
}
Charset charset = defaultCharSet;
if (charset == null) // can happen if set explicitly in the configuration
{
log.debug("Default charset is empty!");
/* Default charset isn't specified, get the locale specific one. */
Locale locale = getDefaultLocale();
log.debug("Locale is {}", locale);
if (!locale.equals(Locale.US))
{
log.debug("We don't have US Locale!");
ServiceManager serviceManager = TurbineServices.getInstance();
if (serviceManager.isRegistered(MimeTypeService.ROLE))
{
try
{
MimeTypeService mimeTypeService = (MimeTypeService) serviceManager.getService(MimeTypeService.ROLE);
charset = charSetForName(mimeTypeService.getCharSet(locale));
}
catch (Exception e)
{
throw new RuntimeException(e);
}
log.debug("Charset now {}", charset);
}
}
// The fallback to end all fallbacks
if (charset == null)
{
charset = StandardCharsets.ISO_8859_1;
}
}
log.debug("Returning default Charset of {}", charset);
return charset;
}
/**
* Gets the charset defined by a property named "locale.override.charset"
* This property has no default. If it exists, the output charset is always
* set to its value
*
* @return the name of the override charset or null.
*/
@Deprecated
public static String getOverrideCharSet()
{
return Turbine.getConfiguration()
.getString(TurbineConstants.LOCALE_OVERRIDE_CHARSET_KEY);
}
/**
* Gets the charset defined by a property named "locale.override.charset"
* This property has no default. If it exists, the output charset is always
* set to its value
*
* @return the override charset or null.
*/
public static Charset getOverrideCharset()
{
String charset = Turbine.getConfiguration()
.getString(TurbineConstants.LOCALE_OVERRIDE_CHARSET_KEY);
if (StringUtils.isEmpty(charset))
{
return null;
}
return charSetForName(charset);
}
/**
* Get a Charset object for a given name
* This method does not throw exceptions on illegal input but returns null.
*
* @param charSet the charset name
*
* @return the Charset or null if it does not exist
*/
private static Charset charSetForName(String charSet)
{
try
{
return Charset.forName(charSet);
}
catch (IllegalCharsetNameException | UnsupportedCharsetException e)
{
log.error("Illegal default charset {}", charSet);
}
return null;
}
}