Browse Source

Merge remote-tracking branch 'upstream/dev' into spilit

pull/3/MERGE
lenboo 4 years ago
parent
commit
1d72a43680
  1. 2
      dolphinscheduler-alert-plugin/dolphinscheduler-alert-dingtalk/src/main/java/org/apache/dolphinscheduler/plugin/alert/dingtalk/DingTalkParamsConstants.java
  2. 2
      dolphinscheduler-alert-plugin/dolphinscheduler-alert-dingtalk/src/main/java/org/apache/dolphinscheduler/plugin/alert/dingtalk/DingTalkSender.java
  3. 4
      dolphinscheduler-alert-plugin/dolphinscheduler-alert-email/src/main/java/org/apache/dolphinscheduler/plugin/alert/email/EmailConstants.java
  4. 15
      dolphinscheduler-alert-plugin/dolphinscheduler-alert-email/src/main/java/org/apache/dolphinscheduler/plugin/alert/email/ExcelUtils.java
  5. 2
      dolphinscheduler-alert-plugin/dolphinscheduler-alert-email/src/main/java/org/apache/dolphinscheduler/plugin/alert/email/MailParamsConstants.java
  6. 74
      dolphinscheduler-alert-plugin/dolphinscheduler-alert-email/src/main/java/org/apache/dolphinscheduler/plugin/alert/email/MailSender.java
  7. 40
      dolphinscheduler-alert-plugin/dolphinscheduler-alert-email/src/main/java/org/apache/dolphinscheduler/plugin/alert/email/exception/AlertEmailException.java
  8. 11
      dolphinscheduler-alert-plugin/dolphinscheduler-alert-email/src/main/java/org/apache/dolphinscheduler/plugin/alert/email/template/DefaultHTMLTemplate.java
  9. 2
      dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/OSUtils.java
  10. 2
      dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/ScriptParamsConstants.java
  11. 4
      dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/StreamGobbler.java
  12. 4
      dolphinscheduler-alert-plugin/dolphinscheduler-alert-wechat/src/main/java/org/apache/dolphinscheduler/plugin/alert/wechat/WeChatAlertConstants.java
  13. 3
      dolphinscheduler-alert-plugin/dolphinscheduler-alert-wechat/src/main/java/org/apache/dolphinscheduler/plugin/alert/wechat/WeChatAlertParamsConstants.java
  14. 47
      dolphinscheduler-alert-plugin/dolphinscheduler-alert-wechat/src/main/java/org/apache/dolphinscheduler/plugin/alert/wechat/WeChatSender.java
  15. 30
      dolphinscheduler-alert-plugin/dolphinscheduler-alert-wechat/src/main/java/org/apache/dolphinscheduler/plugin/alert/wechat/exception/WeChatAlertException.java
  16. 6
      dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/CollectionUtils.java
  17. 2
      dolphinscheduler-dist/release-docs/LICENSE
  18. 12
      dolphinscheduler-spi/src/main/java/org/apache/dolphinscheduler/spi/utils/JSONUtils.java
  19. 1
      dolphinscheduler-ui/src/js/conf/home/pages/projects/pages/definition/pages/list/_source/list.vue
  20. 3
      dolphinscheduler-ui/src/js/conf/home/pages/projects/pages/instance/pages/list/_source/list.vue
  21. 1
      dolphinscheduler-ui/src/js/conf/home/pages/projects/pages/instance/pages/list/index.vue
  22. 4
      dolphinscheduler-ui/src/js/conf/home/pages/security/pages/queue/_source/createQueue.vue
  23. 4
      dolphinscheduler-ui/src/js/conf/home/pages/security/pages/tenement/_source/createTenement.vue
  24. 4
      dolphinscheduler-ui/src/js/conf/home/pages/security/pages/users/_source/createUser.vue
  25. 3
      dolphinscheduler-ui/src/js/conf/home/pages/security/pages/users/_source/list.vue
  26. 8
      dolphinscheduler-ui/src/js/conf/home/pages/user/pages/token/_source/createToken.vue
  27. 5
      dolphinscheduler-ui/src/js/conf/home/router/index.js
  28. 8
      dolphinscheduler-ui/src/js/module/util/routerUtil.js
  29. 2
      pom.xml
  30. 111
      sql/upgrade/1.4.0_schema/mysql/dolphinscheduler_ddl.sql
  31. 96
      sql/upgrade/1.4.0_schema/postgresql/dolphinscheduler_ddl.sql
  32. 2
      tools/dependencies/known-dependencies.txt

2
dolphinscheduler-alert-plugin/dolphinscheduler-alert-dingtalk/src/main/java/org/apache/dolphinscheduler/plugin/alert/dingtalk/DingTalkParamsConstants.java

