[maven-debian-helper] 01/01: Refactored the UserInteraction class Ask the question again if the response is not valid

Emmanuel Bourg ebourg-guest at alioth.debian.org
Mon Sep 2 09:48:44 UTC 2013


This is an automated email from the git hooks/post-receive script.

ebourg-guest pushed a commit to branch master
in repository maven-debian-helper.

commit 4baee0d89ae1460359531b18429608bf111a071c
Author: Emmanuel Bourg <ebourg at apache.org>
Date:   Mon Sep 2 11:43:03 2013 +0200

    Refactored the UserInteraction class
    Ask the question again if the response is not valid
---
 .../debian/maven/packager/DependenciesSolver.java  |   35 +++---
 .../maven/packager/GenerateDebianFilesMojo.java    |   33 +++--
 .../maven/packager/interaction/ChoiceQuestion.java |   77 ++++++++++++
 .../packager/interaction/MultilineQuestion.java    |   52 ++++++++
 .../maven/packager/interaction/Question.java       |   70 +++++++++++
 .../maven/packager/interaction/SimpleQuestion.java |   36 ++++++
 .../maven/packager/interaction/YesNoQuestion.java  |   60 +++++++++
 .../packager/util/IgnoreDependencyQuestions.java   |    9 +-
 .../maven/packager/util/LicensesScanner.java       |   17 +--
 .../maven/packager/util/UserInteraction.java       |  123 ------------------
 .../packager/interaction/ChoiceQuestionTest.java   |  133 ++++++++++++++++++++
 .../interaction/MultilineQuestionTest.java         |   49 ++++++++
 .../packager/interaction/SimpleQuestionTest.java   |   42 +++++++
 .../packager/interaction/YesNoQuestionTest.java    |   82 ++++++++++++
 14 files changed, 650 insertions(+), 168 deletions(-)

diff --git a/maven-packager-utils/src/main/java/org/debian/maven/packager/DependenciesSolver.java b/maven-packager-utils/src/main/java/org/debian/maven/packager/DependenciesSolver.java
index 295fbc3..e6f7c12 100644
--- a/maven-packager-utils/src/main/java/org/debian/maven/packager/DependenciesSolver.java
+++ b/maven-packager-utils/src/main/java/org/debian/maven/packager/DependenciesSolver.java
@@ -30,6 +30,9 @@ import java.util.regex.Pattern;
 
 import javax.xml.stream.XMLStreamException;
 
+import org.debian.maven.packager.interaction.ChoiceQuestion;
+import org.debian.maven.packager.interaction.SimpleQuestion;
+import org.debian.maven.packager.interaction.YesNoQuestion;
 import org.debian.maven.packager.util.*;
 import org.debian.maven.repo.Dependency;
 import org.debian.maven.repo.DependencyNotFoundException;
