|
@@ -20,9 +20,24 @@ package org.apache.dolphinscheduler.spi.plugin;
|
|
|
import static java.lang.String.format;
|
|
|
import static java.util.Objects.requireNonNull;
|
|
|
|
|
|
+import org.apache.dolphinscheduler.spi.utils.StringUtils;
|
|
|
+
|
|
|
import java.io.File;
|
|
|
+import java.nio.file.Files;
|
|
|
+import java.nio.file.Path;
|
|
|
+import java.nio.file.Paths;
|
|
|
import java.util.List;
|
|
|
|
|
|
+import javax.xml.XMLConstants;
|
|
|
+import javax.xml.parsers.DocumentBuilder;
|
|
|
+import javax.xml.parsers.DocumentBuilderFactory;
|
|
|
+
|
|
|
+import org.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
+import org.w3c.dom.Document;
|
|
|
+import org.w3c.dom.Node;
|
|
|
+import org.w3c.dom.NodeList;
|
|
|
+
|
|
|
import com.google.common.base.Splitter;
|
|
|
import com.google.common.collect.ImmutableList;
|
|
|
|
|
@@ -31,6 +46,8 @@ import com.google.common.collect.ImmutableList;
|
|
|
*/
|
|
|
public class DolphinPluginManagerConfig {
|
|
|
|
|
|
+ private static final Logger logger = LoggerFactory.getLogger(DolphinPluginManagerConfig.class);
|
|
|
+
|
|
|
/**
|
|
|
* The dir of the Alert Plugin in.
|
|
|
* When AlertServer is running on the server, it will load the Alert Plugin from this directory.
|
|
@@ -46,7 +63,8 @@ public class DolphinPluginManagerConfig {
|
|
|
/**
|
|
|
* Development, When AlertServer is running on IDE, AlertPluginLoad can load Alert Plugin from local Repository.
|
|
|
*/
|
|
|
- private String mavenLocalRepository = System.getProperty("user.home") + "/.m2/repository";
|
|
|
+ private final String defaultLocalRepository = System.getProperty("user.home") + "/.m2/repository";
|
|
|
+ private String mavenLocalRepository = getMavenLocalRepositoryOrDefault(defaultLocalRepository);
|
|
|
private List<String> mavenRemoteRepository = ImmutableList.of("http://repo1.maven.org/maven2/");
|
|
|
|
|
|
File getInstalledPluginsDir() {
|
|
@@ -107,6 +125,110 @@ public class DolphinPluginManagerConfig {
|
|
|
return mavenRemoteRepository;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Get local repository from maven settings.xml if available.
|
|
|
+ * <p>
|
|
|
+ * if System environment does not exists settings.xml, return the default value.
|
|
|
+ * </p>
|
|
|
+ *
|
|
|
+ * @param defaultRepository default repository path.
|
|
|
+ * @return local repository path.
|
|
|
+ */
|
|
|
+ private String getMavenLocalRepositoryOrDefault(String defaultRepository) {
|
|
|
+ // get 'settings.xml' from user home
|
|
|
+ Path settingsXmlPath = getMavenSettingsXmlFromUserHome();
|
|
|
+ // if user home does not exist settings.xml, get from '$MAVEN_HOME/conf/settings.xml'
|
|
|
+ if (settingsXmlPath == null) {
|
|
|
+ logger.info("User home does not exists maven settings.xml");
|
|
|
+ settingsXmlPath = getMavenSettingsXmlFromEvn();
|
|
|
+ }
|
|
|
+ // still not exist, return default repository
|
|
|
+ if (settingsXmlPath == null) {
|
|
|
+ logger.info("Maven home does not exists maven settings.xml, use default");
|
|
|
+ return defaultRepository;
|
|
|
+ }
|
|
|
+ // parse xml
|
|
|
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
|
|
|
+ DocumentBuilder documentBuilder;
|
|
|
+ try {
|
|
|
+ // security settings
|
|
|
+ try {
|
|
|
+ factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
|
|
|
+ factory.setFeature("http://xml.org/sax/features/external-general-entities", false);
|
|
|
+ factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
|
|
|
+ factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
|
|
|
+ factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");
|
|
|
+ } catch (Exception e) {
|
|
|
+ logger.warn("Error at parse settings.xml, setting security features: {}", e.getLocalizedMessage());
|
|
|
+ }
|
|
|
+ documentBuilder = factory.newDocumentBuilder();
|
|
|
+ Document document = documentBuilder.parse(settingsXmlPath.toFile());
|
|
|
+ // search node named 'localRepository'
|
|
|
+ String localRepositoryNodeTag = "localRepository";
|
|
|
+ NodeList nodeList = document.getElementsByTagName(localRepositoryNodeTag);
|
|
|
+ int length = nodeList.getLength();
|
|
|
+ if (length <= 0) {
|
|
|
+ // if node not exists, return default repository
|
|
|
+ logger.info("File {} does not contains node named {}", settingsXmlPath, localRepositoryNodeTag);
|
|
|
+ return defaultRepository;
|
|
|
+ }
|
|
|
+ for (int i = 0; i < length; i++) {
|
|
|
+ Node node = nodeList.item(i);
|
|
|
+ String content = node.getTextContent();
|
|
|
+ if (StringUtils.isNotEmpty(content) && StringUtils.isNotBlank(content)) {
|
|
|
+ Path localRepositoryPath = Paths.get(content);
|
|
|
+ if (Files.exists(localRepositoryPath)) {
|
|
|
+ logger.info("Got local repository path {}", content);
|
|
|
+ return content;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return defaultRepository;
|
|
|
+ } catch (Exception e) {
|
|
|
+ logger.error(e.getLocalizedMessage(), e);
|
|
|
+ return defaultRepository;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Get maven settings.xml file path from "${user.home}/.m2"
|
|
|
+ * <p>
|
|
|
+ * if "${user.home}/.m2/settings.xml" does not exist,
|
|
|
+ * null will be returned
|
|
|
+ * </p>
|
|
|
+ *
|
|
|
+ * @return settings.xml file path, could be null
|
|
|
+ */
|
|
|
+ private Path getMavenSettingsXmlFromUserHome() {
|
|
|
+ String userHome = System.getProperty("user.home");
|
|
|
+ Path settingsXmlPath = null;
|
|
|
+ if (!StringUtils.isEmpty(userHome)) {
|
|
|
+ settingsXmlPath = Paths.get(userHome, ".m2", "settings.xml").toAbsolutePath();
|
|
|
+ }
|
|
|
+ return settingsXmlPath;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Get maven settings.xml file path from "${MAVEN_HOME}/conf"
|
|
|
+ * <p>
|
|
|
+ * if "${MAVEN_HOME}/conf/settings.xml" does not exist,
|
|
|
+ * null will be returned
|
|
|
+ * </p>
|
|
|
+ *
|
|
|
+ * @return settings.xml file path, could be null
|
|
|
+ */
|
|
|
+ private Path getMavenSettingsXmlFromEvn() {
|
|
|
+ String mavenHome = System.getenv("MAVEN_HOME");
|
|
|
+ Path settingsXmlPath = null;
|
|
|
+ if (mavenHome == null) {
|
|
|
+ mavenHome = System.getenv("M2_HOME");
|
|
|
+ }
|
|
|
+ if (mavenHome != null) {
|
|
|
+ settingsXmlPath = Paths.get(mavenHome, "conf", "settings.xml").toAbsolutePath();
|
|
|
+ }
|
|
|
+ return settingsXmlPath;
|
|
|
+ }
|
|
|
+
|
|
|
public DolphinPluginManagerConfig setMavenRemoteRepository(List<String> mavenRemoteRepository) {
|
|
|
this.mavenRemoteRepository = mavenRemoteRepository;
|
|
|
return this;
|