修改供应商创建相关代码,修改SE初始化方式

This commit is contained in:
heng 2023-08-05 19:06:42 +08:00
parent 9b03996af6
commit 236ae38016
19 changed files with 119 additions and 81 deletions

View File

@ -17,7 +17,7 @@ public interface SmsRestrictedUtil {
* @param time 过期时间秒级单位
* @author :Wind
*/
public boolean setOrTime(String key, Object value, Long time) throws RuntimeException;
boolean setOrTime(String key, Object value, Long time) throws RuntimeException;
/**
* set
@ -26,7 +26,7 @@ public interface SmsRestrictedUtil {
* @param value 缓存value值
* @author :Wind
*/
public boolean set(String key, Object value) throws RuntimeException;
boolean set(String key, Object value) throws RuntimeException;
/**
* getByKey
@ -34,12 +34,12 @@ public interface SmsRestrictedUtil {
* @param key redis的key
* @author :Wind
*/
public Object getByKey(String key) throws RuntimeException;
Object getByKey(String key) throws RuntimeException;
/**
* clear
* <p>清除缓存</p>
* @author :Wind
*/
public void clean() throws RuntimeException;
void clean() throws RuntimeException;
}

View File

@ -43,6 +43,11 @@ public abstract class Constant {
*/
public static final String HTTPS_PREFIX = "https://";
/**
* 供应商配置键名
*/
public static final String SUPPLIER_KEY = "supplier";
private Constant() {
}
}

View File

@ -4,11 +4,13 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/**
* @author wind
@ -139,4 +141,26 @@ public class SmsUtil {
return toStr.toArray(new String[list.size()]);
}
/**
* 将Map中所有key的分隔符转换为新的分隔符
* @param map map对象
* @param seperator 旧分隔符
* @param newSeperator 新分隔符
*/
public static void replaceKeysSeperator(Map<String, String> map, String seperator, String newSeperator) {
if(CollUtil.isEmpty(map)) {
return;
}
List<String> keySet = new ArrayList<>(map.keySet());
for(String key : keySet) {
if(StrUtil.isEmpty(key) || !key.contains(seperator)) {
continue;
}
String value = map.get(key);
String newKey = key.replaceAll(seperator, newSeperator);
map.putIfAbsent(newKey, value);
map.remove(key);
}
}
}

View File

