1   package com.atlassian.maven.plugins.amps.codegen;
2   
3   import java.util.*;
4   
5   import com.atlassian.plugins.codegen.modules.PluginModuleCreator;
6   
7   import org.apache.commons.lang.StringUtils;
8   import org.codehaus.plexus.components.interactivity.Prompter;
9   import org.codehaus.plexus.components.interactivity.PrompterException;
10  import org.codehaus.plexus.logging.AbstractLogEnabled;
11  
12  import jline.ANSIBuffer;
13  
14  /**
15   *
16   */
17  public class DefaultPluginModuleSelectionQueryer extends AbstractLogEnabled implements PluginModuleSelectionQueryer
18  {
19      public static final List<String> YN_ANSWERS = new ArrayList<String>(Arrays.asList("Y", "y", "N", "n"));
20      private Prompter prompter;
21      private boolean useAnsiColor;
22  
23      public DefaultPluginModuleSelectionQueryer()
24      {
25          String mavencolor = System.getenv("MAVEN_COLOR");
26          if (mavencolor != null && !mavencolor.equals(""))
27          {
28              useAnsiColor = Boolean.parseBoolean(mavencolor);
29          } else
30          {
31              useAnsiColor = false;
32          }
33      }
34  
35      @Override
36      public PluginModuleCreator selectModule(Map<Class, PluginModuleCreator> map) throws PrompterException
37      {
38  
39          if (useAnsiColor)
40          {
41              return getAnsiModule(map);
42          } else
43          {
44              return getPlainModule(map);
45          }
46      }
47  
48      private PluginModuleCreator getAnsiModule(Map<Class, PluginModuleCreator> map) throws PrompterException
49      {
50          ANSIBuffer query = new ANSIBuffer();
51          query.bold("Choose Plugin Module:\n");
52  
53          List<String> answers = new ArrayList<String>();
54          Map<String, PluginModuleCreator> moduleAnswerMap = new HashMap<String, PluginModuleCreator>();
55  
56          int counter = 1;
57  
58          for (Map.Entry<Class, PluginModuleCreator> entry : map.entrySet())
59          {
60              PluginModuleCreator moduleCreator = entry.getValue();
61  
62              String answer = String.valueOf(counter);
63              query.bold(answer);
64              if (counter < 10)
65              {
66                  query.append(":  ");
67              } else
68              {
69                  query.append(": ");
70              }
71              query.append(entry.getValue()
72                      .getModuleName() + "\n");
73  
74              answers.add(answer);
75  
76              moduleAnswerMap.put(answer, moduleCreator);
77  
78              counter++;
79          }
80  
81          query.bold("Choose a number");
82  
83          String answer = prompter.prompt(query.toString(), answers);
84  
85          PluginModuleCreator selection = moduleAnswerMap.get(answer);
86  
87          return selection;
88      }
89  
90      private PluginModuleCreator getPlainModule(Map<Class, PluginModuleCreator> map) throws PrompterException
91      {
92          StringBuilder query = new StringBuilder("Choose Plugin Module:\n");
93  
94          List<String> answers = new ArrayList<String>();
95          Map<String, PluginModuleCreator> moduleAnswerMap = new HashMap<String, PluginModuleCreator>();
96  
97          int counter = 1;
98  
99          for (Map.Entry<Class, PluginModuleCreator> entry : map.entrySet())
100         {
101             PluginModuleCreator moduleCreator = entry.getValue();
102 
103             String answer = String.valueOf(counter);
104             if (counter < 10)
105             {
106                 query.append(answer + ":  ");
107             } else
108             {
109                 query.append(answer + ": ");
110             }
111             query.append(entry.getValue()
112                     .getModuleName() + "\n");
113 
114             answers.add(answer);
115 
116             moduleAnswerMap.put(answer, moduleCreator);
117 
118             counter++;
119         }
120 
121         query.append("Choose a number");
122 
123         String answer = prompter.prompt(query.toString(), answers);
124 
125         PluginModuleCreator selection = moduleAnswerMap.get(answer);
126 
127         return selection;
128     }
129 
130     @Override
131     public boolean addAnotherModule() throws PrompterException
132     {
133         return promptForBoolean("Add Another Plugin Module?", "N");
134     }
135 
136     public void setPrompter(Prompter prompter)
137     {
138         this.prompter = prompter;
139     }
140 
141     protected boolean promptForBoolean(String message, String defaultValue) throws PrompterException
142     {
143         String answer;
144         boolean bool;
145         if (StringUtils.isBlank(defaultValue))
146         {
147             answer = prompter.prompt(message, YN_ANSWERS);
148         } else
149         {
150             answer = prompter.prompt(message, YN_ANSWERS, defaultValue);
151         }
152 
153         if ("y".equals(answer.toLowerCase()))
154         {
155             bool = true;
156         } else
157         {
158             bool = false;
159         }
160 
161         return bool;
162     }
163 }