/*
* 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.parser.impl;
import static com.alibaba.citrus.service.requestcontext.parser.ParserRequestContext.*;
import static com.alibaba.citrus.util.ArrayUtil.*;
import static com.alibaba.citrus.util.ObjectUtil.*;
import static com.alibaba.citrus.util.StringUtil.*;
import com.alibaba.citrus.service.configuration.support.PropertyEditorRegistrarsSupport;
import com.alibaba.citrus.service.requestcontext.RequestContext;
import com.alibaba.citrus.service.requestcontext.parser.ParameterParserFilter;
import com.alibaba.citrus.service.requestcontext.parser.ParserRequestContext;
import com.alibaba.citrus.service.requestcontext.support.AbstractRequestContextFactory;
import com.alibaba.citrus.service.upload.UploadService;
import com.alibaba.citrus.util.ToStringBuilder.MapBuilder;
import org.springframework.beans.PropertyEditorRegistrar;
/**
* 创建<code>ParserRequestContext</code>的工厂。
*
* @author Michael Zhou
*/
public class ParserRequestContextFactoryImpl extends AbstractRequestContextFactory<ParserRequestContext> {
private final static boolean CONVERTER_QUIET_DEFAULT = true;
private final static String URL_CASE_FOLDING_DEFAULT = URL_CASE_FOLDING_LOWER_WITH_UNDERSCORES;
private final static boolean AUTO_UPLOAD_DEFAULT = true;
private final static boolean UNESCAPE_PARAMETERS_DEFAULT = true;
private final static boolean USE_SERVLET_ENGINE_PARSER_DEFAULT = false;
private final static boolean USE_BODY_ENCODING_FOR_URI_DEFAULT = true;
private final static String URI_ENCODING_DEFAULT = "UTF-8";
private final static boolean TRIMMING_DEFAULT = true;
private final static String HTML_FIELD_SUFFIX_DEFAULT = ".~html";
private PropertyEditorRegistrarsSupport propertyEditorRegistrars = new PropertyEditorRegistrarsSupport();
private Boolean converterQuiet;
private String caseFolding;
private Boolean autoUpload;
private Boolean unescapeParameters;
private Boolean useServletEngineParser;
private Boolean useBodyEncodingForURI;
private String uriEncoding;
private Boolean trimming;
private ParameterParserFilter[] filters;
private String htmlFieldSuffix;
private UploadService uploadService;
public void setPropertyEditorRegistrars(PropertyEditorRegistrar[] registrars) {
propertyEditorRegistrars.setPropertyEditorRegistrars(registrars);
}
public void setConverterQuiet(boolean converterQuiet) {
this.converterQuiet = converterQuiet;
}
public void setCaseFolding(String caseFolding) {
this.caseFolding = caseFolding;
}
public void setAutoUpload(boolean autoUpload) {
this.autoUpload = autoUpload;
}
public void setUnescapeParameters(boolean unescapeParameters) {
this.unescapeParameters = unescapeParameters;
}
public void setUseServletEngineParser(boolean useServletEngineParser) {
this.useServletEngineParser = useServletEngineParser;
}
public void setUseBodyEncodingForURI(boolean useBodyEncodingForURI) {
this.useBodyEncodingForURI = useBodyEncodingForURI;
}
public void setURIEncoding(String uriEncoding) {
this.uriEncoding = uriEncoding;
}
public void setTrimming(boolean trimming) {
this.trimming = trimming;
}
public void setParameterParserFilters(ParameterParserFilter[] filters) {
this.filters = filters;
}
public void setHtmlFieldSuffix(String htmlFieldSuffix) {
this.htmlFieldSuffix = htmlFieldSuffix;
}
public void setUploadService(UploadService uploadService) {
this.uploadService = uploadService;
}
@Override
protected void init() {
// 类型转换出错时,是否不报错,而是返回默认值
converterQuiet = defaultIfNull(converterQuiet, CONVERTER_QUIET_DEFAULT);
// 参数和cookies名称的大小写转换选项
caseFolding = defaultIfEmpty(caseFolding, URL_CASE_FOLDING_DEFAULT).toLowerCase();
// 是否自动处理上传文件
autoUpload = defaultIfNull(autoUpload, AUTO_UPLOAD_DEFAULT);
// 是否对参数进行HTML entities解码,默认为true
unescapeParameters = defaultIfNull(unescapeParameters, UNESCAPE_PARAMETERS_DEFAULT);
// 是否让servlet engine来解析GET参数
useServletEngineParser = defaultIfNull(useServletEngineParser, USE_SERVLET_ENGINE_PARSER_DEFAULT);
// 是否以request.setCharacterEncoding所指定的编码来解析query
useBodyEncodingForURI = defaultIfNull(useBodyEncodingForURI, USE_BODY_ENCODING_FOR_URI_DEFAULT);
// 如果不以request.setCharacterEncoding所指定的编码来解析query,那么就用这个
uriEncoding = defaultIfNull(uriEncoding, URI_ENCODING_DEFAULT);
// 是否对参数值进行trimming
trimming = defaultIfNull(trimming, TRIMMING_DEFAULT);
// HTML类型的字段名后缀
htmlFieldSuffix = defaultIfEmpty(htmlFieldSuffix, HTML_FIELD_SUFFIX_DEFAULT);
}
/**
* 包装一个request context。
*
* @param wrappedContext 被包装的<code>RequestContext</code>对象
* @return request context
*/
public ParserRequestContext getRequestContextWrapper(RequestContext wrappedContext) {
ParserRequestContextImpl requestContext = new ParserRequestContextImpl(wrappedContext);
requestContext.setPropertyEditorRegistrar(propertyEditorRegistrars);
requestContext.setConverterQuiet(converterQuiet);
requestContext.setAutoUpload(autoUpload);
requestContext.setCaseFolding(caseFolding);
requestContext.setUnescapeParameters(unescapeParameters);
requestContext.setUseServletEngineParser(useServletEngineParser);
requestContext.setUseBodyEncodingForURI(useBodyEncodingForURI);
requestContext.setURIEncoding(uriEncoding);
requestContext.setTrimming(trimming);
if (autoUpload) {
requestContext.setUploadService(uploadService);
}
if (!isEmptyArray(filters)) {
requestContext.setParameterParserFilters(filters);
}
requestContext.setHtmlFieldSuffix(htmlFieldSuffix);
return requestContext;
}
/** 本类提供了解析参数和cookie的功能。 */
public String[] getFeatures() {
return new String[] { "parseRequest" };
}
/** 本类不依赖其它features。 */
public FeatureOrder[] featureOrders() {
return null;
}
@Override
protected Object dumpConfiguration() {
MapBuilder mb = new MapBuilder();
mb.append("Converter quiet", converterQuiet);
mb.append("Case folding", caseFolding);
mb.append("Auto upload", autoUpload);
mb.append("Unescape HTML entities", unescapeParameters);
mb.append("Use servlet engine's parser", useServletEngineParser);
mb.append("Use body encoding for URI", useBodyEncodingForURI);
mb.append("URI encoding if not use body encoding for URI", uriEncoding);
mb.append("Trimming", trimming);
mb.append("HTML field suffix", htmlFieldSuffix);
mb.append("Upload Service", uploadService);
mb.append("Parameter Parser Filters", filters);
return mb;
}
}