mirror of
https://gitee.com/dolphinscheduler/DolphinScheduler.git
synced 2024-12-02 12:17:43 +08:00
Refactor alert template (#1713)
* refactor Alert Template * refactor alert template(remove freemarker) * add license * update abstract class to interface * make test into root pom * fix powermock static * fix powermock static * remove custom exception * remove custom exception
This commit is contained in:
parent
0628aec535
commit
9eb823c0aa
@ -36,17 +36,36 @@
|
||||
<artifactId>junit</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.mockito</groupId>
|
||||
<artifactId>mockito-core</artifactId>
|
||||
<type>jar</type>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.powermock</groupId>
|
||||
<artifactId>powermock-module-junit4</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.powermock</groupId>
|
||||
<artifactId>powermock-api-mockito2</artifactId>
|
||||
<scope>test</scope>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.mockito</groupId>
|
||||
<artifactId>mockito-core</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-email</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.freemarker</groupId>
|
||||
<artifactId>freemarker</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.alibaba</groupId>
|
||||
<artifactId>fastjson</artifactId>
|
||||
|
@ -0,0 +1,41 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.apache.dolphinscheduler.alert.template;
|
||||
|
||||
import org.apache.dolphinscheduler.common.enums.ShowType;
|
||||
|
||||
/**
|
||||
* alert message template
|
||||
*/
|
||||
public interface AlertTemplate {
|
||||
|
||||
/**
|
||||
* get a message from a specified alert template
|
||||
* @param content alert message content
|
||||
* @param showType show type
|
||||
* @param showAll whether to show all
|
||||
* @return a message from a specified alert template
|
||||
*/
|
||||
String getMessageFromTemplate(String content, ShowType showType,boolean showAll);
|
||||
|
||||
/**
|
||||
* default showAll is true
|
||||
*/
|
||||
default String getMessageFromTemplate(String content,ShowType showType){
|
||||
return getMessageFromTemplate(content,showType,true);
|
||||
}
|
||||
}
|
@ -0,0 +1,54 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* 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.apache.dolphinscheduler.alert.utils.Constants;
|
||||
import org.apache.dolphinscheduler.alert.utils.PropertyUtils;
|
||||
import org.apache.dolphinscheduler.common.utils.StringUtils;
|
||||
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 static final String alertTemplate = PropertyUtils.getString(Constants.ALERT_TEMPLATE);
|
||||
|
||||
private AlertTemplateFactory(){}
|
||||
|
||||
/**
|
||||
* get a template from alert.properties conf file
|
||||
* @return a template, default is DefaultHTMLTemplate
|
||||
*/
|
||||
public static AlertTemplate getMessageTemplate() {
|
||||
|
||||
if(StringUtils.isEmpty(alertTemplate)){
|
||||
return new DefaultHTMLTemplate();
|
||||
}
|
||||
|
||||
switch (alertTemplate){
|
||||
case "html":
|
||||
return new DefaultHTMLTemplate();
|
||||
default:
|
||||
throw new IllegalArgumentException(String.format("not support alert template: %s",alertTemplate));
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,161 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.apache.dolphinscheduler.alert.template.impl;
|
||||
|
||||
import org.apache.dolphinscheduler.alert.template.AlertTemplate;
|
||||
import org.apache.dolphinscheduler.alert.utils.Constants;
|
||||
import org.apache.dolphinscheduler.alert.utils.JSONUtils;
|
||||
import org.apache.dolphinscheduler.alert.utils.MailUtils;
|
||||
import org.apache.dolphinscheduler.common.enums.ShowType;
|
||||
import org.apache.dolphinscheduler.common.utils.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
import static org.apache.dolphinscheduler.common.utils.Preconditions.*;
|
||||
|
||||
/**
|
||||
* the default html alert message template
|
||||
*/
|
||||
public class DefaultHTMLTemplate implements AlertTemplate {
|
||||
|
||||
public static final Logger logger = LoggerFactory.getLogger(DefaultHTMLTemplate.class);
|
||||
|
||||
@Override
|
||||
public String getMessageFromTemplate(String content, ShowType showType,boolean showAll) {
|
||||
|
||||
switch (showType){
|
||||
case TABLE:
|
||||
return getTableTypeMessage(content,showAll);
|
||||
case TEXT:
|
||||
return getTextTypeMessage(content,showAll);
|
||||
default:
|
||||
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){
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
StringBuilder contents = new StringBuilder(200);
|
||||
|
||||
boolean flag = true;
|
||||
|
||||
String title = "";
|
||||
for (LinkedHashMap mapItems : mapItemsList){
|
||||
|
||||
Set<Map.Entry<String, Object>> entries = mapItems.entrySet();
|
||||
|
||||
Iterator<Map.Entry<String, Object>> iterator = entries.iterator();
|
||||
|
||||
StringBuilder t = new StringBuilder(Constants.TR);
|
||||
StringBuilder cs = new StringBuilder(Constants.TR);
|
||||
while (iterator.hasNext()){
|
||||
|
||||
Map.Entry<String, Object> entry = iterator.next();
|
||||
t.append(Constants.TH).append(entry.getKey()).append(Constants.TH_END);
|
||||
cs.append(Constants.TD).append(String.valueOf(entry.getValue())).append(Constants.TD_END);
|
||||
|
||||
}
|
||||
t.append(Constants.TR_END);
|
||||
cs.append(Constants.TR_END);
|
||||
if (flag){
|
||||
title = t.toString();
|
||||
}
|
||||
flag = false;
|
||||
contents.append(cs);
|
||||
}
|
||||
|
||||
return getMessageFromHtmlTemplate(title,contents.toString());
|
||||
}
|
||||
|
||||
return content;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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){
|
||||
|
||||
if (StringUtils.isNotEmpty(content)){
|
||||
List<String> list;
|
||||
try {
|
||||
list = JSONUtils.toList(content,String.class);
|
||||
}catch (Exception e){
|
||||
logger.error("json format exception",e);
|
||||
return null;
|
||||
}
|
||||
|
||||
StringBuilder contents = new StringBuilder(100);
|
||||
for (String str : list){
|
||||
contents.append(Constants.TR);
|
||||
contents.append(Constants.TD).append(str).append(Constants.TD_END);
|
||||
contents.append(Constants.TR_END);
|
||||
}
|
||||
|
||||
return getMessageFromHtmlTemplate(null,contents.toString());
|
||||
|
||||
}
|
||||
|
||||
return content;
|
||||
}
|
||||
|
||||
/**
|
||||
* get alert message from a html template
|
||||
* @param title message title
|
||||
* @param content message content
|
||||
* @return alert message which use html template
|
||||
*/
|
||||
private String getMessageFromHtmlTemplate(String title,String content){
|
||||
|
||||
checkNotNull(content);
|
||||
String htmlTableThead = StringUtils.isEmpty(title) ? "" : String.format("<thead>%s</thead>\n",title);
|
||||
|
||||
return "<html>\n" +
|
||||
" <head>\n" +
|
||||
" <title>dolphinscheduler</title>\n" +
|
||||
" <meta name='Keywords' content=''>\n" +
|
||||
" <meta name='Description' content=''>\n" +
|
||||
" <style type=\"text/css\">\n" +
|
||||
" table {margin-top:0px;padding-top:0px;border:1px solid;font-size: 14px;color: #333333;border-width: 1px;border-color: #666666;border-collapse: collapse;}\n" +
|
||||
" table th {border-width: 1px;padding: 8px;border-style: solid;border-color: #666666;background-color: #dedede;text-align: right;}\n" +
|
||||
" table td {border-width: 1px;padding: 8px;border-style: solid;border-color: #666666;background-color: #ffffff;text-align: right;}\n" +
|
||||
" </style>\n" +
|
||||
" </head>\n" +
|
||||
" <body style=\"margin:0;padding:0\">\n" +
|
||||
" <table border=\"1px\" cellpadding=\"5px\" cellspacing=\"-10px\">\n" + htmlTableThead + content +
|
||||
" </table>\n" +
|
||||
" </body>\n" +
|
||||
"</html>";
|
||||
}
|
||||
}
|
@ -75,6 +75,8 @@ public class Constants {
|
||||
|
||||
public static final int NUMBER_1000 = 1000;
|
||||
|
||||
public static final String ALERT_TEMPLATE = "alert.template";
|
||||
|
||||
public static final String SPRING_DATASOURCE_DRIVER_CLASS_NAME = "spring.datasource.driver-class-name";
|
||||
|
||||
public static final String SPRING_DATASOURCE_URL = "spring.datasource.url";
|
||||
@ -115,8 +117,6 @@ public class Constants {
|
||||
|
||||
public static final String DEVELOPMENT = "development";
|
||||
|
||||
public static final String CLASSPATH_MAIL_TEMPLATES_ALERT_MAIL_TEMPLATE_FTL = "classpath:mail_templates/alert_mail_template.ftl";
|
||||
|
||||
public static final String TR = "<tr>";
|
||||
|
||||
public static final String TD = "<td>";
|
||||
|
@ -16,15 +16,12 @@
|
||||
*/
|
||||
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 freemarker.cache.StringTemplateLoader;
|
||||
import freemarker.template.Configuration;
|
||||
import freemarker.template.Template;
|
||||
import freemarker.template.TemplateException;
|
||||
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.IOUtils;
|
||||
import org.apache.dolphinscheduler.common.utils.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@ -68,25 +65,7 @@ public class MailUtils {
|
||||
|
||||
public static final String sslTrust = PropertyUtils.getString(Constants.MAIL_SMTP_SSL_TRUST);
|
||||
|
||||
private static Template MAIL_TEMPLATE;
|
||||
|
||||
static {
|
||||
Configuration cfg = new Configuration(Configuration.VERSION_2_3_21);
|
||||
cfg.setDefaultEncoding(Constants.UTF_8);
|
||||
StringTemplateLoader stringTemplateLoader = new StringTemplateLoader();
|
||||
cfg.setTemplateLoader(stringTemplateLoader);
|
||||
InputStreamReader isr = null;
|
||||
try {
|
||||
isr = new InputStreamReader(new FileInputStream(ResourceUtils.getFile(Constants.CLASSPATH_MAIL_TEMPLATES_ALERT_MAIL_TEMPLATE_FTL)),
|
||||
Constants.UTF_8);
|
||||
|
||||
MAIL_TEMPLATE = new Template("alert_mail_template", isr, cfg);
|
||||
} catch (Exception e) {
|
||||
MAIL_TEMPLATE = null;
|
||||
} finally {
|
||||
IOUtils.closeQuietly(isr);
|
||||
}
|
||||
}
|
||||
public static final AlertTemplate alertTemplate = AlertTemplateFactory.getMessageTemplate();
|
||||
|
||||
|
||||
/**
|
||||
@ -173,46 +152,7 @@ public class MailUtils {
|
||||
* @return the html table form
|
||||
*/
|
||||
private static String htmlTable(String content, boolean showAll){
|
||||
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);
|
||||
}
|
||||
|
||||
StringBuilder contents = new StringBuilder(200);
|
||||
|
||||
boolean flag = true;
|
||||
|
||||
String title = "";
|
||||
for (LinkedHashMap mapItems : mapItemsList){
|
||||
|
||||
Set<Map.Entry<String, Object>> entries = mapItems.entrySet();
|
||||
|
||||
Iterator<Map.Entry<String, Object>> iterator = entries.iterator();
|
||||
|
||||
StringBuilder t = new StringBuilder(Constants.TR);
|
||||
StringBuilder cs = new StringBuilder(Constants.TR);
|
||||
while (iterator.hasNext()){
|
||||
|
||||
Map.Entry<String, Object> entry = iterator.next();
|
||||
t.append(Constants.TH).append(entry.getKey()).append(Constants.TH_END);
|
||||
cs.append(Constants.TD).append(String.valueOf(entry.getValue())).append(Constants.TD_END);
|
||||
|
||||
}
|
||||
t.append(Constants.TR_END);
|
||||
cs.append(Constants.TR_END);
|
||||
if (flag){
|
||||
title = t.toString();
|
||||
}
|
||||
flag = false;
|
||||
contents.append(cs);
|
||||
}
|
||||
|
||||
return getTemplateContent(title,contents.toString());
|
||||
}
|
||||
|
||||
return null;
|
||||
return alertTemplate.getMessageFromTemplate(content,ShowType.TABLE,showAll);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -230,33 +170,9 @@ public class MailUtils {
|
||||
* @return text in html form
|
||||
*/
|
||||
private static String htmlText(String content){
|
||||
|
||||
if (StringUtils.isNotEmpty(content)){
|
||||
List<String> list;
|
||||
try {
|
||||
list = JSONUtils.toList(content,String.class);
|
||||
}catch (Exception e){
|
||||
logger.error("json format exception",e);
|
||||
return null;
|
||||
}
|
||||
|
||||
StringBuilder contents = new StringBuilder(100);
|
||||
for (String str : list){
|
||||
contents.append(Constants.TR);
|
||||
contents.append(Constants.TD).append(str).append(Constants.TD_END);
|
||||
contents.append(Constants.TR_END);
|
||||
}
|
||||
|
||||
return getTemplateContent(null,contents.toString());
|
||||
|
||||
}
|
||||
|
||||
return null;
|
||||
return alertTemplate.getMessageFromTemplate(content,ShowType.TEXT);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* send mail as Excel attachment
|
||||
* @param receivers the receiver list
|
||||
@ -425,28 +341,4 @@ public class MailUtils {
|
||||
retMap.put(Constants.MESSAGE, "Send email to {" + StringUtils.join(receivers, ",") + "} failed," + e.toString());
|
||||
}
|
||||
|
||||
/**
|
||||
* get the content of the template
|
||||
* @param title the title
|
||||
* @param content the content to retrieve
|
||||
* @return the content in the template or null if exception occurs
|
||||
*/
|
||||
private static String getTemplateContent(String title,String content){
|
||||
StringWriter out = new StringWriter();
|
||||
Map<String,String> map = new HashMap<>();
|
||||
if(null != title){
|
||||
map.put(Constants.TITLE,title);
|
||||
}
|
||||
map.put(Constants.CONTENT,content);
|
||||
try {
|
||||
MAIL_TEMPLATE.process(map, out);
|
||||
return out.toString();
|
||||
} catch (TemplateException e) {
|
||||
logger.error(e.getMessage(),e);
|
||||
} catch (IOException e) {
|
||||
logger.error(e.getMessage(),e);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
@ -18,6 +18,9 @@
|
||||
#alert type is EMAIL/SMS
|
||||
alert.type=EMAIL
|
||||
|
||||
# alter msg template, default is html template
|
||||
#alert.template=html
|
||||
|
||||
# mail server configuration
|
||||
mail.protocol=SMTP
|
||||
mail.server.host=xxx.xxx.com
|
||||
|
@ -1,17 +0,0 @@
|
||||
<#--
|
||||
~ Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
~ contributor license agreements. See the NOTICE file distributed with
|
||||
~ this work for additional information regarding copyright ownership.
|
||||
~ The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
~ (the "License"); you may not use this file except in compliance with
|
||||
~ the License. You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
<!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: right;} table td { border-width: 1px; padding: 8px; border-style: solid; border-color: #666666; background-color: #ffffff; text-align: right;}</style></head><body style="margin:0;padding:0"><table border="1px" cellpadding="5px" cellspacing="-10px"><thead><#if title??> ${title}</#if></thead><#if content??> ${content}</#if></table></body></html>
|
@ -0,0 +1,66 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* 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.apache.dolphinscheduler.alert.utils.Constants;
|
||||
import org.apache.dolphinscheduler.alert.utils.PropertyUtils;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Mockito;
|
||||
import org.powermock.api.mockito.PowerMockito;
|
||||
import org.powermock.core.classloader.annotations.PrepareForTest;
|
||||
import org.powermock.modules.junit4.PowerMockRunner;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import static org.mockito.Mockito.*;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* test class for AlertTemplateFactory
|
||||
*/
|
||||
@RunWith(PowerMockRunner.class)
|
||||
@PrepareForTest(PropertyUtils.class)
|
||||
public class AlertTemplateFactoryTest {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(AlertTemplateFactoryTest.class);
|
||||
|
||||
/**
|
||||
* GetMessageTemplate method test
|
||||
*/
|
||||
@Test
|
||||
public void testGetMessageTemplate(){
|
||||
|
||||
PowerMockito.mockStatic(PropertyUtils.class);
|
||||
when(PropertyUtils.getString(Constants.ALERT_TEMPLATE)).thenReturn("html");
|
||||
|
||||
AlertTemplate defaultTemplate = AlertTemplateFactory.getMessageTemplate();
|
||||
|
||||
assertTrue(defaultTemplate instanceof DefaultHTMLTemplate);
|
||||
}
|
||||
|
||||
/**
|
||||
* GetMessageTemplate method throw Exception test
|
||||
*/
|
||||
@Test
|
||||
public void testGetMessageTemplateException(){
|
||||
|
||||
AlertTemplate defaultTemplate = AlertTemplateFactory.getMessageTemplate();
|
||||
assertTrue(defaultTemplate instanceof DefaultHTMLTemplate);
|
||||
}
|
||||
}
|
@ -0,0 +1,123 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.apache.dolphinscheduler.alert.template.impl;
|
||||
|
||||
import org.apache.dolphinscheduler.alert.utils.JSONUtils;
|
||||
import org.apache.dolphinscheduler.common.enums.ShowType;
|
||||
import org.junit.Test;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* test class for DefaultHTMLTemplate
|
||||
*/
|
||||
public class DefaultHTMLTemplateTest{
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(DefaultHTMLTemplateTest.class);
|
||||
|
||||
/**
|
||||
* only need test method GetMessageFromTemplate
|
||||
*/
|
||||
@Test
|
||||
public void testGetMessageFromTemplate(){
|
||||
|
||||
DefaultHTMLTemplate template = new DefaultHTMLTemplate();
|
||||
|
||||
String tableTypeMessage = template.getMessageFromTemplate(list2String(), ShowType.TABLE,true);
|
||||
|
||||
assertEquals(tableTypeMessage,generateMockTableTypeResultByHand());
|
||||
|
||||
String textTypeMessage = template.getMessageFromTemplate(list2String(), ShowType.TEXT,true);
|
||||
|
||||
assertEquals(textTypeMessage,generateMockTextTypeResultByHand());
|
||||
}
|
||||
|
||||
/**
|
||||
* generate some simulation data
|
||||
*/
|
||||
private String list2String(){
|
||||
|
||||
LinkedHashMap<String, Object> map1 = new LinkedHashMap<>();
|
||||
map1.put("mysql service name","mysql200");
|
||||
map1.put("mysql address","192.168.xx.xx");
|
||||
map1.put("port","3306");
|
||||
map1.put("no index of number","80");
|
||||
map1.put("database client connections","190");
|
||||
|
||||
LinkedHashMap<String, Object> map2 = new LinkedHashMap<>();
|
||||
map2.put("mysql service name","mysql210");
|
||||
map2.put("mysql address","192.168.xx.xx");
|
||||
map2.put("port","3306");
|
||||
map2.put("no index of number","10");
|
||||
map2.put("database client connections","90");
|
||||
|
||||
List<LinkedHashMap<String, Object>> maps = new ArrayList<>();
|
||||
maps.add(0,map1);
|
||||
maps.add(1,map2);
|
||||
String mapjson = JSONUtils.toJsonString(maps);
|
||||
logger.info(mapjson);
|
||||
|
||||
return mapjson;
|
||||
}
|
||||
|
||||
private String generateMockTableTypeResultByHand(){
|
||||
|
||||
return "<html>\n" +
|
||||
" <head>\n" +
|
||||
" <title>dolphinscheduler</title>\n" +
|
||||
" <meta name='Keywords' content=''>\n" +
|
||||
" <meta name='Description' content=''>\n" +
|
||||
" <style type=\"text/css\">\n" +
|
||||
" table {margin-top:0px;padding-top:0px;border:1px solid;font-size: 14px;color: #333333;border-width: 1px;border-color: #666666;border-collapse: collapse;}\n" +
|
||||
" table th {border-width: 1px;padding: 8px;border-style: solid;border-color: #666666;background-color: #dedede;text-align: right;}\n" +
|
||||
" table td {border-width: 1px;padding: 8px;border-style: solid;border-color: #666666;background-color: #ffffff;text-align: right;}\n" +
|
||||
" </style>\n" +
|
||||
" </head>\n" +
|
||||
" <body style=\"margin:0;padding:0\">\n" +
|
||||
" <table border=\"1px\" cellpadding=\"5px\" cellspacing=\"-10px\">\n" +
|
||||
"<thead><tr><th>mysql service name</th><th>mysql address</th><th>port</th><th>no index of number</th><th>database client connections</th></tr></thead>\n" +
|
||||
"<tr><td>mysql200</td><td>192.168.xx.xx</td><td>3306</td><td>80</td><td>190</td></tr><tr><td>mysql210</td><td>192.168.xx.xx</td><td>3306</td><td>10</td><td>90</td></tr> </table>\n" +
|
||||
" </body>\n" +
|
||||
"</html>";
|
||||
}
|
||||
|
||||
private String generateMockTextTypeResultByHand(){
|
||||
|
||||
return "<html>\n" +
|
||||
" <head>\n" +
|
||||
" <title>dolphinscheduler</title>\n" +
|
||||
" <meta name='Keywords' content=''>\n" +
|
||||
" <meta name='Description' content=''>\n" +
|
||||
" <style type=\"text/css\">\n" +
|
||||
" table {margin-top:0px;padding-top:0px;border:1px solid;font-size: 14px;color: #333333;border-width: 1px;border-color: #666666;border-collapse: collapse;}\n" +
|
||||
" table th {border-width: 1px;padding: 8px;border-style: solid;border-color: #666666;background-color: #dedede;text-align: right;}\n" +
|
||||
" table td {border-width: 1px;padding: 8px;border-style: solid;border-color: #666666;background-color: #ffffff;text-align: right;}\n" +
|
||||
" </style>\n" +
|
||||
" </head>\n" +
|
||||
" <body style=\"margin:0;padding:0\">\n" +
|
||||
" <table border=\"1px\" cellpadding=\"5px\" cellspacing=\"-10px\">\n" +
|
||||
"<tr><td>{\"mysql service name\":\"mysql200\",\"mysql address\":\"192.168.xx.xx\",\"database client connections\":\"190\",\"port\":\"3306\",\"no index of number\":\"80\"}</td></tr><tr><td>{\"mysql service name\":\"mysql210\",\"mysql address\":\"192.168.xx.xx\",\"database client connections\":\"90\",\"port\":\"3306\",\"no index of number\":\"10\"}</td></tr> </table>\n" +
|
||||
" </body>\n" +
|
||||
"</html>";
|
||||
}
|
||||
}
|
@ -23,21 +23,11 @@ import org.apache.dolphinscheduler.dao.AlertDao;
|
||||
import org.apache.dolphinscheduler.dao.DaoFactory;
|
||||
import org.apache.dolphinscheduler.dao.entity.Alert;
|
||||
import org.apache.dolphinscheduler.dao.entity.User;
|
||||
import freemarker.cache.StringTemplateLoader;
|
||||
import freemarker.template.Configuration;
|
||||
import freemarker.template.Template;
|
||||
import freemarker.template.TemplateException;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.util.ResourceUtils;
|
||||
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.StringWriter;
|
||||
import java.util.*;
|
||||
|
||||
|
||||
@ -48,8 +38,8 @@ public class MailUtilsTest {
|
||||
private static final Logger logger = LoggerFactory.getLogger(MailUtilsTest.class);
|
||||
@Test
|
||||
public void testSendMails() {
|
||||
String[] receivers = new String[]{"xxx@qq.com"};
|
||||
String[] receiversCc = new String[]{"xxx@qq.com"};
|
||||
String[] receivers = new String[]{"347801120@qq.com"};
|
||||
String[] receiversCc = new String[]{"347801120@qq.com"};
|
||||
|
||||
String content ="[\"id:69\"," +
|
||||
"\"name:UserBehavior-0--1193959466\"," +
|
||||
@ -114,7 +104,7 @@ public class MailUtilsTest {
|
||||
|
||||
@Test
|
||||
public void testSendTableMail(){
|
||||
String[] mails = new String[]{"825193156@qq.com"};
|
||||
String[] mails = new String[]{"347801120@qq.com"};
|
||||
Alert alert = new Alert();
|
||||
alert.setTitle("Mysql Exception");
|
||||
alert.setShowType(ShowType.TABLE);
|
||||
@ -194,39 +184,4 @@ public class MailUtilsTest {
|
||||
MailUtils.sendMails(Arrays.asList(mails),"gaojing",alert.getContent(),ShowType.TABLEATTACHMENT);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void template(){
|
||||
Template MAIL_TEMPLATE;
|
||||
Configuration cfg = new Configuration(Configuration.VERSION_2_3_21);
|
||||
cfg.setDefaultEncoding(Constants.UTF_8);
|
||||
StringTemplateLoader stringTemplateLoader = new StringTemplateLoader();
|
||||
cfg.setTemplateLoader(stringTemplateLoader);
|
||||
InputStreamReader isr = null;
|
||||
try {
|
||||
isr = new InputStreamReader(new FileInputStream(ResourceUtils.getFile(Constants.CLASSPATH_MAIL_TEMPLATES_ALERT_MAIL_TEMPLATE_FTL)),
|
||||
Constants.UTF_8);
|
||||
|
||||
MAIL_TEMPLATE = new Template("alert_mail_template", isr, cfg);
|
||||
} catch (Exception e) {
|
||||
MAIL_TEMPLATE = null;
|
||||
} finally {
|
||||
IOUtils.closeQuietly(isr);
|
||||
}
|
||||
|
||||
|
||||
StringWriter out = new StringWriter();
|
||||
Map<String,String> map = new HashMap<>();
|
||||
map.put(Constants.TITLE,"title_test");
|
||||
try {
|
||||
MAIL_TEMPLATE.process(map, out);
|
||||
logger.info(out.toString());
|
||||
|
||||
} catch (TemplateException e) {
|
||||
logger.error(e.getMessage(),e);
|
||||
} catch (IOException e) {
|
||||
logger.error(e.getMessage(),e);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
2
pom.xml
2
pom.xml
@ -703,6 +703,8 @@
|
||||
<include>**/dao/mapper/AlertGroupMapperTest.java</include>
|
||||
<include>**/dao/mapper/AlertMapperTest.java</include>
|
||||
<include>**/dao/mapper/CommandMapperTest.java</include>
|
||||
<include>**/alert/template/AlertTemplateFactoryTest.java</include>
|
||||
<include>**/alert/template/impl/DefaultHTMLTemplateTest.java</include>
|
||||
</includes>
|
||||
<!-- <skip>true</skip> -->
|
||||
</configuration>
|
||||
|
Loading…
Reference in New Issue
Block a user