From de036be65092fb1b4344290f383c21744bfcb2ed Mon Sep 17 00:00:00 2001 From: Stefan Oehme Date: Thu, 27 Mar 2025 23:38:09 +0100 Subject: [PATCH] [MNG-8660] Decouple legacy prompter from implementation details The legacy prompter should only use the Prompter interface, not the DefaultPrompter implementaiton, so that the Maven daemon can override how prompting is implemented. See https://github.com/apache/maven-mvnd/pull/1303 --- .../maven/api/services/PrompterException.java | 4 ++ .../LegacyPlexusInteractivity.java | 45 ++++++++++++------- .../apache/maven/jline/DefaultPrompter.java | 41 +++++------------ 3 files changed, 46 insertions(+), 44 deletions(-) diff --git a/api/maven-api-core/src/main/java/org/apache/maven/api/services/PrompterException.java b/api/maven-api-core/src/main/java/org/apache/maven/api/services/PrompterException.java index 5a379d14804b..ca17937dfcc1 100644 --- a/api/maven-api-core/src/main/java/org/apache/maven/api/services/PrompterException.java +++ b/api/maven-api-core/src/main/java/org/apache/maven/api/services/PrompterException.java @@ -33,6 +33,10 @@ public class PrompterException extends MavenException { @Serial private static final long serialVersionUID = -3505070928479515081L; + public PrompterException(String message) { + super(message); + } + /** * @param message the message to give * @param e the {@link Exception} diff --git a/compat/maven-compat/src/main/java/org/apache/maven/internal/compat/interactivity/LegacyPlexusInteractivity.java b/compat/maven-compat/src/main/java/org/apache/maven/internal/compat/interactivity/LegacyPlexusInteractivity.java index dd5a941659f8..f56bd1cedc82 100644 --- a/compat/maven-compat/src/main/java/org/apache/maven/internal/compat/interactivity/LegacyPlexusInteractivity.java +++ b/compat/maven-compat/src/main/java/org/apache/maven/internal/compat/interactivity/LegacyPlexusInteractivity.java @@ -27,7 +27,6 @@ import java.util.List; import org.apache.maven.api.annotations.Experimental; -import org.apache.maven.jline.DefaultPrompter; import org.codehaus.plexus.components.interactivity.InputHandler; import org.codehaus.plexus.components.interactivity.OutputHandler; import org.codehaus.plexus.components.interactivity.Prompter; @@ -36,28 +35,36 @@ /** * This class is injected into any legacy component that would want to use legacy "Plexus Interactivity API". - * It simply delegates to Maven4 API {@link DefaultPrompter}. + * It simply delegates to Maven4 API {@link org.apache.maven.api.services.Prompter}. */ @Experimental @Named @Singleton @Priority(10) public class LegacyPlexusInteractivity implements Prompter, InputHandler, OutputHandler { - private final DefaultPrompter defaultPrompter; + private final org.apache.maven.api.services.Prompter prompter; @Inject - public LegacyPlexusInteractivity(DefaultPrompter defaultPrompter) { - this.defaultPrompter = defaultPrompter; + public LegacyPlexusInteractivity(org.apache.maven.api.services.Prompter prompter) { + this.prompter = prompter; } @Override public String readLine() throws IOException { - return defaultPrompter.doPrompt(null, false); + try { + return prompter.prompt(null); + } catch (org.apache.maven.api.services.PrompterException e) { + throw new IOException("Unable to prompt", e); + } } @Override public String readPassword() throws IOException { - return defaultPrompter.doPrompt(null, true); + try { + return prompter.promptForPassword(null); + } catch (org.apache.maven.api.services.PrompterException e) { + throw new IOException("Unable to prompt", e); + } } @Override @@ -71,18 +78,26 @@ public List readMultipleLines() throws IOException { @Override public void write(String line) throws IOException { - defaultPrompter.doDisplay(line); + try { + prompter.showMessage(line); + } catch (org.apache.maven.api.services.PrompterException e) { + throw new IOException("Unable to prompt", e); + } } @Override public void writeLine(String line) throws IOException { - defaultPrompter.doDisplay(line + System.lineSeparator()); + try { + prompter.showMessage(line + System.lineSeparator()); + } catch (org.apache.maven.api.services.PrompterException e) { + throw new IOException("Unable to prompt", e); + } } @Override public String prompt(String message) throws PrompterException { try { - return defaultPrompter.prompt(message, null, null); + return prompter.prompt(message, null, null); } catch (org.apache.maven.api.services.PrompterException e) { throw new PrompterException("Unable to prompt", e); } @@ -91,7 +106,7 @@ public String prompt(String message) throws PrompterException { @Override public String prompt(String message, String defaultReply) throws PrompterException { try { - return defaultPrompter.prompt(message, null, defaultReply); + return prompter.prompt(message, null, defaultReply); } catch (org.apache.maven.api.services.PrompterException e) { throw new PrompterException("Unable to prompt", e); } @@ -100,7 +115,7 @@ public String prompt(String message, String defaultReply) throws PrompterExcepti @Override public String prompt(String message, List possibleValues) throws PrompterException { try { - return defaultPrompter.prompt(message, possibleValues, null); + return prompter.prompt(message, possibleValues, null); } catch (org.apache.maven.api.services.PrompterException e) { throw new PrompterException("Unable to prompt", e); } @@ -109,7 +124,7 @@ public String prompt(String message, List possibleValues) throws PrompterExcepti @Override public String prompt(String message, List possibleValues, String defaultReply) throws PrompterException { try { - return defaultPrompter.prompt(message, possibleValues, defaultReply); + return prompter.prompt(message, possibleValues, defaultReply); } catch (org.apache.maven.api.services.PrompterException e) { throw new PrompterException("Unable to prompt", e); } @@ -118,7 +133,7 @@ public String prompt(String message, List possibleValues, String defaultReply) t @Override public String promptForPassword(String message) throws PrompterException { try { - return defaultPrompter.promptForPassword(message); + return prompter.promptForPassword(message); } catch (org.apache.maven.api.services.PrompterException e) { throw new PrompterException("Unable to promptForPassword", e); } @@ -127,7 +142,7 @@ public String promptForPassword(String message) throws PrompterException { @Override public void showMessage(String message) throws PrompterException { try { - defaultPrompter.showMessage(message); + prompter.showMessage(message); } catch (org.apache.maven.api.services.PrompterException e) { throw new PrompterException("Unable to showMessage", e); } diff --git a/impl/maven-jline/src/main/java/org/apache/maven/jline/DefaultPrompter.java b/impl/maven-jline/src/main/java/org/apache/maven/jline/DefaultPrompter.java index cf0ae093f656..565419a3cc3a 100644 --- a/impl/maven-jline/src/main/java/org/apache/maven/jline/DefaultPrompter.java +++ b/impl/maven-jline/src/main/java/org/apache/maven/jline/DefaultPrompter.java @@ -18,7 +18,6 @@ */ package org.apache.maven.jline; -import java.io.IOException; import java.util.Iterator; import java.util.List; @@ -35,35 +34,20 @@ public class DefaultPrompter implements Prompter { @Override public String prompt(String message, List possibleValues, String defaultReply) throws PrompterException { - try { - return doPrompt(message, possibleValues, defaultReply, false); - } catch (IOException e) { - throw new PrompterException("Failed to prompt", e); - } + return doPrompt(message, possibleValues, defaultReply, false); } @Override public String promptForPassword(String message) throws PrompterException { - try { - return doPrompt(message, null, null, true); - } catch (IOException e) { - throw new PrompterException("Failed to prompt for password", e); - } + return doPrompt(message, null, null, true); } @Override public void showMessage(String message) throws PrompterException { - try { - doDisplay(message); - } catch (IOException e) { - throw new PrompterException("Failed to present message", e); - } + doDisplay(message); } - /** - * Used by {@code LegacyPlexusInteractivity} - */ - public String doPrompt(String message, boolean password) throws IOException { + private String doPrompt(String message, boolean password) { try { if (message != null) { if (!message.endsWith("\n")) { @@ -81,30 +65,26 @@ public String doPrompt(String message, boolean password) throws IOException { } return MessageUtils.reader.readLine(message, password ? '*' : null); } catch (Exception e) { - throw new IOException("Unable to prompt user", e); + throw new PrompterException("Unable to prompt user", e); } } - /** - * Used by {@code LegacyPlexusInteractivity} - */ - public void doDisplay(String message) throws IOException { + private void doDisplay(String message) { try { MessageUtils.terminal.writer().print(message); MessageUtils.terminal.flush(); } catch (Exception e) { - throw new IOException("Unable to display message", e); + throw new PrompterException("Unable to display message", e); } } - private String doPrompt(String message, List possibleValues, String defaultReply, boolean password) - throws IOException { + private String doPrompt(String message, List possibleValues, String defaultReply, boolean password) { String formattedMessage = formatMessage(message, possibleValues, defaultReply); String line; do { line = doPrompt(formattedMessage, password); if (line == null && defaultReply == null) { - throw new IOException("EOF"); + throw new PrompterException("EOF"); } if (line == null || line.isEmpty()) { line = defaultReply; @@ -117,6 +97,9 @@ private String doPrompt(String message, List possibleValues, String defaultRe } private String formatMessage(String message, List possibleValues, String defaultReply) { + if (message == null) { + return null; + } StringBuilder formatted = new StringBuilder(message.length() * 2); formatted.append(message); if (possibleValues != null && !possibleValues.isEmpty()) {