1   package org.apache.maven.archetype.ui;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import org.apache.maven.archetype.ArchetypeGenerationRequest;
23  import org.apache.maven.archetype.catalog.Archetype;
24  import org.apache.maven.archetype.common.ArchetypeDefinition;
25  import org.apache.maven.archetype.exception.ArchetypeNotDefined;
26  import org.apache.maven.archetype.exception.ArchetypeSelectionFailure;
27  import org.apache.maven.archetype.exception.UnknownArchetype;
28  import org.apache.maven.archetype.exception.UnknownGroup;
29  import org.codehaus.plexus.PlexusTestCase;
30  import org.codehaus.plexus.components.interactivity.PrompterException;
31  import org.easymock.AbstractMatcher;
32  import org.easymock.ArgumentsMatcher;
33  import org.easymock.MockControl;
34  
35  import java.io.IOException;
36  import java.util.Collections;
37  import java.util.Map;
38  
39  public class DefaultArchetypeSelectorTest
40      extends PlexusTestCase
41  {
42      private DefaultArchetypeSelector selector;
43  
44      public void setUp()
45          throws Exception
46      {
47          super.setUp();
48  
49          selector = (DefaultArchetypeSelector) lookup( ArchetypeSelector.ROLE );
50      }
51  
52      public void testArchetypeCoordinatesInRequest()
53          throws PrompterException, IOException, UnknownGroup, ArchetypeSelectionFailure, UnknownArchetype,
54          ArchetypeNotDefined
55      {
56          ArchetypeGenerationRequest request = new ArchetypeGenerationRequest();
57          request.setArchetypeArtifactId( "preset-artifactId" );
58          request.setArchetypeGroupId( "preset-groupId" );
59          request.setArchetypeVersion( "preset-version" );
60  
61          MockControl control = MockControl.createControl( ArchetypeSelectionQueryer.class );
62  
63          ArchetypeSelectionQueryer queryer = (ArchetypeSelectionQueryer) control.getMock();
64          // expect it to not be called
65  
66          control.replay();
67  
68          selector.setArchetypeSelectionQueryer( queryer );
69  
70          selector.selectArchetype( request, Boolean.TRUE, "" );
71  
72          control.verify();
73  
74          assertEquals( "preset-groupId", request.getArchetypeGroupId() );
75          assertEquals( "preset-artifactId", request.getArchetypeArtifactId() );
76          assertEquals( "preset-version", request.getArchetypeVersion() );
77      }
78  
79      public void testArchetypeArtifactIdInRequest()
80          throws PrompterException, IOException, UnknownGroup, ArchetypeSelectionFailure, UnknownArchetype,
81          ArchetypeNotDefined
82      {
83          ArchetypeGenerationRequest request = new ArchetypeGenerationRequest();
84          request.setArchetypeArtifactId( "preset-artifactId" );
85  
86          MockControl control = MockControl.createControl( ArchetypeSelectionQueryer.class );
87  
88          ArchetypeSelectionQueryer queryer = (ArchetypeSelectionQueryer) control.getMock();
89          // expect it to not be called
90  
91          control.replay();
92  
93          selector.setArchetypeSelectionQueryer( queryer );
94  
95          selector.selectArchetype( request, Boolean.TRUE, "" );
96  
97          control.verify();
98  
99          assertEquals( DefaultArchetypeSelector.DEFAULT_ARCHETYPE_GROUPID, request.getArchetypeGroupId() );
100         assertEquals( "preset-artifactId", request.getArchetypeArtifactId() );
101         assertEquals( DefaultArchetypeSelector.DEFAULT_ARCHETYPE_VERSION, request.getArchetypeVersion() );
102     }
103 
104     public void testArchetypeArtifactIdNotInRequest()
105         throws PrompterException, IOException, UnknownGroup, ArchetypeSelectionFailure, UnknownArchetype,
106         ArchetypeNotDefined
107     {
108         ArchetypeGenerationRequest request = new ArchetypeGenerationRequest();
109 
110         MockControl control = MockControl.createControl( ArchetypeSelectionQueryer.class );
111 
112         ArchetypeSelectionQueryer queryer = (ArchetypeSelectionQueryer) control.getMock();
113         queryer.selectArchetype( Collections.EMPTY_MAP, new ArchetypeDefinition() );
114         control.setMatcher( MockControl.ALWAYS_MATCHER );
115         Archetype archetype = new Archetype();
116         archetype.setArtifactId( "set-artifactId" );
117         archetype.setGroupId( "set-groupId" );
118         archetype.setVersion( "set-version" );
119         control.setReturnValue( archetype );
120 
121         control.replay();
122 
123         selector.setArchetypeSelectionQueryer( queryer );
124 
125         selector.selectArchetype( request, Boolean.TRUE, "" );
126 
127         control.verify();
128 
129         assertEquals( "set-groupId", request.getArchetypeGroupId() );
130         assertEquals( "set-artifactId", request.getArchetypeArtifactId() );
131         assertEquals( "set-version", request.getArchetypeVersion() );
132     }
133 
134     public void testArchetypeNotInRequestDefaultsInBatchMode()
135         throws PrompterException, IOException, UnknownGroup, ArchetypeSelectionFailure, UnknownArchetype,
136         ArchetypeNotDefined
137     {
138         ArchetypeGenerationRequest request = new ArchetypeGenerationRequest();
139 
140         MockControl control = MockControl.createControl( ArchetypeSelectionQueryer.class );
141 
142         ArchetypeSelectionQueryer queryer = (ArchetypeSelectionQueryer) control.getMock();
143         // expect it to not be called
144 
145         control.replay();
146 
147         selector.setArchetypeSelectionQueryer( queryer );
148 
149         selector.selectArchetype( request, Boolean.FALSE, "" );
150 
151         control.verify();
152 
153         assertEquals( DefaultArchetypeSelector.DEFAULT_ARCHETYPE_GROUPID, request.getArchetypeGroupId() );
154         assertEquals( DefaultArchetypeSelector.DEFAULT_ARCHETYPE_ARTIFACTID, request.getArchetypeArtifactId() );
155         assertEquals( DefaultArchetypeSelector.DEFAULT_ARCHETYPE_VERSION, request.getArchetypeVersion() );
156     }
157 
158     public void testArchetypeNotInRequestDefaults()
159         throws PrompterException, IOException, UnknownGroup, ArchetypeSelectionFailure, UnknownArchetype,
160         ArchetypeNotDefined
161     {
162         ArchetypeGenerationRequest request = new ArchetypeGenerationRequest();
163 
164         MockControl control = MockControl.createControl( ArchetypeSelectionQueryer.class );
165 
166         ArchetypeSelectionQueryer queryer = (ArchetypeSelectionQueryer) control.getMock();
167         queryer.selectArchetype( Collections.EMPTY_MAP, createDefaultArchetypeDefinition() );
168         control.setMatcher( createArgumentMatcher() );
169         Archetype archetype = new Archetype();
170         archetype.setArtifactId( "set-artifactId" );
171         archetype.setGroupId( "set-groupId" );
172         archetype.setVersion( "set-version" );
173         control.setReturnValue( archetype );
174 
175         control.replay();
176 
177         selector.setArchetypeSelectionQueryer( queryer );
178 
179         selector.selectArchetype( request, Boolean.TRUE, "" );
180 
181         control.verify();
182 
183         assertEquals( "set-groupId", request.getArchetypeGroupId() );
184         assertEquals( "set-artifactId", request.getArchetypeArtifactId() );
185         assertEquals( "set-version", request.getArchetypeVersion() );
186     }
187 
188     private ArchetypeDefinition createDefaultArchetypeDefinition()
189     {
190         ArchetypeDefinition definition = new ArchetypeDefinition();
191         definition.setGroupId( DefaultArchetypeSelector.DEFAULT_ARCHETYPE_GROUPID );
192         definition.setArtifactId( DefaultArchetypeSelector.DEFAULT_ARCHETYPE_ARTIFACTID );
193         definition.setVersion( DefaultArchetypeSelector.DEFAULT_ARCHETYPE_VERSION );
194         return definition;
195     }
196 
197     private static ArgumentsMatcher createArgumentMatcher()
198     {
199         return new AbstractMatcher()
200         {
201             protected boolean argumentMatches( Object o, Object o1 )
202             {
203                 return !( o instanceof ArchetypeDefinition ) ||
204                     compareArchetypeDefinition( (ArchetypeDefinition) o, (ArchetypeDefinition) o1 );
205             }
206 
207             private boolean compareArchetypeDefinition( ArchetypeDefinition o, ArchetypeDefinition o1 )
208             {
209                 if ( o1 == o )
210                 {
211                     return true;
212                 }
213                 if ( o == null )
214                 {
215                     return false;
216                 }
217 
218                 if ( o1.getArtifactId() != null
219                     ? !o1.getArtifactId().equals( o.getArtifactId() )
220                     : o.getArtifactId() != null )
221                 {
222                     return false;
223                 }
224                 if ( o1.getGroupId() != null ? !o1.getGroupId().equals( o.getGroupId() ) : o.getGroupId() != null )
225                 {
226                     return false;
227                 }
228                 if ( o1.getName() != null ? !o1.getName().equals( o.getName() ) : o.getName() != null )
229                 {
230                     return false;
231                 }
232                 if ( o1.getVersion() != null ? !o1.getVersion().equals( o.getVersion() ) : o.getVersion() != null )
233                 {
234                     return false;
235                 }
236                 if ( o1.getGoals() != null ? !o1.getGoals().equals( o.getGoals() ) : o.getGoals() != null )
237                 {
238                     return false;
239                 }
240                 if ( o1.getRepository() != null
241                     ? !o1.getRepository().equals( o.getRepository() )
242                     : o.getRepository() != null )
243                 {
244                     return false;
245                 }
246 
247                 return true;
248             }
249 
250             protected String argumentToString( Object o )
251             {
252                 return o instanceof Map ? "..." : toString( (ArchetypeDefinition) o );
253             }
254 
255             private String toString( ArchetypeDefinition archetypeDefinition )
256             {
257                 return "groupId = " + archetypeDefinition.getGroupId() + ", " + "artifactId = " +
258                     archetypeDefinition.getArtifactId() + ", " + "version = " + archetypeDefinition.getVersion();
259             }
260         };
261     }
262 }