/*
 * Copyright 2002-2017 the original author or authors.
 *
 * Licensed 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
 *
 *      https://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.springframework.beans.propertyeditors;

import java.beans.PropertyEditorSupport;
import java.util.Locale;
import java.util.ResourceBundle;

import org.springframework.util.Assert;
import org.springframework.util.StringUtils;

PropertyEditor implementation for standard JDK ResourceBundles.

Only supports conversion from a String, but not to a String. Find below some examples of using this class in a (properly configured) Spring container using XML-based metadata:

 <bean id="errorDialog" class="...">
   <!--
       the 'messages' property is of type java.util.ResourceBundle.
       the 'DialogMessages.properties' file exists at the root of the CLASSPATH
   -->
   <property name="messages" value="DialogMessages"/>
</bean>
 <bean id="errorDialog" class="...">
   <!--
       the 'DialogMessages.properties' file exists in the 'com/messages' package
   -->
   <property name="messages" value="com/messages/DialogMessages"/>
</bean>

A 'properly configured' Spring container might contain a CustomEditorConfigurer definition such that the conversion can be effected transparently:

 <bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
   <property name="customEditors">
       <map>
           <entry key="java.util.ResourceBundle">
               <bean class="org.springframework.beans.propertyeditors.ResourceBundleEditor"/>
           </entry>
       </map>
   </property>
</bean>

Please note that this PropertyEditor is not registered by default with any of the Spring infrastructure.

Thanks to David Leal Valmana for the suggestion and initial prototype.

Author:Rick Evans, Juergen Hoeller
Since:2.0
/** * {@link java.beans.PropertyEditor} implementation for standard JDK * {@link java.util.ResourceBundle ResourceBundles}. * * <p>Only supports conversion <i>from</i> a String, but not <i>to</i> a String. * * Find below some examples of using this class in a (properly configured) * Spring container using XML-based metadata: * * <pre class="code"> &lt;bean id="errorDialog" class="..."&gt; * &lt;!-- * the 'messages' property is of type java.util.ResourceBundle. * the 'DialogMessages.properties' file exists at the root of the CLASSPATH * --&gt; * &lt;property name="messages" value="DialogMessages"/&gt; * &lt;/bean&gt;</pre> * * <pre class="code"> &lt;bean id="errorDialog" class="..."&gt; * &lt;!-- * the 'DialogMessages.properties' file exists in the 'com/messages' package * --&gt; * &lt;property name="messages" value="com/messages/DialogMessages"/&gt; * &lt;/bean&gt;</pre> * * <p>A 'properly configured' Spring {@link org.springframework.context.ApplicationContext container} * might contain a {@link org.springframework.beans.factory.config.CustomEditorConfigurer} * definition such that the conversion can be effected transparently: * * <pre class="code"> &lt;bean class="org.springframework.beans.factory.config.CustomEditorConfigurer"&gt; * &lt;property name="customEditors"&gt; * &lt;map&gt; * &lt;entry key="java.util.ResourceBundle"&gt; * &lt;bean class="org.springframework.beans.propertyeditors.ResourceBundleEditor"/&gt; * &lt;/entry&gt; * &lt;/map&gt; * &lt;/property&gt; * &lt;/bean&gt;</pre> * * <p>Please note that this {@link java.beans.PropertyEditor} is <b>not</b> * registered by default with any of the Spring infrastructure. * * <p>Thanks to David Leal Valmana for the suggestion and initial prototype. * * @author Rick Evans * @author Juergen Hoeller * @since 2.0 */
public class ResourceBundleEditor extends PropertyEditorSupport {
The separator used to distinguish between the base name and the locale (if any) when converting from a String.
/** * The separator used to distinguish between the base name and the locale * (if any) when {@link #setAsText(String) converting from a String}. */
public static final String BASE_NAME_SEPARATOR = "_"; @Override public void setAsText(String text) throws IllegalArgumentException { Assert.hasText(text, "'text' must not be empty"); String name = text.trim(); int separator = name.indexOf(BASE_NAME_SEPARATOR); if (separator == -1) { setValue(ResourceBundle.getBundle(name)); } else { // The name potentially contains locale information String baseName = name.substring(0, separator); if (!StringUtils.hasText(baseName)) { throw new IllegalArgumentException("Invalid ResourceBundle name: '" + text + "'"); } String localeString = name.substring(separator + 1); Locale locale = StringUtils.parseLocaleString(localeString); setValue(locale != null ? ResourceBundle.getBundle(baseName, locale) : ResourceBundle.getBundle(baseName)); } } }