From 20680460f5c9bd6410a130ab2b7798400b6838ba Mon Sep 17 00:00:00 2001 From: Charuka Tharindu Date: Wed, 25 Oct 2023 10:06:49 +0530 Subject: [PATCH 1/2] Add dependency availability check before setting up the distribution --- .../ballerinalang/command/util/ToolUtil.java | 55 +++++++++++++------ 1 file changed, 38 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/ballerinalang/command/util/ToolUtil.java b/src/main/java/org/ballerinalang/command/util/ToolUtil.java index a2acae65..c7e56d6b 100644 --- a/src/main/java/org/ballerinalang/command/util/ToolUtil.java +++ b/src/main/java/org/ballerinalang/command/util/ToolUtil.java @@ -527,13 +527,29 @@ public static boolean downloadDistribution(PrintStream printStream, String distr String newUrl = conn.getHeaderField("Location"); HttpsURLConnection redirectedConn = getServerUrlWithProxyAuthentication(new URL(newUrl)); redirectedConn.setRequestProperty("content-type", "binary/data"); - ToolUtil.downloadAndSetupDist(printStream, redirectedConn, distribution); - ToolUtil.getDependency(printStream, distribution, distributionType, distributionVersion); + ToolUtil.downloadDistributionZip(printStream, redirectedConn, distribution); + String dependencyForDistribution = ToolUtil.getDependency(printStream, distribution, distributionType, distributionVersion); + if (!ToolUtil.checkDependencyAvailable(dependencyForDistribution)) { + downloadDependency(printStream, dependencyForDistribution, distributionType, + distributionVersion); + } else { + printStream.println("Dependency '" + dependencyForDistribution + + "' is already available locally"); + } + setupDistribution(distribution, dependencyForDistribution); return false; } else if (conn.getResponseCode() == 200) { printStream.println("Fetching the '" + distribution + "' distribution from the remote server..."); - ToolUtil.downloadAndSetupDist(printStream, conn, distribution); - ToolUtil.getDependency(printStream, distribution, distributionType, distributionVersion); + ToolUtil.downloadDistributionZip(printStream, conn, distribution); + String dependencyForDistribution = ToolUtil.getDependency(printStream, distribution, distributionType, distributionVersion); + if (!ToolUtil.checkDependencyAvailable(dependencyForDistribution)) { + downloadDependency(printStream, dependencyForDistribution, distributionType, + distributionVersion); + } else { + printStream.println("Dependency '" + dependencyForDistribution + + "' is already available locally"); + } + setupDistribution(distribution, dependencyForDistribution); return false; } else { throw ErrorUtil.createDistributionNotFoundException(distribution); @@ -555,12 +571,24 @@ public static boolean downloadDistribution(PrintStream printStream, String distr } } - private static void downloadAndSetupDist(PrintStream printStream, HttpURLConnection conn, + private static void downloadDistributionZip(PrintStream printStream, HttpURLConnection conn, String distribution) { try { - String distPath = getDistributionsPath(); String zipFileLocation = getDistributionsPath() + File.separator + distribution + ".zip"; downloadFile(conn, zipFileLocation, distribution, printStream); + } finally { + conn.disconnect(); + } + } + + public static void setupDistribution (String distribution, String dependency) { + String distPath = getDistributionsPath(); + String zipFileLocation = getDistributionsPath() + File.separator + distribution + ".zip"; + if (!ToolUtil.checkDependencyAvailable(dependency)) { + new File(zipFileLocation).delete(); + throw ErrorUtil.createCommandException("dependency '" + dependency + "' is not available locally. Please " + + "try reinstalling the distribution"); + } else { unzip(zipFileLocation, distPath); addExecutablePermissionToFile(new File(distPath + File.separator + ToolUtil.getType(distribution) + "-" + distribution + File.separator + "bin" @@ -583,14 +611,13 @@ private static void downloadAndSetupDist(PrintStream printStream, HttpURLConnect } new File(zipFileLocation).delete(); - } finally { - conn.disconnect(); } } - public static void getDependency(PrintStream printStream, String distribution, String distributionType, + public static String getDependency(PrintStream printStream, String distribution, String distributionType, String distributionVersion) { HttpsURLConnection conn = null; + String dependencyName = ""; try { printStream.println("\nFetching the dependencies for '" + distribution + "' from the remote server..."); URL url = new URL(ToolUtil.getServerURL() + "/distributions"); @@ -612,14 +639,7 @@ public static void getDependency(PrintStream printStream, String distribution, S Pattern dependencyPattern = Pattern.compile(dependencyRegex); Matcher dependencyMatcher = dependencyPattern.matcher(distInfo); while (dependencyMatcher.find()) { - String dependencyName = dependencyMatcher.group(1); - if (!ToolUtil.checkDependencyAvailable(dependencyName)) { - downloadDependency(printStream, dependencyName, distributionType, - distributionVersion); - } else { - printStream.println("Dependency '" + dependencyName + - "' is already available locally"); - } + dependencyName = dependencyMatcher.group(1); } break; } @@ -636,6 +656,7 @@ public static void getDependency(PrintStream printStream, String distribution, S conn.disconnect(); } } + return dependencyName; } private static void downloadDependency(PrintStream printStream, String dependency, String distributionType, From 6ddb578f1e8d4be114b9fb4b5c4163b8b414519b Mon Sep 17 00:00:00 2001 From: Charuka Tharindu Date: Thu, 2 Nov 2023 15:27:34 +0530 Subject: [PATCH 2/2] Address review suggestions --- .../org/ballerinalang/command/util/ToolUtil.java | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/ballerinalang/command/util/ToolUtil.java b/src/main/java/org/ballerinalang/command/util/ToolUtil.java index c7e56d6b..de8a50b6 100644 --- a/src/main/java/org/ballerinalang/command/util/ToolUtil.java +++ b/src/main/java/org/ballerinalang/command/util/ToolUtil.java @@ -532,9 +532,6 @@ public static boolean downloadDistribution(PrintStream printStream, String distr if (!ToolUtil.checkDependencyAvailable(dependencyForDistribution)) { downloadDependency(printStream, dependencyForDistribution, distributionType, distributionVersion); - } else { - printStream.println("Dependency '" + dependencyForDistribution + - "' is already available locally"); } setupDistribution(distribution, dependencyForDistribution); return false; @@ -545,9 +542,6 @@ public static boolean downloadDistribution(PrintStream printStream, String distr if (!ToolUtil.checkDependencyAvailable(dependencyForDistribution)) { downloadDependency(printStream, dependencyForDistribution, distributionType, distributionVersion); - } else { - printStream.println("Dependency '" + dependencyForDistribution + - "' is already available locally"); } setupDistribution(distribution, dependencyForDistribution); return false; @@ -586,8 +580,8 @@ public static void setupDistribution (String distribution, String dependency) { String zipFileLocation = getDistributionsPath() + File.separator + distribution + ".zip"; if (!ToolUtil.checkDependencyAvailable(dependency)) { new File(zipFileLocation).delete(); - throw ErrorUtil.createCommandException("dependency '" + dependency + "' is not available locally. Please " + - "try reinstalling the distribution"); + throw ErrorUtil.createCommandException("The required dependency '" + dependency + "' is not available locally." + + " Please try reinstalling the distribution."); } else { unzip(zipFileLocation, distPath); addExecutablePermissionToFile(new File(distPath + File.separator + ToolUtil.getType(distribution) @@ -619,7 +613,6 @@ public static String getDependency(PrintStream printStream, String distribution, HttpsURLConnection conn = null; String dependencyName = ""; try { - printStream.println("\nFetching the dependencies for '" + distribution + "' from the remote server..."); URL url = new URL(ToolUtil.getServerURL() + "/distributions"); conn = getServerUrlWithProxyAuthentication(url); conn.setRequestMethod("GET"); @@ -662,6 +655,7 @@ public static String getDependency(PrintStream printStream, String distribution, private static void downloadDependency(PrintStream printStream, String dependency, String distributionType, String distributionVersion) { try { + printStream.println("\nFetching the dependencies for '" + distributionVersion + "' from the remote server..."); String encodedDependencyName = encodePlusCharacters(dependency); String url = ToolUtil.getServerURL() + "/dependencies/" + encodedDependencyName; HttpsURLConnection conn = getServerUrlWithProxyAuthentication(new URL(url));