@ -69,7 +69,7 @@ public abstract class SmsFactory {
}
private static SmsBlend create(SupplierConfig config) {
BaseProviderFactory factory = ProviderFactoryHolder.requireForConfig(config);
BaseProviderFactory factory = ProviderFactoryHolder.requireForSupplier(config.getSupplier());
if (factory == null) {
throw new SmsBlendException("不支持当前供应商配置");
}

View File

@ -2,27 +2,38 @@ package org.dromara.sms4j.javase.config;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.io.resource.ClassPathResource;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import org.dromara.sms4j.aliyun.config.AlibabaConfig;
import org.dromara.sms4j.api.SmsBlend;
import org.dromara.sms4j.api.universal.SupplierConfig;
import org.dromara.sms4j.cloopen.config.CloopenConfig;
import org.dromara.sms4j.comm.config.SmsConfig;
import org.dromara.sms4j.comm.constant.Constant;
import org.dromara.sms4j.comm.exception.SmsBlendException;
import org.dromara.sms4j.comm.factory.BeanFactory;
import org.dromara.sms4j.comm.utils.SmsUtil;
import org.dromara.sms4j.core.factory.SmsFactory;
import org.dromara.sms4j.emay.config.EmayConfig;
import org.dromara.sms4j.huawei.config.HuaweiConfig;
import org.dromara.sms4j.javase.util.YamlUtil;
import org.dromara.sms4j.jdcloud.config.JdCloudConfig;
import org.dromara.sms4j.netease.config.NeteaseConfig;
import org.dromara.sms4j.provider.config.BaseConfig;
import org.dromara.sms4j.provider.factory.BaseProviderFactory;
import org.dromara.sms4j.provider.factory.ProviderFactoryHolder;
import org.dromara.sms4j.tencent.config.TencentConfig;
import org.dromara.sms4j.unisms.config.UniConfig;
import org.dromara.sms4j.yunpian.config.YunpianConfig;
import org.dromara.sms4j.zhutong.config.ZhutongConfig;
import java.util.Map;
/**
* 初始化类
*/
@ -88,45 +99,20 @@ public class SEInitializer {
}
this.initSmsConfig(smsConfig);
AlibabaConfig alibabaConfig = smsConfig.getAlibaba();
if (alibabaConfig != null) {
SmsFactory.createSmsBlend(alibabaConfig);
}
CloopenConfig cloopenConfig = smsConfig.getCloopen();
if (cloopenConfig != null) {
SmsFactory.createSmsBlend(cloopenConfig);
}
EmayConfig emayConfig = smsConfig.getEmay();
if (emayConfig != null) {
SmsFactory.createSmsBlend(emayConfig);
}
HuaweiConfig huaweiConfig = smsConfig.getHuawei();
if (huaweiConfig != null) {
SmsFactory.createSmsBlend(huaweiConfig);
}
JdCloudConfig jdCloudConfig = smsConfig.getJdCloud();
if (jdCloudConfig != null) {
SmsFactory.createSmsBlend(jdCloudConfig);
}
TencentConfig tencentConfig = smsConfig.getTencent();
if (tencentConfig != null) {
SmsFactory.createSmsBlend(tencentConfig);
}
UniConfig uniConfig = smsConfig.getUni();
if (uniConfig != null) {
SmsFactory.createSmsBlend(uniConfig);
}
YunpianConfig yunpianConfig = smsConfig.getYunpian();
if (yunpianConfig != null) {
SmsFactory.createSmsBlend(yunpianConfig);
}
NeteaseConfig neteaseConfig = smsConfig.getNeteaseConfig();
if (neteaseConfig != null){
SmsFactory.createSmsBlend(neteaseConfig);
}
ZhutongConfig zhutongConfig = smsConfig.getZhutongConfig();
if (zhutongConfig != null){
SmsFactory.createSmsBlend(zhutongConfig);
// 解析供应商配置
Map<String, Map<String, String>> blends = smsConfig.getBlends();
for(String configId : blends.keySet()) {
Map<String, String> configMap = blends.get(configId);
String supplier = configMap.get(Constant.SUPPLIER_KEY);
supplier = StrUtil.isEmpty(supplier) ? configId : supplier;
BaseProviderFactory<SmsBlend, SupplierConfig> providerFactory = (BaseProviderFactory<SmsBlend, SupplierConfig>) ProviderFactoryHolder.requireForSupplier(supplier);
if(providerFactory == null) {
log.warn("创建\"{}\"的短信服务失败,未找到供应商为\"{}\"的服务", configId, supplier);
}
SmsUtil.replaceKeysSeperator(configMap, "-", "_");
JSONObject configJson = new JSONObject(configMap);
SupplierConfig supplierConfig = JSONUtil.toBean(configJson, providerFactory.getConfigClass());
providerFactory.createSms(supplierConfig);
}
}
@ -147,16 +133,7 @@ public class SEInitializer {
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public static class InitSmsConfig extends SmsConfig {
private AlibabaConfig alibaba;
private CloopenConfig cloopen;
private EmayConfig emay;
private HuaweiConfig huawei;
private JdCloudConfig jdCloud;
private TencentConfig tencent;
private UniConfig uni;
private YunpianConfig yunpian;
private NeteaseConfig neteaseConfig;
private ZhutongConfig zhutongConfig;
private Map<String, Map<String, String>> blends;
}
}

View File

@ -3,7 +3,7 @@ package org.dromara.sms4j.aliyun.config;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.dromara.sms4j.aliyun.service.AlibabaSmsImpl;
import org.dromara.sms4j.provider.factory.BaseProviderFactory;
import org.dromara.sms4j.provider.factory.AbstractProviderFactory;
import org.dromara.sms4j.provider.factory.ProviderFactoryHolder;
/**
@ -14,7 +14,7 @@ import org.dromara.sms4j.provider.factory.ProviderFactoryHolder;
* 2023/4/8 14:54
**/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class AlibabaFactory implements BaseProviderFactory<AlibabaSmsImpl, AlibabaConfig> {
public class AlibabaFactory extends AbstractProviderFactory<AlibabaSmsImpl, AlibabaConfig> {
private static final AlibabaFactory INSTANCE = new AlibabaFactory();

View File

@ -3,7 +3,7 @@ package org.dromara.sms4j.cloopen.config;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.dromara.sms4j.cloopen.service.CloopenSmsImpl;
import org.dromara.sms4j.provider.factory.BaseProviderFactory;
import org.dromara.sms4j.provider.factory.AbstractProviderFactory;
import org.dromara.sms4j.provider.factory.ProviderFactoryHolder;
/**
@ -13,7 +13,7 @@ import org.dromara.sms4j.provider.factory.ProviderFactoryHolder;
* @since 2023/4/10 22:10
*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class CloopenFactory implements BaseProviderFactory<CloopenSmsImpl, CloopenConfig> {
public class CloopenFactory extends AbstractProviderFactory<CloopenSmsImpl, CloopenConfig> {
private static final CloopenFactory INSTANCE = new CloopenFactory();

View File

@ -3,7 +3,7 @@ package org.dromara.sms4j.ctyun.config;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.dromara.sms4j.ctyun.service.CtyunSmsImpl;
import org.dromara.sms4j.provider.factory.BaseProviderFactory;
import org.dromara.sms4j.provider.factory.AbstractProviderFactory;
import org.dromara.sms4j.provider.factory.ProviderFactoryHolder;
/**
@ -14,7 +14,7 @@ import org.dromara.sms4j.provider.factory.ProviderFactoryHolder;
* 2023/5/12 15:06
**/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class CtyunFactory implements BaseProviderFactory<CtyunSmsImpl, CtyunConfig> {
public class CtyunFactory extends AbstractProviderFactory<CtyunSmsImpl, CtyunConfig> {
private static final CtyunFactory INSTANCE = new CtyunFactory();

View File

@ -3,7 +3,7 @@ package org.dromara.sms4j.emay.config;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.dromara.sms4j.emay.service.EmaySmsImpl;
import org.dromara.sms4j.provider.factory.BaseProviderFactory;
import org.dromara.sms4j.provider.factory.AbstractProviderFactory;
import org.dromara.sms4j.provider.factory.ProviderFactoryHolder;
/**
@ -14,7 +14,7 @@ import org.dromara.sms4j.provider.factory.ProviderFactoryHolder;
* @date 2023/04/11 12:00
* */
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class EmayFactory implements BaseProviderFactory<EmaySmsImpl, EmayConfig> {
public class EmayFactory extends AbstractProviderFactory<EmaySmsImpl, EmayConfig> {
private static final EmayFactory INSTANCE = new EmayFactory();

View File

@ -4,7 +4,7 @@ import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.dromara.sms4j.aliyun.service.AlibabaSmsImpl;
import org.dromara.sms4j.huawei.service.HuaweiSmsImpl;
import org.dromara.sms4j.provider.factory.BaseProviderFactory;
import org.dromara.sms4j.provider.factory.AbstractProviderFactory;
import org.dromara.sms4j.provider.factory.ProviderFactoryHolder;
/**
@ -15,7 +15,7 @@ import org.dromara.sms4j.provider.factory.ProviderFactoryHolder;
* 2023/4/8 15:27
**/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class HuaweiFactory implements BaseProviderFactory<HuaweiSmsImpl, HuaweiConfig> {
public class HuaweiFactory extends AbstractProviderFactory<HuaweiSmsImpl, HuaweiConfig> {
private static final HuaweiFactory INSTANCE = new HuaweiFactory();

View File

@ -8,7 +8,7 @@ import com.jdcloud.sdk.service.sms.client.SmsClient;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.dromara.sms4j.jdcloud.service.JdCloudSmsImpl;
import org.dromara.sms4j.provider.factory.BaseProviderFactory;
import org.dromara.sms4j.provider.factory.AbstractProviderFactory;
import org.dromara.sms4j.provider.factory.ProviderFactoryHolder;
/**
@ -18,7 +18,7 @@ import org.dromara.sms4j.provider.factory.ProviderFactoryHolder;
* @since 2023/4/10 20:01
*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class JdCloudFactory implements BaseProviderFactory<JdCloudSmsImpl, JdCloudConfig> {
public class JdCloudFactory extends AbstractProviderFactory<JdCloudSmsImpl, JdCloudConfig> {
private static final JdCloudFactory INSTANCE = new JdCloudFactory();

View File

@ -3,7 +3,7 @@ package org.dromara.sms4j.netease.config;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.dromara.sms4j.netease.service.NeteaseSmsImpl;
import org.dromara.sms4j.provider.factory.BaseProviderFactory;
import org.dromara.sms4j.provider.factory.AbstractProviderFactory;
import org.dromara.sms4j.provider.factory.ProviderFactoryHolder;
/**
@ -14,7 +14,7 @@ import org.dromara.sms4j.provider.factory.ProviderFactoryHolder;
* 2023-05-30
**/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class NeteaseFactory implements BaseProviderFactory<NeteaseSmsImpl, NeteaseConfig> {
public class NeteaseFactory extends AbstractProviderFactory<NeteaseSmsImpl, NeteaseConfig> {
private static final NeteaseFactory INSTANCE = new NeteaseFactory();

View File

@ -0,0 +1,32 @@
package org.dromara.sms4j.provider.factory;
import org.dromara.sms4j.api.SmsBlend;
import org.dromara.sms4j.api.universal.SupplierConfig;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public abstract class AbstractProviderFactory<S extends SmsBlend, C extends SupplierConfig> implements BaseProviderFactory<S, C> {
private Class<C> configClass;
public AbstractProviderFactory() {
Type genericSuperclass = getClass().getGenericSuperclass();
if(genericSuperclass instanceof ParameterizedType) {
ParameterizedType paramType = (ParameterizedType) genericSuperclass;
Type[] typeArguments = paramType.getActualTypeArguments();
if(typeArguments.length > 1 && typeArguments[1] instanceof Class) {
configClass = (Class<C>) typeArguments[1];
}
}
}
/**
* 获取配置类
* @return 配置类
*/
public Class<C> getConfigClass() {
return configClass;
}
}

View File

@ -19,10 +19,10 @@ public interface BaseProviderFactory<S extends SmsBlend, C extends SupplierConfi
S createSms(C c);
/**
* 创建配置对象
* @return
* 获取配置类
* @return 配置类
*/
C createConfig();
Class<C> getConfigClass();
/**
* 获取供应商

View File

@ -20,9 +20,9 @@ public class ProviderFactoryHolder {
factories.add(factory);
}
public static BaseProviderFactory<? extends SmsBlend, ? extends SupplierConfig> requireForConfig(SupplierConfig config) {
public static BaseProviderFactory<? extends SmsBlend, ? extends SupplierConfig> requireForSupplier(String supplier) {
return factories.stream()
.filter(f -> f.getSupplier().equals(config.getSupplier()))
.filter(f -> f.getSupplier().equals(supplier))
.findFirst()
.orElse(null);
}

View File

@ -1,6 +1,6 @@
package org.dromara.sms4j.tencent.config;
import org.dromara.sms4j.provider.factory.BaseProviderFactory;
import org.dromara.sms4j.provider.factory.AbstractProviderFactory;
import org.dromara.sms4j.provider.factory.ProviderFactoryHolder;
import org.dromara.sms4j.tencent.service.TencentSmsImpl;
@ -11,7 +11,7 @@ import org.dromara.sms4j.tencent.service.TencentSmsImpl;
* @author :Wind
* 2023/4/8 16:05
**/
public class TencentFactory implements BaseProviderFactory<TencentSmsImpl, TencentConfig> {
public class TencentFactory extends AbstractProviderFactory<TencentSmsImpl, TencentConfig> {
private static final TencentFactory INSTANCE = new TencentFactory();

View File

@ -2,7 +2,7 @@ package org.dromara.sms4j.unisms.config;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.dromara.sms4j.provider.factory.BaseProviderFactory;
import org.dromara.sms4j.provider.factory.AbstractProviderFactory;
import org.dromara.sms4j.provider.factory.ProviderFactoryHolder;
import org.dromara.sms4j.unisms.core.Uni;
import org.dromara.sms4j.unisms.service.UniSmsImpl;
@ -14,7 +14,7 @@ import org.dromara.sms4j.unisms.service.UniSmsImpl;
* 2023/4/8 15:46
**/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class UniFactory implements BaseProviderFactory<UniSmsImpl, UniConfig> {
public class UniFactory extends AbstractProviderFactory<UniSmsImpl, UniConfig> {
private static final UniFactory INSTANCE = new UniFactory();

View File

@ -2,12 +2,12 @@ package org.dromara.sms4j.yunpian.config;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.dromara.sms4j.provider.factory.BaseProviderFactory;
import org.dromara.sms4j.provider.factory.AbstractProviderFactory;
import org.dromara.sms4j.provider.factory.ProviderFactoryHolder;
import org.dromara.sms4j.yunpian.service.YunPianSmsImpl;
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class YunPianFactory implements BaseProviderFactory<YunPianSmsImpl, YunpianConfig> {
public class YunPianFactory extends AbstractProviderFactory<YunPianSmsImpl, YunpianConfig> {
private static final YunPianFactory INSTANCE = new YunPianFactory();

View File

@ -2,12 +2,12 @@ package org.dromara.sms4j.zhutong.config;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.dromara.sms4j.provider.factory.BaseProviderFactory;
import org.dromara.sms4j.provider.factory.AbstractProviderFactory;
import org.dromara.sms4j.provider.factory.ProviderFactoryHolder;
import org.dromara.sms4j.zhutong.service.ZhutongSmsImpl;
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class ZhutongFactory implements BaseProviderFactory<ZhutongSmsImpl, ZhutongConfig> {
public class ZhutongFactory extends AbstractProviderFactory<ZhutongSmsImpl, ZhutongConfig> {
private static final ZhutongFactory INSTANCE = new ZhutongFactory();
static {