package com.erdaoya.springcloud.comx.utils.rest;
import com.erdaoya.springcloud.comx.context.Context;
import java.util.HashMap;
/**
* Created by xue on 12/23/16.
* 部分请求参数保留到调用接口的类
* 以此类废弃 commonParameterHolder
* TODO 将配置部分抽取出来,读取配置
*/
public class ReservedParameterManager {
private static final HashMap<String, String> RESERVED_PARAMETERS = new HashMap<String, String>(){
{
put("loginToken", "X-Gomeplus-Login-Token" );
put("userId", "X-Gomeplus-User-Id" );
put("accessToken", "X-Gomeplus-Access-Token" );
put("device", "X-Gomeplus-Device" );
put("app" , "X-Gomeplus-App" );
put("net", "X-Gomeplus-Net" );
put("accept", "Accept" );
put("traceId", "X-Gomeplus-Trace-Id" );
put("appVersion", "X-Gomeplus-App-Version" );
put("xLanguage", "X-Gomeplus-Lang" );
put("xTimezone", "X-Gomeplus-Time-Zone");
}
};
private static final HashMap<String, String> RESERVED_TO_QUERY_PARAMERTERS = new HashMap<String, String>(){
{
put("uniqueDeviceId", "X-Gomeplus-Unique-Device-Id");
}
};
protected HashMap<String, String> reservedQueryParams;
protected HashMap<String, String> reservedHeaderParams;
/**
* 1, query to query, header to header
* 2, reserved to query. (header and query to query);
* if both key exists, choose query;
* @param request RequestMessage
* @return ReservedParameterManager
*/
public static ReservedParameterManager fromRequest(RequestMessage request) {
HashMap<String, String> headers = request.getHeaderParameters();
HashMap<String, String> queries = request.getUrl().getQuery().getParameters();
HashMap<String, String> reservedHeaderParams = new HashMap<>();
HashMap<String, String> reservedQueryParams = new HashMap<>();
for (String queryName: RESERVED_PARAMETERS.keySet()) {
String headerName = RESERVED_PARAMETERS.get(queryName);
String headerNameL = headerName.toLowerCase();
//TODO 临时 fix Spring 当中获取到的header 为 小写
if (headers.containsKey(headerNameL)) {
reservedHeaderParams.put(queryName, headers.get(headerNameL));
}
if (headers.containsKey(headerName)) {
reservedHeaderParams.put(queryName, headers.get(headerName));
}
if (queries.containsKey(queryName)) {
reservedQueryParams.put(queryName, queries.get(queryName));
}
}
for (String queryName: RESERVED_TO_QUERY_PARAMERTERS.keySet()) {
String headerName = RESERVED_TO_QUERY_PARAMERTERS.get(queryName);
String headerNameL = headerName.toLowerCase();
//TODO 临时 fix Spring 当中获取到的header 为 小写
if (headers.containsKey(headerNameL)) {
reservedQueryParams.put(queryName, queries.get(headerNameL));
}
if (headers.containsKey(headerName)) {
reservedQueryParams.put(queryName, queries.get(headerName));
}
if (queries.containsKey(queryName)) {
reservedQueryParams.put(queryName, queries.get(queryName));
}
}
return new ReservedParameterManager(reservedQueryParams, reservedHeaderParams);
}
public ReservedParameterManager(HashMap<String, String> reservedQueryParams, HashMap<String, String> reservedHeaderParams) {
this.reservedHeaderParams = reservedHeaderParams;
this.reservedQueryParams = reservedQueryParams;
}
public HashMap<String, String> getReservedQueryParams(){
return reservedQueryParams;
}
public HashMap<String, String> getFilteredReservedHeaders(Context context) {
HashMap<String, String> result = new HashMap<>();
for (String queryName: reservedHeaderParams.keySet()) {
String headerName = RESERVED_PARAMETERS.get(queryName);
if (reservedQueryParams.containsKey(headerName)){
continue;
}
result.put(headerName, reservedHeaderParams.get(queryName));
}
//context.getLogger().error("In Reserved Param manager: " + result.keySet());
return result;
}
public String getUserId() {
String headerKey = "X-Gomeplus-User-Id";
String queryKey = "userId";
if (reservedQueryParams.containsKey(queryKey)) return reservedQueryParams.get(queryKey);
if (reservedHeaderParams.containsKey(queryKey)) return reservedHeaderParams.get(queryKey);
return null;
}
public String getLoginToken() {
String headerKey = "X-Gomeplus-Login-Token";
String queryKey = "loginToken";
if (reservedQueryParams.containsKey(queryKey)) return reservedQueryParams.get(queryKey);
if (reservedHeaderParams.containsKey(queryKey)) return reservedHeaderParams.get(queryKey);
return null;
}
public String getApp() {
String headerKey = "X-Gomeplus-App";
String queryKey = "app";
if (reservedQueryParams.containsKey(queryKey)) return reservedQueryParams.get(queryKey);
if (reservedHeaderParams.containsKey(queryKey)) return reservedHeaderParams.get(queryKey);
return null;
}
}