docs: 完善通知模板管理器文档

This commit is contained in:
椰子 2021-07-03 20:01:58 +08:00
parent 2d48623733
commit e8c4f1594e
2 changed files with 80 additions and 44 deletions

View File

@ -1,63 +1,78 @@
package com.cicdi.notify.template;
import com.cicdi.notify.DefaultNotifyType;
import com.cicdi.notify.NotifyType;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 模板管理器
* 通知模板管理器抽象实现
* <p>在SpringBoot框架中可以实现BeanPostProcessor接口实现服务商的自动注册</p>
*
* @author xueye
* @see Template
* @see TemplateProvider
*/
public abstract class AbstractTemplateManager implements TemplateManager {
/**
* 所有注册支持的服务商
* <p>使用{@link #register(TemplateProvider)}方法进行注册</p>
*/
protected Map<String, Map<String, TemplateProvider>> providers = new ConcurrentHashMap<>();
/**
* 通知模板
*/
protected Map<String, Template> templates = new ConcurrentHashMap<>();
/**
* 根据ID获取通知模板配置属性
*
* @param type 通知类型 {@link DefaultNotifyType}
* @param id 通知模板属性ID
* @return 通知模板属性
* @see DefaultNotifyType
*/
protected abstract TemplateProperties getProperties(NotifyType type, String id);
/**
* 注册模板提供商
*
* @param provider 模板提供商
*/
@Override
public void register(TemplateProvider provider) {
providers.computeIfAbsent(provider.getType().getId(), ignore -> new ConcurrentHashMap<>()).put(provider.getProvider().getId(), provider);
}
@Override
public Template createTemplate(NotifyType type, TemplateProperties prop) {
Map<String, TemplateProvider> providerMap = providers.get(type.getId());
if (null == providerMap) {
throw new UnsupportedOperationException("不支持的通知类型: " + prop.getType());
}
TemplateProvider templateProvider = providerMap.get(prop.getProvider());
if (null == templateProvider) {
throw new UnsupportedOperationException("不支持的提供商: " + prop.getProvider());
}
return templateProvider.createTemplate(prop);
}
@Override
public Template getTemplate(NotifyType type, String id) {
Template template = templates.get(id);
public Template getTemplate(NotifyType type, String templateId) {
Template template;
if (null != templates.get(templateId)) {
template = templates.get(templateId);
} else {
template = createTemplate(type, getProperties(type, templateId));
if (null == template) {
TemplateProperties properties = this.getProperties(type, id);
template = this.createTemplate(type, properties);
if (null == template) {
throw new UnsupportedOperationException("通知类型不支持: " + type.getId());
throw new UnsupportedOperationException("不支持的通知类型: " + type.getId());
}
templates.put(id, template);
templates.put(templateId, template);
}
return template;
}
@Override
public Template createTemplate(NotifyType type, TemplateProperties properties) {
Map<String, TemplateProvider> providerTypes = providers.get(type.getId());
if (null == providerTypes) {
throw new UnsupportedOperationException("不支持的通知类型: " + properties.getType());
}
TemplateProvider templateProvider = providerTypes.get(properties.getProvider());
if (null == templateProvider) {
throw new UnsupportedOperationException("不支持的服务商: " + properties.getProvider());
}
return templateProvider.createTemplate(properties);
}
@Override
public void reload(String templateId) {
templates.remove(templateId);
}
@Override
public void register(TemplateProvider provider) {
providers.computeIfAbsent(provider.getType().getId(), ignore -> new ConcurrentHashMap<>()).put(provider.getProvider().getId(), provider);
}
}

View File

@ -2,33 +2,54 @@ package com.cicdi.notify.template;
import com.cicdi.notify.NotifyType;
import java.util.concurrent.ConcurrentHashMap;
/**
* 通知模板管理器用于模板的转换
* 通知模板管理器
* <p>通知模板的转换在不同的通知服务商{@link TemplateProvider}中实现</p>
*
* @author xueye
* @see Template
* @see TemplateProvider
*/
public interface TemplateManager {
/**
* @param type 模板类型
* @param id 模板ID
* @return 模板
* 根据ID获取通知模板
* <p>使用容器缓存模板如果不存在调用{@link #createTemplate(NotifyType, TemplateProperties)}方法创建
* 并添加到容器中容器建议使用线程安全的{@link ConcurrentHashMap}集合</p>
*
* @param type 通知类型
* @param templateId 通知模板ID
* @return 通知模板
*/
Template getTemplate(NotifyType type, String id);
Template getTemplate(NotifyType type, String templateId);
/**
* @param type 模板类型
* @param properties 模板属性
* @return 模板
* 使用提供的模板配置属性创建通知模板
* <p>根据不同的通知类型处理对应的模板</p>
*
* @param type 通知类型
* @param properties 通知模板属性
* @return 通知模板
*/
Template createTemplate(NotifyType type, TemplateProperties properties);
/**
* 重新加载模板
* 注册通知服务商
* <p>服务商经过注册之后才可以使用, 如果通知模板配置的服务商不在已注册集合中, 将会抛出{@link UnsupportedOperationException}</p>
*
* @param id 模板ID
* @param provider 通知服务商
* @see UnsupportedOperationException
*/
void reload(String id);
void register(TemplateProvider provider);
/**
* 重新加载通知模板
* <p>如果通知模板属性有变更调用此方法更新容器缓存中的通知模板</p>
*
* @param templateId 通知模板ID
*/
void reload(String templateId);
}