com.enonic.cms.core.localization.LocalizationResourceBundleServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.enonic.cms.core.localization.LocalizationResourceBundleServiceImpl.java

Source

/*
 * Copyright 2000-2013 Enonic AS
 * http://www.enonic.com/license
 */
package com.enonic.cms.core.localization;

import java.io.IOException;
import java.util.Locale;
import java.util.Properties;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import com.enonic.cms.framework.cache.CacheFacade;
import com.enonic.cms.framework.cache.CacheManager;

import com.enonic.cms.core.resource.ResourceFile;
import com.enonic.cms.core.resource.ResourceKey;
import com.enonic.cms.core.resource.ResourceService;
import com.enonic.cms.core.structure.SiteEntity;

@Component
public final class LocalizationResourceBundleServiceImpl
        implements LocalizationResourceBundleService, InitializingBean {
    private ResourceService resourceService;

    private CacheFacade cacheFacade;

    private long checkInterval = 5000;

    private LocalizationPropertiesCache propertiesCache;

    @Override
    public LocalizationResourceBundle getResourceBundle(final SiteEntity site, final Locale locale) {
        final ResourceKey defaultLocalizationResourceKey = site.getDefaultLocalizationResource();
        if (defaultLocalizationResourceKey == null) {
            return null;
        }

        return createResourceBundle(locale, defaultLocalizationResourceKey);
    }

    private Properties loadBundle(final ResourceKey defaultLocalizationResourceKey, final String bundleExtension) {
        final String defaultLocalizationResourceName = defaultLocalizationResourceKey.toString();
        final int pos = defaultLocalizationResourceName.lastIndexOf('.');

        String bundleResourceKey = defaultLocalizationResourceName;
        if (pos > 0) {
            bundleResourceKey = defaultLocalizationResourceName.substring(0, pos);
        }

        bundleResourceKey = bundleResourceKey + bundleExtension + ".properties";

        return getOrCreateProperties(ResourceKey.from(bundleResourceKey));
    }

    private Properties getOrCreateProperties(final ResourceKey resourceKey) {

        Properties properties = getFromCache(resourceKey);

        if (properties == null) {
            properties = loadPropertiesFromFile(resourceKey);
        }

        return properties;
    }

    private synchronized Properties loadPropertiesFromFile(final ResourceKey resourceKey) {
        Properties properties = getFromCache(resourceKey);

        if (properties != null) {
            return properties;
        }

        properties = new Properties();

        final ResourceFile resourceFile = resourceService.getResourceFile(resourceKey);
        if (resourceFile != null) {
            try {
                properties.load(resourceFile.getDataAsInputStream());
            } catch (final IOException e) {
                throw new LocalizationResourceException("Not able to load resource: " + resourceFile.getName(), e);
            }
        }

        putInCache(resourceKey, properties);
        return properties;
    }

    private void putInCache(final ResourceKey resourceKey, final Properties properties) {
        this.propertiesCache.put(new LocalizationPropertiesCacheEntry(resourceKey, properties));
    }

    private Properties getFromCache(final ResourceKey resourceKey) {
        final LocalizationPropertiesCacheEntry entry = this.propertiesCache.get(resourceKey);
        return entry != null ? entry.getProperties() : null;
    }

    private LocalizationResourceBundle createResourceBundle(final Locale locale,
            final ResourceKey defaultLocalizationResourceKey) {
        Properties props = new Properties();

        String lang = locale.getLanguage();
        String country = locale.getCountry();
        String variant = locale.getVariant();

        props.putAll(loadBundle(defaultLocalizationResourceKey, ""));

        if (StringUtils.isNotEmpty(lang)) {
            lang = lang.toLowerCase();
            props.putAll(loadBundle(defaultLocalizationResourceKey, "_" + lang));
        }

        if (StringUtils.isNotEmpty(country)) {
            country = country.toLowerCase();
            props.putAll(loadBundle(defaultLocalizationResourceKey, "_" + lang + "_" + country));
        }

        if (StringUtils.isNotEmpty(variant)) {
            variant = variant.toLowerCase();
            props.putAll(loadBundle(defaultLocalizationResourceKey, "_" + lang + "_" + country + "_" + variant));
        }

        return new LocalizationResourceBundle(props);
    }

    @Autowired
    public void setResourceService(final ResourceService resourceService) {
        this.resourceService = resourceService;
    }

    @Autowired
    public void setCacheManager(final CacheManager cacheManager) {
        this.cacheFacade = cacheManager.getLocalizationCache();
    }

    @Value("${cms.cache.localization.checkInterval}")
    public void setCheckInterval(final long checkInterval) {
        this.checkInterval = checkInterval;
    }

    @Override
    public void afterPropertiesSet() {
        this.propertiesCache = new LocalizationPropertiesCache(this.cacheFacade, this.resourceService,
                this.checkInterval);
    }
}