1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
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
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
159
160
161
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 }