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 }