| /* |
| * 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. |
| */ |
| package org.apache.felix.webconsole.internal.i18n; |
| |
| |
| import java.util.HashMap; |
| import java.util.Locale; |
| import java.util.Map; |
| import java.util.ResourceBundle; |
| |
| import org.osgi.framework.Bundle; |
| import org.osgi.framework.BundleContext; |
| import org.osgi.framework.BundleEvent; |
| import org.osgi.framework.BundleListener; |
| |
| |
| /** |
| * The ResourceBundleManager manages resource bundle instance per OSGi Bundle. |
| * It contains a local cache, for bundles, but when a bundle is being unistalled, |
| * its resources stored in the cache are cleaned up. |
| */ |
| public class ResourceBundleManager implements BundleListener |
| { |
| |
| private final BundleContext bundleContext; |
| |
| private final ResourceBundleCache consoleResourceBundleCache; |
| |
| private final Map resourceBundleCaches; |
| |
| |
| /** |
| * Creates a new object and adds self as a bundle listener |
| * |
| * @param bundleContext the bundle context of the Web Console. |
| */ |
| public ResourceBundleManager( final BundleContext bundleContext ) |
| { |
| this.bundleContext = bundleContext; |
| this.consoleResourceBundleCache = new ResourceBundleCache( bundleContext.getBundle() ); |
| this.resourceBundleCaches = new HashMap(); |
| |
| bundleContext.addBundleListener( this ); |
| } |
| |
| |
| /** |
| * Removes the bundle lister. |
| */ |
| public void dispose() |
| { |
| bundleContext.removeBundleListener( this ); |
| } |
| |
| |
| /** |
| * This method is used to retrieve a /cached/ instance of the i18n resource associated |
| * with a given bundle. |
| * |
| * @param provider the bundle, provider of the resources |
| * @param locale the requested locale. |
| * @return the resource bundle - if not bundle with the requested locale exists, |
| * the default locale is used. |
| */ |
| public ResourceBundle getResourceBundle( final Bundle provider, final Locale locale ) |
| { |
| // check whether we have to return the resource bundle for the |
| // Web Console itself in which case we directly return it |
| final ResourceBundle defaultResourceBundle = consoleResourceBundleCache.getResourceBundle( locale ); |
| if ( provider == null || provider.equals( bundleContext.getBundle() ) ) |
| { |
| return defaultResourceBundle; |
| } |
| |
| ResourceBundleCache cache; |
| synchronized ( resourceBundleCaches ) |
| { |
| Long key = new Long( provider.getBundleId() ); |
| cache = ( ResourceBundleCache ) resourceBundleCaches.get( key ); |
| if ( cache == null ) |
| { |
| cache = new ResourceBundleCache( provider ); |
| resourceBundleCaches.put( key, cache ); |
| } |
| } |
| |
| final ResourceBundle bundleResourceBundle = cache.getResourceBundle( locale ); |
| return new CombinedResourceBundle( bundleResourceBundle, defaultResourceBundle, locale ); |
| } |
| |
| |
| // ---------- BundleListener |
| |
| /** |
| * @see org.osgi.framework.BundleListener#bundleChanged(org.osgi.framework.BundleEvent) |
| */ |
| public final void bundleChanged( BundleEvent event ) |
| { |
| if ( event.getType() == BundleEvent.STOPPED ) |
| { |
| Long key = new Long( event.getBundle().getBundleId() ); |
| synchronized ( resourceBundleCaches ) |
| { |
| resourceBundleCaches.remove( key ); |
| } |
| } |
| } |
| } |