View Javadoc
1   package org.apache.maven.archetype.generator;
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.exception.InvalidPackaging;
23  import org.apache.maven.archetype.old.OldArchetype;
24  import org.apache.maven.archetype.ArchetypeGenerationRequest;
25  import org.apache.maven.archetype.ArchetypeGenerationResult;
26  import org.apache.maven.archetype.common.ArchetypeArtifactManager;
27  import org.apache.maven.archetype.exception.ArchetypeException;
28  import org.apache.maven.archetype.exception.ArchetypeGenerationFailure;
29  import org.apache.maven.archetype.exception.ArchetypeNotDefined;
30  import org.apache.maven.archetype.exception.UnknownArchetype;
31  import org.apache.maven.artifact.repository.ArtifactRepository;
32  import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
33  import org.apache.maven.artifact.repository.MavenArtifactRepository;
34  import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
35  import org.codehaus.plexus.component.annotations.Component;
36  import org.codehaus.plexus.component.annotations.Requirement;
37  import org.codehaus.plexus.logging.AbstractLogEnabled;
38  import org.codehaus.plexus.util.StringUtils;
39  
40  import java.io.File;
41  import java.util.ArrayList;
42  import java.util.List;
43  
44  @Component( role = ArchetypeGenerator.class )
45  public class DefaultArchetypeGenerator
46      extends AbstractLogEnabled
47      implements ArchetypeGenerator
48  {
49      /**
50       * Determines whether the layout is legacy or not.
51       */
52      @Requirement
53      private ArtifactRepositoryLayout defaultArtifactRepositoryLayout;
54  
55      @Requirement
56      private ArchetypeArtifactManager archetypeArtifactManager;
57  
58      @Requirement
59      private FilesetArchetypeGenerator filesetGenerator;
60  
61      @Requirement
62      private OldArchetype oldArchetype;
63  
64      private File getArchetypeFile( ArchetypeGenerationRequest request, ArtifactRepository localRepository )
65          throws ArchetypeException
66      {
67          if ( !isArchetypeDefined( request ) )
68          {
69              throw new ArchetypeNotDefined( "The archetype is not defined" );
70          }
71  
72          List<ArtifactRepository> repos = new ArrayList<>();
73  
74          ArtifactRepository remoteRepo = null;
75          if ( request != null && request.getArchetypeRepository() != null )
76          {
77              remoteRepo =
78                  createRepository( request.getArchetypeRepository(),
79                                                             request.getArchetypeArtifactId() + "-repo" );
80  
81              repos.add( remoteRepo );
82          }
83  
84          if ( !archetypeArtifactManager.exists( request.getArchetypeGroupId(), request.getArchetypeArtifactId(),
85                                                 request.getArchetypeVersion(), remoteRepo, localRepository, repos,
86                                                 request.getProjectBuildingRequest() ) )
87          {
88              throw new UnknownArchetype( "The desired archetype does not exist (" + request.getArchetypeGroupId() + ":"
89                  + request.getArchetypeArtifactId() + ":" + request.getArchetypeVersion() + ")" );
90          }
91  
92          File archetypeFile =
93              archetypeArtifactManager.getArchetypeFile( request.getArchetypeGroupId(), request.getArchetypeArtifactId(),
94                                                         request.getArchetypeVersion(), remoteRepo, localRepository,
95                                                         repos, request.getProjectBuildingRequest() );
96          return archetypeFile;
97      }
98  
99      private void generateArchetype( ArchetypeGenerationRequest request, File archetypeFile )
100         throws ArchetypeException
101     {
102         if ( archetypeArtifactManager.isFileSetArchetype( archetypeFile ) )
103         {
104             processFileSetArchetype( request, archetypeFile );
105         }
106         else if ( archetypeArtifactManager.isOldArchetype( archetypeFile ) )
107         {
108             processOldArchetype( request, archetypeFile );
109         }
110         else
111         {
112             throw new ArchetypeGenerationFailure( "The defined artifact is not an archetype" );
113         }
114     }
115 
116     /** Common */
117     public String getPackageAsDirectory( String packageName )
118     {
119         return StringUtils.replace( packageName, ".", "/" );
120     }
121 
122     private boolean isArchetypeDefined( ArchetypeGenerationRequest request )
123     {
124         return StringUtils.isNotEmpty( request.getArchetypeGroupId() )
125             && StringUtils.isNotEmpty( request.getArchetypeArtifactId() )
126             && StringUtils.isNotEmpty( request.getArchetypeVersion() );
127     }
128 
129     /** FileSetArchetype */
130     private void processFileSetArchetype( ArchetypeGenerationRequest request, File archetypeFile )
131         throws ArchetypeException
132     {
133         filesetGenerator.generateArchetype( request, archetypeFile );
134     }
135 
136     private void processOldArchetype( ArchetypeGenerationRequest request, File archetypeFile )
137             throws ArchetypeGenerationFailure, InvalidPackaging
138     {
139         oldArchetype.createArchetype( request, archetypeFile );
140     }
141 
142     @Override
143     public void generateArchetype( ArchetypeGenerationRequest request, File archetypeFile,
144                                    ArchetypeGenerationResult result )
145     {
146         try
147         {
148             generateArchetype( request, archetypeFile );
149         }
150         catch ( ArchetypeException e )
151         {
152             result.setCause( e );
153         }
154     }
155 
156     @Override
157     public void generateArchetype( ArchetypeGenerationRequest request, ArchetypeGenerationResult result )
158     {
159         try
160         {
161             File archetypeFile = getArchetypeFile( request, request.getLocalRepository() );
162 
163             generateArchetype( request, archetypeFile, result );
164         }
165         catch ( ArchetypeException ex )
166         {
167             result.setCause( ex );
168         }
169     }
170     
171     private ArtifactRepository createRepository( String url, String repositoryId )
172     {
173         
174         
175         // snapshots vs releases
176         // offline = to turning the update policy off
177 
178         // TODO: we'll need to allow finer grained creation of repositories but this will do for now
179 
180         String updatePolicyFlag = ArtifactRepositoryPolicy.UPDATE_POLICY_ALWAYS;
181 
182         String checksumPolicyFlag = ArtifactRepositoryPolicy.CHECKSUM_POLICY_WARN;
183 
184         ArtifactRepositoryPolicy snapshotsPolicy =
185             new ArtifactRepositoryPolicy( true, updatePolicyFlag, checksumPolicyFlag );
186 
187         ArtifactRepositoryPolicy releasesPolicy =
188             new ArtifactRepositoryPolicy( true, updatePolicyFlag, checksumPolicyFlag );
189         
190         return new MavenArtifactRepository( repositoryId, url, defaultArtifactRepositoryLayout, snapshotsPolicy,
191                                             releasesPolicy );
192     }
193 }