|
|
|
@ -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; |
|
|
|
|