@ -22,7 +22,7 @@ package org.apache.dolphinscheduler.plugin.alert.dingtalk;
*/ */
public class DingTalkParamsConstants { public class DingTalkParamsConstants {
public DingTalkParamsConstants() { private DingTalkParamsConstants() {
throw new IllegalStateException("Utility class"); throw new IllegalStateException("Utility class");
} }

2
dolphinscheduler-alert-plugin/dolphinscheduler-alert-dingtalk/src/main/java/org/apache/dolphinscheduler/plugin/alert/dingtalk/DingTalkSender.java

@ -113,7 +113,7 @@ public class DingTalkSender {
} finally { } finally {
response.close(); response.close();
} }
logger.info("Ding Talk send [ %s ], resp:{%s}", msg, resp); logger.info("Ding Talk send {}, resp: {}", msg, resp);
return resp; return resp;
} finally { } finally {
httpClient.close(); httpClient.close();

4
dolphinscheduler-alert-plugin/dolphinscheduler-alert-email/src/main/java/org/apache/dolphinscheduler/plugin/alert/email/EmailConstants.java

@ -19,6 +19,10 @@ package org.apache.dolphinscheduler.plugin.alert.email;
public class EmailConstants { public class EmailConstants {
private EmailConstants() {
throw new IllegalStateException(EmailConstants.class.getName());
}
public static final String XLS_FILE_PATH = "xls.file.path"; public static final String XLS_FILE_PATH = "xls.file.path";

15
dolphinscheduler-alert-plugin/dolphinscheduler-alert-email/src/main/java/org/apache/dolphinscheduler/plugin/alert/email/ExcelUtils.java

@ -17,6 +17,7 @@
package org.apache.dolphinscheduler.plugin.alert.email; package org.apache.dolphinscheduler.plugin.alert.email;
import org.apache.dolphinscheduler.plugin.alert.email.exception.AlertEmailException;
import org.apache.dolphinscheduler.spi.utils.JSONUtils; import org.apache.dolphinscheduler.spi.utils.JSONUtils;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
@ -31,7 +32,6 @@ import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -44,7 +44,7 @@ import org.slf4j.LoggerFactory;
*/ */
public class ExcelUtils { public class ExcelUtils {
public ExcelUtils() { private ExcelUtils() {
throw new IllegalStateException("Utility class"); throw new IllegalStateException("Utility class");
} }
@ -65,16 +65,14 @@ public class ExcelUtils {
if (CollectionUtils.isEmpty(itemsList)) { if (CollectionUtils.isEmpty(itemsList)) {
logger.error("itemsList is null"); logger.error("itemsList is null");
throw new RuntimeException("itemsList is null"); throw new AlertEmailException("itemsList is null");
} }
LinkedHashMap<String, Object> headerMap = itemsList.get(0); LinkedHashMap<String, Object> headerMap = itemsList.get(0);
List<String> headerList = new ArrayList<>(); List<String> headerList = new ArrayList<>();
Iterator<Map.Entry<String, Object>> iter = headerMap.entrySet().iterator(); for (Map.Entry<String, Object> en : headerMap.entrySet()) {
while (iter.hasNext()) {
Map.Entry<String, Object> en = iter.next();
headerList.add(en.getKey()); headerList.add(en.getKey());
} }
@ -130,8 +128,7 @@ public class ExcelUtils {
wb.write(fos); wb.write(fos);
} catch (Exception e) { } catch (Exception e) {
logger.error("generate excel error", e); throw new AlertEmailException("generate excel error", e);
throw new RuntimeException("generate excel error", e);
} finally { } finally {
if (wb != null) { if (wb != null) {
try { try {
@ -150,4 +147,4 @@ public class ExcelUtils {
} }
} }
} }

2
dolphinscheduler-alert-plugin/dolphinscheduler-alert-email/src/main/java/org/apache/dolphinscheduler/plugin/alert/email/MailParamsConstants.java

@ -22,7 +22,7 @@ package org.apache.dolphinscheduler.plugin.alert.email;
*/ */
public class MailParamsConstants { public class MailParamsConstants {
public MailParamsConstants() { private MailParamsConstants() {
throw new IllegalStateException("Utility class"); throw new IllegalStateException("Utility class");
} }

74
dolphinscheduler-alert-plugin/dolphinscheduler-alert-email/src/main/java/org/apache/dolphinscheduler/plugin/alert/email/MailSender.java

@ -19,6 +19,7 @@ package org.apache.dolphinscheduler.plugin.alert.email;
import static java.util.Objects.requireNonNull; import static java.util.Objects.requireNonNull;
import org.apache.dolphinscheduler.plugin.alert.email.exception.AlertEmailException;
import org.apache.dolphinscheduler.plugin.alert.email.template.AlertTemplate; import org.apache.dolphinscheduler.plugin.alert.email.template.AlertTemplate;
import org.apache.dolphinscheduler.plugin.alert.email.template.DefaultHTMLTemplate; import org.apache.dolphinscheduler.plugin.alert.email.template.DefaultHTMLTemplate;
import org.apache.dolphinscheduler.spi.alert.AlertConstants; import org.apache.dolphinscheduler.spi.alert.AlertConstants;
@ -67,7 +68,7 @@ public class MailSender {
private String mailProtocol = "SMTP"; private String mailProtocol = "SMTP";
private String mailSmtpHost; private String mailSmtpHost;
private String mailSmtpPort; private String mailSmtpPort;
private String mailSender; private String mailSenderEmail;
private String enableSmtpAuth; private String enableSmtpAuth;
private String mailUser; private String mailUser;
private String mailPasswd; private String mailPasswd;
@ -77,12 +78,13 @@ public class MailSender {
private String sslTrust; private String sslTrust;
private String showType; private String showType;
private AlertTemplate alertTemplate; private AlertTemplate alertTemplate;
private String mustNotNull = "must not be null";
public MailSender(Map<String, String> config) { public MailSender(Map<String, String> config) {
String receiversConfig = config.get(MailParamsConstants.NAME_PLUGIN_DEFAULT_EMAIL_RECEIVERS); String receiversConfig = config.get(MailParamsConstants.NAME_PLUGIN_DEFAULT_EMAIL_RECEIVERS);
if (receiversConfig == null || "".equals(receiversConfig)) { if (receiversConfig == null || "".equals(receiversConfig)) {
throw new RuntimeException(MailParamsConstants.PLUGIN_DEFAULT_EMAIL_RECEIVERS + "must not be null"); throw new AlertEmailException(MailParamsConstants.PLUGIN_DEFAULT_EMAIL_RECEIVERS + mustNotNull);
} }
receivers = Arrays.asList(receiversConfig.split(",")); receivers = Arrays.asList(receiversConfig.split(","));
@ -95,33 +97,33 @@ public class MailSender {
} }
mailSmtpHost = config.get(MailParamsConstants.NAME_MAIL_SMTP_HOST); mailSmtpHost = config.get(MailParamsConstants.NAME_MAIL_SMTP_HOST);
requireNonNull(mailSmtpHost, MailParamsConstants.MAIL_SMTP_HOST + " must not null"); requireNonNull(mailSmtpHost, MailParamsConstants.MAIL_SMTP_HOST + mustNotNull);
mailSmtpPort = config.get(MailParamsConstants.NAME_MAIL_SMTP_PORT); mailSmtpPort = config.get(MailParamsConstants.NAME_MAIL_SMTP_PORT);
requireNonNull(mailSmtpPort, MailParamsConstants.MAIL_SMTP_PORT + " must not null"); requireNonNull(mailSmtpPort, MailParamsConstants.MAIL_SMTP_PORT + mustNotNull);
mailSender = config.get(MailParamsConstants.NAME_MAIL_SENDER); mailSenderEmail = config.get(MailParamsConstants.NAME_MAIL_SENDER);
requireNonNull(mailSender, MailParamsConstants.MAIL_SENDER + " must not null"); requireNonNull(mailSenderEmail, MailParamsConstants.MAIL_SENDER + mustNotNull);
enableSmtpAuth = config.get(MailParamsConstants.NAME_MAIL_SMTP_AUTH); enableSmtpAuth = config.get(MailParamsConstants.NAME_MAIL_SMTP_AUTH);
mailUser = config.get(MailParamsConstants.NAME_MAIL_USER); mailUser = config.get(MailParamsConstants.NAME_MAIL_USER);
requireNonNull(mailUser, MailParamsConstants.MAIL_USER + " must not null"); requireNonNull(mailUser, MailParamsConstants.MAIL_USER + mustNotNull);
mailPasswd = config.get(MailParamsConstants.NAME_MAIL_PASSWD); mailPasswd = config.get(MailParamsConstants.NAME_MAIL_PASSWD);
requireNonNull(mailPasswd, MailParamsConstants.MAIL_PASSWD + " must not null"); requireNonNull(mailPasswd, MailParamsConstants.MAIL_PASSWD + mustNotNull);
mailUseStartTLS = config.get(MailParamsConstants.NAME_MAIL_SMTP_STARTTLS_ENABLE); mailUseStartTLS = config.get(MailParamsConstants.NAME_MAIL_SMTP_STARTTLS_ENABLE);
requireNonNull(mailUseStartTLS, MailParamsConstants.MAIL_SMTP_STARTTLS_ENABLE + " must not null"); requireNonNull(mailUseStartTLS, MailParamsConstants.MAIL_SMTP_STARTTLS_ENABLE + mustNotNull);
mailUseSSL = config.get(MailParamsConstants.NAME_MAIL_SMTP_SSL_ENABLE); mailUseSSL = config.get(MailParamsConstants.NAME_MAIL_SMTP_SSL_ENABLE);
requireNonNull(mailUseSSL, MailParamsConstants.MAIL_SMTP_SSL_ENABLE + " must not null"); requireNonNull(mailUseSSL, MailParamsConstants.MAIL_SMTP_SSL_ENABLE + mustNotNull);
sslTrust = config.get(MailParamsConstants.NAME_MAIL_SMTP_SSL_TRUST); sslTrust = config.get(MailParamsConstants.NAME_MAIL_SMTP_SSL_TRUST);
requireNonNull(sslTrust, MailParamsConstants.MAIL_SMTP_SSL_TRUST + " must not null"); requireNonNull(sslTrust, MailParamsConstants.MAIL_SMTP_SSL_TRUST + mustNotNull);
showType = config.get(AlertConstants.SHOW_TYPE); showType = config.get(AlertConstants.SHOW_TYPE);
requireNonNull(showType, AlertConstants.SHOW_TYPE + " must not null"); requireNonNull(showType, AlertConstants.SHOW_TYPE + mustNotNull);
xlsFilePath = config.get(EmailConstants.XLS_FILE_PATH); xlsFilePath = config.get(EmailConstants.XLS_FILE_PATH);
if (StringUtils.isBlank(xlsFilePath)) { if (StringUtils.isBlank(xlsFilePath)) {
@ -134,9 +136,8 @@ public class MailSender {
/** /**
* send mail to receivers * send mail to receivers
* *
* @param title title * @param title title
* @param content content * @param content content
* @return
*/ */
public AlertResult sendMails(String title, String content) { public AlertResult sendMails(String title, String content) {
return sendMails(this.receivers, this.receiverCcs, title, content); return sendMails(this.receivers, this.receiverCcs, title, content);
@ -145,9 +146,8 @@ public class MailSender {
/** /**
* send mail to receivers * send mail to receivers
* *
* @param title email title * @param title email title
* @param content email content * @param content email content
* @return
*/ */
public AlertResult sendMailsToReceiverOnly(String title, String content) { public AlertResult sendMailsToReceiverOnly(String title, String content) {
return sendMails(this.receivers, null, title, content); return sendMails(this.receivers, null, title, content);
@ -156,11 +156,10 @@ public class MailSender {
/** /**
* send mail * send mail
* *
* @param receivers receivers * @param receivers receivers
* @param receiverCcs receiverCcs * @param receiverCcs receiverCcs
* @param title title * @param title title
* @param content content * @param content content
* @return
*/ */
public AlertResult sendMails(List<String> receivers, List<String> receiverCcs, String title, String content) { public AlertResult sendMails(List<String> receivers, List<String> receiverCcs, String title, String content) {
AlertResult alertResult = new AlertResult(); AlertResult alertResult = new AlertResult();
@ -180,7 +179,7 @@ public class MailSender {
try { try {
Session session = getSession(); Session session = getSession();
email.setMailSession(session); email.setMailSession(session);
email.setFrom(mailSender); email.setFrom(mailSenderEmail);
email.setCharset(EmailConstants.UTF_8); email.setCharset(EmailConstants.UTF_8);
if (CollectionUtils.isNotEmpty(receivers)) { if (CollectionUtils.isNotEmpty(receivers)) {
// receivers mail // receivers mail
@ -251,11 +250,6 @@ public class MailSender {
/** /**
* send mail as Excel attachment * send mail as Excel attachment
*
* @param title
* @param content
* @param partContent
* @throws Exception
*/ */
private void attachment(String title, String content, String partContent) throws Exception { private void attachment(String title, String content, String partContent) throws Exception {
MimeMessage msg = getMimeMessage(); MimeMessage msg = getMimeMessage();
@ -265,9 +259,6 @@ public class MailSender {
/** /**
* get MimeMessage * get MimeMessage
*
* @return
* @throws MessagingException
*/ */
private MimeMessage getMimeMessage() throws MessagingException { private MimeMessage getMimeMessage() throws MessagingException {
@ -279,7 +270,7 @@ public class MailSender {
// 2. creating mail: Creating a MimeMessage // 2. creating mail: Creating a MimeMessage
MimeMessage msg = new MimeMessage(session); MimeMessage msg = new MimeMessage(session);
// 3. set sender // 3. set sender
msg.setFrom(new InternetAddress(mailSender)); msg.setFrom(new InternetAddress(mailSenderEmail));
// 4. set receivers // 4. set receivers
for (String receiver : receivers) { for (String receiver : receivers) {
msg.addRecipients(Message.RecipientType.TO, InternetAddress.parse(receiver)); msg.addRecipients(Message.RecipientType.TO, InternetAddress.parse(receiver));
@ -317,16 +308,9 @@ public class MailSender {
/** /**
* attach content * attach content
*
* @param title
* @param content
* @param partContent
* @param msg
* @throws MessagingException
* @throws IOException
*/ */
private void attachContent(String title, String content, String partContent, MimeMessage msg) throws MessagingException, IOException { private void attachContent(String title, String content, String partContent, MimeMessage msg) throws MessagingException, IOException {
/** /*
* set receiverCc * set receiverCc
*/ */
if (CollectionUtils.isNotEmpty(receiverCcs)) { if (CollectionUtils.isNotEmpty(receiverCcs)) {
@ -365,21 +349,14 @@ public class MailSender {
/** /**
* the string object map * the string object map
*
* @param title
* @param content
* @param alertResult
* @param email
* @return
* @throws EmailException
*/ */
private AlertResult getStringObjectMap(String title, String content, AlertResult alertResult, HtmlEmail email) throws EmailException { private AlertResult getStringObjectMap(String title, String content, AlertResult alertResult, HtmlEmail email) throws EmailException {
/** /*
* the subject of the message to be sent * the subject of the message to be sent
*/ */
email.setSubject(title); email.setSubject(title);
/** /*
* to send information, you can use HTML tags in mail content because of the use of HtmlEmail * to send information, you can use HTML tags in mail content because of the use of HtmlEmail
*/ */
if (showType.equals(ShowType.TABLE.getDescp())) { if (showType.equals(ShowType.TABLE.getDescp())) {
@ -417,9 +394,6 @@ public class MailSender {
/** /**
* handle exception * handle exception
*
* @param alertResult
* @param e
*/ */
private void handleException(AlertResult alertResult, Exception e) { private void handleException(AlertResult alertResult, Exception e) {
logger.error("Send email to {} failed", receivers, e); logger.error("Send email to {} failed", receivers, e);

40
dolphinscheduler-alert-plugin/dolphinscheduler-alert-email/src/main/java/org/apache/dolphinscheduler/plugin/alert/email/exception/AlertEmailException.java

@ -0,0 +1,40 @@
/*
* 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.plugin.alert.email.exception;
public class AlertEmailException extends RuntimeException {
/**
* Create Runtime exception
*
* @param errMsg - Error message
*/
public AlertEmailException(String errMsg) {
super(errMsg);
}
/**
* Create Runtime exception
*
* @param errMsg - Error message
* @param cause - cause
*/
public AlertEmailException(String errMsg, Throwable cause) {
super(errMsg, cause);
}
}

11
dolphinscheduler-alert-plugin/dolphinscheduler-alert-email/src/main/java/org/apache/dolphinscheduler/plugin/alert/email/template/DefaultHTMLTemplate.java

@ -50,7 +50,7 @@ public class DefaultHTMLTemplate implements AlertTemplate {
case TABLE: case TABLE:
return getTableTypeMessage(content, showAll); return getTableTypeMessage(content, showAll);
case TEXT: case TEXT:
return getTextTypeMessage(content, showAll); return getTextTypeMessage(content);
default: 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));
} }
@ -77,7 +77,7 @@ public class DefaultHTMLTemplate implements AlertTemplate {
boolean flag = true; boolean flag = true;
String title = ""; String title = "";
for (LinkedHashMap mapItems : mapItemsList) { for (LinkedHashMap<String, Object> mapItems : mapItemsList) {
Set<Map.Entry<String, Object>> entries = mapItems.entrySet(); Set<Map.Entry<String, Object>> entries = mapItems.entrySet();
@ -111,10 +111,9 @@ public class DefaultHTMLTemplate implements AlertTemplate {
* get alert message which type is TEXT * get alert message which type is TEXT
* *
* @param content message content * @param content message content
* @param showAll weather to show all
* @return alert message * @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); ArrayNode list = JSONUtils.parseArray(content);
@ -135,14 +134,14 @@ public class DefaultHTMLTemplate implements AlertTemplate {
/** /**
* get alert message from a html template * get alert message from a html template
* *
* @param title message title * @param title message title
* @param content message content * @param content message content
* @return alert message which use html template * @return alert message which use html template
*/ */
private String getMessageFromHtmlTemplate(String title, String content) { private String getMessageFromHtmlTemplate(String title, String content) {
requireNonNull(content, "content must not null"); requireNonNull(content, "content must not null");
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 EmailConstants.HTML_HEADER_PREFIX + htmlTableThead + content + EmailConstants.TABLE_BODY_HTML_TAIL; return EmailConstants.HTML_HEADER_PREFIX + htmlTableThead + content + EmailConstants.TABLE_BODY_HTML_TAIL;
} }

2
dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/OSUtils.java

@ -22,7 +22,7 @@ package org.apache.dolphinscheduler.plugin.alert.script;
*/ */
public class OSUtils { public class OSUtils {
public OSUtils() { private OSUtils() {
throw new UnsupportedOperationException("Construct OSUtils"); throw new UnsupportedOperationException("Construct OSUtils");
} }

2
dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/ScriptParamsConstants.java

@ -22,7 +22,7 @@ package org.apache.dolphinscheduler.plugin.alert.script;
*/ */
public class ScriptParamsConstants { public class ScriptParamsConstants {
public ScriptParamsConstants() { private ScriptParamsConstants() {
throw new IllegalStateException("Utility class"); throw new IllegalStateException("Utility class");
} }

4
dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/StreamGobbler.java

@ -51,11 +51,11 @@ public class StreamGobbler extends Thread {
output.append(System.getProperty("line.separator")); output.append(System.getProperty("line.separator"));
} }
if (output.length() > 0) { if (output.length() > 0) {
logger.info("out put msg is{}",output.toString()); logger.info("out put msg is{}", output);
} }
} catch (IOException e) { } catch (IOException e) {
logger.error("I/O error occurs {}", e.getMessage()); logger.error("I/O error occurs {}", e.getMessage());
} }
} }
} }

4
dolphinscheduler-alert-plugin/dolphinscheduler-alert-wechat/src/main/java/org/apache/dolphinscheduler/plugin/alert/wechat/WeChatAlertConstants.java

@ -22,6 +22,10 @@ package org.apache.dolphinscheduler.plugin.alert.wechat;
*/ */
public class WeChatAlertConstants { public class WeChatAlertConstants {
private WeChatAlertConstants() {
throw new IllegalStateException(WeChatAlertConstants.class.getName());
}
static final String MARKDOWN_QUOTE = ">"; static final String MARKDOWN_QUOTE = ">";
static final String MARKDOWN_ENTER = "\n"; static final String MARKDOWN_ENTER = "\n";

3
dolphinscheduler-alert-plugin/dolphinscheduler-alert-wechat/src/main/java/org/apache/dolphinscheduler/plugin/alert/wechat/WeChatAlertParamsConstants.java

@ -22,6 +22,9 @@ package org.apache.dolphinscheduler.plugin.alert.wechat;
*/ */
public class WeChatAlertParamsConstants { public class WeChatAlertParamsConstants {
private WeChatAlertParamsConstants() {
throw new IllegalStateException(WeChatAlertParamsConstants.class.getName());
}
static final String ENTERPRISE_WE_CHAT_CORP_ID = "corp.id"; static final String ENTERPRISE_WE_CHAT_CORP_ID = "corp.id";

47
dolphinscheduler-alert-plugin/dolphinscheduler-alert-wechat/src/main/java/org/apache/dolphinscheduler/plugin/alert/wechat/WeChatSender.java

@ -19,6 +19,7 @@ package org.apache.dolphinscheduler.plugin.alert.wechat;
import static java.util.Objects.requireNonNull; import static java.util.Objects.requireNonNull;
import org.apache.dolphinscheduler.plugin.alert.wechat.exception.WeChatAlertException;
import org.apache.dolphinscheduler.spi.alert.AlertConstants; import org.apache.dolphinscheduler.spi.alert.AlertConstants;
import org.apache.dolphinscheduler.spi.alert.AlertResult; import org.apache.dolphinscheduler.spi.alert.AlertResult;
import org.apache.dolphinscheduler.spi.alert.ShowType; import org.apache.dolphinscheduler.spi.alert.ShowType;
@ -59,8 +60,6 @@ public class WeChatSender {
private String weChatUsers; private String weChatUsers;
private String weChatTeamSendMsg;
private String weChatUserSendMsg; private String weChatUserSendMsg;
private String weChatTokenUrlReplace; private String weChatTokenUrlReplace;
@ -70,14 +69,14 @@ public class WeChatSender {
private String showType; private String showType;
private static final String agentIdRegExp = "{agentId}"; private static final String MUST_NOT_NULL = " must not null";
private static final String msgRegExp = "{msg}"; private static final String ALERT_STATUS = "false";
private static final String userRegExp = "{toUser}"; private static final String AGENT_ID_REG_EXP = "{agentId}";
private static final String corpIdRegex = "{corpId}"; private static final String MSG_REG_EXP = "{msg}";
private static final String secretRegex = "{secret}"; private static final String USER_REG_EXP = "{toUser}";
private static final String toPartyRegex = "{toParty}"; private static final String CORP_ID_REGEX = "{corpId}";
private static final String toUserRegex = "{toUser}"; private static final String SECRET_REGEX = "{secret}";
private static final String tokenRegex = "{token}"; private static final String TOKEN_REGEX = "{token}";
WeChatSender(Map<String, String> config) { WeChatSender(Map<String, String> config) {
weChatAgentId = config.get(WeChatAlertParamsConstants.NAME_ENTERPRISE_WE_CHAT_AGENT_ID); weChatAgentId = config.get(WeChatAlertParamsConstants.NAME_ENTERPRISE_WE_CHAT_AGENT_ID);
@ -85,13 +84,12 @@ public class WeChatSender {
String weChatCorpId = config.get(WeChatAlertParamsConstants.NAME_ENTERPRISE_WE_CHAT_CORP_ID); String weChatCorpId = config.get(WeChatAlertParamsConstants.NAME_ENTERPRISE_WE_CHAT_CORP_ID);
String weChatSecret = config.get(WeChatAlertParamsConstants.NAME_ENTERPRISE_WE_CHAT_SECRET); String weChatSecret = config.get(WeChatAlertParamsConstants.NAME_ENTERPRISE_WE_CHAT_SECRET);
String weChatTokenUrl = WeChatAlertConstants.WE_CHAT_TOKEN_URL; String weChatTokenUrl = WeChatAlertConstants.WE_CHAT_TOKEN_URL;
weChatTeamSendMsg = config.get(WeChatAlertParamsConstants.NAME_ENTERPRISE_WE_CHAT_TEAM_SEND_MSG);
weChatUserSendMsg = config.get(WeChatAlertParamsConstants.NAME_ENTERPRISE_WE_CHAT_USER_SEND_MSG); weChatUserSendMsg = config.get(WeChatAlertParamsConstants.NAME_ENTERPRISE_WE_CHAT_USER_SEND_MSG);
showType = config.get(AlertConstants.SHOW_TYPE); showType = config.get(AlertConstants.SHOW_TYPE);
requireNonNull(showType, AlertConstants.SHOW_TYPE + " must not null"); requireNonNull(showType, AlertConstants.SHOW_TYPE + MUST_NOT_NULL);
weChatTokenUrlReplace = weChatTokenUrl weChatTokenUrlReplace = weChatTokenUrl
.replace(corpIdRegex, weChatCorpId) .replace(CORP_ID_REGEX, weChatCorpId)
.replace(secretRegex, weChatSecret); .replace(SECRET_REGEX, weChatSecret);
weChatToken = getToken(); weChatToken = getToken();
} }
@ -105,16 +103,15 @@ public class WeChatSender {
*/ */
private String makeUserSendMsg(Collection<String> toUser, String agentId, String msg) { private String makeUserSendMsg(Collection<String> toUser, String agentId, String msg) {
String listUser = mkString(toUser); String listUser = mkString(toUser);
return weChatUserSendMsg.replace(userRegExp, listUser) return weChatUserSendMsg.replace(USER_REG_EXP, listUser)
.replace(agentIdRegExp, agentId) .replace(AGENT_ID_REG_EXP, agentId)
.replace(msgRegExp, msg); .replace(MSG_REG_EXP, msg);
} }
/** /**
* send Enterprise WeChat * send Enterprise WeChat
* *
* @return Enterprise WeChat resp, demo: {"errcode":0,"errmsg":"ok","invaliduser":""} * @return Enterprise WeChat resp, demo: {"errcode":0,"errmsg":"ok","invaliduser":""}
* @throws Exception the Exception
*/ */
public AlertResult sendEnterpriseWeChat(String title, String content) { public AlertResult sendEnterpriseWeChat(String title, String content) {
AlertResult alertResult; AlertResult alertResult;
@ -124,10 +121,10 @@ public class WeChatSender {
if (null == weChatToken) { if (null == weChatToken) {
alertResult = new AlertResult(); alertResult = new AlertResult();
alertResult.setMessage("send we chat alert fail,get weChat token error"); alertResult.setMessage("send we chat alert fail,get weChat token error");
alertResult.setStatus("false"); alertResult.setStatus(ALERT_STATUS);
return alertResult; return alertResult;
} }
String enterpriseWeChatPushUrlReplace = WeChatAlertConstants.WE_CHAT_PUSH_URL.replace(tokenRegex, weChatToken); String enterpriseWeChatPushUrlReplace = WeChatAlertConstants.WE_CHAT_PUSH_URL.replace(TOKEN_REGEX, weChatToken);
try { try {
return checkWeChatSendMsgResult(post(enterpriseWeChatPushUrlReplace, msg)); return checkWeChatSendMsgResult(post(enterpriseWeChatPushUrlReplace, msg));
@ -135,7 +132,7 @@ public class WeChatSender {
logger.info("send we chat alert msg exception : {}", e.getMessage()); logger.info("send we chat alert msg exception : {}", e.getMessage());
alertResult = new AlertResult(); alertResult = new AlertResult();
alertResult.setMessage("send we chat alert fail"); alertResult.setMessage("send we chat alert fail");
alertResult.setStatus("false"); alertResult.setStatus(ALERT_STATUS);
} }
return alertResult; return alertResult;
} }
@ -170,7 +167,7 @@ public class WeChatSender {
List<LinkedHashMap> mapItemsList = JSONUtils.toList(content, LinkedHashMap.class); List<LinkedHashMap> mapItemsList = JSONUtils.toList(content, LinkedHashMap.class);
if (null == mapItemsList || mapItemsList.isEmpty()) { if (null == mapItemsList || mapItemsList.isEmpty()) {
logger.error("itemsList is null"); logger.error("itemsList is null");
throw new RuntimeException("itemsList is null"); throw new WeChatAlertException("itemsList is null");
} }
StringBuilder contents = new StringBuilder(200); StringBuilder contents = new StringBuilder(200);
for (LinkedHashMap mapItems : mapItemsList) { for (LinkedHashMap mapItems : mapItemsList) {
@ -259,7 +256,7 @@ public class WeChatSender {
EntityUtils.consume(entity); EntityUtils.consume(entity);
} }
HashMap map = JSONUtils.parseObject(resp, HashMap.class); HashMap<String, Object> map = JSONUtils.parseObject(resp, HashMap.class);
if (map != null && null != map.get("access_token")) { if (map != null && null != map.get("access_token")) {
return map.get("access_token").toString(); return map.get("access_token").toString();
} else { } else {
@ -310,7 +307,7 @@ public class WeChatSender {
private static AlertResult checkWeChatSendMsgResult(String result) { private static AlertResult checkWeChatSendMsgResult(String result) {
AlertResult alertResult = new AlertResult(); AlertResult alertResult = new AlertResult();
alertResult.setStatus("false"); alertResult.setStatus(ALERT_STATUS);
if (null == result) { if (null == result) {
alertResult.setMessage("we chat send fail"); alertResult.setMessage("we chat send fail");
@ -328,7 +325,7 @@ public class WeChatSender {
alertResult.setMessage("we chat alert send success"); alertResult.setMessage("we chat alert send success");
return alertResult; return alertResult;
} }
alertResult.setStatus("false"); alertResult.setStatus(ALERT_STATUS);
alertResult.setMessage(sendMsgResponse.getErrmsg()); alertResult.setMessage(sendMsgResponse.getErrmsg());
return alertResult; return alertResult;
} }

30
dolphinscheduler-alert-plugin/dolphinscheduler-alert-wechat/src/main/java/org/apache/dolphinscheduler/plugin/alert/wechat/exception/WeChatAlertException.java

@ -0,0 +1,30 @@
/*
* 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.plugin.alert.wechat.exception;
public class WeChatAlertException extends RuntimeException {
/**
* Create Runtime Exception
*
* @param errMsg - Error message
*/
public WeChatAlertException(String errMsg) {
super(errMsg);
}
}

6
dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/CollectionUtils.java

@ -263,13 +263,13 @@ public class CollectionUtils {
} }
Map<String, Object> instanceMap; Map<String, Object> instanceMap;
for (T instance : originList) { for (T instance : originList) {
Map<String, Object> dataMap = new BeanMap(instance); BeanMap beanMap = new BeanMap(instance);
instanceMap = new LinkedHashMap<>(16, 0.75f, true); instanceMap = new LinkedHashMap<>(16, 0.75f, true);
for (Map.Entry<String, Object> entry : dataMap.entrySet()) { for (Map.Entry<Object, Object> entry : beanMap.entrySet()) {
if (exclusionSet.contains(entry.getKey())) { if (exclusionSet.contains(entry.getKey())) {
continue; continue;
} }
instanceMap.put(entry.getKey(), entry.getValue()); instanceMap.put((String) entry.getKey(), entry.getValue());
} }
instanceList.add(instanceMap); instanceList.add(instanceMap);
} }

2
dolphinscheduler-dist/release-docs/LICENSE vendored

@ -227,7 +227,7 @@ The text of each license is also included at licenses/LICENSE-[project].txt.
byte-buddy 1.9.10: https://mvnrepository.com/artifact/net.bytebuddy/byte-buddy/1.9.10, Apache 2.0 byte-buddy 1.9.10: https://mvnrepository.com/artifact/net.bytebuddy/byte-buddy/1.9.10, Apache 2.0
classmate 1.4.0: https://mvnrepository.com/artifact/com.fasterxml/classmate/1.4.0, Apache 2.0 classmate 1.4.0: https://mvnrepository.com/artifact/com.fasterxml/classmate/1.4.0, Apache 2.0
clickhouse-jdbc 0.1.52: https://mvnrepository.com/artifact/ru.yandex.clickhouse/clickhouse-jdbc/0.1.52, Apache 2.0 clickhouse-jdbc 0.1.52: https://mvnrepository.com/artifact/ru.yandex.clickhouse/clickhouse-jdbc/0.1.52, Apache 2.0
commons-beanutils 1.7.0 https://mvnrepository.com/artifact/commons-beanutils/commons-beanutils/1.7.0, Apache 2.0 commons-beanutils 1.9.4 https://mvnrepository.com/artifact/commons-beanutils/commons-beanutils/1.9.4, Apache 2.0
commons-cli 1.2: https://mvnrepository.com/artifact/commons-cli/commons-cli/1.2, Apache 2.0 commons-cli 1.2: https://mvnrepository.com/artifact/commons-cli/commons-cli/1.2, Apache 2.0
commons-codec 1.11: https://mvnrepository.com/artifact/commons-codec/commons-codec/1.11, Apache 2.0 commons-codec 1.11: https://mvnrepository.com/artifact/commons-codec/commons-codec/1.11, Apache 2.0
commons-collections 3.2.2: https://mvnrepository.com/artifact/commons-collections/commons-collections/3.2.2, Apache 2.0 commons-collections 3.2.2: https://mvnrepository.com/artifact/commons-collections/commons-collections/3.2.2, Apache 2.0

12
dolphinscheduler-spi/src/main/java/org/apache/dolphinscheduler/spi/utils/JSONUtils.java

@ -58,7 +58,7 @@ public class JSONUtils {
/** /**
* json representation of object * json representation of object
* *
* @param object object * @param object object
* @param feature feature * @param feature feature
* @return object to json string * @return object to json string
*/ */
@ -81,9 +81,9 @@ public class JSONUtils {
* the fields of the specified object are generics, just the object itself should not be a * the fields of the specified object are generics, just the object itself should not be a
* generic type. * generic type.
* *
* @param json the string from which the object is to be deserialized * @param json the string from which the object is to be deserialized
* @param clazz the class of T * @param clazz the class of T
* @param <T> T * @param <T> T
* @return an object of type T from the string * @return an object of type T from the string
* classOfT * classOfT
*/ */
@ -103,9 +103,9 @@ public class JSONUtils {
/** /**
* json to list * json to list
* *
* @param json json string * @param json json string
* @param clazz class * @param clazz class
* @param <T> T * @param <T> T
* @return list * @return list
*/ */
public static <T> List<T> toList(String json, Class<T> clazz) { public static <T> List<T> toList(String json, Class<T> clazz) {
@ -153,4 +153,4 @@ public class JSONUtils {
throw new RuntimeException("Json deserialization exception.", e); throw new RuntimeException("Json deserialization exception.", e);
} }
} }
} }

1
dolphinscheduler-ui/src/js/conf/home/pages/projects/pages/definition/pages/list/_source/list.vue

@ -84,7 +84,6 @@
<el-button type="primary" size="mini" icon="el-icon-date" :disabled="scope.row.releaseState !== 'ONLINE'" @click="_timingManage(scope.row)" circle></el-button> <el-button type="primary" size="mini" icon="el-icon-date" :disabled="scope.row.releaseState !== 'ONLINE'" @click="_timingManage(scope.row)" circle></el-button>
</el-tooltip> </el-tooltip>
<el-tooltip :content="$t('delete')" placement="top" :enterable="false"> <el-tooltip :content="$t('delete')" placement="top" :enterable="false">
<el-button type="danger" size="mini" icon="el-icon-delete" circle></el-button>
<el-popconfirm <el-popconfirm
:confirmButtonText="$t('Confirm')" :confirmButtonText="$t('Confirm')"
:cancelButtonText="$t('Cancel')" :cancelButtonText="$t('Cancel')"

3
dolphinscheduler-ui/src/js/conf/home/pages/projects/pages/instance/pages/list/_source/list.vue

@ -84,7 +84,6 @@
<span><el-button type="error" size="mini" :icon="scope.row.state === 'PAUSE' ? 'el-icon-video-play' : 'el-icon-video-pause'" :disabled="scope.row.state !== 'RUNNING_EXECUTION' && scope.row.state !== 'PAUSE'" @click="_suspend(scope.row,scope.$index)" circle></el-button></span> <span><el-button type="error" size="mini" :icon="scope.row.state === 'PAUSE' ? 'el-icon-video-play' : 'el-icon-video-pause'" :disabled="scope.row.state !== 'RUNNING_EXECUTION' && scope.row.state !== 'PAUSE'" @click="_suspend(scope.row,scope.$index)" circle></el-button></span>
</el-tooltip> </el-tooltip>
<el-tooltip :content="$t('delete')" placement="top" :enterable="false"> <el-tooltip :content="$t('delete')" placement="top" :enterable="false">
<el-button type="danger" size="mini" icon="el-icon-delete" circle></el-button>
<el-popconfirm <el-popconfirm
:confirmButtonText="$t('Confirm')" :confirmButtonText="$t('Confirm')"
:cancelButtonText="$t('Cancel')" :cancelButtonText="$t('Cancel')"
@ -92,7 +91,7 @@
iconColor="red" iconColor="red"
:title="$t('Delete?')" :title="$t('Delete?')"
@onConfirm="_delete(scope.row,scope.row.id)"> @onConfirm="_delete(scope.row,scope.row.id)">
<el-button type="danger" size="mini" icon="el-icon-delete" :disabled="scope.row.releaseState === 'ONLINE'" circle slot="reference"></el-button> <el-button type="danger" size="mini" icon="el-icon-delete" :disabled="scope.row.state !== 'SUCCESS' && scope.row.state !== 'FAILURE' && scope.row.state !== 'STOP' && scope.row.state !== 'PAUSE'" circle slot="reference"></el-button>
</el-popconfirm> </el-popconfirm>
</el-tooltip> </el-tooltip>
<el-tooltip :content="$t('Gantt')" placement="top" :enterable="false"> <el-tooltip :content="$t('Gantt')" placement="top" :enterable="false">

1
dolphinscheduler-ui/src/js/conf/home/pages/projects/pages/instance/pages/list/index.vue

@ -95,6 +95,7 @@
* Query * Query
*/ */
_onQuery (o) { _onQuery (o) {
this.searchParams.pageNo = 1
this.searchParams = _.assign(this.searchParams, o) this.searchParams = _.assign(this.searchParams, o)
setUrlParams(this.searchParams) setUrlParams(this.searchParams)
this._debounceGET() this._debounceGET()

4
dolphinscheduler-ui/src/js/conf/home/pages/security/pages/queue/_source/createQueue.vue

@ -88,9 +88,7 @@
let $then = (res) => { let $then = (res) => {
this.$emit('onUpdate') this.$emit('onUpdate')
this.$message.success(res.msg) this.$message.success(res.msg)
setTimeout(() => { this.$refs.popover.spinnerLoading = false
this.$refs.popover.spinnerLoading = false
}, 800)
} }
let $catch = (e) => { let $catch = (e) => {

4
dolphinscheduler-ui/src/js/conf/home/pages/security/pages/tenement/_source/createTenement.vue

@ -144,9 +144,7 @@
this.store.dispatch(`security/${this.item ? 'updateQueue' : 'createQueue'}`, param).then(res => { this.store.dispatch(`security/${this.item ? 'updateQueue' : 'createQueue'}`, param).then(res => {
this.$emit('onUpdate') this.$emit('onUpdate')
this.$message.success(res.msg) this.$message.success(res.msg)
setTimeout(() => { this.$refs.popover.spinnerLoading = false
this.$refs.popover.spinnerLoading = false
}, 800)
}).catch(e => { }).catch(e => {
this.$message.error(e.msg || '') this.$message.error(e.msg || '')
this.$refs.popover.spinnerLoading = false this.$refs.popover.spinnerLoading = false

4
dolphinscheduler-ui/src/js/conf/home/pages/security/pages/users/_source/createUser.vue

@ -268,9 +268,7 @@
} }
this.store.dispatch(`security/${this.item ? 'updateUser' : 'createUser'}`, param).then(res => { this.store.dispatch(`security/${this.item ? 'updateUser' : 'createUser'}`, param).then(res => {
setTimeout(() => { this.$refs.popover.spinnerLoading = false
this.$refs.popover.spinnerLoading = false
}, 800)
this.$emit('onUpdate', param) this.$emit('onUpdate', param)
this.$message.success(res.msg) this.$message.success(res.msg)
}).catch(e => { }).catch(e => {

3
dolphinscheduler-ui/src/js/conf/home/pages/security/pages/users/_source/list.vue

@ -81,18 +81,21 @@
</el-table> </el-table>
</div> </div>
<el-dialog <el-dialog
v-if="authProjectDialog"
:visible.sync="authProjectDialog" :visible.sync="authProjectDialog"
width="auto"> width="auto">
<m-transfer :transferData="transferData" @onUpdateAuthProject="onUpdateAuthProject" @closeAuthProject="closeAuthProject"></m-transfer> <m-transfer :transferData="transferData" @onUpdateAuthProject="onUpdateAuthProject" @closeAuthProject="closeAuthProject"></m-transfer>
</el-dialog> </el-dialog>
<el-dialog <el-dialog
v-if="authDataSourceDialog"
:visible.sync="authDataSourceDialog" :visible.sync="authDataSourceDialog"
width="auto"> width="auto">
<m-transfer :transferData="transferData" @onUpdateAuthDataSource="onUpdateAuthDataSource" @closeAuthDataSource="closeAuthDataSource"></m-transfer> <m-transfer :transferData="transferData" @onUpdateAuthDataSource="onUpdateAuthDataSource" @closeAuthDataSource="closeAuthDataSource"></m-transfer>
</el-dialog> </el-dialog>
<el-dialog <el-dialog
v-if="authUdfFuncDialog"
:visible.sync="authUdfFuncDialog" :visible.sync="authUdfFuncDialog"
width="auto"> width="auto">
<m-transfer :transferData="transferData" @onUpdateAuthUdfFunc="onUpdateAuthUdfFunc" @closeAuthUdfFunc="closeAuthUdfFunc"></m-transfer> <m-transfer :transferData="transferData" @onUpdateAuthUdfFunc="onUpdateAuthUdfFunc" @closeAuthUdfFunc="closeAuthUdfFunc"></m-transfer>

8
dolphinscheduler-ui/src/js/conf/home/pages/user/pages/token/_source/createToken.vue

@ -119,16 +119,14 @@
if (this.item) { if (this.item) {
param.id = this.item.id param.id = this.item.id
} }
this.$refs.popup.spinnerLoading = true this.$refs.popover.spinnerLoading = true
this.store.dispatch(`user/${this.item ? 'updateToken' : 'createToken'}`, param).then(res => { this.store.dispatch(`user/${this.item ? 'updateToken' : 'createToken'}`, param).then(res => {
this.$emit('onUpdate') this.$emit('onUpdate')
this.$message.success(res.msg) this.$message.success(res.msg)
setTimeout(() => { this.$refs.popover.spinnerLoading = false
this.$refs.popup.spinnerLoading = false
}, 800)
}).catch(e => { }).catch(e => {
this.$message.error(e.msg || '') this.$message.error(e.msg || '')
this.$refs.popup.spinnerLoading = false this.$refs.popover.spinnerLoading = false
}) })
}, },
_generateToken () { _generateToken () {

5
dolphinscheduler-ui/src/js/conf/home/router/index.js

@ -558,6 +558,11 @@ const router = new Router({
] ]
}) })
const VueRouterPush = Router.prototype.push
Router.prototype.push = function push (to) {
return VueRouterPush.call(this, to).catch(err => err)
}
router.beforeEach((to, from, next) => { router.beforeEach((to, from, next) => {
const $body = $('body') const $body = $('body')
$body.find('.tooltip.fade.top.in').remove() $body.find('.tooltip.fade.top.in').remove()

8
dolphinscheduler-ui/src/js/module/util/routerUtil.js

@ -14,9 +14,11 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
import merge from 'webpack-merge'
import router from '@/conf/home/router'
export function setUrlParams (o) { export function setUrlParams (o) {
// router.push({ router.push({
// query: merge(router.history.current.query, o) query: merge(router.history.current.query, o)
// }) })
} }

2
pom.xml

@ -81,7 +81,7 @@
<slf4j.log4j12.version>1.7.5</slf4j.log4j12.version> <slf4j.log4j12.version>1.7.5</slf4j.log4j12.version>
<commons.collections.version>3.2.2</commons.collections.version> <commons.collections.version>3.2.2</commons.collections.version>
<commons.httpclient>3.0.1</commons.httpclient> <commons.httpclient>3.0.1</commons.httpclient>
<commons.beanutils.version>1.7.0</commons.beanutils.version> <commons.beanutils.version>1.9.4</commons.beanutils.version>
<commons.configuration.version>1.10</commons.configuration.version> <commons.configuration.version>1.10</commons.configuration.version>
<commons.email.version>1.5</commons.email.version> <commons.email.version>1.5</commons.email.version>
<poi.version>3.17</poi.version> <poi.version>3.17</poi.version>

111
sql/upgrade/1.4.0_schema/mysql/dolphinscheduler_ddl.sql

@ -16,6 +16,10 @@
*/ */
SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
-- ----------------------------
-- Table structure for t_ds_plugin_define
-- ----------------------------
DROP TABLE IF EXISTS `t_ds_plugin_define`; DROP TABLE IF EXISTS `t_ds_plugin_define`;
CREATE TABLE `t_ds_plugin_define` ( CREATE TABLE `t_ds_plugin_define` (
`id` int NOT NULL AUTO_INCREMENT, `id` int NOT NULL AUTO_INCREMENT,
@ -28,6 +32,13 @@ CREATE TABLE `t_ds_plugin_define` (
UNIQUE KEY `t_ds_plugin_define_UN` (`plugin_name`,`plugin_type`) UNIQUE KEY `t_ds_plugin_define_UN` (`plugin_name`,`plugin_type`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of t_ds_plugin_define
-- ----------------------------
-- ----------------------------
-- Table structure for t_ds_alert_plugin_instance
-- ----------------------------
DROP TABLE IF EXISTS `t_ds_alert_plugin_instance`; DROP TABLE IF EXISTS `t_ds_alert_plugin_instance`;
CREATE TABLE `t_ds_alert_plugin_instance` ( CREATE TABLE `t_ds_alert_plugin_instance` (
`id` int NOT NULL AUTO_INCREMENT, `id` int NOT NULL AUTO_INCREMENT,
@ -39,31 +50,101 @@ CREATE TABLE `t_ds_alert_plugin_instance` (
PRIMARY KEY (`id`) PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE t_ds_process_definition -- ----------------------------
ADD COLUMN `warning_group_id` int(11) DEFAULT NULL COMMENT 'alert group id' AFTER `connects`; -- Records of t_ds_alert_plugin_instance
-- ----------------------------
-- uc_dolphin_T_t_ds_process_definition_A_warning_group_id
drop PROCEDURE if EXISTS uc_dolphin_T_t_ds_process_definition_A_warning_group_id;
delimiter d//
CREATE PROCEDURE uc_dolphin_T_t_ds_process_definition_A_warning_group_id()
BEGIN
IF NOT EXISTS (SELECT 1 FROM information_schema.COLUMNS
WHERE TABLE_NAME='t_ds_process_definition'
AND TABLE_SCHEMA=(SELECT DATABASE())
AND COLUMN_NAME ='warning_group_id')
THEN
ALTER TABLE t_ds_process_definition ADD COLUMN `warning_group_id` int(11) DEFAULT NULL COMMENT 'alert group id' AFTER `connects`;
END IF;
END;
ALTER TABLE t_ds_process_definition_version d//
ADD COLUMN `warning_group_id` int(11) DEFAULT NULL COMMENT 'alert group id' AFTER `connects`;
ALTER TABLE t_ds_alertgroup delimiter ;
ADD COLUMN `alert_instance_ids` varchar (255) DEFAULT NULL COMMENT 'alert instance ids' AFTER `id`, CALL uc_dolphin_T_t_ds_process_definition_A_warning_group_id();
ADD COLUMN `create_user_id` int(11) DEFAULT NULL COMMENT 'create user id' AFTER `alert_instance_ids`; DROP PROCEDURE uc_dolphin_T_t_ds_process_definition_A_warning_group_id;
-- uc_dolphin_T_t_ds_process_definition_version_A_warning_group_id
drop PROCEDURE if EXISTS uc_dolphin_T_t_ds_process_definition_version_A_warning_group_id;
delimiter d//
CREATE PROCEDURE uc_dolphin_T_t_ds_process_definition_version_A_warning_group_id()
BEGIN
IF NOT EXISTS (SELECT 1 FROM information_schema.COLUMNS
WHERE TABLE_NAME='t_ds_process_definition_version'
AND TABLE_SCHEMA=(SELECT DATABASE())
AND COLUMN_NAME ='warning_group_id')
THEN
ALTER TABLE t_ds_process_definition_version ADD COLUMN `warning_group_id` int(11) DEFAULT NULL COMMENT 'alert group id' AFTER `connects`;
END IF;
END;
d//
delimiter ;
CALL uc_dolphin_T_t_ds_process_definition_version_A_warning_group_id();
DROP PROCEDURE uc_dolphin_T_t_ds_process_definition_version_A_warning_group_id;
-- uc_dolphin_T_t_ds_alertgroup_A_alert_instance_ids
drop PROCEDURE if EXISTS uc_dolphin_T_t_ds_alertgroup_A_alert_instance_ids;
delimiter d//
CREATE PROCEDURE uc_dolphin_T_t_ds_alertgroup_A_alert_instance_ids()
BEGIN
IF NOT EXISTS (SELECT 1 FROM information_schema.COLUMNS
WHERE TABLE_NAME='t_ds_alertgroup'
AND TABLE_SCHEMA=(SELECT DATABASE())
AND COLUMN_NAME ='alert_instance_ids')
THEN
ALTER TABLE t_ds_alertgroup ADD COLUMN `alert_instance_ids` varchar (255) DEFAULT NULL COMMENT 'alert instance ids' AFTER `id`;
END IF;
END;
d//
delimiter ;
CALL uc_dolphin_T_t_ds_alertgroup_A_alert_instance_ids();
DROP PROCEDURE uc_dolphin_T_t_ds_alertgroup_A_alert_instance_ids;
-- uc_dolphin_T_t_ds_alertgroup_A_create_user_id
drop PROCEDURE if EXISTS uc_dolphin_T_t_ds_alertgroup_A_create_user_id;
delimiter d//
CREATE PROCEDURE uc_dolphin_T_t_ds_alertgroup_A_create_user_id()
BEGIN
IF NOT EXISTS (SELECT 1 FROM information_schema.COLUMNS
WHERE TABLE_NAME='t_ds_alertgroup'
AND TABLE_SCHEMA=(SELECT DATABASE())
AND COLUMN_NAME ='create_user_id')
THEN
ALTER TABLE t_ds_alertgroup ADD COLUMN `create_user_id` int(11) DEFAULT NULL COMMENT 'create user id' AFTER `alert_instance_ids`;
END IF;
END;
d//
delimiter ;
CALL uc_dolphin_T_t_ds_alertgroup_A_create_user_id();
DROP PROCEDURE uc_dolphin_T_t_ds_alertgroup_A_create_user_id;
-- ---------------------------- -- ----------------------------
-- These columns will not be used in the new version,if you determine that the historical data is useless, you can delete it using the sql below -- These columns will not be used in the new version,if you determine that the historical data is useless, you can delete it using the sql below
-- ---------------------------- -- ----------------------------
/*
ALTER TABLE t_ds_process_definition DROP receivers, DROP receivers_cc;
ALTER TABLE t_ds_process_definition_version DROP receivers, DROP receivers_cc; -- ALTER TABLE t_ds_process_definition DROP receivers, DROP receivers_cc;
ALTER TABLE t_ds_alert DROP show_type,DROP alert_type,DROP receivers,DROP receivers_cc; -- ALTER TABLE t_ds_process_definition_version DROP receivers, DROP receivers_cc;
ALTER TABLE t_ds_alertgroup DROP group_type; -- ALTER TABLE t_ds_alert DROP show_type,DROP alert_type,DROP receivers,DROP receivers_cc;
DROP TABLE IF EXISTS t_ds_relation_user_alertgroup;
*/
-- ALTER TABLE t_ds_alertgroup DROP group_type;
-- DROP TABLE IF EXISTS t_ds_relation_user_alertgroup;

96
sql/upgrade/1.4.0_schema/postgresql/dolphinscheduler_ddl.sql

@ -14,6 +14,10 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
-- ----------------------------
-- Table structure for t_ds_plugin_define
-- ----------------------------
DROP TABLE IF EXISTS t_ds_plugin_define; DROP TABLE IF EXISTS t_ds_plugin_define;
CREATE TABLE t_ds_plugin_define ( CREATE TABLE t_ds_plugin_define (
id serial NOT NULL, id serial NOT NULL,
@ -26,7 +30,9 @@ CREATE TABLE t_ds_plugin_define (
CONSTRAINT t_ds_plugin_define_un UNIQUE (plugin_name, plugin_type) CONSTRAINT t_ds_plugin_define_un UNIQUE (plugin_name, plugin_type)
); );
-- ----------------------------
-- Table structure for t_ds_alert_plugin_instance
-- ----------------------------
DROP TABLE IF EXISTS t_ds_alert_plugin_instance; DROP TABLE IF EXISTS t_ds_alert_plugin_instance;
CREATE TABLE t_ds_alert_plugin_instance ( CREATE TABLE t_ds_alert_plugin_instance (
id serial NOT NULL, id serial NOT NULL,
@ -38,28 +44,88 @@ CREATE TABLE t_ds_alert_plugin_instance (
CONSTRAINT t_ds_alert_plugin_instance_pk PRIMARY KEY (id) CONSTRAINT t_ds_alert_plugin_instance_pk PRIMARY KEY (id)
); );
ALTER TABLE t_ds_process_definition -- uc_dolphin_T_t_ds_process_definition_A_warning_group_id
ADD COLUMN `warning_group_id` int4 DEFAULT NULL COMMENT 'alert group id' AFTER `connects`; delimiter d//
CREATE OR REPLACE FUNCTION uc_dolphin_T_t_ds_process_definition_A_warning_group_id() RETURNS void AS $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM information_schema.COLUMNS
WHERE TABLE_NAME='t_ds_process_definition'
AND COLUMN_NAME ='warning_group_id')
THEN
ALTER TABLE t_ds_process_definition ADD COLUMN `warning_group_id` int4 DEFAULT NULL COMMENT 'alert group id' AFTER `connects`;
END IF;
END;
$$ LANGUAGE plpgsql;
d//
delimiter ;
SELECT uc_dolphin_T_t_ds_process_definition_A_warning_group_id();
DROP FUNCTION IF EXISTS uc_dolphin_T_t_ds_process_definition_A_warning_group_id();
ALTER TABLE t_ds_process_definition_version -- uc_dolphin_T_t_ds_process_definition_version_A_warning_group_id
ADD COLUMN `warning_group_id` int4 DEFAULT NULL COMMENT 'alert group id' AFTER `connects`; delimiter d//
CREATE OR REPLACE FUNCTION uc_dolphin_T_t_ds_process_definition_version_A_warning_group_id() RETURNS void AS $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM information_schema.COLUMNS
WHERE TABLE_NAME='t_ds_process_definition_version'
AND COLUMN_NAME ='warning_group_id')
THEN
ALTER TABLE t_ds_process_definition_version ADD COLUMN `warning_group_id` int4 DEFAULT NULL COMMENT 'alert group id' AFTER `connects`;
END IF;
END;
$$ LANGUAGE plpgsql;
d//
ALTER TABLE t_ds_alertgroup delimiter ;
ADD COLUMN `alert_instance_ids` int4 DEFAULT NULL COMMENT 'alert instance ids' AFTER `id`; SELECT uc_dolphin_T_t_ds_process_definition_version_A_warning_group_id();
ADD COLUMN `create_user_id` varchar(255) DEFAULT NULL COMMENT 'create user id' AFTER `alert_instance_ids`, DROP FUNCTION IF EXISTS uc_dolphin_T_t_ds_process_definition_version_A_warning_group_id();
-- uc_dolphin_T_t_ds_alertgroup_A_alert_instance_ids
delimiter d//
CREATE OR REPLACE FUNCTION uc_dolphin_T_t_ds_alertgroup_A_alert_instance_ids() RETURNS void AS $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM information_schema.COLUMNS
WHERE TABLE_NAME='t_ds_alertgroup'
AND COLUMN_NAME ='alert_instance_ids')
THEN
ALTER TABLE t_ds_alertgroup ADD COLUMN `alert_instance_ids` varchar (255) DEFAULT NULL COMMENT 'alert instance ids' AFTER `id`;
END IF;
END;
$$ LANGUAGE plpgsql;
d//
delimiter ;
SELECT uc_dolphin_T_t_ds_alertgroup_A_alert_instance_ids();
DROP FUNCTION IF EXISTS uc_dolphin_T_t_ds_alertgroup_A_alert_instance_ids();
-- uc_dolphin_T_t_ds_alertgroup_A_create_user_id
delimiter d//
CREATE OR REPLACE FUNCTION uc_dolphin_T_t_ds_alertgroup_A_create_user_id() RETURNS void AS $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM information_schema.COLUMNS
WHERE TABLE_NAME='t_ds_alertgroup'
AND COLUMN_NAME ='create_user_id')
THEN
ALTER TABLE t_ds_alertgroup ADD COLUMN `create_user_id` int4 DEFAULT NULL COMMENT 'create user id' AFTER `alert_instance_ids`;
END IF;
END;
$$ LANGUAGE plpgsql;
d//
delimiter ;
SELECT uc_dolphin_T_t_ds_alertgroup_A_create_user_id();
DROP FUNCTION IF EXISTS uc_dolphin_T_t_ds_alertgroup_A_create_user_id();
-- ---------------------------- -- ----------------------------
-- These columns will not be used in the new version,if you determine that the historical data is useless, you can delete it using the sql below -- These columns will not be used in the new version,if you determine that the historical data is useless, you can delete it using the sql below
-- ---------------------------- -- ----------------------------
/*
ALTER TABLE t_ds_process_definition DROP COLUMN "receivers", DROP COLUMN "receivers_cc";
ALTER TABLE t_ds_process_definition_version DROP COLUMN "receivers", DROP COLUMN "receivers_cc"; -- ALTER TABLE t_ds_process_definition DROP COLUMN "receivers", DROP COLUMN "receivers_cc";
ALTER TABLE t_ds_alert DROP COLUMN "show_type",DROP COLUMN "alert_type",DROP COLUMN "receivers",DROP COLUMN "receivers_cc"; -- ALTER TABLE t_ds_process_definition_version DROP COLUMN "receivers", DROP COLUMN "receivers_cc";
ALTER TABLE t_ds_alertgroup DROP COLUMN "group_type"; -- ALTER TABLE t_ds_alert DROP COLUMN "show_type",DROP COLUMN "alert_type",DROP COLUMN "receivers",DROP COLUMN "receivers_cc";
DROP TABLE IF EXISTS t_ds_relation_user_alertgroup; -- ALTER TABLE t_ds_alertgroup DROP COLUMN "group_type";
*/
-- DROP TABLE IF EXISTS t_ds_relation_user_alertgroup;

2
tools/dependencies/known-dependencies.txt

@ -24,7 +24,7 @@ commons-compress-1.4.1.jar
commons-compiler-3.0.16.jar commons-compiler-3.0.16.jar
commons-configuration-1.10.jar commons-configuration-1.10.jar
commons-daemon-1.0.13.jar commons-daemon-1.0.13.jar
commons-beanutils-1.7.0.jar commons-beanutils-1.9.4.jar
commons-dbcp-1.4.jar commons-dbcp-1.4.jar
commons-httpclient-3.0.1.jar commons-httpclient-3.0.1.jar
commons-io-2.4.jar commons-io-2.4.jar

Loading…
Cancel
Save