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  package org.apache.maven.archetype.generator;
20  
21  import javax.inject.Inject;
22  import javax.inject.Named;
23  import javax.inject.Singleton;
24  
25  import java.io.File;
26  import java.util.ArrayList;
27  import java.util.Collections;
28  import java.util.List;
29  
30  import org.apache.maven.archetype.ArchetypeGenerationRequest;
31  import org.apache.maven.archetype.ArchetypeGenerationResult;
32  import org.apache.maven.archetype.common.ArchetypeArtifactManager;
33  import org.apache.maven.archetype.exception.ArchetypeException;
34  import org.apache.maven.archetype.exception.ArchetypeGenerationFailure;
35  import org.apache.maven.archetype.exception.ArchetypeNotDefined;
36  import org.apache.maven.archetype.exception.InvalidPackaging;
37  import org.apache.maven.archetype.exception.UnknownArchetype;
38  import org.apache.maven.archetype.old.OldArchetype;
39  import org.codehaus.plexus.util.StringUtils;
40  import org.eclipse.aether.RepositorySystem;
41  import org.eclipse.aether.RepositorySystemSession;
42  import org.eclipse.aether.repository.RemoteRepository;
43  import org.eclipse.aether.repository.RepositoryPolicy;
44  
45  @Named
46  @Singleton
47  public class DefaultArchetypeGenerator implements ArchetypeGenerator {
48  
49      private ArchetypeArtifactManager archetypeArtifactManager;
50  
51      private FilesetArchetypeGenerator filesetGenerator;
52  
53      private OldArchetype oldArchetype;
54  
55      private RepositorySystem repositorySystem;
56  
57      @Inject
58      public DefaultArchetypeGenerator(
59              ArchetypeArtifactManager archetypeArtifactManager,
60              FilesetArchetypeGenerator filesetGenerator,
61              OldArchetype oldArchetype,
62              RepositorySystem repositorySystem) {
63          this.archetypeArtifactManager = archetypeArtifactManager;
64          this.filesetGenerator = filesetGenerator;
65          this.oldArchetype = oldArchetype;
66          this.repositorySystem = repositorySystem;
67      }
68  
69      private File getArchetypeFile(ArchetypeGenerationRequest request) throws ArchetypeException {
70          if (!isArchetypeDefined(request)) {
71              throw new ArchetypeNotDefined("The archetype is not defined");
72          }
73  
74          List<RemoteRepository> repos = new ArrayList<>(request.getRemoteRepositories());
75  
76          if (request != null && request.getArchetypeRepository() != null) {
77              RepositorySystemSession repositorySession = request.getRepositorySession();
78              RemoteRepository remoteRepo = createRepository(
79                      repositorySession, request.getArchetypeRepository(), request.getArchetypeArtifactId() + "-repo");
80  
81              repos.add(remoteRepo);
82          }
83  
84          if (!archetypeArtifactManager.exists(
85                  request.getArchetypeGroupId(),
86                  request.getArchetypeArtifactId(),
87                  request.getArchetypeVersion(),
88                  repos,
89                  request.getRepositorySession())) {
90              throw new UnknownArchetype("The desired archetype does not exist (" + request.getArchetypeGroupId() + ":"
91                      + request.getArchetypeArtifactId() + ":" + request.getArchetypeVersion() + ")");
92          }
93  
94          return archetypeArtifactManager.getArchetypeFile(
95                  request.getArchetypeGroupId(),
96                  request.getArchetypeArtifactId(),
97                  request.getArchetypeVersion(),
98                  repos,
99                  request.getRepositorySession());
100     }
101 
102     private void generateArchetype(ArchetypeGenerationRequest request, File archetypeFile) throws ArchetypeException {
103         if (archetypeArtifactManager.isFileSetArchetype(archetypeFile)) {
104             processFileSetArchetype(request, archetypeFile);
105         } else if (archetypeArtifactManager.isOldArchetype(archetypeFile)) {
106             processOldArchetype(request, archetypeFile);
107         } else {
108             throw new ArchetypeGenerationFailure("The defined artifact is not an archetype: " + archetypeFile);
109         }
110     }
111 
112     /** Common */
113     public String getPackageAsDirectory(String packageName) {
114         return StringUtils.replace(packageName, ".", "/");
115     }
116 
117     private boolean isArchetypeDefined(ArchetypeGenerationRequest request) {
118         return StringUtils.isNotEmpty(request.getArchetypeGroupId())
119                 && StringUtils.isNotEmpty(request.getArchetypeArtifactId())
120                 && StringUtils.isNotEmpty(request.getArchetypeVersion());
121     }
122 
123     /** FileSetArchetype */
124     private void processFileSetArchetype(ArchetypeGenerationRequest request, File archetypeFile)
125             throws ArchetypeException {
126         filesetGenerator.generateArchetype(request, archetypeFile);
127     }
128 
129     private void processOldArchetype(ArchetypeGenerationRequest request, File archetypeFile)
130             throws ArchetypeGenerationFailure, InvalidPackaging {
131         oldArchetype.createArchetype(request, archetypeFile);
132     }
133 
134     @Override
135     public void generateArchetype(
136             ArchetypeGenerationRequest request, File archetypeFile, ArchetypeGenerationResult result) {
137         try {
138             generateArchetype(request, archetypeFile);
139         } catch (ArchetypeException e) {
140             result.setCause(e);
141         }
142     }
143 
144     @Override
145     public void generateArchetype(ArchetypeGenerationRequest request, ArchetypeGenerationResult result) {
146         try {
147             File archetypeFile = getArchetypeFile(request);
148 
149             generateArchetype(request, archetypeFile, result);
150         } catch (ArchetypeException ex) {
151             result.setCause(ex);
152         }
153     }
154 
155     private RemoteRepository createRepository(
156             RepositorySystemSession repositorySession, String url, String repositoryId) {
157 
158         // snapshots vs releases
159         // offline = to turning the update policy off
160 
161         // TODO: we'll need to allow finer grained creation of repositories but this will do for now
162 
163         RepositoryPolicy repositoryPolicy = new RepositoryPolicy(
164                 true, RepositoryPolicy.UPDATE_POLICY_ALWAYS, RepositoryPolicy.CHECKSUM_POLICY_WARN);
165 
166         RemoteRepository remoteRepository = new RemoteRepository.Builder(repositoryId, "default", url)
167                 .setSnapshotPolicy(repositoryPolicy)
168                 .setReleasePolicy(repositoryPolicy)
169                 .build();
170 
171         return repositorySystem
172                 .newResolutionRepositories(repositorySession, Collections.singletonList(remoteRepository))
173                 .get(0);
174     }
175 }