1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 package org.sonar.mojo.bootstrap;
25
26 import org.apache.maven.artifact.repository.ArtifactRepository;
27 import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;
28 import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
29 import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
30 import org.apache.maven.execution.MavenSession;
31 import org.apache.maven.model.Plugin;
32 import org.apache.maven.plugin.MojoExecution;
33 import org.apache.maven.plugin.MojoExecutionException;
34 import org.apache.maven.plugin.PluginManager;
35 import org.apache.maven.plugin.descriptor.MojoDescriptor;
36 import org.apache.maven.plugin.descriptor.PluginDescriptor;
37 import org.apache.maven.project.MavenProject;
38
39 import java.io.IOException;
40 import java.util.ArrayList;
41 import java.util.List;
42
43
44
45
46 public class Bootstraper {
47
48 public static final String REPOSITORY_ID = "sonar";
49
50 private ServerMetadata server;
51 private PluginManager pluginManager;
52 private ArtifactRepositoryFactory repoFactory;
53
54 public Bootstraper(ServerMetadata server, ArtifactRepositoryFactory repoFactory, PluginManager pluginManager) {
55 this.server = server;
56 this.repoFactory = repoFactory;
57 this.pluginManager = pluginManager;
58 }
59
60 public void start(MavenProject project, MavenSession session) throws IOException, MojoExecutionException {
61 configure(project);
62 executeMojo(project, session);
63 }
64
65 private void executeMojo(MavenProject project, MavenSession session) throws MojoExecutionException {
66 try {
67 PluginDescriptor pluginDescriptor = pluginManager.verifyPlugin(
68 createSonarPlugin(),
69 project,
70 session.getSettings(),
71 session.getLocalRepository());
72 MojoDescriptor mojoDescriptor = pluginDescriptor.getMojo("internal");
73 if (mojoDescriptor == null) {
74 throw new MojoExecutionException("Unknown mojo goal: install");
75 }
76 pluginManager.executeMojo(project, new MojoExecution(mojoDescriptor), session);
77
78 } catch (Exception e) {
79 throw new MojoExecutionException("Can not execute Sonar", e);
80 }
81 }
82
83 private void configure(MavenProject project) throws IOException {
84 configureRepositories(project);
85 }
86
87 private void configureRepositories(MavenProject project) throws IOException {
88 List<ArtifactRepository> pluginRepositories = new ArrayList<ArtifactRepository>();
89 ArtifactRepository repository = createSonarRepository(repoFactory);
90 pluginRepositories.add(repository);
91 pluginRepositories.addAll(project.getPluginArtifactRepositories());
92 project.setPluginArtifactRepositories(pluginRepositories);
93
94 List<ArtifactRepository> artifactRepositories = new ArrayList<ArtifactRepository>();
95 artifactRepositories.add(repository);
96 artifactRepositories.addAll(project.getRemoteArtifactRepositories());
97 project.setRemoteArtifactRepositories(artifactRepositories);
98
99 }
100
101 private Plugin createSonarPlugin() throws IOException {
102 Plugin plugin = new Plugin();
103 plugin.setGroupId("org.codehaus.sonar.runtime");
104 plugin.setArtifactId("sonar-core-maven-plugin");
105 plugin.setVersion(server.getKey());
106 return plugin;
107 }
108
109 private ArtifactRepository createSonarRepository(ArtifactRepositoryFactory repoFactory) {
110 return repoFactory.createArtifactRepository(REPOSITORY_ID, server.getMavenRepositoryUrl(),
111 new DefaultRepositoryLayout(),
112 new ArtifactRepositoryPolicy(false, "never", "ignore"),
113 new ArtifactRepositoryPolicy(true, "never", "ignore"));
114 }
115 }