
com.xiaoleilu.ucloud.core.Param Maven / Gradle / Ivy
package com.xiaoleilu.ucloud.core;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.Date;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;
import com.xiaoleilu.hutool.Conver;
import com.xiaoleilu.hutool.HttpUtil;
import com.xiaoleilu.hutool.SecureUtil;
import com.xiaoleilu.hutool.StrUtil;
import com.xiaoleilu.ucloud.exception.ParamException;
import com.xiaoleilu.ucloud.util.Config;
import com.xiaoleilu.ucloud.util.Global;
/**
* 参数对象
*
* @author Looly
*
*/
public class Param extends TreeMap {
private static final long serialVersionUID = 1190594719758105119L;
/**
* 参数名接口
* 具体的参数枚举类需要实现这个接口
* @author Looly
*
*/
public static interface Name{
String toString();
}
// --------------------------------------------------------------- Static method start
/**
* 创建参数对象
*
* @return 参数对象
*/
public static Param create() {
return new Param();
}
/**
* 创建参数对象
*
* @param paramMap 参数Map
* @return 参数对象
*/
public static Param create(Map paramMap) {
return (new Param()).setAll(paramMap);
}
// --------------------------------------------------------------- Static method end
// --------------------------------------------------------------- Constructor start
/**
* 构造,使用配置文件中定义的公钥和私钥
*/
public Param() {
}
// --------------------------------------------------------------- Constructor end
// -------------------------------------------------------------------- 特定类型值
/**
* 设置列
*
* @param name 参数名
* @param value 值
* @return 本身
*/
public Param set(String name, Object value) {
if (null != name && null != value) {
put(name, value);
}
return this;
}
/**
* 设置列
*
* @param paramName 参数名(枚举类型)
* @param value 值
* @return 本身
*/
public Param set(Name paramName, Object value) {
return set(paramName.toString(), value);
}
/**
* 设置API指令
* @param action API指令
* @return 本身
*/
public Param setAction(Action action) {
return set(PubName.Action, action);
}
/**
* 设置多列
*
* @param map Map
* @return 本身
*/
public Param setAll(Map map) {
for (Entry entry : map.entrySet()) {
this.set(entry.getKey(), entry.getValue());
}
return this;
}
/**
* 特殊参数:设置密码,此方法对密码做了Base64编码
* @param password 密码
* @return 本身
*/
public Param setPassword(String password){
return set(PubName.Password, SecureUtil.base64(password, Global.CHARSET));
}
/**
* 获得特定类型值
*
* @param attr 字段名
* @param defaultValue 默认值
* @return 字段值
*/
@SuppressWarnings("unchecked")
public T get(String attr, T defaultValue) {
final Object result = get(attr);
return (T) (result != null ? result : defaultValue);
}
/**
* @param attr 字段名
* @return 字段值
*/
public String getStr(String attr) {
return Conver.toStr(get(attr), null);
}
/**
* @param attr 字段名
* @return 字段值
*/
public Integer getInt(String attr) {
return Conver.toInt(get(attr), null);
}
/**
* @param attr 字段名
* @return 字段值
*/
public Long getLong(String attr) {
return Conver.toLong(get(attr), null);
}
/**
* @param attr 字段名
* @return 字段值
*/
public Float getFloat(String attr) {
return Conver.toFloat(get(attr), null);
}
/**
* @param attr 字段名
* @return 字段值
*/
public Boolean getBool(String attr) {
return Conver.toBool(get(attr), null);
}
/**
* @param attr 字段名
* @return 字段值
*/
public byte[] getBytes(String attr) {
return get(attr, null);
}
/**
* @param attr 字段名
* @return 字段值
*/
public Date getDate(String attr) {
return get(attr, null);
}
/**
* @param attr 字段名
* @return 字段值
*/
public Time getTime(String attr) {
return get(attr, null);
}
/**
* @param attr 字段名
* @return 字段值
*/
public Timestamp getTimestamp(String attr) {
return get(attr, null);
}
/**
* @param attr 字段名
* @return 字段值
*/
public Number getNumber(String attr) {
return get(attr, null);
}
/**
* @param attr 字段名
* @return 字段值
*/
public BigDecimal getBigDecimal(String attr) {
return get(attr, null);
}
/**
* @param attr 字段名
* @return 字段值
*/
public BigInteger getBigInteger(String attr) {
return get(attr, null);
}
/**
* 浅复制本对象
* @return Param对象
*/
public Param clone() {
return (Param) super.clone();
}
/**
* 生成签名
*
* @param privateKey 私钥
* @return 签名
*/
public String signature(String privateKey) {
final StringBuilder sb = new StringBuilder();
for (Entry entry : this.entrySet()) {
sb.append(entry.getKey()).append(entry.getValue());
}
sb.append(privateKey);
return SecureUtil.sha1(sb.toString(), Global.CHARSET);
}
/**
* url转义参数值
*/
public String encode() {
final Param param = this.clone();
final Set keys = param.keySet();
Object value;
for (String key : keys) {
value = param.get(key);
param.put(key, HttpUtil.encode(StrUtil.str(value), Global.CHARSET));
}
return HttpUtil.toParams(param);
}
/**
* 生成Http请求参数字符串
* @return Http请求参数字符串
*/
public String genHttpParam(Config config){
//指令名称和数据中心必须存在
assertParams(PubName.Action);
//1. 设置公钥
this.set(PubName.PublicKey, config.getPublicKey());
//2. 生成签名
this.set(PubName.Signature, this.signature(config.getPrivateKey()));
//3. 生成Http参数字符串
return this.encode();
}
/**
* 检查参数
* @param paramNames 参数名
*/
private void assertParams(PubName... paramNames){
for (PubName paramName : paramNames) {
if(false == this.containsKey(paramName.name())){
throw new ParamException("Parameter '{}' not found!", paramName);
}
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy