]> source.dussan.org Git - sonarqube.git/blob
2908c45ad92b0a19a89bd912a6a2ee3e2d52b4a7
[sonarqube.git] /
1 /*
2  * Sonar, open source software quality management tool.
3  * Copyright (C) 2009 SonarSource SA
4  * mailto:contact AT sonarsource DOT com
5  *
6  * Sonar is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 3 of the License, or (at your option) any later version.
10  *
11  * Sonar is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with Sonar; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02
19  */
20 package org.sonar.updatecenter.mavenplugin;
21
22 import java.io.File;
23 import java.util.HashSet;
24 import java.util.List;
25 import java.util.Set;
26
27 import org.apache.maven.artifact.Artifact;
28 import org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter;
29 import org.apache.maven.plugin.AbstractMojo;
30 import org.apache.maven.project.MavenProject;
31 import org.apache.maven.project.MavenProjectHelper;
32 import org.sonar.updatecenter.common.PluginKeyUtils;
33
34 /**
35  * Base class for Sonar-plugin-packaging related tasks.
36  * 
37  * @author Evgeny Mandrikov
38  */
39 public abstract class AbstractSonarPluginMojo extends AbstractMojo {
40
41   public static final String SONAR_GROUPID = "org.codehaus.sonar";
42   public static final String SONAR_PLUGIN_API_ARTIFACTID = "sonar-plugin-api";
43   public static final String SONAR_PLUGIN_API_TYPE = "jar";
44
45   /**
46    * The Maven project.
47    * 
48    * @parameter expression="${project}"
49    * @required
50    * @readonly
51    */
52   private MavenProject project;
53
54   /**
55    * Directory containing the generated JAR.
56    * 
57    * @parameter expression="${project.build.directory}"
58    * @required
59    */
60   private File outputDirectory;
61
62   /**
63    * Directory containing the classes and resource files that should be packaged into the JAR.
64    * 
65    * @parameter expression="${project.build.outputDirectory}"
66    * @required
67    */
68   private File classesDirectory;
69
70   /**
71    * The directory where the app is built.
72    * 
73    * @parameter expression="${project.build.directory}/${project.build.finalName}"
74    * @required
75    */
76   private File appDirectory;
77
78   /**
79    * Name of the generated JAR.
80    * 
81    * @parameter alias="jarName" expression="${jar.finalName}" default-value="${project.build.finalName}"
82    * @required
83    */
84   private String finalName;
85
86   /**
87    * Classifier to add to the artifact generated. If given, the artifact will be an attachment instead.
88    * 
89    * @parameter
90    */
91   private String classifier;
92
93   /**
94    * @component
95    */
96   protected MavenProjectHelper projectHelper;
97
98   /**
99    * Plugin key.
100    * 
101    * @parameter expression="${sonar.pluginKey}"
102    */
103   protected String pluginKey;
104
105   /**
106    * @parameter expression="${sonar.pluginTermsConditionsUrl}"
107    */
108   private String pluginTermsConditionsUrl;
109
110   /**
111    * Name of plugin class.
112    * 
113    * @parameter expression="${sonar.pluginClass}"
114    * @required
115    */
116   private String pluginClass;
117
118   /**
119    * @parameter expression="${sonar.pluginName}" default-value="${project.name}"
120    */
121   private String pluginName;
122
123   /**
124    * @parameter default-value="${project.description}"
125    */
126   private String pluginDescription;
127
128   /**
129    * @parameter default-value="${project.url}"
130    */
131   private String pluginUrl;
132
133   /**
134    * @parameter default-value="${project.issueManagement.url}"
135    */
136   private String pluginIssueTrackerUrl;
137
138   /**
139    * @parameter
140    * @since 0.3
141    */
142   private boolean useChildFirstClassLoader = false;
143
144   /**
145    * @parameter expression="${sonar.skipDependenciesPackaging}"
146    */
147   private boolean skipDependenciesPackaging = false;
148
149   protected final MavenProject getProject() {
150     return project;
151   }
152
153   protected final File getOutputDirectory() {
154     return outputDirectory;
155   }
156
157   /**
158    * @return the main classes directory, so it's used as the root of the jar.
159    */
160   protected final File getClassesDirectory() {
161     return classesDirectory;
162   }
163
164   public File getAppDirectory() {
165     return appDirectory;
166   }
167
168   protected final String getFinalName() {
169     return finalName;
170   }
171
172   protected final String getClassifier() {
173     return classifier;
174   }
175
176   public String getExplicitPluginKey() {
177     return pluginKey;
178   }
179
180   protected final String getPluginClass() {
181     return pluginClass;
182   }
183
184   protected final String getPluginName() {
185     return pluginName;
186   }
187
188   protected final String getPluginDescription() {
189     return pluginDescription;
190   }
191
192   protected final String getPluginUrl() {
193     return pluginUrl;
194   }
195
196   protected String getPluginTermsConditionsUrl() {
197     return pluginTermsConditionsUrl;
198   }
199
200   protected String getPluginIssueTrackerUrl() {
201     return pluginIssueTrackerUrl;
202   }
203
204   public boolean isUseChildFirstClassLoader() {
205     return useChildFirstClassLoader;
206   }
207
208   protected boolean isSkipDependenciesPackaging() {
209     return skipDependenciesPackaging;
210   }
211
212   @SuppressWarnings({ "unchecked" })
213   protected Set<Artifact> getDependencyArtifacts() {
214     return getProject().getDependencyArtifacts();
215   }
216
217   protected Set<Artifact> getDependencyArtifacts(String scope) {
218     Set<Artifact> result = new HashSet<Artifact>();
219     for (Artifact dep : getDependencyArtifacts()) {
220       if (scope.equals(dep.getScope())) {
221         result.add(dep);
222       }
223     }
224     return result;
225   }
226
227   @SuppressWarnings({ "unchecked" })
228   protected Set<Artifact> getIncludedArtifacts() {
229     Set<Artifact> result = new HashSet<Artifact>();
230     Set<Artifact> artifacts = getProject().getArtifacts();
231     ScopeArtifactFilter filter = new ScopeArtifactFilter(Artifact.SCOPE_RUNTIME);
232     for (Artifact artifact : artifacts) {
233       if (filter.include(artifact)) {
234         result.add(artifact);
235       }
236     }
237     return result;
238   }
239
240   protected final Artifact getSonarPluginApiArtifact() {
241     Set<Artifact> dependencies = getDependencyArtifacts();
242     if (dependencies != null) {
243       for (Artifact dep : dependencies) {
244         if (SONAR_GROUPID.equals(dep.getGroupId()) && SONAR_PLUGIN_API_ARTIFACTID.equals(dep.getArtifactId())
245             && SONAR_PLUGIN_API_TYPE.equals(dep.getType())) {
246           return dep;
247         }
248       }
249     }
250     return null;
251   }
252
253   protected String getMessage(String title, List<String> ids) {
254     StringBuilder message = new StringBuilder();
255     message.append(title);
256     message.append("\n\n");
257     for (String id : ids) {
258       message.append("\t").append(id).append("\n");
259     }
260     return message.toString();
261   }
262 }