View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  
20  package org.apache.maven.archetype.ui;
21  
22  //import org.apache.maven.archetype.common.Archetype;
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  /** @plexus.component */
32  public class DefaultArchetypeSelectionQueryer
33      extends AbstractLogEnabled
34      implements ArchetypeSelectionQueryer
35  {
36      /** @plexus.requirement role-hint="archetype" */
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                     // the version is not tested. This is intentional.
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 //    public String selectGroup( List groups )
200 //        throws
201 //        PrompterException
202 //    {
203 //        String query = "Choose group:\n";
204 //        Map answerMap = new HashMap();
205 //        List answers = new ArrayList();
206 //        Iterator groupIterator = groups.iterator();
207 //        int counter = 1;
208 //        while ( groupIterator.hasNext() )
209 //        {
210 //            String group = (String) groupIterator.next();
211 //
212 //            answerMap.put( "" + counter, group );
213 //            query += "" + counter + ": " + group + "\n";
214 //            answers.add( "" + counter );
215 //
216 //            counter++;
217 //        }
218 //        query += "Choose a number: ";
219 //
220 //        String answer = prompter.prompt( query, answers );
221 //
222 //        return (String) answerMap.get( answer );
223 //    }
224 //
225 //    public Archetype selectArtifact( List archetypes )
226 //        throws
227 //        PrompterException
228 //    {
229 //        String query = "Choose archetype:\n";
230 //        Map answerMap = new HashMap();
231 //        List answers = new ArrayList();
232 //        Iterator archetypeIterator = archetypes.iterator();
233 //        int counter = 1;
234 //        while ( archetypeIterator.hasNext() )
235 //        {
236 //            Archetype archetype = (Archetype) archetypeIterator.next();
237 //
238 //            answerMap.put( "" + counter, archetype );
239 //            query +=
240 //                "" + counter + ": " + archetype.getName() + " (" + archetype.getGroupId() + ":"
241 //                    + archetype.getArtifactId() + ")\n";
242 //            answers.add( "" + counter );
243 //
244 //            counter++;
245 //        }
246 //        query += "Choose a number: ";
247 //
248 //        String answer = prompter.prompt( query, answers );
249 //
250 //        return (Archetype) answerMap.get( answer );
251 //    }
252 //
253 //    public String selectVersion( List archetypeVersions )
254 //        throws
255 //        PrompterException
256 //    {
257 //        String query = "Choose version: \n";
258 //        Map answerMap = new HashMap();
259 //        List answers = new ArrayList();
260 //
261 //        Iterator archetypeVersionsKeys = archetypeVersions.iterator();
262 //        int counter = 1;
263 //        while ( archetypeVersionsKeys.hasNext() )
264 //        {
265 //            String archetypeVersion = (String) archetypeVersionsKeys.next();
266 //
267 //            answerMap.put( "" + counter, archetypeVersion );
268 //            query += "" + counter + ": " + archetypeVersion + "\n";
269 //            answers.add( "" + counter );
270 //
271 //            counter++;
272 //        }
273 //        query += "Choose a number: ";
274 //
275 //        String answer = prompter.prompt( query, answers );
276 //
277 //        return (String) answerMap.get( answer );
278 //    }
279 
280     public void setPrompter( Prompter prompter )
281     {
282         this.prompter = prompter;
283     }
284 }