ca.simplegames.micro.extensions.i18n.I18NExtension.java Source code

Java tutorial

Introduction

Here is the source code for ca.simplegames.micro.extensions.i18n.I18NExtension.java

Source

/*
 * Copyright (c)2012. Florin T.PATRASCU
 *
 * 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
 *
 *      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 ca.simplegames.micro.extensions.i18n;

import ca.simplegames.micro.Extension;
import ca.simplegames.micro.Filter;
import ca.simplegames.micro.Globals;
import ca.simplegames.micro.SiteContext;
import ca.simplegames.micro.filters.FilterManager;
import ca.simplegames.micro.utils.Assert;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.net.MalformedURLException;
import java.util.*;

/**
 * @author <a href="mailto:florin.patrascu@gmail.com">Florin T.PATRASCU</a>
 * @since $Revision$ (created: 2012-12-19 10:19 PM)
 */
@SuppressWarnings("unchecked")
public class I18NExtension implements Extension {
    private Logger log = LoggerFactory.getLogger(getClass());

    private static final String version = "0.1";
    private String intercept = "lang";
    private String scopesSrc = "context";
    private String[] scopes = { scopesSrc };
    private boolean fallbackToSystemLocale = true;
    private String defaultEncoding = "utf-8";
    private int resourceCacheRefreshInterval = 25;
    private String[] resourceBasePaths = new String[] {};
    private ReloadableResourceBundleMessageSource messageSource;
    public static final String DEFAULT_LANG = "en";
    private List<String> infoDetails = new ArrayList<String>();
    private String name = "i18N";

    public Extension register(String name, SiteContext site, Map<String, Object> locales) throws Exception {
        Assert.notNull(name, "The name of the extension must not be null!");
        this.name = StringUtils.defaultIfBlank(name, "i18N");

        if (locales != null) {
            Map interceptConfig = (Map<String, Object>) locales.get("intercept");

            if (interceptConfig != null) {
                intercept = StringUtils.defaultString((String) interceptConfig.get("parameter_name"), "lang");
                scopesSrc = StringUtils.defaultString((String) interceptConfig.get("scope"), "context");
                scopes = StringUtils.split(scopesSrc, ",");
            }

            defaultEncoding = StringUtils.defaultString((String) locales.get("default_encoding"), Globals.UTF8);
            fallbackToSystemLocale = locales.get("fallback_to_system_locale") != null
                    ? (Boolean) locales.get("fallback_to_system_locale")
                    : true;

            resourceCacheRefreshInterval = Integer
                    .parseInt(StringUtils.defaultString((locales.get("resource_cache")).toString(), "10"));

            List<String> paths = (List<String>) locales.get("base_names");
            if (paths != null && !paths.isEmpty()) {
                List<String> absPaths = new ArrayList<String>();

                for (String path : paths) {
                    File realPath = new File(path);
                    if (!realPath.exists()) {
                        realPath = new File(site.getWebInfPath().getAbsolutePath(), path);
                    }

                    try {
                        absPaths.add(realPath.toURI().toURL().toString());
                        //absPaths.add(pathConfig.getValue());
                    } catch (MalformedURLException e) {
                        e.printStackTrace();
                    }
                }
                resourceBasePaths = absPaths.toArray(new String[absPaths.size()]);
            } else {
                resourceBasePaths = new String[] { "config/locales/messages" };
            }

            //Configure the i18n
            messageSource = new ReloadableResourceBundleMessageSource();
            messageSource.setDefaultEncoding(defaultEncoding);
            messageSource.setFallbackToSystemLocale(fallbackToSystemLocale);
            messageSource.setCacheSeconds(resourceCacheRefreshInterval);
            messageSource.setBasenames(resourceBasePaths);

            Filter i18N = new I18NFilter(this);
            final FilterManager filterManager = site.getFilterManager();

            filterManager.addFilter(i18N);
            // now make sure the i18N filter is always first (if present)
            Collections.swap(filterManager.getBeforeFilters(), 0, filterManager.getBeforeFilters().size() - 1);

            infoDetails.add(String.format("  default encoding ........: %s", defaultEncoding));
            infoDetails.add(String.format("  fallback to system locale: %s", fallbackToSystemLocale));
            infoDetails.add(String.format("  cache refresh ...........: %s", resourceCacheRefreshInterval));
            infoDetails.add(String.format("  resource bundle .........: %s", Arrays.toString(resourceBasePaths)));
            infoDetails.add(String.format("  Listening for ...........: '%s'", intercept));
            infoDetails.add(String.format("       in scope(s) ........: %s", scopesSrc));
        }

        return this;
    }

    public ReloadableResourceBundleMessageSource getMessageSource() {
        return messageSource;
    }

    public String[] getScopes() {
        return scopes;
    }

    public String getDefaultEncoding() {
        return defaultEncoding;
    }

    public String getIntercept() {
        return intercept;
    }

    public String getName() {
        return name;
    }

    @Override
    public void shutdown() {
        // all good, nothing to do
    }

    @Override
    public String toString() {
        return "I18NExtension{" + "infoDetails=" + infoDetails + '}';
    }
}