From 86b0dc9b2f1b19b3e17a85d35921628fef5c71ef Mon Sep 17 00:00:00 2001 From: Michael Kemp Date: Fri, 18 Oct 2024 23:56:29 +0200 Subject: [PATCH] DCA11Y-1315: Use PAC mirrors where possible Excuse the factoring, it's got enough spaghetti for a whole 'nother generation of Eminem memes. Why? Trying to make it easy to update from upstream. If I was to refactor the existing code we're more likely to get merge-conflicts. I don't see us ever being able to upstream this change so it doesn't make sense for the diff to be optimised for that. --- frontend-maven-plugin/pom.xml | 6 ++ .../plugins/frontend/mojo/AtlassianUtil.java | 37 ++++++++++++ .../frontend/mojo/InstallNodeAndNpmMojo.java | 49 +++++++++++++-- .../frontend/mojo/InstallNodeAndPnpmMojo.java | 59 +++++++++++++++---- .../frontend/mojo/InstallNodeAndYarnMojo.java | 59 ++++++++++++++++--- .../lib/ArchiveExtractionException.java | 12 ++++ .../frontend/lib/ArchiveExtractor.java | 11 ---- .../frontend/lib/DownloadException.java | 10 ++++ .../plugins/frontend/lib/FileDownloader.java | 11 +--- .../plugins/frontend/lib/NPMInstaller.java | 3 + .../plugins/frontend/lib/NodeInstaller.java | 2 + .../maven/plugins/frontend/lib/Platform.java | 38 ++++++------ .../maven/plugins/frontend/lib/Utils.java | 9 ++- .../plugins/frontend/lib/YarnInstaller.java | 3 + 14 files changed, 243 insertions(+), 66 deletions(-) create mode 100644 frontend-maven-plugin/src/main/java/com/github/eirslett/maven/plugins/frontend/mojo/AtlassianUtil.java create mode 100644 frontend-plugin-core/src/main/java/com/github/eirslett/maven/plugins/frontend/lib/ArchiveExtractionException.java create mode 100644 frontend-plugin-core/src/main/java/com/github/eirslett/maven/plugins/frontend/lib/DownloadException.java diff --git a/frontend-maven-plugin/pom.xml b/frontend-maven-plugin/pom.xml index 210d9c0d6..6318511da 100644 --- a/frontend-maven-plugin/pom.xml +++ b/frontend-maven-plugin/pom.xml @@ -55,6 +55,12 @@ plexus-build-api 0.0.7 + + com.google.code.findbugs + jsr305 + 3.0.2 + compile + diff --git a/frontend-maven-plugin/src/main/java/com/github/eirslett/maven/plugins/frontend/mojo/AtlassianUtil.java b/frontend-maven-plugin/src/main/java/com/github/eirslett/maven/plugins/frontend/mojo/AtlassianUtil.java new file mode 100644 index 000000000..d4357163f --- /dev/null +++ b/frontend-maven-plugin/src/main/java/com/github/eirslett/maven/plugins/frontend/mojo/AtlassianUtil.java @@ -0,0 +1,37 @@ +package com.github.eirslett.maven.plugins.frontend.mojo; + +import org.apache.maven.project.MavenProject; + +import javax.annotation.Nonnull; +import javax.naming.OperationNotSupportedException; + +import static java.util.Objects.requireNonNull; + +public class AtlassianUtil { + private AtlassianUtil() throws OperationNotSupportedException { + throw new OperationNotSupportedException("my dude, this is a util class"); + } + + public static boolean isAtlassianProject(@Nonnull MavenProject mavenProject) { + requireNonNull(mavenProject, "mavenProject"); + + // Ordered by likelihood + if (containsAtlassian(mavenProject.getGroupId()) || + containsAtlassian(mavenProject.getVersion()) || // we have forks with original coordinates + containsAtlassian(mavenProject.getArtifactId())) { + return true; + } + + // I don't think I'm missing anything here for forks that have a frontend?? + // AO plugin, Greenhopper, and Ridalabs all have Atlassian group IDs now + // Please take mercy on me and don't be offended if I forgot something + + return false; + } + + private static boolean containsAtlassian(@Nonnull String string) { + requireNonNull(string, "string"); + + return string.toLowerCase().contains("atlassian"); + } +} diff --git a/frontend-maven-plugin/src/main/java/com/github/eirslett/maven/plugins/frontend/mojo/InstallNodeAndNpmMojo.java b/frontend-maven-plugin/src/main/java/com/github/eirslett/maven/plugins/frontend/mojo/InstallNodeAndNpmMojo.java index 1b9511a0b..b18bee3a9 100644 --- a/frontend-maven-plugin/src/main/java/com/github/eirslett/maven/plugins/frontend/mojo/InstallNodeAndNpmMojo.java +++ b/frontend-maven-plugin/src/main/java/com/github/eirslett/maven/plugins/frontend/mojo/InstallNodeAndNpmMojo.java @@ -1,6 +1,9 @@ package com.github.eirslett.maven.plugins.frontend.mojo; +import com.github.eirslett.maven.plugins.frontend.lib.ArchiveExtractionException; +import com.github.eirslett.maven.plugins.frontend.lib.DownloadException; import com.github.eirslett.maven.plugins.frontend.lib.FrontendPluginFactory; +import com.github.eirslett.maven.plugins.frontend.lib.InstallationException; import com.github.eirslett.maven.plugins.frontend.lib.NPMInstaller; import com.github.eirslett.maven.plugins.frontend.lib.NodeVersionDetector; import com.github.eirslett.maven.plugins.frontend.lib.NodeVersionHelper; @@ -14,7 +17,11 @@ import org.apache.maven.settings.Server; import org.apache.maven.settings.crypto.SettingsDecrypter; +import static com.github.eirslett.maven.plugins.frontend.lib.NPMInstaller.ATLASSIAN_NPM_DOWNLOAD_ROOT; +import static com.github.eirslett.maven.plugins.frontend.lib.NodeInstaller.ATLASSIAN_NODE_DOWNLOAD_ROOT; import static com.github.eirslett.maven.plugins.frontend.lib.NodeVersionHelper.getDownloadableVersion; +import static com.github.eirslett.maven.plugins.frontend.lib.Utils.isBlank; +import static com.github.eirslett.maven.plugins.frontend.mojo.AtlassianUtil.isAtlassianProject; import static java.util.Objects.isNull; @Mojo(name="install-node-and-npm", defaultPhase = LifecyclePhase.GENERATE_RESOURCES, threadSafe = true) @@ -29,7 +36,7 @@ public final class InstallNodeAndNpmMojo extends AbstractFrontendMojo { /** * Where to download NPM binary from. Defaults to https://registry.npmjs.org/npm/-/ */ - @Parameter(property = "npmDownloadRoot", required = false, defaultValue = NPMInstaller.DEFAULT_NPM_DOWNLOAD_ROOT) + @Parameter(property = "npmDownloadRoot", required = false) private String npmDownloadRoot; /** @@ -84,11 +91,6 @@ protected boolean skipExecution() { @Override public void execute(FrontendPluginFactory factory) throws Exception { - ProxyConfig proxyConfig = MojoUtils.getProxyConfig(session, decrypter); - String nodeDownloadRoot = getNodeDownloadRoot(); - String npmDownloadRoot = getNpmDownloadRoot(); - Server server = MojoUtils.decryptServer(serverId, session, decrypter); - String nodeVersion = NodeVersionDetector.getNodeVersion(workingDirectory, this.nodeVersion, this.nodeVersionFile); if (isNull(nodeVersion)) { @@ -101,6 +103,41 @@ public void execute(FrontendPluginFactory factory) throws Exception { String validNodeVersion = getDownloadableVersion(nodeVersion); + final String nodeDownloadRoot = getNodeDownloadRoot(); + final String npmDownloadRoot = getNpmDownloadRoot(); + + if (isAtlassianProject(project) && + isBlank(serverId) && + (isBlank(nodeDownloadRoot) || isBlank(npmDownloadRoot)) + ) { // If they're overridden the settings, they be the boss + getLog().info("Atlassian project detected, going to use the internal mirrors (requires VPN)"); + + serverId = "maven-atlassian-com"; + try { + install(factory, validNodeVersion, + isBlank(nodeDownloadRoot) ? ATLASSIAN_NODE_DOWNLOAD_ROOT : nodeDownloadRoot, + isBlank(npmDownloadRoot) ? ATLASSIAN_NPM_DOWNLOAD_ROOT : npmDownloadRoot); + return; + } catch (InstallationException exception) { + // Ignore as many filesystem exceptions unrelated to the mirror easily + if (!(exception.getCause() instanceof DownloadException || + exception.getCause() instanceof ArchiveExtractionException)) { + throw exception; + } + getLog().warn("Oh no couldn't use the internal mirrors! Falling back to upstream mirrors"); + getLog().debug("Using internal mirrors failed because: ", exception); + } finally { + serverId = null; + } + } + + install(factory, validNodeVersion, nodeDownloadRoot, npmDownloadRoot); + } + + private void install(FrontendPluginFactory factory, String validNodeVersion, String nodeDownloadRoot, String npmDownloadRoot) throws InstallationException { + ProxyConfig proxyConfig = MojoUtils.getProxyConfig(session, decrypter); + Server server = MojoUtils.decryptServer(serverId, session, decrypter); + if (null != server) { factory.getNodeInstaller(proxyConfig) .setNodeVersion(validNodeVersion) diff --git a/frontend-maven-plugin/src/main/java/com/github/eirslett/maven/plugins/frontend/mojo/InstallNodeAndPnpmMojo.java b/frontend-maven-plugin/src/main/java/com/github/eirslett/maven/plugins/frontend/mojo/InstallNodeAndPnpmMojo.java index bbeb1f098..866df49b1 100644 --- a/frontend-maven-plugin/src/main/java/com/github/eirslett/maven/plugins/frontend/mojo/InstallNodeAndPnpmMojo.java +++ b/frontend-maven-plugin/src/main/java/com/github/eirslett/maven/plugins/frontend/mojo/InstallNodeAndPnpmMojo.java @@ -1,6 +1,9 @@ package com.github.eirslett.maven.plugins.frontend.mojo; +import com.github.eirslett.maven.plugins.frontend.lib.ArchiveExtractionException; +import com.github.eirslett.maven.plugins.frontend.lib.DownloadException; import com.github.eirslett.maven.plugins.frontend.lib.FrontendPluginFactory; +import com.github.eirslett.maven.plugins.frontend.lib.InstallationException; import com.github.eirslett.maven.plugins.frontend.lib.NodeVersionDetector; import com.github.eirslett.maven.plugins.frontend.lib.NodeVersionHelper; import com.github.eirslett.maven.plugins.frontend.lib.PnpmInstaller; @@ -14,7 +17,11 @@ import org.apache.maven.settings.Server; import org.apache.maven.settings.crypto.SettingsDecrypter; +import static com.github.eirslett.maven.plugins.frontend.lib.NPMInstaller.ATLASSIAN_NPM_DOWNLOAD_ROOT; +import static com.github.eirslett.maven.plugins.frontend.lib.NodeInstaller.ATLASSIAN_NODE_DOWNLOAD_ROOT; import static com.github.eirslett.maven.plugins.frontend.lib.NodeVersionHelper.getDownloadableVersion; +import static com.github.eirslett.maven.plugins.frontend.lib.Utils.isBlank; +import static com.github.eirslett.maven.plugins.frontend.mojo.AtlassianUtil.isAtlassianProject; import static java.util.Objects.isNull; @Mojo(name="install-node-and-pnpm", defaultPhase = LifecyclePhase.GENERATE_RESOURCES, threadSafe = true) @@ -29,7 +36,7 @@ public final class InstallNodeAndPnpmMojo extends AbstractFrontendMojo { /** * Where to download pnpm binary from. Defaults to https://registry.npmjs.org/pnpm/-/ */ - @Parameter(property = "pnpmDownloadRoot", required = false, defaultValue = PnpmInstaller.DEFAULT_PNPM_DOWNLOAD_ROOT) + @Parameter(property = "pnpmDownloadRoot", required = false) private String pnpmDownloadRoot; /** @@ -85,16 +92,6 @@ protected boolean skipExecution() { @Override public void execute(FrontendPluginFactory factory) throws Exception { - ProxyConfig proxyConfig = MojoUtils.getProxyConfig(session, decrypter); - // Use different names to avoid confusion with fields `nodeDownloadRoot` and - // `pnpmDownloadRoot`. - // - // TODO: Remove the `downloadRoot` config (with breaking change) to simplify download root - // resolution. - String resolvedNodeDownloadRoot = getNodeDownloadRoot(); - String resolvedPnpmDownloadRoot = getPnpmDownloadRoot(); - Server server = MojoUtils.decryptServer(serverId, session, decrypter); - String nodeVersion = NodeVersionDetector.getNodeVersion(workingDirectory, this.nodeVersion, this.nodeVersionFile); if (isNull(nodeVersion)) { @@ -107,6 +104,46 @@ public void execute(FrontendPluginFactory factory) throws Exception { String validNodeVersion = getDownloadableVersion(nodeVersion); + // Use different names to avoid confusion with fields `nodeDownloadRoot` and + // `pnpmDownloadRoot`. + // + // TODO: Remove the `downloadRoot` config (with breaking change) to simplify download root + // resolution. + String resolvedNodeDownloadRoot = getNodeDownloadRoot(); + String resolvedPnpmDownloadRoot = getPnpmDownloadRoot(); + + if (isAtlassianProject(project) && + isBlank(serverId) && + (isBlank(resolvedNodeDownloadRoot) || isBlank(resolvedPnpmDownloadRoot)) + ) { // If they're overridden the settings, they be the boss + getLog().info("Atlassian project detected, going to use the internal mirrors (requires VPN)"); + + serverId = "maven-atlassian-com"; + try { + install(factory, validNodeVersion, + isBlank(resolvedNodeDownloadRoot) ? ATLASSIAN_NODE_DOWNLOAD_ROOT : resolvedNodeDownloadRoot, + isBlank(resolvedPnpmDownloadRoot) ? ATLASSIAN_NPM_DOWNLOAD_ROOT : resolvedPnpmDownloadRoot); + return; + } catch (InstallationException exception) { + // Ignore as many filesystem exceptions unrelated to the mirror easily + if (!(exception.getCause() instanceof DownloadException || + exception.getCause() instanceof ArchiveExtractionException)) { + throw exception; + } + getLog().warn("Oh no couldn't use the internal mirrors! Falling back to upstream mirrors"); + getLog().debug("Using internal mirrors failed because: ", exception); + } finally { + serverId = null; + } + } + + install(factory, validNodeVersion, resolvedNodeDownloadRoot, resolvedPnpmDownloadRoot); + } + + private void install(FrontendPluginFactory factory, String validNodeVersion, String resolvedNodeDownloadRoot, String resolvedPnpmDownloadRoot) throws InstallationException { + ProxyConfig proxyConfig = MojoUtils.getProxyConfig(session, decrypter); + Server server = MojoUtils.decryptServer(serverId, session, decrypter); + if (null != server) { factory.getNodeInstaller(proxyConfig) .setNodeVersion(validNodeVersion) diff --git a/frontend-maven-plugin/src/main/java/com/github/eirslett/maven/plugins/frontend/mojo/InstallNodeAndYarnMojo.java b/frontend-maven-plugin/src/main/java/com/github/eirslett/maven/plugins/frontend/mojo/InstallNodeAndYarnMojo.java index 7284562ce..4550e3bc2 100644 --- a/frontend-maven-plugin/src/main/java/com/github/eirslett/maven/plugins/frontend/mojo/InstallNodeAndYarnMojo.java +++ b/frontend-maven-plugin/src/main/java/com/github/eirslett/maven/plugins/frontend/mojo/InstallNodeAndYarnMojo.java @@ -1,10 +1,11 @@ package com.github.eirslett.maven.plugins.frontend.mojo; +import com.github.eirslett.maven.plugins.frontend.lib.ArchiveExtractionException; +import com.github.eirslett.maven.plugins.frontend.lib.DownloadException; import com.github.eirslett.maven.plugins.frontend.lib.FrontendPluginFactory; -import com.github.eirslett.maven.plugins.frontend.lib.NodeVersionDetector; +import com.github.eirslett.maven.plugins.frontend.lib.InstallationException; import com.github.eirslett.maven.plugins.frontend.lib.NodeVersionHelper; import com.github.eirslett.maven.plugins.frontend.lib.ProxyConfig; -import com.github.eirslett.maven.plugins.frontend.lib.YarnInstaller; import org.apache.maven.execution.MavenSession; import org.apache.maven.lifecycle.LifecycleExecutionException; import org.apache.maven.plugins.annotations.Component; @@ -14,7 +15,12 @@ import org.apache.maven.settings.Server; import org.apache.maven.settings.crypto.SettingsDecrypter; +import static com.github.eirslett.maven.plugins.frontend.lib.NodeInstaller.ATLASSIAN_NODE_DOWNLOAD_ROOT; +import static com.github.eirslett.maven.plugins.frontend.lib.NodeVersionDetector.getNodeVersion; import static com.github.eirslett.maven.plugins.frontend.lib.NodeVersionHelper.getDownloadableVersion; +import static com.github.eirslett.maven.plugins.frontend.lib.Utils.isBlank; +import static com.github.eirslett.maven.plugins.frontend.lib.YarnInstaller.ATLASSIAN_YARN_DOWNLOAD_ROOT; +import static com.github.eirslett.maven.plugins.frontend.mojo.AtlassianUtil.isAtlassianProject; import static com.github.eirslett.maven.plugins.frontend.mojo.YarnUtils.isYarnrcYamlFilePresent; import static java.util.Objects.isNull; @@ -32,8 +38,7 @@ public final class InstallNodeAndYarnMojo extends AbstractFrontendMojo { /** * Where to download Yarn binary from. Defaults to https://github.com/yarnpkg/yarn/releases/download/... */ - @Parameter(property = "yarnDownloadRoot", required = false, - defaultValue = YarnInstaller.DEFAULT_YARN_DOWNLOAD_ROOT) + @Parameter(property = "yarnDownloadRoot", required = false) private String yarnDownloadRoot; /** @@ -80,10 +85,7 @@ protected boolean skipExecution() { @Override public void execute(FrontendPluginFactory factory) throws Exception { - ProxyConfig proxyConfig = MojoUtils.getProxyConfig(this.session, this.decrypter); - Server server = MojoUtils.decryptServer(this.serverId, this.session, this.decrypter); - - String nodeVersion = NodeVersionDetector.getNodeVersion(workingDirectory, this.nodeVersion, this.nodeVersionFile); + String nodeVersion = getNodeVersion(workingDirectory, this.nodeVersion, this.nodeVersionFile); if (isNull(nodeVersion)) { throw new LifecycleExecutionException("Node version could not be detected from a file and was not set"); @@ -97,6 +99,47 @@ public void execute(FrontendPluginFactory factory) throws Exception { boolean isYarnYamlFilePresent = isYarnrcYamlFilePresent(this.session, this.workingDirectory); + if (isAtlassianProject(project) && + isBlank(serverId) && + (isBlank(nodeDownloadRoot) || isBlank(yarnDownloadRoot)) + ) { // If they're overridden the settings, they be the boss + getLog().info("Atlassian project detected, going to use the internal mirrors (requires VPN)"); + + serverId = "maven-atlassian-com"; + final String userSetYarnDownloadRoot = yarnDownloadRoot; + if (isBlank(yarnDownloadRoot)) { + yarnDownloadRoot = ATLASSIAN_YARN_DOWNLOAD_ROOT; + } + final String userSetNodeDownloadRoot = nodeDownloadRoot; + if (isBlank(nodeDownloadRoot)) { + nodeDownloadRoot = ATLASSIAN_NODE_DOWNLOAD_ROOT; + } + + try { + install(factory, validNodeVersion, isYarnYamlFilePresent); + return; + } catch (InstallationException exception) { + // Ignore as many filesystem exceptions unrelated to the mirror easily + if (!(exception.getCause() instanceof DownloadException || + exception.getCause() instanceof ArchiveExtractionException)) { + throw exception; + } + getLog().warn("Oh no couldn't use the internal mirrors! Falling back to upstream mirrors"); + getLog().debug("Using internal mirrors failed because: ", exception); + } finally { + nodeDownloadRoot = userSetNodeDownloadRoot; + yarnDownloadRoot = userSetYarnDownloadRoot; + serverId = null; + } + } + + install(factory, validNodeVersion, isYarnYamlFilePresent); + } + + private void install(FrontendPluginFactory factory, String validNodeVersion, boolean isYarnYamlFilePresent) throws InstallationException { + ProxyConfig proxyConfig = MojoUtils.getProxyConfig(this.session, this.decrypter); + Server server = MojoUtils.decryptServer(this.serverId, this.session, this.decrypter); + if (null != server) { factory.getNodeInstaller(proxyConfig).setNodeDownloadRoot(this.nodeDownloadRoot) .setNodeVersion(validNodeVersion).setPassword(server.getPassword()) diff --git a/frontend-plugin-core/src/main/java/com/github/eirslett/maven/plugins/frontend/lib/ArchiveExtractionException.java b/frontend-plugin-core/src/main/java/com/github/eirslett/maven/plugins/frontend/lib/ArchiveExtractionException.java new file mode 100644 index 000000000..f2295fe59 --- /dev/null +++ b/frontend-plugin-core/src/main/java/com/github/eirslett/maven/plugins/frontend/lib/ArchiveExtractionException.java @@ -0,0 +1,12 @@ +package com.github.eirslett.maven.plugins.frontend.lib; + +public class ArchiveExtractionException extends Exception { + + ArchiveExtractionException(String message) { + super(message); + } + + ArchiveExtractionException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/frontend-plugin-core/src/main/java/com/github/eirslett/maven/plugins/frontend/lib/ArchiveExtractor.java b/frontend-plugin-core/src/main/java/com/github/eirslett/maven/plugins/frontend/lib/ArchiveExtractor.java index ebc51f239..3a9a17ff4 100644 --- a/frontend-plugin-core/src/main/java/com/github/eirslett/maven/plugins/frontend/lib/ArchiveExtractor.java +++ b/frontend-plugin-core/src/main/java/com/github/eirslett/maven/plugins/frontend/lib/ArchiveExtractor.java @@ -24,17 +24,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -class ArchiveExtractionException extends Exception { - - ArchiveExtractionException(String message) { - super(message); - } - - ArchiveExtractionException(String message, Throwable cause) { - super(message, cause); - } -} - interface ArchiveExtractor { public void extract(String archive, String destinationDirectory) throws ArchiveExtractionException; } diff --git a/frontend-plugin-core/src/main/java/com/github/eirslett/maven/plugins/frontend/lib/DownloadException.java b/frontend-plugin-core/src/main/java/com/github/eirslett/maven/plugins/frontend/lib/DownloadException.java new file mode 100644 index 000000000..69afbc7b9 --- /dev/null +++ b/frontend-plugin-core/src/main/java/com/github/eirslett/maven/plugins/frontend/lib/DownloadException.java @@ -0,0 +1,10 @@ +package com.github.eirslett.maven.plugins.frontend.lib; + +public final class DownloadException extends Exception { + public DownloadException(String message){ + super(message); + } + DownloadException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/frontend-plugin-core/src/main/java/com/github/eirslett/maven/plugins/frontend/lib/FileDownloader.java b/frontend-plugin-core/src/main/java/com/github/eirslett/maven/plugins/frontend/lib/FileDownloader.java index 2d5244a62..4d32fb19b 100644 --- a/frontend-plugin-core/src/main/java/com/github/eirslett/maven/plugins/frontend/lib/FileDownloader.java +++ b/frontend-plugin-core/src/main/java/com/github/eirslett/maven/plugins/frontend/lib/FileDownloader.java @@ -29,15 +29,6 @@ import com.github.eirslett.maven.plugins.frontend.lib.ProxyConfig.Proxy; -final class DownloadException extends Exception { - public DownloadException(String message){ - super(message); - } - DownloadException(String message, Throwable cause) { - super(message, cause); - } -} - interface FileDownloader { void download(String downloadUrl, String destination, String userName, String password) throws DownloadException; } @@ -69,7 +60,7 @@ public void download(String downloadUrl, String destination, String userName, St if(statusCode != 200){ throw new DownloadException("Got error code "+ statusCode +" from the server."); } - + byte[] data = IOUtils.toByteArray(response.getEntity().getContent()); new File(FilenameUtils.getFullPathNoEndSeparator(destination)).mkdirs(); FileUtils.writeByteArrayToFile(new File(destination), data); diff --git a/frontend-plugin-core/src/main/java/com/github/eirslett/maven/plugins/frontend/lib/NPMInstaller.java b/frontend-plugin-core/src/main/java/com/github/eirslett/maven/plugins/frontend/lib/NPMInstaller.java index 9df7a255d..007752e4a 100644 --- a/frontend-plugin-core/src/main/java/com/github/eirslett/maven/plugins/frontend/lib/NPMInstaller.java +++ b/frontend-plugin-core/src/main/java/com/github/eirslett/maven/plugins/frontend/lib/NPMInstaller.java @@ -14,6 +14,9 @@ public class NPMInstaller { private static final String VERSION = "version"; + public static final String ATLASSIAN_NPM_DOWNLOAD_ROOT = + "https://packages.atlassian.com/artifactory/api/npm/npm-remote/npm/-/"; + public static final String DEFAULT_NPM_DOWNLOAD_ROOT = "https://registry.npmjs.org/npm/-/"; private static final Object LOCK = new Object(); diff --git a/frontend-plugin-core/src/main/java/com/github/eirslett/maven/plugins/frontend/lib/NodeInstaller.java b/frontend-plugin-core/src/main/java/com/github/eirslett/maven/plugins/frontend/lib/NodeInstaller.java index 5b5c68190..8e8e1d3f0 100644 --- a/frontend-plugin-core/src/main/java/com/github/eirslett/maven/plugins/frontend/lib/NodeInstaller.java +++ b/frontend-plugin-core/src/main/java/com/github/eirslett/maven/plugins/frontend/lib/NodeInstaller.java @@ -14,6 +14,8 @@ public class NodeInstaller { + public static final String ATLASSIAN_NODE_DOWNLOAD_ROOT = "https://packages.atlassian.com/artifactory/nodejs-dist/"; + public static final String INSTALL_PATH = "/node"; private static final Object LOCK = new Object(); diff --git a/frontend-plugin-core/src/main/java/com/github/eirslett/maven/plugins/frontend/lib/Platform.java b/frontend-plugin-core/src/main/java/com/github/eirslett/maven/plugins/frontend/lib/Platform.java index 64d088baa..81886ba70 100644 --- a/frontend-plugin-core/src/main/java/com/github/eirslett/maven/plugins/frontend/lib/Platform.java +++ b/frontend-plugin-core/src/main/java/com/github/eirslett/maven/plugins/frontend/lib/Platform.java @@ -15,13 +15,13 @@ public static Architecture guess(){ } else if (arch.equals("aarch64")) { return arm64; } else if (arch.equals("s390x")) { - return s390x; + return s390x; } else if (arch.equals("arm")) { - if (version.contains("v7")) { + if (version.contains("v7")) { return armv7l; - } else { - return arm64; - } + } else { + return arm64; + } } else if (arch.equals("ppc64")) { return ppc64; } else if (arch.equals("ppc")) { @@ -39,15 +39,15 @@ public static OS guess() { return osName.contains("Windows") ? OS.Windows : osName.contains("Mac") ? OS.Mac : osName.contains("SunOS") ? OS.SunOS : - osName.toUpperCase().contains("AIX") ? OS.AIX : - OS.Linux; + osName.toUpperCase().contains("AIX") ? OS.AIX : + OS.Linux; } public String getArchiveExtension(){ if(this == OS.Windows){ - return "zip"; + return "zip"; } else { - return "tar.gz"; + return "tar.gz"; } } @@ -88,10 +88,10 @@ public Platform(OS os, Architecture architecture) { } public Platform( - String nodeDownloadRoot, - OS os, - Architecture architecture, - String classifier + String nodeDownloadRoot, + OS os, + Architecture architecture, + String classifier ) { this.nodeDownloadRoot = nodeDownloadRoot; this.os = os; @@ -114,11 +114,11 @@ public static Platform guess(OS os, Architecture architecture, Supplier // We know Alpine is in use if the release file exists, and this is the simplest check. if (os == OS.Linux && checkForAlpine.get()) { return new Platform( - // Currently, musl is Experimental. The download root can be overridden with config - // if this changes and there's not been an update to this project, yet. - // See https://github.com/nodejs/node/blob/master/BUILDING.md#platform-list - "https://unofficial-builds.nodejs.org/download/release/", - os, architecture, "musl"); + // Currently, musl is Experimental. The download root can be overridden with config + // if this changes and there's not been an update to this project, yet. + // See https://github.com/nodejs/node/blob/master/BUILDING.md#platform-list + "https://unofficial-builds.nodejs.org/download/release/", + os, architecture, "musl"); } return new Platform(os, architecture); } @@ -161,7 +161,7 @@ public String getNodeDownloadFilename(String nodeVersion, boolean archiveOnWindo } } else { if (nodeVersion.startsWith("v0.")) { - return nodeVersion + "/node.exe"; + return nodeVersion + "/node.exe"; } else { return nodeVersion+"/win-x86/node.exe"; } diff --git a/frontend-plugin-core/src/main/java/com/github/eirslett/maven/plugins/frontend/lib/Utils.java b/frontend-plugin-core/src/main/java/com/github/eirslett/maven/plugins/frontend/lib/Utils.java index 7ff0b02a7..2ea18a615 100644 --- a/frontend-plugin-core/src/main/java/com/github/eirslett/maven/plugins/frontend/lib/Utils.java +++ b/frontend-plugin-core/src/main/java/com/github/eirslett/maven/plugins/frontend/lib/Utils.java @@ -1,11 +1,14 @@ package com.github.eirslett.maven.plugins.frontend.lib; +import javax.annotation.Nullable; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -final class Utils { +import static java.util.Objects.isNull; + +public final class Utils { public static List merge(List first, List second) { ArrayList result = new ArrayList(first); result.addAll(second); @@ -34,4 +37,8 @@ public static String implode(String separator, List elements){ public static boolean isRelative(String path) { return !path.startsWith("/") && !path.startsWith("file:") && !path.matches("^[a-zA-Z]:\\\\.*"); } + + public static boolean isBlank(@Nullable String string) { + return isNull(string) || string.trim().isEmpty(); + } } diff --git a/frontend-plugin-core/src/main/java/com/github/eirslett/maven/plugins/frontend/lib/YarnInstaller.java b/frontend-plugin-core/src/main/java/com/github/eirslett/maven/plugins/frontend/lib/YarnInstaller.java index 2edc035d2..a693d0ed8 100644 --- a/frontend-plugin-core/src/main/java/com/github/eirslett/maven/plugins/frontend/lib/YarnInstaller.java +++ b/frontend-plugin-core/src/main/java/com/github/eirslett/maven/plugins/frontend/lib/YarnInstaller.java @@ -14,6 +14,9 @@ public class YarnInstaller { public static final String INSTALL_PATH = "/node/yarn"; + public static final String ATLASSIAN_YARN_DOWNLOAD_ROOT = + "https://packages.atlassian.com/artifactory/yarn-dist/"; + public static final String DEFAULT_YARN_DOWNLOAD_ROOT = "https://github.com/yarnpkg/yarn/releases/download/";