";
public static final String TD = "";
diff --git a/dolphinscheduler-alert/src/main/java/org/apache/dolphinscheduler/alert/utils/MailUtils.java b/dolphinscheduler-alert/src/main/java/org/apache/dolphinscheduler/alert/utils/MailUtils.java
index b7634fe567..8bc8c35171 100644
--- a/dolphinscheduler-alert/src/main/java/org/apache/dolphinscheduler/alert/utils/MailUtils.java
+++ b/dolphinscheduler-alert/src/main/java/org/apache/dolphinscheduler/alert/utils/MailUtils.java
@@ -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 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> entries = mapItems.entrySet();
-
- Iterator> iterator = entries.iterator();
-
- StringBuilder t = new StringBuilder(Constants.TR);
- StringBuilder cs = new StringBuilder(Constants.TR);
- while (iterator.hasNext()){
-
- Map.Entry 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 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 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;
- }
-}
+}
\ No newline at end of file
diff --git a/dolphinscheduler-alert/src/main/resources/alert.properties b/dolphinscheduler-alert/src/main/resources/alert.properties
index 127ab5a91b..000d0653b7 100644
--- a/dolphinscheduler-alert/src/main/resources/alert.properties
+++ b/dolphinscheduler-alert/src/main/resources/alert.properties
@@ -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
diff --git a/dolphinscheduler-alert/src/main/resources/mail_templates/alert_mail_template.ftl b/dolphinscheduler-alert/src/main/resources/mail_templates/alert_mail_template.ftl
deleted file mode 100644
index 1ca9cab17e..0000000000
--- a/dolphinscheduler-alert/src/main/resources/mail_templates/alert_mail_template.ftl
+++ /dev/null
@@ -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.
--->
- dolphinscheduler<#if title??> ${title}#if><#if content??> ${content}#if>
\ No newline at end of file
diff --git a/dolphinscheduler-alert/src/test/java/org/apache/dolphinscheduler/alert/template/AlertTemplateFactoryTest.java b/dolphinscheduler-alert/src/test/java/org/apache/dolphinscheduler/alert/template/AlertTemplateFactoryTest.java
new file mode 100644
index 0000000000..6865b895e2
--- /dev/null
+++ b/dolphinscheduler-alert/src/test/java/org/apache/dolphinscheduler/alert/template/AlertTemplateFactoryTest.java
@@ -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);
+ }
+}
diff --git a/dolphinscheduler-alert/src/test/java/org/apache/dolphinscheduler/alert/template/impl/DefaultHTMLTemplateTest.java b/dolphinscheduler-alert/src/test/java/org/apache/dolphinscheduler/alert/template/impl/DefaultHTMLTemplateTest.java
new file mode 100644
index 0000000000..58609c07cb
--- /dev/null
+++ b/dolphinscheduler-alert/src/test/java/org/apache/dolphinscheduler/alert/template/impl/DefaultHTMLTemplateTest.java
@@ -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 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 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> 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 "\n" +
+ " \n" +
+ " dolphinscheduler\n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ "mysql service name | mysql address | port | no index of number | database client connections | \n" +
+ "mysql200 | 192.168.xx.xx | 3306 | 80 | 190 | mysql210 | 192.168.xx.xx | 3306 | 10 | 90 | \n" +
+ " \n" +
+ "";
+ }
+
+ private String generateMockTextTypeResultByHand(){
+
+ return "\n" +
+ " \n" +
+ " dolphinscheduler\n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ "{\"mysql service name\":\"mysql200\",\"mysql address\":\"192.168.xx.xx\",\"database client connections\":\"190\",\"port\":\"3306\",\"no index of number\":\"80\"} | {\"mysql service name\":\"mysql210\",\"mysql address\":\"192.168.xx.xx\",\"database client connections\":\"90\",\"port\":\"3306\",\"no index of number\":\"10\"} | \n" +
+ " \n" +
+ "";
+ }
+}
diff --git a/dolphinscheduler-alert/src/test/java/org/apache/dolphinscheduler/alert/utils/MailUtilsTest.java b/dolphinscheduler-alert/src/test/java/org/apache/dolphinscheduler/alert/utils/MailUtilsTest.java
index 96f1d9f21e..612de3e31d 100644
--- a/dolphinscheduler-alert/src/test/java/org/apache/dolphinscheduler/alert/utils/MailUtilsTest.java
+++ b/dolphinscheduler-alert/src/test/java/org/apache/dolphinscheduler/alert/utils/MailUtilsTest.java
@@ -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 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);
- }
-
- }
-
}
diff --git a/pom.xml b/pom.xml
index e1e3407982..6c1d3aa4aa 100644
--- a/pom.xml
+++ b/pom.xml
@@ -703,6 +703,8 @@
**/dao/mapper/AlertGroupMapperTest.java
**/dao/mapper/AlertMapperTest.java
**/dao/mapper/CommandMapperTest.java
+ **/alert/template/AlertTemplateFactoryTest.java
+ **/alert/template/impl/DefaultHTMLTemplateTest.java
|