org.sakaiproject.util.DbResourceBundle.java Source code

Java tutorial

Introduction

Here is the source code for org.sakaiproject.util.DbResourceBundle.java

Source

/**********************************************************************************
 * $URL: https://source.sakaiproject.org/svn/kernel/branches/SAK-18678/api/src/main/java/org/sakaiproject/site/api/Site.java $
 * $Id: Site.java 81275 2010-08-14 09:24:56Z david.horwitz@uct.ac.za $
 ***********************************************************************************
 *
 * Copyright (c) 2003, 2004, 2005, 2006, 2008 Sakai Foundation
 *
 * Licensed under the Educational Community 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.opensource.org/licenses/ECL-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.sakaiproject.util;

import org.sakaiproject.messagebundle.api.MessageBundleService;
import org.sakaiproject.component.cover.ComponentManager;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.thread_local.api.ThreadLocalManager;

import java.util.*;
import java.util.Map.Entry;

/**
 * An extension of ResourceBundle which gets the bundle data in the normal way and then
 * consults with the MessageBundleService for addition data.
 * Any values returned by the MessageBundleService will override values returned from
 * the normal ResourceBundle.
 *
 * Also provides a method to index new bundle data by interacting with the MessageBundleService
 * to do the real work.
 *
 * Created by IntelliJ IDEA.
 * User: jbush
 * Date: May 7, 2009
 * Time: 11:03:59 AM
 * To change this template use File | Settings | File Templates.
 */
@SuppressWarnings({ "rawtypes", "unchecked" })
public class DbResourceBundle extends ResourceBundle {
    protected Locale locale;
    protected Map entries = new HashMap();
    protected String baseName;

    protected static Log log = LogFactory.getLog(DbResourceBundle.class);

    private DbResourceBundle(String baseName, Locale locale) {
        this.baseName = baseName;
        this.locale = locale;
    }

    private static Object LOCK = new Object();

    private static ThreadLocalManager threadLocalManager;

    protected static ThreadLocalManager getThreadLocalManager() {
        if (threadLocalManager == null) {
            synchronized (LOCK) {
                ThreadLocalManager component = (ThreadLocalManager) ComponentManager.get(ThreadLocalManager.class);
                if (component == null) {
                    throw new IllegalStateException(
                            "Unable to find the ThreadLocalManager using the ComponentManager");
                } else {
                    threadLocalManager = component;
                }
            }
        }
        return threadLocalManager;
    }

    /**
     *
     * @param baseName
     * @param locale
     * @param classLoader
     * @return ResourceBundle with values from classpath loading, and overridden by any values
     *         retrieved from the MessageBundleService
     */
    static public ResourceBundle addResourceBundle(String baseName, Locale locale, ClassLoader classLoader) {
        DbResourceBundle newBundle = new DbResourceBundle(baseName, locale);
        String context = (String) getThreadLocalManager().get(org.sakaiproject.util.RequestFilter.CURRENT_CONTEXT);
        try {
            if (context != null) {
                Map bundleValues = getMessageBundleService().getBundle(baseName, context, locale);
                Iterator<Entry<String, String>> bundleEntryIter = bundleValues.entrySet().iterator();
                while (bundleEntryIter.hasNext()) {
                    Entry<String, String> entry = bundleEntryIter.next();
                    String key = entry.getKey();
                    String value = entry.getValue();
                    newBundle.addProperty(key, value);
                }
            }
            ResourceBundle loadedBundle = null;
            try {
                if (classLoader == null)
                    loadedBundle = ResourceBundle.getBundle(baseName, locale);
                else
                    loadedBundle = ResourceBundle.getBundle(baseName, locale, classLoader);
            } catch (NullPointerException e) {
            } // ignore

            Enumeration<String> keys = loadedBundle.getKeys();
            while (keys.hasMoreElements()) {
                String key = keys.nextElement();
                if (newBundle.handleGetObject(key) == null) {
                    newBundle.addProperty(key, loadedBundle.getString(key));
                }
            }
        } catch (Exception e) {
            log.error(
                    "problem loading bundle: " + baseName + " locale: " + locale.toString() + " " + e.getMessage());
        }

        return newBundle;
    }

    protected void addProperty(String name, String value) {
        entries.put(name, value);
    }

    public Locale getLocale() {
        return locale;
    }

    protected Object handleGetObject(String key) {
        return entries.get(key);
    }

    public Enumeration<String> getKeys() {
        return Collections.enumeration(entries.keySet());
    }

    /**
     * imports or updates bundle data via the MessageBundleService
     * @param baseName
     * @param newBundle
     * @param loc
     * @param classLoader
     */
    public static void indexResourceBundle(String baseName, ResourceBundle newBundle, Locale loc,
            ClassLoader classLoader) {
        // serves as the moduleName
        String context = (String) getThreadLocalManager().get(org.sakaiproject.util.RequestFilter.CURRENT_CONTEXT);
        if (context == null)
            return;
        MessageBundleService messageBundleService = getMessageBundleService();
        messageBundleService.saveOrUpdate(baseName, context, newBundle, loc);

    }

    private static MessageBundleService getMessageBundleService() {
        return (MessageBundleService) ComponentManager.get(MessageBundleService.class.getName());
    }

}