]> source.dussan.org Git - archiva.git/blob
f35a7b0d064f3d4162e011315d8157915a71b737
[archiva.git] /
1 package org.apache.maven.archiva.plugins.dev.testgen;
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.commons.collections.CollectionUtils;
23 import org.apache.commons.collections.Predicate;
24 import org.apache.commons.collections.iterators.EnumerationIterator;
25 import org.apache.maven.archiva.plugins.dev.functors.MatchingDependencyPredicate;
26 import org.apache.maven.artifact.InvalidArtifactRTException;
27 import org.apache.maven.model.Dependency;
28 import org.apache.maven.model.DistributionManagement;
29 import org.apache.maven.model.Exclusion;
30 import org.apache.maven.model.Model;
31 import org.apache.maven.model.Relocation;
32 import org.apache.maven.plugin.MojoExecutionException;
33 import org.codehaus.plexus.util.IOUtil;
34 import org.codehaus.plexus.util.StringUtils;
35
36 import java.io.File;
37 import java.io.FileNotFoundException;
38 import java.io.PrintWriter;
39 import java.util.HashSet;
40 import java.util.Iterator;
41 import java.util.Set;
42
43 /**
44  * MemoryRepositoryCreator 
45  *
46  * @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a>
47  * @version $Id$
48  */
49 public class MemoryRepositoryCreator
50     extends AbstractCreator
51 {
52     private File outputFile;
53
54     private PrintWriter out;
55
56     private int modelsProcessed = 0;
57
58     public void create( String classPrefix )
59         throws MojoExecutionException
60     {
61         getLog().info( "Generating " + classPrefix + "MemoryRepository.java ..." );
62         getLog().info( "Please be patient, this can take a few minutes ..." );
63
64         modelsProcessed = 0;
65
66         outputFile = new File( outputDir, classPrefix + "MemoryRepository.java" );
67         try
68         {
69             out = new PrintWriter( outputFile );
70         }
71         catch ( FileNotFoundException e )
72         {
73             throw new MojoExecutionException( "Unable to open file " + outputFile.getName() + " for output: "
74                 + e.getMessage(), e );
75         }
76
77         try
78         {
79             out.println( "package org.apache.maven.archiva.dependency.graph;" );
80             out.println( "" );
81
82             writeLicense( out );
83
84             // Imports
85             out.println( "import org.apache.maven.archiva.model.ArchivaProjectModel;" );
86             out.println( "import org.apache.maven.archiva.model.Dependency;" );
87             out.println( "import org.apache.maven.archiva.model.VersionedReference;" );
88             out.println( "" );
89
90             String projectKey = toKey( project.getModel() );
91
92             writeJavadoc( classPrefix + "MemoryRepository", projectKey );
93
94             // The class itself.
95             out.println( "public class " + classPrefix + "MemoryRepository" );
96             out.println( "   extends AbstractMemoryRepository" );
97             out.println( "{" );
98
99             writeTest();
100
101             out.println( "}" );
102         }
103         finally
104         {
105             out.flush();
106             IOUtil.close( out );
107         }
108
109     }
110
111     private void writeJavadoc( String classname, String projectKey )
112     {
113         out.println( "/**" );
114         out.println( " * " + classname );
115         out.println( " * " );
116         out.println( " * MemoryRepository for testing <code>" + projectKey + "</code>" );
117         out.println( " *" );
118         out.println( " * Generated by <code>archivadev:generate-dependency-tests</code> plugin" );
119         out.println( " * @version $Id$" );
120         out.println( " */" );
121     }
122
123     private void writeTest()
124     {
125         out.println( "   public void initialize()" );
126         out.println( "   {" );
127         out.println( "      ArchivaProjectModel model;" );
128         out.println( "      Dependency dep;" );
129         out.println( "" );
130
131         Set seenModels = new HashSet();
132
133         writeModel( seenModels, project.getModel() );
134
135         getLog().info(
136                        "Processing done: Processed " + modelsProcessed + " models (" + seenModels.size()
137                            + " were unique)" );
138
139         out.println( "   }" );
140     }
141
142     private void writeModel( Set seenModels, Model model )
143     {
144         String projectKey = toKey( model );
145
146         modelsProcessed++;
147
148         if ( ( modelsProcessed % 100 ) == 0 )
149         {
150             getLog()
151                 .info( "Processed " + modelsProcessed + " models (" + seenModels.size() + " unique) ..." );
152         }
153
154         Relocation relocation = null;
155
156         if ( seenModels.contains( projectKey ) )
157         {
158             return;
159         }
160
161         seenModels.add( projectKey );
162
163         out.println( "      model = toModel( \"" + projectKey + "\" );" );
164
165         if ( model.getParent() != null )
166         {
167             String parentKey = toKey( model.getParent() );
168             out.println( "      model.setParentProject( toParent( \"" + parentKey + "\" ) );" );
169         }
170
171         if ( isNotEmpty( model.getDependencies() ) )
172         {
173             Iterator it = model.getDependencies().iterator();
174             while ( it.hasNext() )
175             {
176                 Dependency dep = applyDepMan( (Dependency) it.next(), model );
177
178                 writeAddDependency( "addDependency", dep );
179             }
180         }
181
182         if ( ( model.getDependencyManagement() != null )
183             && isNotEmpty( model.getDependencyManagement().getDependencies() ) )
184         {
185             Iterator it = model.getDependencyManagement().getDependencies().iterator();
186             while ( it.hasNext() )
187             {
188                 Dependency dep = (Dependency) it.next();
189
190                 writeAddDependency( "addDependencyManagement", dep );
191             }
192         }
193
194         if ( isNotEmpty( model.getProperties() ) )
195         {
196             Iterator it = new EnumerationIterator( model.getProperties().keys() );
197             while ( it.hasNext() )
198             {
199                 String key = (String) it.next();
200                 String value = model.getProperties().getProperty( key );
201                 out.println( "      model.addProperty( \"" + key + "\", \"" + value + "\" );" );
202             }
203         }
204
205         if ( model.getDistributionManagement() != null )
206         {
207             DistributionManagement distMgmt = model.getDistributionManagement();
208
209             if ( distMgmt.getRelocation() != null )
210             {
211                 relocation = distMgmt.getRelocation();
212
213                 out.println( "      model.setRelocation( new VersionedReference() );" );
214                 if ( StringUtils.isNotEmpty( relocation.getGroupId() ) )
215                 {
216                     out.println( "      model.getRelocation().setGroupId( \"" + relocation.getGroupId() + "\" );" );
217                 }
218                 if ( StringUtils.isNotEmpty( relocation.getArtifactId() ) )
219                 {
220                     out
221                         .println( "      model.getRelocation().setArtifactId( \"" + relocation.getArtifactId()
222                             + "\" );" );
223                 }
224                 if ( StringUtils.isNotEmpty( relocation.getVersion() ) )
225                 {
226                     out.println( "      model.getRelocation().setVersion( \"" + relocation.getVersion() + "\" );" );
227                 }
228             }
229         }
230
231         out.println( "      addModel( model );" );
232         out.println( "" );
233
234         if ( model.getParent() != null )
235         {
236             Model parentModel = getModel( model.getParent() );
237             writeModel( seenModels, parentModel );
238         }
239
240         if ( relocation != null )
241         {
242             Model relocatedModel = getModel( model, relocation );
243             writeModel( seenModels, relocatedModel );
244         }
245
246         writeModelDependencies( seenModels, projectKey, model );
247         writeModelDependencyManagement( seenModels, projectKey, model );
248     }
249
250     private Model getModel( Model model, Relocation relocation )
251     {
252         String groupId = relocation.getGroupId();
253         String artifactId = relocation.getArtifactId();
254         String version = relocation.getVersion();
255
256         // Set empty groupId.
257         if ( StringUtils.isEmpty( groupId ) )
258         {
259             groupId = model.getGroupId();
260
261             if ( StringUtils.isEmpty( groupId ) )
262             {
263                 if ( model.getParent() == null )
264                 {
265                     throw new IllegalStateException( "BAD POM: GroupId for relocation in " + toKey( model )
266                         + " cannot be determined, as there is no Parent Pom reference." );
267                 }
268
269                 groupId = model.getParent().getGroupId();
270             }
271         }
272
273         // Set empty artifactId.
274         if ( StringUtils.isEmpty( artifactId ) )
275         {
276             artifactId = model.getArtifactId();
277
278             if ( StringUtils.isEmpty( artifactId ) )
279             {
280                 if ( model.getParent() == null )
281                 {
282                     throw new IllegalStateException( "BAD POM: ArtifactId for relocation in " + toKey( model )
283                         + " cannot be determined, as there is no Parent Pom reference." );
284                 }
285
286                 artifactId = model.getParent().getArtifactId();
287             }
288         }
289
290         // Set empty version.
291         if ( StringUtils.isEmpty( version ) )
292         {
293             version = model.getVersion();
294
295             if ( StringUtils.isEmpty( version ) )
296             {
297                 if ( model.getParent() == null )
298                 {
299                     throw new IllegalStateException( "BAD POM: version for relocation in " + toKey( model )
300                         + " cannot be determined, as there is no Parent Pom reference." );
301                 }
302
303                 version = model.getParent().getVersion();
304             }
305         }
306
307         return getModel( groupId, artifactId, version, "pom" );
308     }
309
310     private void writeAddDependency( String addMethod, Dependency dep )
311     {
312         boolean useShortForm = true;
313         String depKey = toKey( dep );
314
315         useShortForm = isEmpty( dep.getExclusions() ) && !dep.isOptional();
316
317         String scopePart = "";
318
319         if ( isNotBlank( dep.getScope() ) )
320         {
321             scopePart = ", \"" + dep.getScope() + "\"";
322         }
323
324         if ( useShortForm )
325         {
326             out.println( "      model." + addMethod + "( toDependency( \"" + depKey + "\"" + scopePart + " ) );" );
327             return;
328         }
329
330         out.println( "      dep = toDependency( \"" + depKey + "\"" + scopePart + " );" );
331
332         if ( isNotEmpty( dep.getExclusions() ) )
333         {
334             Iterator it = dep.getExclusions().iterator();
335             while ( it.hasNext() )
336             {
337                 Exclusion exclusion = (Exclusion) it.next();
338                 String exkey = toKey( exclusion );
339                 out.println( "      addExclusion( dep, \"" + exkey + "\" );" );
340             }
341         }
342
343         if ( dep.isOptional() )
344         {
345             out.println( "      dep.setOptional( true );" );
346         }
347
348         out.println( "      model." + addMethod + "( dep );" );
349     }
350
351     private void writeModelDependencies( Set seenModels, String projectKey, Model model )
352     {
353         if ( model.getDependencies() == null )
354         {
355             return;
356         }
357
358         Iterator it = model.getDependencies().iterator();
359
360         while ( it.hasNext() )
361         {
362             Dependency dep = applyDepMan( (Dependency) it.next(), model );
363
364             Model rawModel = getModel( dep );
365
366             try
367             {
368                 writeModel( seenModels, rawModel );
369             }
370             catch ( InvalidArtifactRTException e )
371             {
372                 getLog().error(
373                                 "Encountered invalid dependency/artifact during [" + projectKey + "] : "
374                                     + e.getMessage(), e );
375                 throw e;
376             }
377         }
378     }
379
380     private void writeModelDependencyManagement( Set seenModels, String projectKey, Model model )
381     {
382         if ( model.getDependencyManagement() == null )
383         {
384             return;
385         }
386
387         Iterator it = model.getDependencyManagement().getDependencies().iterator();
388
389         while ( it.hasNext() )
390         {
391             Dependency dep = (Dependency) it.next();
392
393             Model rawModel = getModel( dep );
394
395             try
396             {
397                 writeModel( seenModels, rawModel );
398             }
399             catch ( InvalidArtifactRTException e )
400             {
401                 getLog().error(
402                                 "Encountered invalid dependency/artifact during [" + projectKey + "] : "
403                                     + e.getMessage(), e );
404                 throw e;
405             }
406         }
407     }
408
409     private Dependency applyDepMan( Dependency dependency, Model model )
410     {
411         if ( model.getDependencyManagement() != null )
412         {
413             if ( model.getDependencyManagement().getDependencies() != null )
414             {
415                 // Attempt to find matching dep.
416                 Predicate matchingDep = new MatchingDependencyPredicate( dependency );
417                 Dependency depman = (Dependency) CollectionUtils.find( model.getDependencyManagement()
418                     .getDependencies(), matchingDep );
419
420                 if ( depman != null )
421                 {
422                     dependency.setVersion( depman.getVersion() );
423                     dependency.setScope( StringUtils.defaultString( depman.getScope(), dependency.getScope() ) );
424
425                     // Found it!
426                     return dependency;
427                 }
428             }
429         }
430
431         if ( model.getParent() != null )
432         {
433             Model parentModel = getModel( model.getParent() );
434             return applyDepMan( dependency, parentModel );
435         }
436
437         return dependency;
438     }
439 }