net.solarnetwork.web.support.ReloadableResourceBundleMessagesSource.java Source code

Java tutorial

Introduction

Here is the source code for net.solarnetwork.web.support.ReloadableResourceBundleMessagesSource.java

Source

/* ==================================================================
 * ReloadableResourceBundleMessagesSource.java - Jun 18, 2011 12:14:11 PM
 * 
 * Copyright 2007-2011 SolarNetwork.net Dev Team
 * 
 * This program is free software; you can redistribute it and/or 
 * modify it under the terms of the GNU General Public License as 
 * published by the Free Software Foundation; either version 2 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, write to the Free Software 
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 
 * 02111-1307 USA
 * ==================================================================
 * $Id$
 * ==================================================================
 */

package net.solarnetwork.web.support;

import java.util.Collections;
import java.util.Enumeration;
import java.util.Locale;
import java.util.Set;
import org.springframework.context.MessageSource;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;

/**
 * Extension of {@link ReloadableResourceBundleMessagesSource} to allow finding
 * all keys for all messages.
 * 
 * <p>
 * Adapted from {@code magoffin.matt.xweb.util.ResourceBundleMessagesSource}.
 * </p>
 * 
 * @author matt
 * @version $Revision$
 */
public class ReloadableResourceBundleMessagesSource extends ReloadableResourceBundleMessageSource
        implements MessageSource, MessagesSource {

    /**
     * Private copy of basenames, as parent class does not provide a way to
     * access this.
     */
    private String[] basenames;
    private MessagesSource parent;

    @Override
    public void setBasenames(String... basenames) {
        super.setBasenames(basenames);
        this.basenames = basenames;
    }

    @Override
    public void registerMessageResource(String resource) {
        String[] newBasenames = new String[basenames.length + 1];
        System.arraycopy(basenames, 0, newBasenames, 0, basenames.length);
        newBasenames[newBasenames.length - 1] = resource;
        super.setBasenames(newBasenames);
        this.basenames = newBasenames;
    }

    @Override
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public Enumeration<String> getKeys(Locale locale) {
        PropertiesHolder propHolder = super.getMergedProperties(locale);
        return Collections.enumeration((Set) propHolder.getProperties().keySet());
    }

    @Override
    protected String getMessageInternal(String code, Object[] args, Locale locale) {
        String msg = super.getMessageInternal(code, args, locale);
        if (msg != null) {
            return msg;
        }
        if (parent != null) {
            return parent.getMessage(code, args, locale);
        }
        return null;
    }

    /**
     * @return the parent
     */
    public MessagesSource getParent() {
        return parent;
    }

    /**
     * @param parent
     *        the parent to set
     */
    public void setParent(MessagesSource parent) {
        this.parent = parent;
    }

}