From 0f11dfcacca082f73d07fab78b67cf1be65c3c59 Mon Sep 17 00:00:00 2001 From: damage Date: Sun, 22 Dec 2024 23:56:28 +0100 Subject: [PATCH] provide dependencies via system call of mvn --- pom.xml | 38 ------ .../de/devloop/mavor/servlet/Download.java | 111 +++++++++++++++--- src/main/resources/pomstub.xml | 23 ++++ src/main/webapp/download.jsp | 5 +- src/main/webapp/main.jsp | 12 +- 5 files changed, 128 insertions(+), 61 deletions(-) create mode 100644 src/main/resources/pomstub.xml diff --git a/pom.xml b/pom.xml index 3e9af9f..0df2058 100644 --- a/pom.xml +++ b/pom.xml @@ -90,43 +90,5 @@ gson 2.11.0 - - - org.eclipse.sisu - org.eclipse.sisu.plexus - 0.9.0.M3 - - - - - - org.apache.maven - maven-embedder - 3.9.9 - - - - - org.apache.maven - maven-slf4j-provider - 3.9.9 - - - - - org.apache.maven - maven-core - 3.9.9 - - - - - org.apache.maven - maven-compat - 3.9.9 - - - - diff --git a/src/main/java/de/devloop/mavor/servlet/Download.java b/src/main/java/de/devloop/mavor/servlet/Download.java index ff531d6..430d215 100644 --- a/src/main/java/de/devloop/mavor/servlet/Download.java +++ b/src/main/java/de/devloop/mavor/servlet/Download.java @@ -1,11 +1,16 @@ package de.devloop.mavor.servlet; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileWriter; import java.io.IOException; -import java.io.PrintStream; - -import org.apache.maven.cli.MavenCli; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.util.stream.Collectors; import de.devloop.mavor.AuthenticatedServlet; +import jakarta.servlet.RequestDispatcher; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServletRequest; @@ -16,29 +21,99 @@ public class Download extends AuthenticatedServlet { private static final String PARAMETER_SITE = "site"; private static final String PARAMETER_GROUP_ID = "groupId"; - private static final String PARAMETER_ARTEFACT_ID = "artefactId"; + private static final String PARAMETER_ARTIFACT_ID = "artifactId"; private static final String PARAMETER_VERSION = "version"; + private static final String PARAMETER_POM = "pom"; + private static final String PARAMETER_TYPE = "type"; + private static final String MAVEN_CMD = "/usr/bin/mvn"; private static final String TEMP_DIR = "/home/damage/Temp/mavor"; @Override protected void doAuthenticatedGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - String site = req.getParameter(PARAMETER_SITE); - String groupId = req.getParameter(PARAMETER_GROUP_ID); - String artifactId = req.getParameter(PARAMETER_ARTEFACT_ID); - String version = req.getParameter(PARAMETER_VERSION); + // implement a lot of checks: + // NPE, required parameters not given - String artifact = String.format("%s:%s:%s", groupId, artifactId, version); + String type = req.getParameter(PARAMETER_TYPE); + if (type.equals("artifact")) { + String site = req.getParameter(PARAMETER_SITE); + String groupId = req.getParameter(PARAMETER_GROUP_ID); + String artifactId = req.getParameter(PARAMETER_ARTIFACT_ID); + String version = req.getParameter(PARAMETER_VERSION); + generatePomXmlByArtifact(site, groupId, artifactId, version); + } else if (type.equals("pom")) { + writePomXml(req.getParameter(PARAMETER_POM)); + } else { + throw new ServletException("Unknown download type: " + type); + } - PrintStream out = new PrintStream(resp.getOutputStream()); + ExecutionResult executionResult; + try { + executionResult = executeMaven(); + } catch (InterruptedException e) { + throw new ServletException("Running maven failed", e); + } - MavenCli cli = new MavenCli(); - System.setProperty("maven.multiModuleProjectDirectory", "/home/damage/Temp"); - // TODO: does not work -> generate pom.xml in temp dir and use dependency:copy-dependencies? - System.setProperty("maven.repo.remote", site); - cli.doMain(new String[]{"dependency:copy", "-Dartifact=" + artifact, "-DoutputDirectory=/home/damage/Temp"}, "/home/damage/Temp", out, out); + req.setAttribute("stdout", executionResult.stdout); + req.setAttribute("stderr", executionResult.stderr); + req.setAttribute("exitcode", executionResult.exitCode); - //RequestDispatcher view = req.getRequestDispatcher("/download.jsp"); - //view.forward(req, resp); + RequestDispatcher view = req.getRequestDispatcher("/download.jsp"); + view.forward(req, resp); } -} + + private ExecutionResult executeMaven() throws IOException, InterruptedException { + Process mvnProcess = Runtime.getRuntime().exec(MAVEN_CMD + " dependency:copy-dependencies -DoutputDirectory=" + TEMP_DIR, null, new File(TEMP_DIR)); + String stdout = new String(mvnProcess.getInputStream().readAllBytes(), StandardCharsets.UTF_8); + String stderr = new String(mvnProcess.getErrorStream().readAllBytes(), StandardCharsets.UTF_8); + + ExecutionResult executionResult = new ExecutionResult(); + + executionResult.exitCode = mvnProcess.waitFor(); + executionResult.stdout = stdout; + executionResult.stderr = stderr; + return executionResult; + } + + private void generatePomXmlByArtifact(String site, String groupId, String artifactId, String version) throws IOException { + String pomXml = getResourceFileAsString("pomstub.xml"); + pomXml = pomXml.replace("{site-id}", "foo"); + pomXml = pomXml.replace("{site-url}", site); + pomXml = pomXml.replace("{group-id}", groupId); + pomXml = pomXml.replace("{artifact-id}", artifactId); + pomXml = pomXml.replace("{version}", version); + writePomXml(pomXml); + } + + private void writePomXml(String pomXml) throws IOException { + File pomXmlFile = new File(TEMP_DIR + "/pom.xml"); + pomXmlFile.delete(); + FileWriter fileWriter = new FileWriter(pomXmlFile); + fileWriter.write(pomXml); + fileWriter.close(); + } + + /** + * Reads given resource file as a string. + * + * @param fileName path to the resource file + * @return the file's contents + * @throws IOException if read fails for any reason + */ + static String getResourceFileAsString(String fileName) throws IOException { + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + try (InputStream is = classLoader.getResourceAsStream(fileName)) { + if (is == null) return null; + try (InputStreamReader isr = new InputStreamReader(is); + BufferedReader reader = new BufferedReader(isr)) { + return reader.lines().collect(Collectors.joining(System.lineSeparator())); + } + } + } + + private class ExecutionResult { + public int exitCode; + public String stdout; + public String stderr; + } +} \ No newline at end of file diff --git a/src/main/resources/pomstub.xml b/src/main/resources/pomstub.xml new file mode 100644 index 0000000..1729ef7 --- /dev/null +++ b/src/main/resources/pomstub.xml @@ -0,0 +1,23 @@ + + + 4.0.0 + + de.devloop + mavor-download + 0.0.7 + + + + {site-id} + {site-url} + + + + + + {group-id} + {artifact-id} + {version} + + + \ No newline at end of file diff --git a/src/main/webapp/download.jsp b/src/main/webapp/download.jsp index b1607c6..de13a59 100644 --- a/src/main/webapp/download.jsp +++ b/src/main/webapp/download.jsp @@ -2,7 +2,8 @@ <%@ page isELIgnored="false" %> - Downloading ${foo}
- logout + Output:
+
${stdout}
+ logout | back diff --git a/src/main/webapp/main.jsp b/src/main/webapp/main.jsp index 5bc3d79..76040b2 100644 --- a/src/main/webapp/main.jsp +++ b/src/main/webapp/main.jsp @@ -4,10 +4,16 @@

Hello ${username}

+ Site:
- Group ID:
- Artifact ID:
- Version:
+ Group ID:
+ Artifact ID:
+ Version:
+ +
+
+ + POM:
logout