@@ -58,7 +61,6 @@ import static org.debian.maven.repo.DependencyRuleSetFiles.RulesType.*;
 public class DependenciesSolver {
 
     private static final Logger log = Logger.getLogger(DependenciesSolver.class.getName());
-    private final UserInteraction userInteraction = new UserInteraction();
     private final IgnoreDependencyQuestions ignoreDependencyQuestion;
 
     private File baseDir;
@@ -102,7 +104,7 @@ public class DependenciesSolver {
         this.outputDirectory = outputDirectory;
         this.scanner = scanner;
         this.interactive = interactive;
-        this.ignoreDependencyQuestion = new IgnoreDependencyQuestions(userInteraction, interactive);
+        this.ignoreDependencyQuestion = new IgnoreDependencyQuestions(interactive);
         pomTransformer.setVerbose(true);
         pomTransformer.setFixVersions(false);
         pomTransformer.setRulesFiles(initDependencyRuleSetFiles(outputDirectory, verbose));
@@ -326,8 +328,8 @@ public class DependenciesSolver {
             knownProjectDependencies.add(pom.getThisPom());
 
             if (interactive && packageVersion == null) {
-                String q = "Enter the upstream version for the package. If you press <Enter> it will default to " + pom.getOriginalVersion();
-                String v = userInteraction.ask(q);
+                String question = "Enter the upstream version for the package. If you press <Enter> it will default to " + pom.getOriginalVersion();
+                String v = new SimpleQuestion(question).ask();
                 if (v.isEmpty()) {
                     v = pom.getOriginalVersion();
                 }
@@ -340,7 +342,7 @@ public class DependenciesSolver {
             }
 
             if (filterModules) {
-                boolean includeModule = userInteraction.askYesNo("Include the module " + IOUtil.relativePath(baseDir, projectPom) + " ?", true);
+                boolean includeModule = new YesNoQuestion("Include the module " + IOUtil.relativePath(baseDir, projectPom) + " ?", true).ask();
                 if (!includeModule) {
                     pomTransformer.getListOfPOMs().getOrCreatePOMOptions(projectPom).setIgnore(true);
                     pomTransformer.getRulesFiles().get(IGNORE).add(DependencyRule.newToMatch(pom.getThisPom()));
@@ -363,8 +365,7 @@ public class DependenciesSolver {
                 Rule selectedRule = askForVersionRule(pom.getThisPom());
                 versionToRules.put(pom.getThisPom().getVersion(), selectedRule);
                 if (selectedRule.getPattern().equals("CUSTOM")) {
-                    String rule = userInteraction.ask("Enter the pattern for your custom rule (in the form s/regex/replace/)")
-                               .toLowerCase();
+                    String rule = new SimpleQuestion("Enter the pattern for your custom rule (in the form s/regex/replace/)").ask().toLowerCase();
                     selectedRule = new Rule(rule, "My custom rule " + rule);
                     defaultRules.add(selectedRule);
                 }
@@ -380,7 +381,7 @@ public class DependenciesSolver {
                             " is a bundle.\n"
                             + "Inform mh_make that dependencies of type jar which may match this library should be transformed into bundles automatically?";
 
-                    boolean transformJarsIntoBundle = userInteraction.askYesNo(question2, true);
+                    boolean transformJarsIntoBundle = new YesNoQuestion(question2, true).ask();
 
                     if (transformJarsIntoBundle) {
                         String transformBundleRule = pom.getThisPom().getGroupId() + " " + pom.getThisPom().getArtifactId()
@@ -411,7 +412,7 @@ public class DependenciesSolver {
 
             if (exploreProjects && !pom.getModules().isEmpty()) {
                 if (interactive && !askedToFilterModules) {
-                    filterModules = !userInteraction.askYesNo("This project contains modules. Include all modules?", true);
+                    filterModules = !new YesNoQuestion("This project contains modules. Include all modules?", true).ask();
                     askedToFilterModules = true;
                 }
                 for (String module : pom.getModules()) {
@@ -453,7 +454,7 @@ public class DependenciesSolver {
             choicesDescriptions.add(choice.getDescription());
         }
 
-        int choice = userInteraction.askChoices(question, defaultChoice, choicesDescriptions);
+        int choice = new ChoiceQuestion(question, defaultChoice, choicesDescriptions).ask();
         return choices.get(choice);
     }
 
@@ -713,10 +714,10 @@ public class DependenciesSolver {
             if (interactive && pkg == null) {
                 pkg = scanner.searchPkgContainingJar(dependency);
                 if (pkg != null) {
-                    String q = "[error] Package " + pkg + " does not contain Maven dependency " + dependency + " but there seem to be a match\n"
+                    String question = "[error] Package " + pkg + " does not contain Maven dependency " + dependency + " but there seem to be a match\n"
                      + "If the package contains already Maven artifacts but the names don't match, try to enter a substitution rule\n"
                      + "of the form s/groupId/newGroupId/ s/artifactId/newArtifactId/ jar s/version/newVersion/ here:";
-                    String newRule = userInteraction.ask(q);
+                    String newRule = new SimpleQuestion(question).ask();
                     if (!newRule.isEmpty()) {
                         DependencyRule userRule = new DependencyRule(newRule);
                         pomTransformer.getRulesFiles().get(RULES).add(userRule);
@@ -724,16 +725,16 @@ public class DependenciesSolver {
                         return resolveDependency(dependency.applyRules(Arrays.asList(userRule)), sourcePom, buildTime, mavenExtension, management, false);
                     }
                 } else {
-                    String newRule = userInteraction.ask(
+                    String newRule = new SimpleQuestion(
                             "[error] Cannot resolve Maven dependency " + dependency + ". If you know a package that contains a compatible dependency,\n"
-                          + "try to enter a substitution rule of the form s/groupId/newGroupId/ s/artifactId/newArtifactId/ jar s/version/newVersion/ here:\n");
+                          + "try to enter a substitution rule of the form s/groupId/newGroupId/ s/artifactId/newArtifactId/ jar s/version/newVersion/ here:\n").ask();
                     while (!newRule.isEmpty()) {
                         DependencyRule userRule = new DependencyRule(newRule);
                         Dependency newDependency = dependency.applyRules(Arrays.asList(userRule));
                         if (newDependency.equals(dependency)) {
-                            newRule = userInteraction.ask("Your rule doesn't seem to apply on " + dependency
+                            newRule = new SimpleQuestion("Your rule doesn't seem to apply on " + dependency
                              + "Please enter a substitution rule of the form s/groupId/newGroupId/ s/artifactId/newArtifactId/ jar s/version/newVersion/ here,"
-                             + "or press <Enter> to give up");
+                             + "or press <Enter> to give up").ask();
                         } else {
                             pomTransformer.getRulesFiles().get(RULES).add(userRule);
                             System.out.println("Rescanning /usr/share/maven-repo...");
@@ -744,7 +745,7 @@ public class DependenciesSolver {
                 }
             }
 
-            if (interactive && userInteraction.askYesNo("Try again to resolve the dependency?", true)) {
+            if (interactive && new YesNoQuestion("Try again to resolve the dependency?", true).ask()) {
                 System.out.println("Rescanning /usr/share/maven-repo...");
                 pomTransformer.getRepository().scan();
                 // Clear caches
diff --git a/maven-packager-utils/src/main/java/org/debian/maven/packager/GenerateDebianFilesMojo.java b/maven-packager-utils/src/main/java/org/debian/maven/packager/GenerateDebianFilesMojo.java
index 7b0ff72..796c764 100644
--- a/maven-packager-utils/src/main/java/org/debian/maven/packager/GenerateDebianFilesMojo.java
+++ b/maven-packager-utils/src/main/java/org/debian/maven/packager/GenerateDebianFilesMojo.java
@@ -16,20 +16,30 @@
 
 package org.debian.maven.packager;
 
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Properties;
+import java.util.Set;
+import java.util.StringTokenizer;
+import java.util.TreeSet;
+
+import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.model.Developer;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
-
-import java.io.*;
-import java.util.*;
-
-import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.project.MavenProject;
 import org.apache.velocity.VelocityContext;
 import org.apache.velocity.app.Velocity;
+import org.debian.maven.packager.interaction.MultilineQuestion;
+import org.debian.maven.packager.interaction.SimpleQuestion;
 import org.debian.maven.packager.util.LicensesScanner;
 import org.debian.maven.packager.util.PackageScanner;
-import org.debian.maven.packager.util.UserInteraction;
 import org.debian.maven.repo.ListOfPOMs;
 
 /**
@@ -147,7 +157,6 @@ public class GenerateDebianFilesMojo extends AbstractMojo {
 
     private PackageScanner scanner = new PackageScanner(false);
     private LicensesScanner licensesScanner = new LicensesScanner();
-    private UserInteraction userInteraction = new UserInteraction();
 
     public void execute() throws MojoExecutionException {
         File f = outputDirectory;
@@ -183,10 +192,10 @@ public class GenerateDebianFilesMojo extends AbstractMojo {
             context.put("generateJavadoc", Boolean.valueOf(generateJavadoc));
 
             if (project.getName() == null || project.getName().isEmpty()) {
-                project.setName(userInteraction.ask("POM does not contain the project name. Please enter the name of the project:"));
+                project.setName(new SimpleQuestion("POM does not contain the project name. Please enter the name of the project:").ask());
             }
             if (project.getUrl() == null || project.getUrl().isEmpty()) {
-                project.setUrl(userInteraction.ask("POM does not contain the project URL. Please enter the URL of the project:"));
+                project.setUrl(new SimpleQuestion("POM does not contain the project URL. Please enter the URL of the project:").ask());
             }
 
             Set<String> licenses = licensesScanner.discoverLicenses(project.getLicenses());
@@ -199,7 +208,7 @@ public class GenerateDebianFilesMojo extends AbstractMojo {
                 String q = "Packager license for the debian/ files was not found, please enter a license name preferably in one of:\n"
                  + "Apache Artistic BSD FreeBSD ISC CC-BY CC-BY-SA CC-BY-ND CC-BY-NC CC-BY-NC-SA CC-BY-NC-ND CC0 CDDL CPL Eiffel"
                  + "Expat GPL LGPL GFDL GFDL-NIV LPPL MPL Perl PSF QPL W3C-Software ZLIB Zope";
-                String s = userInteraction.ask(q);
+                String s = new SimpleQuestion(q).ask();
                 if (s.length() > 0) {
                     packagerLicense = s;
                 }
@@ -223,7 +232,7 @@ public class GenerateDebianFilesMojo extends AbstractMojo {
                 }
             }
             if (copyrightOwner == null || copyrightOwner.isEmpty()) {
-                copyrightOwner = userInteraction.ask("Could not find who owns the copyright for the upstream sources, please enter his name:");
+                copyrightOwner = new SimpleQuestion("Could not find who owns the copyright for the upstream sources, please enter his name:").ask();
             }
             context.put("copyrightOwner", copyrightOwner);
 
@@ -246,7 +255,7 @@ public class GenerateDebianFilesMojo extends AbstractMojo {
             context.put("currentYear", new Integer(currentYear));
 
             if (project.getDescription() == null || project.getDescription().trim().isEmpty()) {
-                project.setDescription(userInteraction.askMultiLine("Please enter a short description of the project, press Enter twice to stop."));
+                project.setDescription(new MultilineQuestion("Please enter a short description of the project, press Enter twice to stop.").ask());
             }
             context.put("description", formatDescription(project.getDescription()));
 
diff --git a/maven-packager-utils/src/main/java/org/debian/maven/packager/interaction/ChoiceQuestion.java b/maven-packager-utils/src/main/java/org/debian/maven/packager/interaction/ChoiceQuestion.java
new file mode 100644
index 0000000..56e59c4
--- /dev/null
+++ b/maven-packager-utils/src/main/java/org/debian/maven/packager/interaction/ChoiceQuestion.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2013 Emmanuel Bourg
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.debian.maven.packager.interaction;
+
+import java.util.Collection;
+
+/**
+ * A question with multiple choices.
+ * 
+ * @author Emmanuel Bourg
+ */
+public class ChoiceQuestion extends Question<Integer> {
+
+    private int defaultChoice;
+    private Collection<String> choices;
+
+    public ChoiceQuestion(String question, int defaultChoice, Collection<String> choices) {
+        super(question);
+        this.defaultChoice = defaultChoice;
+        this.choices = choices;
+    }
+
+    @Override
+    public Integer ask() {
+        Integer choice = null;
+        
+        // keep asking the question until a valid choice is entered
+        while (choice == null) {
+            println(question);
+            printChoices(choices);
+            print("> ");
+            String response = readLine();
+            if ("".equals(response.trim())) {
+                choice = defaultChoice;
+            } else {
+                try {
+                    int c = Integer.parseInt(response);
+                    if (c >= 0 && c < choices.size()) {
+                        choice = c;
+                    }
+                } catch (NumberFormatException e) {
+                }
+            }
+        }
+        
+        return choice;
+    }
+
+    private void printChoices(Collection<String> choices) {
+        int counter = 0;
+        for (String choice : choices) {
+            StringBuilder line = new StringBuilder();
+            if (counter == defaultChoice) {
+                line.append("[").append(counter).append("]");
+            } else {
+                line.append(" ").append(counter).append(" ");
+            }
+            line.append(" - ").append(choice);
+            println(line.toString());
+            ++counter;
+        }
+    }
+}
diff --git a/maven-packager-utils/src/main/java/org/debian/maven/packager/interaction/MultilineQuestion.java b/maven-packager-utils/src/main/java/org/debian/maven/packager/interaction/MultilineQuestion.java
new file mode 100644
index 0000000..daa0c01
--- /dev/null
+++ b/maven-packager-utils/src/main/java/org/debian/maven/packager/interaction/MultilineQuestion.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2013 Emmanuel Bourg
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.debian.maven.packager.interaction;
+
+/**
+ * Asks the user a question with a multi line response.
+ * The user finishes the response by entering two empty lines.
+ * 
+ * @author Emmanuel Bourg
+ */
+public class MultilineQuestion extends Question<String> {
+
+    public MultilineQuestion(String question) {
+        super(question);
+    }
+
+    @Override
+    public String ask() {
+        println(question);
+        
+        StringBuilder answer = new StringBuilder();
+        int emptyLineCount = 0;
+        while (emptyLineCount < 2) {
+            String line = readLine();
+            if (line.isEmpty()) {
+                emptyLineCount++;
+            } else {
+                if (emptyLineCount > 0) {
+                    emptyLineCount = 0;
+                    answer.append("\n");
+                }
+                answer.append(line);
+                answer.append("\n");
+            }
+        }
+        return answer.toString().trim();
+    }
+}
diff --git a/maven-packager-utils/src/main/java/org/debian/maven/packager/interaction/Question.java b/maven-packager-utils/src/main/java/org/debian/maven/packager/interaction/Question.java
new file mode 100644
index 0000000..edad8f7
--- /dev/null
+++ b/maven-packager-utils/src/main/java/org/debian/maven/packager/interaction/Question.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2013 Emmanuel Bourg
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.debian.maven.packager.interaction;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.PrintStream;
+import java.io.PrintWriter;
+
+/**
+ * A generic question.
+ * 
+ * @author Emmanuel Bourg
+ */
+public abstract class Question<T> {
+
+    protected String question;
+    private BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
+    private PrintWriter out = new PrintWriter(System.out, true);
+
+    protected Question(String question) {
+        this.question = question;
+    }
+
+    void setInput(BufferedReader in) {
+        this.in = in;
+    }
+
+    void setOutput(PrintWriter out) {
+        this.out = out;
+    }
+
+    protected String readLine() {
+        try {
+            String line = in.readLine();
+            return line != null ? line.trim() : "";
+        } catch (IOException e) {
+            e.printStackTrace();
+            return "";
+        }
+    }
+
+    protected void println(String text) {
+        out.println(text);
+    }
+
+    protected void print(String text) {
+        out.print(text);
+    }
+
+    /**
+     * Asks the question and returns the response.
+     */
+    public abstract T ask();
+}
diff --git a/maven-packager-utils/src/main/java/org/debian/maven/packager/interaction/SimpleQuestion.java b/maven-packager-utils/src/main/java/org/debian/maven/packager/interaction/SimpleQuestion.java
new file mode 100644
index 0000000..0ccaa30
--- /dev/null
+++ b/maven-packager-utils/src/main/java/org/debian/maven/packager/interaction/SimpleQuestion.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2013 Emmanuel Bourg
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.debian.maven.packager.interaction;
+
+/**
+ * Asks the user a question with a single line response.
+ * 
+ * @author Emmanuel Bourg
+ */
+public class SimpleQuestion extends Question<String> {
+
+    public SimpleQuestion(String question) {
+        super(question);
+    }
+
+    @Override
+    public String ask() {
+        println(question);
+        print("> ");
+        return readLine();
+    }
+}
diff --git a/maven-packager-utils/src/main/java/org/debian/maven/packager/interaction/YesNoQuestion.java b/maven-packager-utils/src/main/java/org/debian/maven/packager/interaction/YesNoQuestion.java
new file mode 100644
index 0000000..fece63e
--- /dev/null
+++ b/maven-packager-utils/src/main/java/org/debian/maven/packager/interaction/YesNoQuestion.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2013 Emmanuel Bourg
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.debian.maven.packager.interaction;
+
+/**
+ * A yes/no question. The question is asked again if the answer is not 'y', 'n',
+ * 'yes' or 'no'. The answer is case insensitive. A blank response returns
+ * the default choice.
+ * 
+ * @author Emmanuel Bourg
+ */
+public class YesNoQuestion extends Question<Boolean> {
+
+    private boolean defaultChoice;
+
+    public YesNoQuestion(String question, boolean defaultChoice) {
+        super(question);
+        this.defaultChoice = defaultChoice;
+    }
+
+    @Override
+    public Boolean ask() {
+        Boolean choice = null;
+        
+        // keep asking the question until a valid choice is entered
+        while (choice == null) {
+            println(question);
+            print("[");
+            print(defaultChoice ? "Y" : "y");
+            print("/");
+            print(defaultChoice ? "n" : "N");
+            print("]");
+            print(" > ");
+            String response = readLine();
+            if ("".equals(response.trim())) {
+                choice = defaultChoice;
+            } else if (response.equalsIgnoreCase("y") || response.equalsIgnoreCase("yes")) {
+                choice = true;
+            } else if (response.equalsIgnoreCase("n") || response.equalsIgnoreCase("no")) {
+                choice = false;
+            }
+        }
+        
+        return choice;
+    }
+}
diff --git a/maven-packager-utils/src/main/java/org/debian/maven/packager/util/IgnoreDependencyQuestions.java b/maven-packager-utils/src/main/java/org/debian/maven/packager/util/IgnoreDependencyQuestions.java
index 16147ab..f4c86a1 100644
--- a/maven-packager-utils/src/main/java/org/debian/maven/packager/util/IgnoreDependencyQuestions.java
+++ b/maven-packager-utils/src/main/java/org/debian/maven/packager/util/IgnoreDependencyQuestions.java
@@ -3,12 +3,12 @@ package org.debian.maven.packager.util;
 import java.util.Set;
 import java.util.TreeSet;
 
+import org.debian.maven.packager.interaction.YesNoQuestion;
 import org.debian.maven.repo.Dependency;
 
 public class IgnoreDependencyQuestions {
 
     private Set<Dependency> notIgnoredDependencies = new TreeSet<Dependency>();
-    private final UserInteraction userInteraction;
     private final boolean interactive;
 
     // Plugins not useful for the build or whose use is against the
@@ -105,9 +105,8 @@ public class IgnoreDependencyQuestions {
     };
 
 
-    public IgnoreDependencyQuestions(UserInteraction userInteraction, boolean interactive) {
+    public IgnoreDependencyQuestions(boolean interactive) {
         this.interactive = interactive;
-        this.userInteraction = userInteraction;
     }
 
 
@@ -131,8 +130,8 @@ public class IgnoreDependencyQuestions {
         if (!interactive || notIgnoredDependencies.contains(dependency)) {
             return false;
         }
-        String q = "\n" + "In " + sourcePomLoc + ":" + message + "  " + dependency;
-        boolean ignore = userInteraction.askYesNo(q, defaultToIgnore);
+        String question = "\n" + "In " + sourcePomLoc + ":" + message + "  " + dependency;
+        boolean ignore = new YesNoQuestion(question, defaultToIgnore).ask();
         if (!ignore) {
             notIgnoredDependencies.add(dependency);
         }
diff --git a/maven-packager-utils/src/main/java/org/debian/maven/packager/util/LicensesScanner.java b/maven-packager-utils/src/main/java/org/debian/maven/packager/util/LicensesScanner.java
index f81edd0..c7d2591 100644
--- a/maven-packager-utils/src/main/java/org/debian/maven/packager/util/LicensesScanner.java
+++ b/maven-packager-utils/src/main/java/org/debian/maven/packager/util/LicensesScanner.java
@@ -17,14 +17,13 @@
 package org.debian.maven.packager.util;
 
 import org.apache.maven.model.License;
+import org.debian.maven.packager.interaction.SimpleQuestion;
 
 import java.util.List;
 import java.util.Set;
 import java.util.TreeSet;
 
 public class LicensesScanner {
-    private final UserInteraction userInteraction = new UserInteraction();
-
     public Set<String> discoverLicenses(List<License> projectLicenses) {
         Set<String> licenses = new TreeSet<String>();
         for (License license : projectLicenses) {
@@ -38,9 +37,8 @@ public class LicensesScanner {
             }
             boolean recognized = recognizeLicense(licenses, licenseName, licenseUrl);
             if (!recognized) {
-                String question = "License " + licenseName + licenseUrl + " was not recognized, please enter a license name preferably in one of:"
-                 + getAvailableLicenses();
-                String s = userInteraction.ask(question);
+                String s = new SimpleQuestion("License " + licenseName + licenseUrl + " was not recognized, " +
+                                        "please enter a license name preferably in one of:" + getAvailableLicenses()).ask();
                 if (s.length() > 0) {
                     licenses.add(s);
                 }
@@ -55,9 +53,8 @@ public class LicensesScanner {
         for (String license : licenseResult.getLicenses()) {
             boolean recognized = recognizeLicense(licenses, license, "");
             if (!recognized) {
-                String question = "License " + license + " was not recognized, please enter a license name preferably in one of:"
-                 + getAvailableLicenses();
-                String s = userInteraction.ask(question);
+                String s = new SimpleQuestion("License " + license + " was not recognized, " +
+                                        "please enter a license name preferably in one of:" + getAvailableLicenses()).ask();
                 if (s.length() > 0) {
                     licenses.add(s);
                 }
@@ -65,9 +62,7 @@ public class LicensesScanner {
         }
 
         if (licenses.isEmpty()) {
-            String question = "License was not found, please enter a license name preferably in one of:"
-             + getAvailableLicenses();
-            String s = userInteraction.ask(question);
+            String s = new SimpleQuestion("License was not found, please enter a license name preferably in one of:" + getAvailableLicenses()).ask();
             if (s.length() > 0) {
                 licenses.add(s);
             }
diff --git a/maven-packager-utils/src/main/java/org/debian/maven/packager/util/UserInteraction.java b/maven-packager-utils/src/main/java/org/debian/maven/packager/util/UserInteraction.java
deleted file mode 100644
index aa3ff6d..0000000
--- a/maven-packager-utils/src/main/java/org/debian/maven/packager/util/UserInteraction.java
+++ /dev/null
@@ -1,123 +0,0 @@
-package org.debian.maven.packager.util;
-
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.LineNumberReader;
-import java.util.ArrayList;
-import java.util.List;
-
-public class UserInteraction {
-    private static final List<String> YESNO = new ArrayList<String>(2);
-    static {
-        YESNO.add("y");
-        YESNO.add("n");
-    }
-
-    private String readLine() {
-        LineNumberReader consoleReader = new LineNumberReader(new InputStreamReader(System.in));
-        try {
-            return consoleReader.readLine().trim();
-        } catch (IOException e) {
-            e.printStackTrace();
-            return "";
-        }
-    }
-
-    public String ask(String question) {
-        println(question);
-        print("> ");
-        return readLine();
-    }
-
-    public boolean askYesNo(String question, boolean defaultOpt) {
-        println(question);
-        print(formatChoicesShort(defaultOpt ? 0 : 1, YESNO));
-        print(" > ");
-        String response = readLine();
-        if ("".equals(response)) {
-            return defaultOpt;
-        } else {
-            return response.startsWith("y");
-        }
-    }
-
-    private String formatChoicesShort(int defaultOpt, Iterable<String> choices) {
-        StringBuilder sb = new StringBuilder();
-        int counter = 0;
-        for (String choice : choices) {
-            if (counter > 0) {
-                sb.append("/");
-            }
-            if (counter == defaultOpt) {
-                sb.append("[").append(choice).append("]");
-            } else {
-                sb.append(choice);
-            }
-            ++counter;
-        }
-        return sb.toString();
-    }
-
-    public int askChoices(String question, int defaultOpt, Iterable<String> choices) {
-        println(question);
-        print(formatChoicesLong(defaultOpt, choices));
-        print("> ");
-        String response = readLine();
-        if ("".equals(response)) {
-            return defaultOpt;
-        }
-        try {
-            return Integer.parseInt(response);
-        } catch (NumberFormatException e) {
-            return defaultOpt;
-        }
-    }
-
-    private String formatChoicesLong(int defaultOpt, Iterable<String> choices) {
-        StringBuilder sb = new StringBuilder();
-        int counter = 0;
-        for (String choice : choices) {
-            if (counter == defaultOpt) {
-                sb.append("[").append(counter).append("]");
-            } else {
-                sb.append(" ").append(counter).append(" ");
-            }
-            sb.append(" - ").append(choice).append("\n");
-            ++counter;
-        }
-        return sb.toString();
-    }
-
-    /**
-     * Asks the user a question with a multi line response.
-     *
-     * The user finishes the response by entering two empty lines.
-     */
-    public String askMultiLine(String question) {
-        println(question);
-        StringBuilder sb = new StringBuilder();
-        int emptyEnterCount = 0;
-        while (emptyEnterCount < 2) {
-            String s = readLine();
-            if (s.isEmpty()) {
-                emptyEnterCount++;
-            } else {
-                if (emptyEnterCount > 0) {
-                    emptyEnterCount = 0;
-                    sb.append("\n");
-                }
-                sb.append(s);
-                sb.append("\n");
-            }
-        }
-        return sb.toString();
-    }
-
-    private void println(String text) {
-        System.out.println(text);
-    }
-
-    private void print(String text) {
-        System.out.print(text);
-    }
-}
diff --git a/maven-packager-utils/src/test/java/org/debian/maven/packager/interaction/ChoiceQuestionTest.java b/maven-packager-utils/src/test/java/org/debian/maven/packager/interaction/ChoiceQuestionTest.java
new file mode 100644
index 0000000..5f7e02e
--- /dev/null
+++ b/maven-packager-utils/src/test/java/org/debian/maven/packager/interaction/ChoiceQuestionTest.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright 2013 Emmanuel Bourg
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.debian.maven.packager.interaction;
+
+import java.io.BufferedReader;
+import java.io.PrintWriter;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.util.Arrays;
+
+import junit.framework.TestCase;
+
+public class ChoiceQuestionTest extends TestCase {
+    
+    private String EOL = System.getProperty("line.separator");
+
+    public void testQuestion() {
+        StringWriter output = new StringWriter();
+
+        ChoiceQuestion question = new ChoiceQuestion("What's the color of your poney?",2, Arrays.asList("Red", "Green", "Blue"));
+        question.setInput(new BufferedReader(new StringReader("1\n")));
+        question.setOutput(new PrintWriter(output, true));
+
+        int answer = question.ask();
+
+        assertEquals("Question", "What's the color of your poney?" + EOL +
+                " 0  - Red" + EOL +
+                " 1  - Green" + EOL +
+                "[2] - Blue" + EOL +
+                "> ", output.toString());
+        assertEquals("Answer", 1, answer);
+    }
+
+    public void testDefaultChoice() {
+        StringWriter output = new StringWriter();
+
+        ChoiceQuestion question = new ChoiceQuestion("What's the color of your poney?",2, Arrays.asList("Red", "Green", "Blue"));
+        question.setInput(new BufferedReader(new StringReader("\n")));
+        question.setOutput(new PrintWriter(output, true));
+
+        int answer = question.ask();
+
+        assertEquals("Question", "What's the color of your poney?" + EOL +
+                " 0  - Red" + EOL +
+                " 1  - Green" + EOL +
+                "[2] - Blue" + EOL +
+                "> ", output.toString());
+        assertEquals("Answer", 2, answer);
+    }
+    
+    public void testOutOfRangeChoice() {
+        StringWriter output = new StringWriter();
+
+        ChoiceQuestion question = new ChoiceQuestion("What's the color of your poney?",1, Arrays.asList("Red", "Green", "Blue"));
+        question.setInput(new BufferedReader(new StringReader("3\n0\n")));
+        question.setOutput(new PrintWriter(output, true));
+
+        int answer = question.ask();
+
+        assertEquals("Question", "What's the color of your poney?" + EOL +
+                " 0  - Red" + EOL +
+                "[1] - Green" + EOL +
+                " 2  - Blue" + EOL +
+                "> " +
+                "What's the color of your poney?" + EOL +
+                " 0  - Red" + EOL +
+                "[1] - Green" + EOL +
+                " 2  - Blue" + EOL +
+                "> ", output.toString());
+        
+        assertEquals("Answer", 0, answer);
+    }
+
+    public void testNegativeChoice() {
+        StringWriter output = new StringWriter();
+
+        ChoiceQuestion question = new ChoiceQuestion("What's the color of your poney?",1, Arrays.asList("Red", "Green", "Blue"));
+        question.setInput(new BufferedReader(new StringReader("-1\n0\n")));
+        question.setOutput(new PrintWriter(output, true));
+
+        int answer = question.ask();
+
+        assertEquals("Question", "What's the color of your poney?" + EOL +
+                " 0  - Red" + EOL +
+                "[1] - Green" + EOL +
+                " 2  - Blue" + EOL +
+                "> " +
+                "What's the color of your poney?" + EOL +
+                " 0  - Red" + EOL +
+                "[1] - Green" + EOL +
+                " 2  - Blue" + EOL +
+                "> ", output.toString());
+        
+        assertEquals("Answer", 0, answer);
+    }
+
+    public void testNonNumericChoice() {
+        StringWriter output = new StringWriter();
+
+        ChoiceQuestion question = new ChoiceQuestion("What's the color of your poney?",1, Arrays.asList("Red", "Green", "Blue"));
+        question.setInput(new BufferedReader(new StringReader("X\n2\n")));
+        question.setOutput(new PrintWriter(output, true));
+
+        int answer = question.ask();
+
+        assertEquals("Question", "What's the color of your poney?" + EOL +
+                " 0  - Red" + EOL +
+                "[1] - Green" + EOL +
+                " 2  - Blue" + EOL +
+                "> " +
+                "What's the color of your poney?" + EOL +
+                " 0  - Red" + EOL +
+                "[1] - Green" + EOL +
+                " 2  - Blue" + EOL +
+                "> ", output.toString());
+        
+        assertEquals("Answer", 2, answer);
+    }
+}
diff --git a/maven-packager-utils/src/test/java/org/debian/maven/packager/interaction/MultilineQuestionTest.java b/maven-packager-utils/src/test/java/org/debian/maven/packager/interaction/MultilineQuestionTest.java
new file mode 100644
index 0000000..f174470
--- /dev/null
+++ b/maven-packager-utils/src/test/java/org/debian/maven/packager/interaction/MultilineQuestionTest.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2013 Emmanuel Bourg
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.debian.maven.packager.interaction;
+
+import java.io.BufferedReader;
+import java.io.PrintWriter;
+import java.io.StringReader;
+import java.io.StringWriter;
+
+import junit.framework.TestCase;
+
+public class MultilineQuestionTest extends TestCase {
+    
+    private String EOL = System.getProperty("line.separator");
+
+    public void testQuestion() throws Exception {
+        StringWriter output = new StringWriter();
+
+        MultilineQuestion question = new MultilineQuestion("What's your address?");
+        question.setInput(new BufferedReader(
+                new StringReader("\nSoftware in the Public Interest, Inc.\n" +
+                "P.O. Box 501248\n" +
+                "Indianapolis, IN 46250-6248\n" +
+                "United States\n\n")));
+        question.setOutput(new PrintWriter(output, true));
+
+        String answer = question.ask();
+
+        assertEquals("Question", "What's your address?" + EOL, output.toString());
+        assertEquals("Answer", "Software in the Public Interest, Inc.\n" +
+                "P.O. Box 501248\n" +
+                "Indianapolis, IN 46250-6248\n" + 
+                "United States", answer);
+    }
+}
diff --git a/maven-packager-utils/src/test/java/org/debian/maven/packager/interaction/SimpleQuestionTest.java b/maven-packager-utils/src/test/java/org/debian/maven/packager/interaction/SimpleQuestionTest.java
new file mode 100644
index 0000000..74e451e
--- /dev/null
+++ b/maven-packager-utils/src/test/java/org/debian/maven/packager/interaction/SimpleQuestionTest.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2013 Emmanuel Bourg
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.debian.maven.packager.interaction;
+
+import java.io.BufferedReader;
+import java.io.PrintWriter;
+import java.io.StringReader;
+import java.io.StringWriter;
+
+import junit.framework.TestCase;
+
+public class SimpleQuestionTest extends TestCase {
+
+    private String EOL = System.getProperty("line.separator");
+
+    public void testQuestion() throws Exception {
+        StringWriter output = new StringWriter();
+
+        SimpleQuestion question = new SimpleQuestion("What's your name?");
+        question.setInput(new BufferedReader(new StringReader("Emmanuel\n")));
+        question.setOutput(new PrintWriter(output, true));
+
+        String answer = question.ask();
+
+        assertEquals("Question", "What's your name?" + EOL + "> ", output.toString());
+        assertEquals("Answer", "Emmanuel", answer);
+    }
+}
diff --git a/maven-packager-utils/src/test/java/org/debian/maven/packager/interaction/YesNoQuestionTest.java b/maven-packager-utils/src/test/java/org/debian/maven/packager/interaction/YesNoQuestionTest.java
new file mode 100644
index 0000000..6374ba8
--- /dev/null
+++ b/maven-packager-utils/src/test/java/org/debian/maven/packager/interaction/YesNoQuestionTest.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2013 Emmanuel Bourg
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.debian.maven.packager.interaction;
+
+import java.io.BufferedReader;
+import java.io.PrintWriter;
+import java.io.StringReader;
+import java.io.StringWriter;
+
+import junit.framework.TestCase;
+
+public class YesNoQuestionTest extends TestCase {
+
+    private String EOL = System.getProperty("line.separator");
+
+    public void testQuestion() {
+        StringWriter output = new StringWriter();
+
+        YesNoQuestion question = new YesNoQuestion("Are you a Java programmer?", false);
+        question.setInput(new BufferedReader(new StringReader("y\n")));
+        question.setOutput(new PrintWriter(output, true));
+
+        boolean answer = question.ask();
+
+        assertEquals("Question", "Are you a Java programmer?" + EOL + "[y/N] > ", output.toString());
+        assertEquals("Answer", true, answer);
+    }
+
+    public void testDefaultChoice() {
+        StringWriter output = new StringWriter();
+
+        YesNoQuestion question = new YesNoQuestion("Are you a Java programmer?", true);
+        question.setInput(new BufferedReader(new StringReader("\n")));
+        question.setOutput(new PrintWriter(output, true));
+
+        boolean answer = question.ask();
+
+        assertEquals("Question", "Are you a Java programmer?" + EOL + "[Y/n] > ", output.toString());
+        assertEquals("Answer", true, answer);
+    }
+
+    public void testWrongAnswer() {
+        StringWriter output = new StringWriter();
+
+        YesNoQuestion question = new YesNoQuestion("Are you a Java programmer?", true);
+        question.setInput(new BufferedReader(new StringReader("X\nno\n")));
+        question.setOutput(new PrintWriter(output, true));
+
+        boolean answer = question.ask();
+
+        assertEquals("Question", "Are you a Java programmer?" + EOL + "[Y/n] > " +
+                                 "Are you a Java programmer?" + EOL + "[Y/n] > ", output.toString());
+        assertEquals("Answer", false, answer);
+    }
+
+    public void testUpperCaseAnswer() {
+        StringWriter output = new StringWriter();
+
+        YesNoQuestion question = new YesNoQuestion("Are you a Java programmer?", false);
+        question.setInput(new BufferedReader(new StringReader("YES\n")));
+        question.setOutput(new PrintWriter(output, true));
+
+        boolean answer = question.ask();
+
+        assertEquals("Question", "Are you a Java programmer?" + EOL + "[y/N] > ", output.toString());
+        assertEquals("Answer", true, answer);
+    }
+}

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/maven-debian-helper.git



More information about the pkg-java-commits mailing list