mirror of
https://gitee.com/dolphinscheduler/DolphinScheduler.git
synced 2024-12-03 04:39:00 +08:00
[Improvement][alert] Refactor alert module to fix code smell (#4434)
* chore: Refactore dolphinscheduler-alert to fix code smell * chore: Refactor code to fix codestyle error
This commit is contained in:
parent
a6becd8c26
commit
a0b2febd62
@ -14,6 +14,7 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.apache.dolphinscheduler.alert;
|
||||
|
||||
import org.apache.dolphinscheduler.alert.plugin.EmailAlertPlugin;
|
||||
@ -25,11 +26,12 @@ import org.apache.dolphinscheduler.common.thread.Stopper;
|
||||
import org.apache.dolphinscheduler.dao.AlertDao;
|
||||
import org.apache.dolphinscheduler.dao.DaoFactory;
|
||||
import org.apache.dolphinscheduler.dao.entity.Alert;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* alert of start
|
||||
*/
|
||||
@ -40,8 +42,6 @@ public class AlertServer {
|
||||
*/
|
||||
private AlertDao alertDao = DaoFactory.getDaoInstance(AlertDao.class);
|
||||
|
||||
private AlertSender alertSender;
|
||||
|
||||
private static AlertServer instance;
|
||||
|
||||
private FilePluginManager alertPluginManager;
|
||||
@ -61,7 +61,7 @@ public class AlertServer {
|
||||
alertPluginManager.addPlugin(new EmailAlertPlugin());
|
||||
}
|
||||
|
||||
public synchronized static AlertServer getInstance() {
|
||||
public static synchronized AlertServer getInstance() {
|
||||
if (null == instance) {
|
||||
instance = new AlertServer();
|
||||
}
|
||||
@ -78,12 +78,11 @@ public class AlertServer {
|
||||
Thread.currentThread().interrupt();
|
||||
}
|
||||
List<Alert> alerts = alertDao.listWaitExecutionAlert();
|
||||
alertSender = new AlertSender(alerts, alertDao, alertPluginManager);
|
||||
AlertSender alertSender = new AlertSender(alerts, alertDao, alertPluginManager);
|
||||
alertSender.run();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static void main(String[] args) {
|
||||
AlertServer alertServer = AlertServer.getInstance();
|
||||
alertServer.start();
|
||||
|
@ -14,40 +14,41 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.apache.dolphinscheduler.alert.manager;
|
||||
|
||||
import org.apache.dolphinscheduler.alert.utils.Constants;
|
||||
import org.apache.dolphinscheduler.alert.utils.DingTalkUtils;
|
||||
import org.apache.dolphinscheduler.plugin.model.AlertInfo;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* Ding Talk Manager
|
||||
*/
|
||||
public class DingTalkManager {
|
||||
private static final Logger logger = LoggerFactory.getLogger(EnterpriseWeChatManager.class);
|
||||
private static final Logger logger = LoggerFactory.getLogger(DingTalkManager.class);
|
||||
|
||||
public Map<String,Object> send(AlertInfo alert) {
|
||||
Map<String,Object> retMap = new HashMap<>();
|
||||
public Map<String, Object> send(AlertInfo alert) {
|
||||
Map<String, Object> retMap = new HashMap<>();
|
||||
retMap.put(Constants.STATUS, false);
|
||||
logger.info("send message {}", alert.getAlertData().getTitle());
|
||||
try {
|
||||
String msg = buildMessage(alert);
|
||||
DingTalkUtils.sendDingTalkMsg(msg, Constants.UTF_8);
|
||||
} catch (IOException e) {
|
||||
logger.error(e.getMessage(),e);
|
||||
logger.error(e.getMessage(), e);
|
||||
}
|
||||
retMap.put(Constants.STATUS, true);
|
||||
return retMap;
|
||||
}
|
||||
|
||||
private String buildMessage(AlertInfo alert) {
|
||||
String msg = alert.getAlertData().getContent();
|
||||
return msg;
|
||||
return alert.getAlertData().getContent();
|
||||
}
|
||||
}
|
||||
|
@ -14,6 +14,7 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.apache.dolphinscheduler.alert.plugin;
|
||||
|
||||
import org.apache.dolphinscheduler.alert.manager.DingTalkManager;
|
||||
@ -28,14 +29,19 @@ import org.apache.dolphinscheduler.plugin.api.AlertPlugin;
|
||||
import org.apache.dolphinscheduler.plugin.model.AlertData;
|
||||
import org.apache.dolphinscheduler.plugin.model.AlertInfo;
|
||||
import org.apache.dolphinscheduler.plugin.model.PluginName;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* EmailAlertPlugin
|
||||
*
|
||||
* <p>
|
||||
* This plugin is a default plugin, and mix up email and enterprise wechat, because adapt with former alert behavior
|
||||
*/
|
||||
public class EmailAlertPlugin implements AlertPlugin {
|
||||
@ -125,10 +131,10 @@ public class EmailAlertPlugin implements AlertPlugin {
|
||||
}
|
||||
}
|
||||
|
||||
if (DingTalkUtils.isEnableDingTalk) {
|
||||
if (DingTalkUtils.IS_ENABLE_DING_TALK) {
|
||||
logger.info("Ding Talk is enable.");
|
||||
dingTalkManager.send(info);
|
||||
}
|
||||
dingTalkManager.send(info);
|
||||
}
|
||||
|
||||
} else {
|
||||
retMaps.put(Constants.MESSAGE, "alert send error.");
|
||||
|
@ -14,23 +14,22 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.apache.dolphinscheduler.alert.template;
|
||||
|
||||
import org.apache.dolphinscheduler.alert.template.impl.DefaultHTMLTemplate;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* the alert template factory
|
||||
*/
|
||||
public class AlertTemplateFactory {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(AlertTemplateFactory.class);
|
||||
|
||||
private AlertTemplateFactory(){}
|
||||
private AlertTemplateFactory() {
|
||||
}
|
||||
|
||||
/**
|
||||
* get a template from alert.properties conf file
|
||||
*
|
||||
* @return a template, default is DefaultHTMLTemplate
|
||||
*/
|
||||
public static AlertTemplate getMessageTemplate() {
|
||||
|
@ -14,21 +14,29 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.apache.dolphinscheduler.alert.template.impl;
|
||||
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.node.ArrayNode;
|
||||
import static org.apache.dolphinscheduler.common.utils.Preconditions.checkNotNull;
|
||||
|
||||
import org.apache.dolphinscheduler.alert.template.AlertTemplate;
|
||||
import org.apache.dolphinscheduler.alert.utils.Constants;
|
||||
import org.apache.dolphinscheduler.common.enums.ShowType;
|
||||
import org.apache.dolphinscheduler.common.utils.JSONUtils;
|
||||
import org.apache.dolphinscheduler.common.utils.StringUtils;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Set;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.apache.dolphinscheduler.common.utils.*;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
import static org.apache.dolphinscheduler.common.utils.Preconditions.*;
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.node.ArrayNode;
|
||||
|
||||
/**
|
||||
* the default html alert message template
|
||||
@ -37,33 +45,33 @@ public class DefaultHTMLTemplate implements AlertTemplate {
|
||||
|
||||
public static final Logger logger = LoggerFactory.getLogger(DefaultHTMLTemplate.class);
|
||||
|
||||
|
||||
@Override
|
||||
public String getMessageFromTemplate(String content, ShowType showType,boolean showAll) {
|
||||
public String getMessageFromTemplate(String content, ShowType showType, boolean showAll) {
|
||||
|
||||
switch (showType){
|
||||
switch (showType) {
|
||||
case TABLE:
|
||||
return getTableTypeMessage(content,showAll);
|
||||
return getTableTypeMessage(content, showAll);
|
||||
case TEXT:
|
||||
return getTextTypeMessage(content,showAll);
|
||||
return getTextTypeMessage(content);
|
||||
default:
|
||||
throw new IllegalArgumentException(String.format("not support showType: %s in DefaultHTMLTemplate",showType));
|
||||
throw new IllegalArgumentException(String.format("not support showType: %s in DefaultHTMLTemplate", showType));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* get alert message which type is TABLE
|
||||
*
|
||||
* @param content message content
|
||||
* @param showAll weather to show all
|
||||
* @return alert message
|
||||
*/
|
||||
private String getTableTypeMessage(String content,boolean showAll){
|
||||
private String getTableTypeMessage(String content, boolean showAll) {
|
||||
|
||||
if (StringUtils.isNotEmpty(content)){
|
||||
if (StringUtils.isNotEmpty(content)) {
|
||||
List<LinkedHashMap> mapItemsList = JSONUtils.toList(content, LinkedHashMap.class);
|
||||
|
||||
if(!showAll && mapItemsList.size() > Constants.NUMBER_1000){
|
||||
mapItemsList = mapItemsList.subList(0,Constants.NUMBER_1000);
|
||||
if (!showAll && mapItemsList.size() > Constants.NUMBER_1000) {
|
||||
mapItemsList = mapItemsList.subList(0, Constants.NUMBER_1000);
|
||||
}
|
||||
|
||||
StringBuilder contents = new StringBuilder(200);
|
||||
@ -71,15 +79,15 @@ public class DefaultHTMLTemplate implements AlertTemplate {
|
||||
boolean flag = true;
|
||||
|
||||
String title = "";
|
||||
for (LinkedHashMap mapItems : mapItemsList){
|
||||
for (LinkedHashMap mapItems : mapItemsList) {
|
||||
|
||||
Set<Map.Entry<String, Object>> entries = mapItems.entrySet();
|
||||
Set<Entry<String, Object>> entries = mapItems.entrySet();
|
||||
|
||||
Iterator<Map.Entry<String, Object>> iterator = entries.iterator();
|
||||
Iterator<Entry<String, Object>> iterator = entries.iterator();
|
||||
|
||||
StringBuilder t = new StringBuilder(Constants.TR);
|
||||
StringBuilder cs = new StringBuilder(Constants.TR);
|
||||
while (iterator.hasNext()){
|
||||
while (iterator.hasNext()) {
|
||||
|
||||
Map.Entry<String, Object> entry = iterator.next();
|
||||
t.append(Constants.TH).append(entry.getKey()).append(Constants.TH_END);
|
||||
@ -88,14 +96,14 @@ public class DefaultHTMLTemplate implements AlertTemplate {
|
||||
}
|
||||
t.append(Constants.TR_END);
|
||||
cs.append(Constants.TR_END);
|
||||
if (flag){
|
||||
if (flag) {
|
||||
title = t.toString();
|
||||
}
|
||||
flag = false;
|
||||
contents.append(cs);
|
||||
}
|
||||
|
||||
return getMessageFromHtmlTemplate(title,contents.toString());
|
||||
return getMessageFromHtmlTemplate(title, contents.toString());
|
||||
}
|
||||
|
||||
return content;
|
||||
@ -103,22 +111,22 @@ public class DefaultHTMLTemplate implements AlertTemplate {
|
||||
|
||||
/**
|
||||
* get alert message which type is TEXT
|
||||
*
|
||||
* @param content message content
|
||||
* @param showAll weather to show all
|
||||
* @return alert message
|
||||
*/
|
||||
private String getTextTypeMessage(String content,boolean showAll){
|
||||
private String getTextTypeMessage(String content) {
|
||||
|
||||
if (StringUtils.isNotEmpty(content)){
|
||||
if (StringUtils.isNotEmpty(content)) {
|
||||
ArrayNode list = JSONUtils.parseArray(content);
|
||||
StringBuilder contents = new StringBuilder(100);
|
||||
for (JsonNode jsonNode : list){
|
||||
for (JsonNode jsonNode : list) {
|
||||
contents.append(Constants.TR);
|
||||
contents.append(Constants.TD).append(jsonNode.toString()).append(Constants.TD_END);
|
||||
contents.append(Constants.TR_END);
|
||||
}
|
||||
|
||||
return getMessageFromHtmlTemplate(null,contents.toString());
|
||||
return getMessageFromHtmlTemplate(null, contents.toString());
|
||||
|
||||
}
|
||||
|
||||
@ -127,16 +135,17 @@ public class DefaultHTMLTemplate implements AlertTemplate {
|
||||
|
||||
/**
|
||||
* get alert message from a html template
|
||||
* @param title message title
|
||||
* @param content message content
|
||||
*
|
||||
* @param title message title
|
||||
* @param content message content
|
||||
* @return alert message which use html template
|
||||
*/
|
||||
private String getMessageFromHtmlTemplate(String title,String content){
|
||||
private String getMessageFromHtmlTemplate(String title, String content) {
|
||||
|
||||
checkNotNull(content);
|
||||
String htmlTableThead = StringUtils.isEmpty(title) ? "" : String.format("<thead>%s</thead>\n",title);
|
||||
String htmlTableThead = StringUtils.isEmpty(title) ? "" : String.format("<thead>%s</thead>%n", title);
|
||||
|
||||
return Constants.HTML_HEADER_PREFIX +htmlTableThead + content + Constants.TABLE_BODY_HTML_TAIL;
|
||||
return Constants.HTML_HEADER_PREFIX + htmlTableThead + content + Constants.TABLE_BODY_HTML_TAIL;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -14,6 +14,7 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.apache.dolphinscheduler.alert.utils;
|
||||
|
||||
/**
|
||||
@ -23,6 +24,7 @@ public class Constants {
|
||||
private Constants() {
|
||||
throw new IllegalStateException("Constants class");
|
||||
}
|
||||
|
||||
/**
|
||||
* alert properties path
|
||||
*/
|
||||
@ -67,7 +69,7 @@ public class Constants {
|
||||
|
||||
public static final String MAIL_SMTP_SSL_ENABLE = "mail.smtp.ssl.enable";
|
||||
|
||||
public static final String MAIL_SMTP_SSL_TRUST="mail.smtp.ssl.trust";
|
||||
public static final String MAIL_SMTP_SSL_TRUST = "mail.smtp.ssl.trust";
|
||||
|
||||
public static final String TEXT_HTML_CHARSET_UTF_8 = "text/html;charset=utf-8";
|
||||
|
||||
@ -156,7 +158,7 @@ public class Constants {
|
||||
public static final String ENTERPRISE_WECHAT_AGENT_ID = "enterprise.wechat.agent.id";
|
||||
|
||||
public static final String ENTERPRISE_WECHAT_USERS = "enterprise.wechat.users";
|
||||
|
||||
|
||||
|
||||
public static final String DINGTALK_WEBHOOK = "dingtalk.webhook";
|
||||
|
||||
@ -174,7 +176,13 @@ public class Constants {
|
||||
|
||||
public static final String DINGTALK_ENABLE = "dingtalk.isEnable";
|
||||
|
||||
public static final String HTML_HEADER_PREFIX = "<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'><html><head><title>dolphinscheduler</title><meta name='Keywords' content=''><meta name='Description' content=''><style type=\"text/css\">table {margin-top:0px;padding-top:0px;border:1px solid;font-size: 14px;color: #333333;border-width: 1px;border-color: #666666;border-collapse: collapse;}table th {border-width: 1px;padding: 8px;border-style: solid;border-color: #666666;background-color: #dedede;text-align: left;}table td {border-width: 1px;padding: 8px;border-style: solid;border-color: #666666;background-color: #ffffff;text-align: left;}</style></head><body style=\"margin:0;padding:0\"><table border=\"1px\" cellpadding=\"5px\" cellspacing=\"-10px\"> ";
|
||||
public static final String HTML_HEADER_PREFIX = "<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'>"
|
||||
+ "<html><head><title>dolphinscheduler</title><meta name='Keywords' content=''>"
|
||||
+ "<meta name='Description' content=''>"
|
||||
+ "<style type=\"text/css\">table {margin-top:0px;padding-top:0px;border:1px solid;font-size: 14px;color: #333333;border-width: 1px;border-color: #666666;border-collapse: collapse;}"
|
||||
+ "table th {border-width: 1px;padding: 8px;border-style: solid;border-color: #666666;background-color: #dedede;text-align: left;}"
|
||||
+ "table td {border-width: 1px;padding: 8px;border-style: solid;border-color: #666666;background-color: #ffffff;text-align: left;}</style>"
|
||||
+ "/head><body style=\"margin:0;padding:0\"><table border=\"1px\" cellpadding=\"5px\" cellspacing=\"-10px\"> ";
|
||||
|
||||
public static final String TABLE_BODY_HTML_TAIL = "</table></body></html>";
|
||||
|
||||
|
@ -14,10 +14,11 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.apache.dolphinscheduler.alert.utils;
|
||||
|
||||
|
||||
import org.apache.dolphinscheduler.common.utils.*;
|
||||
|
||||
import org.apache.commons.codec.binary.StringUtils;
|
||||
import org.apache.http.HttpEntity;
|
||||
import org.apache.http.HttpHost;
|
||||
@ -32,44 +33,50 @@ import org.apache.http.impl.client.BasicCredentialsProvider;
|
||||
import org.apache.http.impl.client.CloseableHttpClient;
|
||||
import org.apache.http.impl.client.HttpClients;
|
||||
import org.apache.http.util.EntityUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* DingTalkUtils utils
|
||||
* support send msg to ding talk by robot message push function.
|
||||
* support proxy setting
|
||||
* support PROXY setting
|
||||
*/
|
||||
public class DingTalkUtils {
|
||||
public static final Logger logger = LoggerFactory.getLogger(DingTalkUtils.class);
|
||||
|
||||
public static final boolean isEnableDingTalk = PropertyUtils.getBoolean(Constants.DINGTALK_ENABLE);
|
||||
private static final String dingTaskUrl = PropertyUtils.getString(Constants.DINGTALK_WEBHOOK);
|
||||
private static final String keyword = PropertyUtils.getString(Constants.DINGTALK_KEYWORD);
|
||||
private static final Boolean isEnableProxy = PropertyUtils.getBoolean(Constants.DINGTALK_PROXY_ENABLE);
|
||||
private static final String proxy = PropertyUtils.getString(Constants.DINGTALK_PROXY);
|
||||
private static final String user = PropertyUtils.getString(Constants.DINGTALK_USER);
|
||||
private static final String passwd = PropertyUtils.getString(Constants.DINGTALK_PASSWORD);
|
||||
private static final Integer port = PropertyUtils.getInt(Constants.DINGTALK_PORT);
|
||||
public static final boolean IS_ENABLE_DING_TALK = PropertyUtils.getBoolean(Constants.DINGTALK_ENABLE);
|
||||
private static final String DING_TASK_URL = PropertyUtils.getString(Constants.DINGTALK_WEBHOOK);
|
||||
private static final String KEYWORD = PropertyUtils.getString(Constants.DINGTALK_KEYWORD);
|
||||
private static final Boolean IS_ENABLE_PROXY = PropertyUtils.getBoolean(Constants.DINGTALK_PROXY_ENABLE);
|
||||
private static final String PROXY = PropertyUtils.getString(Constants.DINGTALK_PROXY);
|
||||
private static final String USER = PropertyUtils.getString(Constants.DINGTALK_USER);
|
||||
private static final String PASSWD = PropertyUtils.getString(Constants.DINGTALK_PASSWORD);
|
||||
private static final Integer PORT = PropertyUtils.getInt(Constants.DINGTALK_PORT);
|
||||
|
||||
private DingTalkUtils() {
|
||||
throw new IllegalStateException(DingTalkUtils.class.getName());
|
||||
}
|
||||
|
||||
/**
|
||||
* send message interface
|
||||
* only support text message format now.
|
||||
*
|
||||
* @param msg message context to send
|
||||
* @param charset charset type
|
||||
* @return result of sending msg
|
||||
* @return result of sending msg
|
||||
* @throws IOException the IOException
|
||||
*/
|
||||
public static String sendDingTalkMsg(String msg, String charset) throws IOException {
|
||||
String msgToJson = textToJsonString(msg + "#" + keyword);
|
||||
String msgToJson = textToJsonString(msg + "#" + KEYWORD);
|
||||
HttpPost httpPost = constructHttpPost(msgToJson, charset);
|
||||
|
||||
CloseableHttpClient httpClient;
|
||||
if (isEnableProxy) {
|
||||
if (Boolean.TRUE.equals(IS_ENABLE_PROXY)) {
|
||||
httpClient = getProxyClient();
|
||||
RequestConfig rcf = getProxyConfig();
|
||||
httpPost.setConfig(rcf);
|
||||
@ -87,28 +94,26 @@ public class DingTalkUtils {
|
||||
} finally {
|
||||
response.close();
|
||||
}
|
||||
logger.info("Ding Talk send [{}], resp:{%s}", msg, resp);
|
||||
logger.info("Ding Talk send [{}], resp:{%s}", msg);
|
||||
return resp;
|
||||
} finally {
|
||||
} finally {
|
||||
httpClient.close();
|
||||
}
|
||||
}
|
||||
|
||||
public static HttpPost constructHttpPost(String msg, String charset) {
|
||||
HttpPost post = new HttpPost(dingTaskUrl);
|
||||
HttpPost post = new HttpPost(DING_TASK_URL);
|
||||
StringEntity entity = new StringEntity(msg, charset);
|
||||
post.setEntity(entity);
|
||||
post.addHeader("Content-Type", "application/json; charset=utf-8");
|
||||
return post;
|
||||
}
|
||||
|
||||
|
||||
public static CloseableHttpClient getProxyClient() {
|
||||
HttpHost httpProxy = new HttpHost(proxy, port);
|
||||
HttpHost httpProxy = new HttpHost(PROXY, PORT);
|
||||
CredentialsProvider provider = new BasicCredentialsProvider();
|
||||
provider.setCredentials(new AuthScope(httpProxy), new UsernamePasswordCredentials(user, passwd));
|
||||
CloseableHttpClient httpClient = HttpClients.custom().setDefaultCredentialsProvider(provider).build();
|
||||
return httpClient;
|
||||
provider.setCredentials(new AuthScope(httpProxy), new UsernamePasswordCredentials(USER, PASSWD));
|
||||
return HttpClients.custom().setDefaultCredentialsProvider(provider).build();
|
||||
}
|
||||
|
||||
public static CloseableHttpClient getDefaultClient() {
|
||||
@ -116,14 +121,14 @@ public class DingTalkUtils {
|
||||
}
|
||||
|
||||
public static RequestConfig getProxyConfig() {
|
||||
HttpHost httpProxy = new HttpHost(proxy, port);
|
||||
HttpHost httpProxy = new HttpHost(PROXY, PORT);
|
||||
return RequestConfig.custom().setProxy(httpProxy).build();
|
||||
}
|
||||
|
||||
public static String textToJsonString(String text) {
|
||||
Map<String, Object> items = new HashMap<String, Object>();
|
||||
Map<String, Object> items = new HashMap<>();
|
||||
items.put("msgtype", "text");
|
||||
Map<String, String> textContent = new HashMap<String, String>();
|
||||
Map<String, String> textContent = new HashMap<>();
|
||||
byte[] byt = StringUtils.getBytesUtf8(text);
|
||||
String txt = StringUtils.newStringUtf8(byt);
|
||||
textContent.put("content", txt);
|
||||
|
@ -60,9 +60,13 @@ public class EnterpriseWeChatUtils {
|
||||
private static final String ENTERPRISE_WE_CHAT_TEAM_SEND_MSG = PropertyUtils.getString(Constants.ENTERPRISE_WECHAT_TEAM_SEND_MSG);
|
||||
private static final String ENTERPRISE_WE_CHAT_USER_SEND_MSG = PropertyUtils.getString(Constants.ENTERPRISE_WECHAT_USER_SEND_MSG);
|
||||
|
||||
private static final String agentIdRegExp = "\\{agentId}";
|
||||
private static final String msgRegExp = "\\{msg}";
|
||||
private static final String userRegExp = "\\{toUser}";
|
||||
private static final String AGENT_ID_REG_EXP = "\\{agentId}";
|
||||
private static final String MSG_REG_EXP = "\\{msg}";
|
||||
private static final String USER_REG_EXP = "\\{toUser}";
|
||||
|
||||
private EnterpriseWeChatUtils() {
|
||||
throw new IllegalStateException(EnterpriseWeChatUtils.class.getName());
|
||||
}
|
||||
|
||||
/**
|
||||
* get Enterprise WeChat is enable
|
||||
@ -120,8 +124,8 @@ public class EnterpriseWeChatUtils {
|
||||
*/
|
||||
public static String makeTeamSendMsg(String toParty, String agentId, String msg) {
|
||||
return ENTERPRISE_WE_CHAT_TEAM_SEND_MSG.replaceAll("\\{toParty}", toParty)
|
||||
.replaceAll(agentIdRegExp, agentId)
|
||||
.replaceAll(msgRegExp, msg);
|
||||
.replaceAll(AGENT_ID_REG_EXP, agentId)
|
||||
.replaceAll(MSG_REG_EXP, msg);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -135,8 +139,8 @@ public class EnterpriseWeChatUtils {
|
||||
public static String makeTeamSendMsg(Collection<String> toParty, String agentId, String msg) {
|
||||
String listParty = FuncUtils.mkString(toParty, "|");
|
||||
return ENTERPRISE_WE_CHAT_TEAM_SEND_MSG.replaceAll("\\{toParty}", listParty)
|
||||
.replaceAll(agentIdRegExp, agentId)
|
||||
.replaceAll(msgRegExp, msg);
|
||||
.replaceAll(AGENT_ID_REG_EXP, agentId)
|
||||
.replaceAll(MSG_REG_EXP, msg);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -148,9 +152,9 @@ public class EnterpriseWeChatUtils {
|
||||
* @return Enterprise WeChat send message
|
||||
*/
|
||||
public static String makeUserSendMsg(String toUser, String agentId, String msg) {
|
||||
return ENTERPRISE_WE_CHAT_USER_SEND_MSG.replaceAll("\\{toUser}", toUser)
|
||||
.replaceAll(agentIdRegExp, agentId)
|
||||
.replaceAll(msgRegExp, msg);
|
||||
return ENTERPRISE_WE_CHAT_USER_SEND_MSG.replaceAll(USER_REG_EXP, toUser)
|
||||
.replaceAll(AGENT_ID_REG_EXP, agentId)
|
||||
.replaceAll(MSG_REG_EXP, msg);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -163,9 +167,9 @@ public class EnterpriseWeChatUtils {
|
||||
*/
|
||||
public static String makeUserSendMsg(Collection<String> toUser, String agentId, String msg) {
|
||||
String listUser = FuncUtils.mkString(toUser, "|");
|
||||
return ENTERPRISE_WE_CHAT_USER_SEND_MSG.replaceAll(userRegExp, listUser)
|
||||
.replaceAll(agentIdRegExp, agentId)
|
||||
.replaceAll(msgRegExp, msg);
|
||||
return ENTERPRISE_WE_CHAT_USER_SEND_MSG.replaceAll(USER_REG_EXP, listUser)
|
||||
.replaceAll(AGENT_ID_REG_EXP, agentId)
|
||||
.replaceAll(MSG_REG_EXP, msg);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -14,23 +14,29 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.apache.dolphinscheduler.alert.utils;
|
||||
|
||||
import org.apache.dolphinscheduler.common.utils.CollectionUtils;
|
||||
import org.apache.dolphinscheduler.common.utils.JSONUtils;
|
||||
|
||||
import org.apache.poi.hssf.usermodel.HSSFCell;
|
||||
import org.apache.poi.hssf.usermodel.HSSFRow;
|
||||
import org.apache.poi.hssf.usermodel.HSSFSheet;
|
||||
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
|
||||
import org.apache.poi.ss.usermodel.CellStyle;
|
||||
import org.apache.poi.ss.usermodel.HorizontalAlignment;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.*;
|
||||
import org.apache.dolphinscheduler.common.utils.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* excel utils
|
||||
@ -38,19 +44,25 @@ import org.apache.dolphinscheduler.common.utils.*;
|
||||
public class ExcelUtils {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(ExcelUtils.class);
|
||||
|
||||
private ExcelUtils() {
|
||||
throw new IllegalStateException(ExcelUtils.class.getName());
|
||||
}
|
||||
|
||||
/**
|
||||
* generate excel file
|
||||
*
|
||||
* @param content the content
|
||||
* @param title the title
|
||||
* @param xlsFilePath the xls path
|
||||
*/
|
||||
public static void genExcelFile(String content,String title,String xlsFilePath){
|
||||
public static void genExcelFile(String content, String title, String xlsFilePath) {
|
||||
List<LinkedHashMap> itemsList;
|
||||
|
||||
//The JSONUtils.toList has been try catch ex
|
||||
itemsList = JSONUtils.toList(content, LinkedHashMap.class);
|
||||
|
||||
if (CollectionUtils.isEmpty(itemsList)){
|
||||
if (CollectionUtils.isEmpty(itemsList)) {
|
||||
logger.error("itemsList is null");
|
||||
throw new RuntimeException("itemsList is null");
|
||||
}
|
||||
@ -59,82 +71,79 @@ public class ExcelUtils {
|
||||
|
||||
List<String> headerList = new ArrayList<>();
|
||||
|
||||
Iterator<Map.Entry<String, Object>> iter = headerMap.entrySet().iterator();
|
||||
while (iter.hasNext()){
|
||||
Map.Entry<String, Object> en = iter.next();
|
||||
for (Map.Entry<String, Object> en : headerMap.entrySet()) {
|
||||
headerList.add(en.getKey());
|
||||
}
|
||||
|
||||
HSSFWorkbook wb = null;
|
||||
FileOutputStream fos = null;
|
||||
try {
|
||||
// declare a workbook
|
||||
wb = new HSSFWorkbook();
|
||||
// generate a table
|
||||
HSSFSheet sheet = wb.createSheet();
|
||||
HSSFRow row = sheet.createRow(0);
|
||||
//set the height of the first line
|
||||
row.setHeight((short)500);
|
||||
try {
|
||||
// declare a workbook
|
||||
wb = new HSSFWorkbook();
|
||||
// generate a table
|
||||
HSSFSheet sheet = wb.createSheet();
|
||||
HSSFRow row = sheet.createRow(0);
|
||||
//set the height of the first line
|
||||
row.setHeight((short) 500);
|
||||
|
||||
//set Horizontal right
|
||||
CellStyle cellStyle = wb.createCellStyle();
|
||||
cellStyle.setAlignment(HorizontalAlignment.RIGHT);
|
||||
//set Horizontal right
|
||||
CellStyle cellStyle = wb.createCellStyle();
|
||||
cellStyle.setAlignment(HorizontalAlignment.RIGHT);
|
||||
|
||||
//setting excel headers
|
||||
for (int i = 0; i < headerList.size(); i++) {
|
||||
HSSFCell cell = row.createCell(i);
|
||||
cell.setCellStyle(cellStyle);
|
||||
cell.setCellValue(headerList.get(i));
|
||||
}
|
||||
//setting excel headers
|
||||
for (int i = 0; i < headerList.size(); i++) {
|
||||
HSSFCell cell = row.createCell(i);
|
||||
cell.setCellStyle(cellStyle);
|
||||
cell.setCellValue(headerList.get(i));
|
||||
}
|
||||
|
||||
//setting excel body
|
||||
int rowIndex = 1;
|
||||
for (LinkedHashMap<String, Object> itemsMap : itemsList){
|
||||
Object[] values = itemsMap.values().toArray();
|
||||
row = sheet.createRow(rowIndex);
|
||||
//setting excel body height
|
||||
row.setHeight((short)500);
|
||||
rowIndex++;
|
||||
for (int j = 0 ; j < values.length ; j++){
|
||||
HSSFCell cell1 = row.createCell(j);
|
||||
cell1.setCellStyle(cellStyle);
|
||||
cell1.setCellValue(String.valueOf(values[j]));
|
||||
}
|
||||
}
|
||||
//setting excel body
|
||||
int rowIndex = 1;
|
||||
for (LinkedHashMap<String, Object> itemsMap : itemsList) {
|
||||
Object[] values = itemsMap.values().toArray();
|
||||
row = sheet.createRow(rowIndex);
|
||||
//setting excel body height
|
||||
row.setHeight((short) 500);
|
||||
rowIndex++;
|
||||
for (int j = 0; j < values.length; j++) {
|
||||
HSSFCell cell1 = row.createCell(j);
|
||||
cell1.setCellStyle(cellStyle);
|
||||
cell1.setCellValue(String.valueOf(values[j]));
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < headerList.size(); i++) {
|
||||
sheet.setColumnWidth(i, headerList.get(i).length() * 800);
|
||||
}
|
||||
for (int i = 0; i < headerList.size(); i++) {
|
||||
sheet.setColumnWidth(i, headerList.get(i).length() * 800);
|
||||
}
|
||||
|
||||
File file = new File(xlsFilePath);
|
||||
if (!file.exists()) {
|
||||
file.mkdirs();
|
||||
}
|
||||
File file = new File(xlsFilePath);
|
||||
if (!file.exists()) {
|
||||
file.mkdirs();
|
||||
}
|
||||
|
||||
//setting file output
|
||||
fos = new FileOutputStream(xlsFilePath + Constants.SINGLE_SLASH + title + Constants.EXCEL_SUFFIX_XLS);
|
||||
//setting file output
|
||||
fos = new FileOutputStream(xlsFilePath + Constants.SINGLE_SLASH + title + Constants.EXCEL_SUFFIX_XLS);
|
||||
|
||||
wb.write(fos);
|
||||
wb.write(fos);
|
||||
|
||||
}catch (Exception e){
|
||||
logger.error("generate excel error",e);
|
||||
throw new RuntimeException("generate excel error",e);
|
||||
}finally {
|
||||
if (wb != null){
|
||||
try {
|
||||
wb.close();
|
||||
} catch (IOException e) {
|
||||
logger.error(e.getMessage(),e);
|
||||
}
|
||||
}
|
||||
if (fos != null){
|
||||
try {
|
||||
fos.close();
|
||||
} catch (IOException e) {
|
||||
logger.error(e.getMessage(),e);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("generate excel error", e);
|
||||
} finally {
|
||||
if (wb != null) {
|
||||
try {
|
||||
wb.close();
|
||||
} catch (IOException e) {
|
||||
logger.error(e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
if (fos != null) {
|
||||
try {
|
||||
fos.close();
|
||||
} catch (IOException e) {
|
||||
logger.error(e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -14,15 +14,20 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.apache.dolphinscheduler.alert.utils;
|
||||
|
||||
import org.apache.dolphinscheduler.common.utils.StringUtils;
|
||||
|
||||
public class FuncUtils {
|
||||
|
||||
private FuncUtils() {
|
||||
throw new IllegalStateException(FuncUtils.class.getName());
|
||||
}
|
||||
|
||||
public static String mkString(Iterable<String> list, String split) {
|
||||
|
||||
if (null == list || StringUtils.isEmpty(split)){
|
||||
if (null == list || StringUtils.isEmpty(split)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@ -14,24 +14,40 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.apache.dolphinscheduler.alert.utils;
|
||||
|
||||
import org.apache.dolphinscheduler.alert.template.AlertTemplate;
|
||||
import org.apache.dolphinscheduler.alert.template.AlertTemplateFactory;
|
||||
import org.apache.dolphinscheduler.common.enums.ShowType;
|
||||
import org.apache.commons.mail.EmailException;
|
||||
import org.apache.commons.mail.HtmlEmail;
|
||||
import org.apache.dolphinscheduler.common.utils.CollectionUtils;
|
||||
import org.apache.dolphinscheduler.common.utils.StringUtils;
|
||||
|
||||
import org.apache.commons.mail.EmailException;
|
||||
import org.apache.commons.mail.HtmlEmail;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
|
||||
import javax.mail.Authenticator;
|
||||
import javax.mail.Message;
|
||||
import javax.mail.MessagingException;
|
||||
import javax.mail.PasswordAuthentication;
|
||||
import javax.mail.Session;
|
||||
import javax.mail.Transport;
|
||||
import javax.mail.internet.InternetAddress;
|
||||
import javax.mail.internet.MimeBodyPart;
|
||||
import javax.mail.internet.MimeMessage;
|
||||
import javax.mail.internet.MimeMultipart;
|
||||
import javax.mail.internet.MimeUtility;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import javax.mail.*;
|
||||
import javax.mail.internet.*;
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
|
||||
|
||||
/**
|
||||
* mail utils
|
||||
*/
|
||||
@ -55,7 +71,7 @@ public class MailUtils {
|
||||
|
||||
public static final Boolean MAIL_USE_SSL = PropertyUtils.getBoolean(Constants.MAIL_SMTP_SSL_ENABLE);
|
||||
|
||||
public static final String xlsFilePath = PropertyUtils.getString(Constants.XLS_FILE_PATH,"/tmp/xls");
|
||||
public static final String XLS_FILE_PATH = PropertyUtils.getString(Constants.XLS_FILE_PATH, "/tmp/xls");
|
||||
|
||||
public static final String STARTTLS_ENABLE = PropertyUtils.getString(Constants.MAIL_SMTP_STARTTLS_ENABLE);
|
||||
|
||||
@ -67,23 +83,29 @@ public class MailUtils {
|
||||
|
||||
//Solve the problem of messy Chinese name in excel attachment
|
||||
static {
|
||||
System.setProperty("mail.mime.splitlongparameters","false");
|
||||
System.setProperty("mail.mime.splitlongparameters", "false");
|
||||
}
|
||||
|
||||
private MailUtils() {
|
||||
throw new IllegalStateException(MailUtils.class.getName());
|
||||
}
|
||||
|
||||
/**
|
||||
* send mail to receivers
|
||||
*
|
||||
* @param receivers the receiver list
|
||||
* @param title the title
|
||||
* @param content the content
|
||||
* @param showType the show type
|
||||
* @return the result map
|
||||
*/
|
||||
public static Map<String,Object> sendMails(Collection<String> receivers, String title, String content,String showType) {
|
||||
public static Map<String, Object> sendMails(Collection<String> receivers, String title, String content, String showType) {
|
||||
return sendMails(receivers, null, title, content, showType);
|
||||
}
|
||||
|
||||
/**
|
||||
* send mail
|
||||
*
|
||||
* @param receivers the receiver list
|
||||
* @param receiversCc cc list
|
||||
* @param title the title
|
||||
@ -91,8 +113,8 @@ public class MailUtils {
|
||||
* @param showType the show type
|
||||
* @return the send result
|
||||
*/
|
||||
public static Map<String,Object> sendMails(Collection<String> receivers, Collection<String> receiversCc, String title, String content, String showType) {
|
||||
Map<String,Object> retMap = new HashMap<>();
|
||||
public static Map<String, Object> sendMails(Collection<String> receivers, Collection<String> receiversCc, String title, String content, String showType) {
|
||||
Map<String, Object> retMap = new HashMap<>();
|
||||
retMap.put(Constants.STATUS, false);
|
||||
|
||||
// if there is no receivers && no receiversCc, no need to process
|
||||
@ -111,14 +133,14 @@ public class MailUtils {
|
||||
email.setMailSession(session);
|
||||
email.setFrom(MAIL_SENDER);
|
||||
email.setCharset(Constants.UTF_8);
|
||||
if (CollectionUtils.isNotEmpty(receivers)){
|
||||
if (CollectionUtils.isNotEmpty(receivers)) {
|
||||
// receivers mail
|
||||
for (String receiver : receivers) {
|
||||
email.addTo(receiver);
|
||||
}
|
||||
}
|
||||
|
||||
if (CollectionUtils.isNotEmpty(receiversCc)){
|
||||
if (CollectionUtils.isNotEmpty(receiversCc)) {
|
||||
//cc
|
||||
for (String receiverCc : receiversCc) {
|
||||
email.addCc(receiverCc);
|
||||
@ -129,16 +151,16 @@ public class MailUtils {
|
||||
} catch (Exception e) {
|
||||
handleException(receivers, retMap, e);
|
||||
}
|
||||
}else if (showType.equals(ShowType.ATTACHMENT.getDescp()) || showType.equals(ShowType.TABLEATTACHMENT.getDescp())) {
|
||||
} else if (showType.equals(ShowType.ATTACHMENT.getDescp()) || showType.equals(ShowType.TABLEATTACHMENT.getDescp())) {
|
||||
try {
|
||||
|
||||
String partContent = (showType.equals(ShowType.ATTACHMENT.getDescp()) ? "Please see the attachment " + title + Constants.EXCEL_SUFFIX_XLS : htmlTable(content,false));
|
||||
String partContent = (showType.equals(ShowType.ATTACHMENT.getDescp()) ? "Please see the attachment " + title + Constants.EXCEL_SUFFIX_XLS : htmlTable(content, false));
|
||||
|
||||
attachment(receivers,receiversCc,title,content,partContent);
|
||||
attachment(receivers, receiversCc, title, content, partContent);
|
||||
|
||||
retMap.put(Constants.STATUS, true);
|
||||
return retMap;
|
||||
}catch (Exception e){
|
||||
} catch (Exception e) {
|
||||
handleException(receivers, retMap, e);
|
||||
return retMap;
|
||||
}
|
||||
@ -149,49 +171,52 @@ public class MailUtils {
|
||||
|
||||
/**
|
||||
* html table content
|
||||
*
|
||||
* @param content the content
|
||||
* @param showAll if show the whole content
|
||||
* @return the html table form
|
||||
*/
|
||||
private static String htmlTable(String content, boolean showAll){
|
||||
return alertTemplate.getMessageFromTemplate(content,ShowType.TABLE,showAll);
|
||||
private static String htmlTable(String content, boolean showAll) {
|
||||
return alertTemplate.getMessageFromTemplate(content, ShowType.TABLE, showAll);
|
||||
}
|
||||
|
||||
/**
|
||||
* html table content
|
||||
*
|
||||
* @param content the content
|
||||
* @return the html table form
|
||||
*/
|
||||
private static String htmlTable(String content){
|
||||
return htmlTable(content,true);
|
||||
private static String htmlTable(String content) {
|
||||
return htmlTable(content, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* html text content
|
||||
*
|
||||
* @param content the content
|
||||
* @return text in html form
|
||||
*/
|
||||
private static String htmlText(String content){
|
||||
return alertTemplate.getMessageFromTemplate(content,ShowType.TEXT);
|
||||
private static String htmlText(String content) {
|
||||
return alertTemplate.getMessageFromTemplate(content, ShowType.TEXT);
|
||||
}
|
||||
|
||||
/**
|
||||
* send mail as Excel attachment
|
||||
*
|
||||
* @param receivers the receiver list
|
||||
* @param title the title
|
||||
* @throws Exception
|
||||
*/
|
||||
private static void attachment(Collection<String> receivers,Collection<String> receiversCc,String title,String content,String partContent)throws Exception{
|
||||
private static void attachment(Collection<String> receivers, Collection<String> receiversCc, String title, String content, String partContent) throws Exception {
|
||||
MimeMessage msg = getMimeMessage(receivers);
|
||||
|
||||
attachContent(receiversCc, title, content,partContent, msg);
|
||||
attachContent(receiversCc, title, content, partContent, msg);
|
||||
}
|
||||
|
||||
/**
|
||||
* get MimeMessage
|
||||
*
|
||||
* @param receivers receivers
|
||||
* @return the MimeMessage
|
||||
* @throws MessagingException
|
||||
*/
|
||||
private static MimeMessage getMimeMessage(Collection<String> receivers) throws MessagingException {
|
||||
|
||||
@ -223,7 +248,7 @@ public class MailUtils {
|
||||
props.setProperty(Constants.MAIL_SMTP_AUTH, Constants.STRING_TRUE);
|
||||
props.setProperty(Constants.MAIL_TRANSPORT_PROTOCOL, MAIL_PROTOCOL);
|
||||
props.setProperty(Constants.MAIL_SMTP_STARTTLS_ENABLE, STARTTLS_ENABLE);
|
||||
if (SSL_ENABLE) {
|
||||
if (Boolean.TRUE.equals(SSL_ENABLE)) {
|
||||
props.setProperty(Constants.MAIL_SMTP_SSL_ENABLE, "true");
|
||||
props.setProperty(Constants.MAIL_SMTP_SSL_TRUST, SSL_TRUST);
|
||||
}
|
||||
@ -241,20 +266,19 @@ public class MailUtils {
|
||||
|
||||
/**
|
||||
* attach content
|
||||
*
|
||||
* @param receiversCc the cc list
|
||||
* @param title the title
|
||||
* @param content the content
|
||||
* @param partContent the partContent
|
||||
* @param msg the message
|
||||
* @throws MessagingException
|
||||
* @throws IOException
|
||||
*/
|
||||
private static void attachContent(Collection<String> receiversCc, String title, String content, String partContent,MimeMessage msg) throws MessagingException, IOException {
|
||||
/**
|
||||
private static void attachContent(Collection<String> receiversCc, String title, String content, String partContent, MimeMessage msg) throws MessagingException, IOException {
|
||||
/*
|
||||
* set receiverCc
|
||||
*/
|
||||
if(CollectionUtils.isNotEmpty(receiversCc)){
|
||||
for (String receiverCc : receiversCc){
|
||||
if (CollectionUtils.isNotEmpty(receiversCc)) {
|
||||
for (String receiverCc : receiversCc) {
|
||||
msg.addRecipients(Message.RecipientType.CC, InternetAddress.parse(receiverCc));
|
||||
}
|
||||
}
|
||||
@ -267,16 +291,16 @@ public class MailUtils {
|
||||
part1.setContent(partContent, Constants.TEXT_HTML_CHARSET_UTF_8);
|
||||
// set attach file
|
||||
MimeBodyPart part2 = new MimeBodyPart();
|
||||
File file = new File(xlsFilePath + Constants.SINGLE_SLASH + title + Constants.EXCEL_SUFFIX_XLS);
|
||||
File file = new File(XLS_FILE_PATH + Constants.SINGLE_SLASH + title + Constants.EXCEL_SUFFIX_XLS);
|
||||
if (!file.getParentFile().exists()) {
|
||||
file.getParentFile().mkdirs();
|
||||
}
|
||||
// make excel file
|
||||
|
||||
ExcelUtils.genExcelFile(content,title,xlsFilePath);
|
||||
ExcelUtils.genExcelFile(content, title, XLS_FILE_PATH);
|
||||
|
||||
part2.attachFile(file);
|
||||
part2.setFileName(MimeUtility.encodeText(title + Constants.EXCEL_SUFFIX_XLS,Constants.UTF_8,"B"));
|
||||
part2.setFileName(MimeUtility.encodeText(title + Constants.EXCEL_SUFFIX_XLS, Constants.UTF_8, "B"));
|
||||
// add components to collection
|
||||
partList.addBodyPart(part1);
|
||||
partList.addBodyPart(part2);
|
||||
@ -289,21 +313,21 @@ public class MailUtils {
|
||||
|
||||
/**
|
||||
* the string object map
|
||||
*
|
||||
* @param title the title
|
||||
* @param content the content
|
||||
* @param showType the showType
|
||||
* @param retMap the result map
|
||||
* @param email the email
|
||||
* @return the result map
|
||||
* @throws EmailException
|
||||
*/
|
||||
private static Map<String, Object> getStringObjectMap(String title, String content, String showType, Map<String, Object> retMap, HtmlEmail email) throws EmailException {
|
||||
|
||||
/**
|
||||
/*
|
||||
* the subject of the message to be sent
|
||||
*/
|
||||
email.setSubject(title);
|
||||
/**
|
||||
/*
|
||||
* to send information, you can use HTML tags in mail content because of the use of HtmlEmail
|
||||
*/
|
||||
if (showType.equals(ShowType.TABLE.getDescp())) {
|
||||
@ -322,23 +346,24 @@ public class MailUtils {
|
||||
|
||||
/**
|
||||
* file delete
|
||||
*
|
||||
* @param file the file to delete
|
||||
*/
|
||||
public static void deleteFile(File file){
|
||||
if(file.exists()){
|
||||
if(file.delete()){
|
||||
logger.info("delete success: {}",file.getAbsolutePath() + file.getName());
|
||||
}else{
|
||||
public static void deleteFile(File file) {
|
||||
if (file.exists()) {
|
||||
if (file.delete()) {
|
||||
logger.info("delete success: {}", file.getAbsolutePath() + file.getName());
|
||||
} else {
|
||||
logger.info("delete fail: {}", file.getAbsolutePath() + file.getName());
|
||||
}
|
||||
}else{
|
||||
} else {
|
||||
logger.info("file not exists: {}", file.getAbsolutePath() + file.getName());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* handle exception
|
||||
*
|
||||
* @param receivers the receiver list
|
||||
* @param retMap the result map
|
||||
* @param e the exception
|
||||
@ -347,6 +372,4 @@ public class MailUtils {
|
||||
logger.error("Send email to {} failed", receivers, e);
|
||||
retMap.put(Constants.MESSAGE, "Send email to {" + String.join(",", receivers) + "} failed," + e.toString());
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -14,19 +14,21 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.apache.dolphinscheduler.alert.utils;
|
||||
|
||||
import static org.apache.dolphinscheduler.alert.utils.Constants.ALERT_PROPERTIES_PATH;
|
||||
|
||||
import org.apache.dolphinscheduler.common.utils.IOUtils;
|
||||
import org.apache.dolphinscheduler.common.utils.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.Properties;
|
||||
import java.util.regex.PatternSyntaxException;
|
||||
|
||||
import static org.apache.dolphinscheduler.alert.utils.Constants.ALERT_PROPERTIES_PATH;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* property utils
|
||||
@ -41,13 +43,11 @@ public class PropertyUtils {
|
||||
|
||||
private static final Properties properties = new Properties();
|
||||
|
||||
private static final PropertyUtils propertyUtils = new PropertyUtils();
|
||||
|
||||
private PropertyUtils(){
|
||||
private PropertyUtils() {
|
||||
init();
|
||||
}
|
||||
|
||||
private void init(){
|
||||
private void init() {
|
||||
String[] propertyFiles = new String[]{ALERT_PROPERTIES_PATH};
|
||||
for (String fileName : propertyFiles) {
|
||||
InputStream fis = null;
|
||||
@ -69,6 +69,7 @@ public class PropertyUtils {
|
||||
|
||||
/**
|
||||
* get property value
|
||||
*
|
||||
* @param key property name
|
||||
* @return the value
|
||||
*/
|
||||
@ -95,7 +96,7 @@ public class PropertyUtils {
|
||||
* get property value
|
||||
*
|
||||
* @param key property name
|
||||
* @return get property int value , if key == null, then return -1
|
||||
* @return get property int value , if key == null, then return -1
|
||||
*/
|
||||
public static int getInt(String key) {
|
||||
|
||||
@ -104,6 +105,7 @@ public class PropertyUtils {
|
||||
|
||||
/**
|
||||
* get int value
|
||||
*
|
||||
* @param key the key
|
||||
* @param defaultValue the default value
|
||||
* @return the value related the key or the default value if the key not existed
|
||||
@ -117,15 +119,16 @@ public class PropertyUtils {
|
||||
try {
|
||||
return Integer.parseInt(value);
|
||||
} catch (NumberFormatException e) {
|
||||
logger.info(e.getMessage(),e);
|
||||
logger.info(e.getMessage(), e);
|
||||
}
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* get property value
|
||||
*
|
||||
* @param key property name
|
||||
* @return the boolean result value
|
||||
* @return the boolean result value
|
||||
*/
|
||||
public static Boolean getBoolean(String key) {
|
||||
|
||||
@ -134,7 +137,7 @@ public class PropertyUtils {
|
||||
}
|
||||
|
||||
String value = properties.getProperty(key.trim());
|
||||
if(null != value){
|
||||
if (null != value) {
|
||||
return Boolean.parseBoolean(value);
|
||||
}
|
||||
|
||||
@ -143,15 +146,17 @@ public class PropertyUtils {
|
||||
|
||||
/**
|
||||
* get long value
|
||||
*
|
||||
* @param key the key
|
||||
* @return if the value not existed, return -1, or will return the related value
|
||||
*/
|
||||
public static long getLong(String key) {
|
||||
return getLong(key,-1);
|
||||
return getLong(key, -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* get long value
|
||||
*
|
||||
* @param key the key
|
||||
* @param defaultVal the default value
|
||||
* @return the value related the key or the default value if the key not existed
|
||||
@ -166,7 +171,7 @@ public class PropertyUtils {
|
||||
try {
|
||||
return Long.parseLong(val);
|
||||
} catch (NumberFormatException e) {
|
||||
logger.info(e.getMessage(),e);
|
||||
logger.info(e.getMessage(), e);
|
||||
}
|
||||
|
||||
return defaultVal;
|
||||
@ -174,16 +179,17 @@ public class PropertyUtils {
|
||||
|
||||
/**
|
||||
* get double value
|
||||
*
|
||||
* @param key the key
|
||||
* @return if the value not existed, return -1.0, or will return the related value
|
||||
*/
|
||||
public static double getDouble(String key) {
|
||||
String val = getString(key);
|
||||
return getDouble(key,-1.0);
|
||||
return getDouble(key, -1.0);
|
||||
}
|
||||
|
||||
/**
|
||||
* get double value
|
||||
*
|
||||
* @param key the key
|
||||
* @param defaultVal the default value
|
||||
* @return the value related the key or the default value if the key not existed
|
||||
@ -198,17 +204,17 @@ public class PropertyUtils {
|
||||
try {
|
||||
return Double.parseDouble(val);
|
||||
} catch (NumberFormatException e) {
|
||||
logger.info(e.getMessage(),e);
|
||||
logger.info(e.getMessage(), e);
|
||||
}
|
||||
|
||||
return defaultVal;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get array
|
||||
* @param key property name
|
||||
* @param splitStr separator
|
||||
* get array
|
||||
*
|
||||
* @param key property name
|
||||
* @param splitStr separator
|
||||
* @return the result array
|
||||
*/
|
||||
public static String[] getArray(String key, String splitStr) {
|
||||
@ -219,21 +225,22 @@ public class PropertyUtils {
|
||||
try {
|
||||
return value.split(splitStr);
|
||||
} catch (PatternSyntaxException e) {
|
||||
logger.info(e.getMessage(),e);
|
||||
logger.info(e.getMessage(), e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* get enum
|
||||
*
|
||||
* @param key the key
|
||||
* @param type the class type
|
||||
* @param defaultValue the default value
|
||||
* @param <T> the generic class type
|
||||
* @return get enum value
|
||||
* @return get enum value
|
||||
*/
|
||||
public static <T extends Enum<T>> T getEnum(String key, Class<T> type,
|
||||
T defaultValue) {
|
||||
T defaultValue) {
|
||||
String val = getString(key);
|
||||
if (val == null) {
|
||||
return defaultValue;
|
||||
@ -242,7 +249,7 @@ public class PropertyUtils {
|
||||
try {
|
||||
return Enum.valueOf(type, val);
|
||||
} catch (IllegalArgumentException e) {
|
||||
logger.info(e.getMessage(),e);
|
||||
logger.info(e.getMessage(), e);
|
||||
}
|
||||
|
||||
return defaultValue;
|
||||
|
@ -32,8 +32,6 @@ import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
@PrepareForTest(PropertyUtils.class)
|
||||
@RunWith(PowerMockRunner.class)
|
||||
@PowerMockIgnore("javax.net.ssl.*")
|
||||
@ -97,8 +95,8 @@ public class DingTalkUtilsTest {
|
||||
@Test
|
||||
public void testProxyConfig() {
|
||||
RequestConfig rc = DingTalkUtils.getProxyConfig();
|
||||
Assert.assertEquals(rc.getProxy().getPort(), 80);
|
||||
Assert.assertEquals(rc.getProxy().getHostName(), "proxy.com.cn");
|
||||
Assert.assertEquals(80, rc.getProxy().getPort());
|
||||
Assert.assertEquals("proxy.com.cn", rc.getProxy().getHostName());
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -114,7 +112,7 @@ public class DingTalkUtilsTest {
|
||||
String msg = DingTalkUtils.textToJsonString("this is test:中文");
|
||||
|
||||
logger.info("test support utf8, actual:" + msg);
|
||||
logger.info("test support utf8, actual:" + DingTalkUtils.isEnableDingTalk);
|
||||
logger.info("test support utf8, actual:" + DingTalkUtils.IS_ENABLE_DING_TALK);
|
||||
String expect = "{\"text\":{\"content\":\"this is test:中文\"},\"msgtype\":\"text\"}";
|
||||
Assert.assertEquals(expect, msg);
|
||||
}
|
||||
|
@ -17,6 +17,10 @@
|
||||
|
||||
package org.apache.dolphinscheduler.alert.utils;
|
||||
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Rule;
|
||||
@ -25,8 +29,6 @@ import org.junit.rules.ExpectedException;
|
||||
import org.junit.rules.TemporaryFolder;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import java.io.File;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
public class ExcelUtilsTest {
|
||||
|
||||
@ -61,7 +63,7 @@ public class ExcelUtilsTest {
|
||||
|
||||
//Define dest file path
|
||||
String xlsFilePath = rootPath + System.getProperty("file.separator");
|
||||
logger.info("xlsFilePath: "+xlsFilePath);
|
||||
logger.info("XLS_FILE_PATH: " + xlsFilePath);
|
||||
|
||||
//Define correctContent
|
||||
String correctContent = "[{\"name\":\"ds name\",\"value\":\"ds value\"}]";
|
||||
@ -99,4 +101,4 @@ public class ExcelUtilsTest {
|
||||
File file = new File("/tmp/xls" + Constants.SINGLE_SLASH + "t" + Constants.EXCEL_SUFFIX_XLS);
|
||||
file.delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -41,11 +41,11 @@ public class PropertyUtilsTest {
|
||||
//Expected "EMAIL"
|
||||
String result = PropertyUtils.getString("alert.type");
|
||||
logger.info(result);
|
||||
assertEquals(result, "EMAIL");
|
||||
assertEquals("EMAIL", result);
|
||||
|
||||
//Expected "xxx.xxx.test"
|
||||
result = PropertyUtils.getString("mail.server.host");
|
||||
assertEquals(result, "xxx.xxx.test");
|
||||
assertEquals("xxx.xxx.test", result);
|
||||
|
||||
//If key is undefine in alert.properties, then return null
|
||||
result = PropertyUtils.getString("abc");
|
||||
@ -88,23 +88,23 @@ public class PropertyUtilsTest {
|
||||
|
||||
//Expected 25
|
||||
long result = PropertyUtils.getLong("mail.server.port");
|
||||
assertSame(result, 25L);
|
||||
assertSame(25L, result);
|
||||
|
||||
//If key is null, then return -1
|
||||
result = PropertyUtils.getLong(null);
|
||||
assertSame(result, -1L);
|
||||
assertSame(-1L, result);
|
||||
|
||||
//If key is undefine in alert.properties, then return -1
|
||||
result = PropertyUtils.getLong("abc");
|
||||
assertSame(result, -1L);
|
||||
assertSame(-1L, result);
|
||||
|
||||
//If key is undefine in alert.properties, and there is a defaultval, then return defaultval
|
||||
result = PropertyUtils.getLong("abc", 200);
|
||||
assertEquals(result, 200L);
|
||||
assertEquals(200L, result);
|
||||
|
||||
//If the value can not parse to long ,it will log the error and return -1L
|
||||
result = PropertyUtils.getLong("test.server.testnumber");
|
||||
assertSame(result, -1L);
|
||||
assertSame(-1L, result);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -115,23 +115,23 @@ public class PropertyUtilsTest {
|
||||
|
||||
//Expected 3.0
|
||||
double result = PropertyUtils.getDouble("test.server.factor");
|
||||
assertEquals(result, 3.0, 0);
|
||||
assertEquals(3.0, result, 0);
|
||||
|
||||
//If key is null, then return -1.0
|
||||
result = PropertyUtils.getDouble(null);
|
||||
assertEquals(result, -1.0, 0);
|
||||
assertEquals(-1.0, result, 0);
|
||||
|
||||
//If key is undefine in alert.properties, then return -1
|
||||
result = PropertyUtils.getDouble("abc");
|
||||
assertEquals(result, -1.0, 0);
|
||||
assertEquals(-1.0, result, 0);
|
||||
|
||||
//If key is undefine in alert.properties, and there is a defaultval, then return defaultval
|
||||
result = PropertyUtils.getDouble("abc", 5.0);
|
||||
assertEquals(result, 5.0, 0);
|
||||
assertEquals(5.0, result, 0);
|
||||
|
||||
//If the value can not parse to double ,it will log the error and return -1.0
|
||||
result = PropertyUtils.getDouble("test.server.testnumber");
|
||||
assertEquals(result, -1.0, 0);
|
||||
assertEquals(-1.0, result, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -145,9 +145,9 @@ public class PropertyUtilsTest {
|
||||
assertEquals(result.length, 3);
|
||||
|
||||
//Equal array values
|
||||
assertEquals(result[0], "xxx.xxx.test1");
|
||||
assertEquals(result[1], "xxx.xxx.test2");
|
||||
assertEquals(result[2], "xxx.xxx.test3");
|
||||
assertEquals("xxx.xxx.test1", result[0]);
|
||||
assertEquals("xxx.xxx.test2", result[1]);
|
||||
assertEquals("xxx.xxx.test3", result[2]);
|
||||
|
||||
//If key is null, then return -1
|
||||
result = PropertyUtils.getArray(null, ",");
|
||||
@ -170,23 +170,23 @@ public class PropertyUtilsTest {
|
||||
|
||||
//Expected 25
|
||||
int result = PropertyUtils.getInt("mail.server.port");
|
||||
assertSame(result, 25);
|
||||
assertSame(25, result);
|
||||
|
||||
//If key is null, then return -1
|
||||
result = PropertyUtils.getInt(null);
|
||||
assertSame(result, -1);
|
||||
assertSame(-1, result);
|
||||
|
||||
//If key is undefine in alert.properties, then return -1
|
||||
result = PropertyUtils.getInt("abc");
|
||||
assertSame(result, -1);
|
||||
assertSame(-1, result);
|
||||
|
||||
//If key is undefine in alert.properties, and there is a defaultval, then return defaultval
|
||||
result = PropertyUtils.getInt("abc", 300);
|
||||
assertEquals(result, 300);
|
||||
assertEquals(300, result);
|
||||
|
||||
//If the value can not parse to int ,it will log the error and return -1
|
||||
result = PropertyUtils.getInt("test.server.testnumber");
|
||||
assertSame(result, -1);
|
||||
assertSame(-1, result);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -197,19 +197,19 @@ public class PropertyUtilsTest {
|
||||
|
||||
//Expected MASTER
|
||||
ZKNodeType zkNodeType = PropertyUtils.getEnum("test.server.enum1", ZKNodeType.class,ZKNodeType.WORKER);
|
||||
assertEquals(zkNodeType, ZKNodeType.MASTER);
|
||||
assertEquals(ZKNodeType.MASTER, zkNodeType);
|
||||
|
||||
//Expected DEAD_SERVER
|
||||
zkNodeType = PropertyUtils.getEnum("test.server.enum2", ZKNodeType.class,ZKNodeType.WORKER);
|
||||
assertEquals(zkNodeType, ZKNodeType.DEAD_SERVER);
|
||||
assertEquals(ZKNodeType.DEAD_SERVER, zkNodeType);
|
||||
|
||||
//If key is null, then return defaultval
|
||||
zkNodeType = PropertyUtils.getEnum(null, ZKNodeType.class,ZKNodeType.WORKER);
|
||||
assertEquals(zkNodeType, ZKNodeType.WORKER);
|
||||
assertEquals(ZKNodeType.WORKER, zkNodeType);
|
||||
|
||||
//If the value doesn't define in enum ,it will log the error and return -1
|
||||
zkNodeType = PropertyUtils.getEnum("test.server.enum3", ZKNodeType.class,ZKNodeType.WORKER);
|
||||
assertEquals(zkNodeType, ZKNodeType.WORKER);
|
||||
assertEquals(ZKNodeType.WORKER, zkNodeType);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user