From 629568ac66018c09f2664a0c428fe411ff45da7d Mon Sep 17 00:00:00 2001 From: mherman22 Date: Wed, 7 Aug 2024 21:28:09 +0300 Subject: [PATCH] change back to semver4j --- maven-plugin/pom.xml | 5 ++ .../openmrs/maven/plugins/BuildDistro.java | 4 -- sdk-commons/pom.xml | 6 ++ .../maven/plugins/utility/DistroHelper.java | 4 +- .../plugins/utility/NpmVersionHelper.java | 69 ++++++++++++------- .../plugins/utility/PropertiesUtils.java | 10 +-- 6 files changed, 63 insertions(+), 35 deletions(-) diff --git a/maven-plugin/pom.xml b/maven-plugin/pom.xml index ffdda75f..fac8ca66 100644 --- a/maven-plugin/pom.xml +++ b/maven-plugin/pom.xml @@ -29,6 +29,11 @@ org.apache.maven.shared maven-verifier + + com.vdurmont + semver4j + 3.1.0 + org.apache.maven maven-model diff --git a/maven-plugin/src/main/java/org/openmrs/maven/plugins/BuildDistro.java b/maven-plugin/src/main/java/org/openmrs/maven/plugins/BuildDistro.java index 2ef46e1b..a10bf79f 100644 --- a/maven-plugin/src/main/java/org/openmrs/maven/plugins/BuildDistro.java +++ b/maven-plugin/src/main/java/org/openmrs/maven/plugins/BuildDistro.java @@ -1,6 +1,5 @@ package org.openmrs.maven.plugins; -import com.github.zafarkhaja.semver.ParseException; import net.lingala.zip4j.core.ZipFile; import net.lingala.zip4j.exception.ZipException; import net.lingala.zip4j.model.ZipParameters; @@ -26,8 +25,6 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileWriter; -import java.io.BufferedReader; -import java.io.FileReader; import java.io.FilenameFilter; import java.io.IOException; import java.io.InputStream; @@ -36,7 +33,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; -import java.util.Properties; /** * Create docker configuration for distributions. diff --git a/sdk-commons/pom.xml b/sdk-commons/pom.xml index f845d9df..577f5589 100644 --- a/sdk-commons/pom.xml +++ b/sdk-commons/pom.xml @@ -86,6 +86,12 @@ json 20230618 + + com.vdurmont + semver4j + 3.1.0 + compile + diff --git a/sdk-commons/src/main/java/org/openmrs/maven/plugins/utility/DistroHelper.java b/sdk-commons/src/main/java/org/openmrs/maven/plugins/utility/DistroHelper.java index 699cfef9..d9e901ce 100644 --- a/sdk-commons/src/main/java/org/openmrs/maven/plugins/utility/DistroHelper.java +++ b/sdk-commons/src/main/java/org/openmrs/maven/plugins/utility/DistroHelper.java @@ -559,12 +559,12 @@ public DistroProperties resolveParentArtifact(Artifact parentArtifact, Server se return resolveParentArtifact(parentArtifact, server.getServerDirectory(), distroProperties, appShellVersion); } - public String findLatestMatchingVersion(String dependency) { + public String findLatestMatchingVersion(String dependency, String versionRange) { if (dependency.startsWith("omod") || dependency.startsWith("owa") || dependency.startsWith("content.") || dependency.startsWith("war.")) { return versionHelper.getLatestReleasedVersion(new Artifact(dependency, "latest")); } else if (dependency.startsWith("spa.frontendModule")) { packageJson.setName(dependency.substring("spa.frontendModules.".length())); - return npmVersionHelper.getLatestReleasedVersionFromNpmRegistry(packageJson); + return npmVersionHelper.getLatestReleasedVersionFromNpmRegistry(packageJson, versionRange); } throw new IllegalArgumentException("Unsupported dependency type: " + dependency); } diff --git a/sdk-commons/src/main/java/org/openmrs/maven/plugins/utility/NpmVersionHelper.java b/sdk-commons/src/main/java/org/openmrs/maven/plugins/utility/NpmVersionHelper.java index 01537482..25713d1a 100644 --- a/sdk-commons/src/main/java/org/openmrs/maven/plugins/utility/NpmVersionHelper.java +++ b/sdk-commons/src/main/java/org/openmrs/maven/plugins/utility/NpmVersionHelper.java @@ -1,47 +1,68 @@ package org.openmrs.maven.plugins.utility; +import org.json.JSONArray; import org.openmrs.maven.plugins.model.PackageJson; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; -import java.net.HttpURLConnection; -import java.net.URL; import org.json.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class NpmVersionHelper { - public String getLatestReleasedVersionFromNpmRegistry(PackageJson packageJson) { + private static final Logger log = LoggerFactory.getLogger(NpmVersionHelper.class); + + /** + * Retrieves the resolved version of an NPM package based on the supplied semver range. + *

+ * This method runs the `npm pack --dry-run --json @` command to + * get the exact version of the package that satisfies the specified semver range. + * + * @param packageJson The PackageJson object containing the name of the package. + * @param versionRange The semver range to resolve the version against. + * @return The resolved version of the package that satisfies the semver range. + * @throws RuntimeException if the command fails or the resolved version cannot be determined. + */ + public String getLatestReleasedVersionFromNpmRegistry(PackageJson packageJson, String versionRange) { try { String packageName = packageJson.getName(); - if (packageName == null || packageName.isEmpty()) { - throw new IllegalArgumentException("Package name cannot be null or empty"); + JSONArray jsonArray = getJsonArray(versionRange, packageName); + if (jsonArray.isEmpty()) { + throw new RuntimeException("No versions found for the specified range: " + versionRange); } - URL url = new URL("https://registry.npmjs.org/" + packageName.replace("/", "%2F")); - JSONObject json = getJson(url); - return json.getJSONObject("dist-tags").getString("latest"); - - } catch (Exception e) { - throw new RuntimeException("Error retrieving latest version from NPM ", e); + JSONObject jsonObject = jsonArray.getJSONObject(0); + return jsonObject.getString("version"); + } catch (IOException | InterruptedException e) { + log.error(e.getMessage()); + throw new RuntimeException("Error retrieving resolved version from NPM", e); } } - private static JSONObject getJson(URL url) throws IOException { - HttpURLConnection conn = (HttpURLConnection) url.openConnection(); - conn.setRequestMethod("GET"); - conn.setRequestProperty("Accept", "application/json"); - if (conn.getResponseCode() != 200) { - throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode()); + private static JSONArray getJsonArray(String versionRange, String packageName) throws IOException, InterruptedException { + if (packageName == null || packageName.isEmpty()) { + throw new IllegalArgumentException("Package name cannot be null or empty"); } - BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream()))); - StringBuilder sb = new StringBuilder(); - String output; - while ((output = br.readLine()) != null) { - sb.append(output); + ProcessBuilder processBuilder = new ProcessBuilder() + .command("npm", "pack", "--dry-run", "--json", packageName + "@" + versionRange) + .redirectErrorStream(true) + .inheritIO(); + Process process = processBuilder.start(); + + // Read the command output + BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); + StringBuilder outputBuilder = new StringBuilder(); + String line; + while ((line = reader.readLine()) != null) { + outputBuilder.append(line); } - conn.disconnect(); - return new JSONObject(sb.toString()); + int exitCode = process.waitFor(); + if (exitCode != 0) { + throw new RuntimeException("npm pack --dry-run --json command failed with exit code " + exitCode); + } + return new JSONArray(outputBuilder.toString()); } } diff --git a/sdk-commons/src/main/java/org/openmrs/maven/plugins/utility/PropertiesUtils.java b/sdk-commons/src/main/java/org/openmrs/maven/plugins/utility/PropertiesUtils.java index e07280e7..074c1be1 100644 --- a/sdk-commons/src/main/java/org/openmrs/maven/plugins/utility/PropertiesUtils.java +++ b/sdk-commons/src/main/java/org/openmrs/maven/plugins/utility/PropertiesUtils.java @@ -22,10 +22,10 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.github.zafarkhaja.semver.ParseException; +import com.vdurmont.semver4j.Semver; import org.apache.commons.io.IOUtils; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; -import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; @@ -352,7 +352,7 @@ public static void parseContentProperties(File userDir, DistroProperties distroP String distroVersion = distroProperties.get(dependency); if (distroVersion == null) { - String latestVersion = findLatestMatchingVersion(dependency); + String latestVersion = findLatestMatchingVersion(dependency, versionRange); if (latestVersion == null) { throw new MojoExecutionException("No matching version found for dependency " + dependency); } @@ -364,8 +364,8 @@ public static void parseContentProperties(File userDir, DistroProperties distroP } } - private static String findLatestMatchingVersion(String dependency) { - return distroHelper.findLatestMatchingVersion(dependency); + private static String findLatestMatchingVersion(String dependency, String versionRange) { + return distroHelper.findLatestMatchingVersion(dependency, versionRange); } /** @@ -379,7 +379,7 @@ private static String findLatestMatchingVersion(String dependency) { * @throws MojoExecutionException If the version does not fall within the specified range or if the range format is invalid. */ private static void checkVersionInRange(String contentDependencyKey, String contentDependencyVersionRange, String distroPropertyVersion, String contentPackageName) throws MojoExecutionException { - com.github.zafarkhaja.semver.Version semverVersion = com.github.zafarkhaja.semver.Version.parse(distroPropertyVersion); + Semver semverVersion = new Semver(distroPropertyVersion, Semver.SemverType.NPM); try { boolean inRange = semverVersion.satisfies(contentDependencyVersionRange.trim());