/*
* 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;
}
}