Package com.alibaba.citrus.service.requestcontext.locale.impl

Source Code of com.alibaba.citrus.service.requestcontext.locale.impl.SetLocaleRequestContextFactoryImpl

/*
* Copyright (c) 2002-2012 Alibaba Group Holding Limited.
* All rights reserved.
*
* 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 com.alibaba.citrus.service.requestcontext.locale.impl;

import static com.alibaba.citrus.service.requestcontext.locale.SetLocaleRequestContext.*;
import static com.alibaba.citrus.util.Assert.*;
import static com.alibaba.citrus.util.ObjectUtil.*;
import static com.alibaba.citrus.util.StringUtil.*;

import java.util.Locale;
import java.util.regex.Pattern;

import com.alibaba.citrus.service.requestcontext.RequestContext;
import com.alibaba.citrus.service.requestcontext.locale.SetLocaleRequestContext;
import com.alibaba.citrus.service.requestcontext.support.AbstractRequestContextFactory;
import com.alibaba.citrus.util.ToStringBuilder.MapBuilder;
import com.alibaba.citrus.util.i18n.LocaleUtil;

/**
* 创建<code>SetLocaleRequestContext</code>的工厂。
*
* @author Michael Zhou
*/
public class SetLocaleRequestContextFactoryImpl extends AbstractRequestContextFactory<SetLocaleRequestContext> {
    private String               inputCharsetParam;
    private Pattern              inputCharsetPattern;
    private String               outputCharsetParam;
    private Pattern              outputCharsetPattern;
    private SetLocaleOverrider[] overriders;
    private String               defaultLocaleName;
    private Locale               defaultLocale;
    private String               defaultCharset;
    private String               sessionKey;
    private String               paramKey;

    public void setInputCharsetParam(String inputCharsetParam) {
        this.inputCharsetParam = trimToNull(inputCharsetParam);
    }

    public void setOutputCharsetParam(String outputCharsetParam) {
        this.outputCharsetParam = trimToNull(outputCharsetParam);
    }

    public void setOverriders(SetLocaleOverrider[] overriders) {
        this.overriders = overriders;
    }

    public void setDefaultLocale(String defaultLocaleName) {
        this.defaultLocaleName = trimToNull(defaultLocaleName);
    }

    public void setDefaultCharset(String defaultCharset) {
        this.defaultCharset = trimToNull(defaultCharset);
    }

    public void setSessionKey(String sessionKey) {
        this.sessionKey = trimToNull(sessionKey);
    }

    public void setParamKey(String paramKey) {
        this.paramKey = trimToNull(paramKey);
    }

    @Override
    protected void init() {
        inputCharsetParam = defaultIfNull(inputCharsetParam, INPUT_CHARSET_PARAM_DEFAULT);
        inputCharsetPattern = Pattern.compile("(" + inputCharsetParam + ")=([\\w-]+)");

        outputCharsetParam = defaultIfNull(outputCharsetParam, OUTPUT_CHARSET_PARAM_DEFAULT);
        outputCharsetPattern = Pattern.compile("(" + outputCharsetParam + ")=([\\w-]+)");

        sessionKey = defaultIfNull(sessionKey, SESSION_KEY_DEFAULT);
        paramKey = defaultIfNull(paramKey, PARAMETER_KEY_DEFAULT);

        defaultLocaleName = defaultIfNull(defaultLocaleName, LOCALE_DEFAULT);
        defaultLocale = LocaleUtil.parseLocale(defaultLocaleName);

        assertTrue(LocaleUtil.isLocaleSupported(defaultLocale), "Locale %s is not supported", defaultLocale);

        defaultCharset = defaultIfNull(defaultCharset, CHARSET_DEFAULT);

        assertTrue(LocaleUtil.isCharsetSupported(defaultCharset), "Charset %s is not supported", defaultCharset);
    }

    /**
     * 包装一个request context。
     *
     * @param wrappedContext 被包装的<code>RequestContext</code>对象
     * @return request context
     */
    public SetLocaleRequestContext getRequestContextWrapper(RequestContext wrappedContext) {
        SetLocaleRequestContextImpl requestContext = new SetLocaleRequestContextImpl(wrappedContext);

        requestContext.setInputCharsetPattern(inputCharsetPattern);
        requestContext.setOutputCharsetPattern(outputCharsetPattern);
        requestContext.setOverriders(overriders);
        requestContext.setDefaultLocale(defaultLocale);
        requestContext.setDefaultCharset(defaultCharset);
        requestContext.setSessionKey(sessionKey);
        requestContext.setParamKey(paramKey);

        return requestContext;
    }

    /** 本类提供了设置多语言环境的功能。 */
    public String[] getFeatures() {
        return new String[] { "setLocaleAndCharset" };
    }

    /**
     * 假如网站支持resource bundle和多语言环境,那么本类提供的request context会把locale信息保存在session里。
     * 假设我们要使用基于cookie的session,那么本类必须放在提供session功能的request
     * context之后。不过,基于cookie的session机制并不是必须的。
     */
    public FeatureOrder[] featureOrders() {
        return new FeatureOrder[] { new AfterFeature("session") };
    }

    @Override
    protected Object dumpConfiguration() {
        MapBuilder mb = new MapBuilder();

        mb.append("Input Charset Pattern", inputCharsetParam);
        mb.append("Output Charset Pattern", outputCharsetParam);
        mb.append("Default Locale", defaultLocaleName);
        mb.append("Default Charset", defaultCharset);
        mb.append("Session Key", sessionKey);
        mb.append("Parameter Key", paramKey);

        return mb;
    }
}
TOP

Related Classes of com.alibaba.citrus.service.requestcontext.locale.impl.SetLocaleRequestContextFactoryImpl

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.