1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.maven.archetype.ui;
21
22
23 import org.apache.maven.archetype.catalog.Archetype;
24 import org.apache.maven.archetype.common.ArchetypeDefinition;
25 import org.codehaus.plexus.components.interactivity.Prompter;
26 import org.codehaus.plexus.components.interactivity.PrompterException;
27 import org.codehaus.plexus.logging.AbstractLogEnabled;
28
29 import java.util.*;
30
31
32 public class DefaultArchetypeSelectionQueryer
33 extends AbstractLogEnabled
34 implements ArchetypeSelectionQueryer
35 {
36
37 private Prompter prompter;
38
39 public boolean confirmSelection( ArchetypeDefinition archetypeDefinition )
40 throws PrompterException
41 {
42 String query =
43 "Confirm archetype selection: \n" + archetypeDefinition.getGroupId() + "/" + archetypeDefinition.getName()
44 + "\n";
45
46 String answer = prompter.prompt( query, Arrays.asList( new String[] { "Y", "N" } ), "Y" );
47
48 return "Y".equalsIgnoreCase( answer );
49 }
50
51 public Archetype selectArchetype( List archetypes )
52 throws PrompterException
53 {
54 String query = "Choose archetype:\n";
55 Map answerMap = new HashMap();
56 List answers = new ArrayList();
57 int counter = 1;
58
59 for ( Iterator archetypeIterator = archetypes.iterator(); archetypeIterator.hasNext(); )
60 {
61 org.apache.maven.archetype.catalog.Archetype archetype =
62 (org.apache.maven.archetype.catalog.Archetype) archetypeIterator.next();
63
64 answerMap.put( "" + counter, archetype );
65 query +=
66 "" + counter + ": " + archetype.getArtifactId() + " (" + archetype.getDescription() + ":"
67 + archetype.getArtifactId() + ")\n";
68 answers.add( "" + counter );
69
70 counter++;
71 }
72 query += "Choose a number: ";
73
74 String answer = prompter.prompt( query, answers );
75
76 return (org.apache.maven.archetype.catalog.Archetype) answerMap.get( answer );
77 }
78
79 public Archetype selectArchetype( Map catalogs )
80 throws PrompterException
81 {
82 return selectArchetype( catalogs, null );
83 }
84
85 public Archetype selectArchetype( Map catalogs, ArchetypeDefinition defaultDefinition )
86 throws PrompterException
87 {
88 String query = "Choose archetype:\n";
89 Map archetypeAnswerMap = new HashMap();
90 Map reversedArchetypeAnswerMap = new HashMap();
91 List answers = new ArrayList();
92 List archetypeVersions;
93 int counter = 1;
94 int defaultSelection = 0;
95
96 for ( Iterator catalogIterator = catalogs.keySet().iterator(); catalogIterator.hasNext(); )
97 {
98 String catalog = (String) catalogIterator.next();
99
100 for ( Iterator archetypeIterator = ( (List) catalogs.get( catalog ) ).iterator();
101 archetypeIterator.hasNext(); )
102 {
103 org.apache.maven.archetype.catalog.Archetype archetype =
104 (org.apache.maven.archetype.catalog.Archetype) archetypeIterator.next();
105
106 String mapKey = "" + counter;
107 String archetypeKey = archetype.getGroupId() + ":" + archetype.getArtifactId();
108 if ( reversedArchetypeAnswerMap.containsKey( archetypeKey ) )
109 {
110 mapKey = (String) reversedArchetypeAnswerMap.get( archetypeKey );
111 archetypeVersions = (List) archetypeAnswerMap.get( mapKey );
112 }
113 else
114 {
115 archetypeVersions = new ArrayList();
116 archetypeAnswerMap.put( mapKey, archetypeVersions );
117 reversedArchetypeAnswerMap.put( archetypeKey, mapKey );
118 query +=
119 mapKey + ": " + catalog +
120 " -> " + archetype.getArtifactId() + " (" + archetype.getDescription() + ")\n";
121 answers.add( mapKey );
122
123
124 if ( defaultDefinition != null && archetype.getGroupId().equals( defaultDefinition.getGroupId() )
125 && archetype.getArtifactId().equals( defaultDefinition.getArtifactId() ) )
126 {
127 defaultSelection = counter;
128 }
129
130 counter++;
131 }
132 archetypeVersions.add( archetype );
133 }
134
135 }
136
137 query += "Choose a number: ";
138
139 String answer;
140 if ( defaultSelection == 0 )
141 {
142 answer = prompter.prompt( query, answers );
143 }
144 else
145 {
146 answer = prompter.prompt( query, answers, Integer.toString( defaultSelection ) );
147 }
148
149 archetypeVersions = (List) archetypeAnswerMap.get( answer );
150
151 if ( archetypeVersions.size() == 1 )
152 {
153 return (org.apache.maven.archetype.catalog.Archetype) archetypeVersions.get( 0 );
154 }
155 else
156 {
157 return selectVersion( archetypeVersions );
158 }
159 }
160
161 private org.apache.maven.archetype.catalog.Archetype selectVersion( List archetypes )
162 throws PrompterException
163 {
164 String query = "Choose version: \n";
165 Map answerMap = new HashMap();
166 List answers = new ArrayList();
167
168 Collections.sort( archetypes, new Comparator()
169 {
170 public int compare( Object o1, Object o2 )
171 {
172 org.apache.maven.archetype.catalog.Archetype a1 = (org.apache.maven.archetype.catalog.Archetype) o1;
173 org.apache.maven.archetype.catalog.Archetype a2 = (org.apache.maven.archetype.catalog.Archetype) o2;
174 return a1.getVersion().compareTo( a2.getVersion() );
175 }
176 } );
177
178 int counter = 1;
179 for ( Iterator archetypeVersionsKeys = archetypes.iterator(); archetypeVersionsKeys.hasNext(); )
180 {
181 org.apache.maven.archetype.catalog.Archetype archetype =
182 (org.apache.maven.archetype.catalog.Archetype) archetypeVersionsKeys.next();
183 String archetypeVersion = archetype.getVersion();
184
185 answerMap.put( "" + counter, archetype );
186 query += "" + counter + ": " + archetypeVersion + "\n";
187 answers.add( "" + counter );
188
189 counter++;
190 }
191 query += "Choose a number: ";
192
193 String answer = prompter.prompt( query, answers );
194
195 return (Archetype) answerMap.get( answer );
196 }
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280 public void setPrompter( Prompter prompter )
281 {
282 this.prompter = prompter;
283 }
284 }