]> source.dussan.org Git - sonarqube.git/blob
c16ecace472fb4b2e12e86a541ffee24bad380f0
[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.common;
21
22 import org.apache.commons.lang.StringUtils;
23 import org.apache.commons.lang.builder.ReflectionToStringBuilder;
24
25 import java.io.File;
26 import java.io.IOException;
27 import java.util.Date;
28 import java.util.jar.Attributes;
29 import java.util.jar.JarFile;
30 import java.util.jar.Manifest;
31
32 import static org.sonar.updatecenter.common.FormatUtils.toDate;
33
34 /**
35  * This class loads Sonar plugin metadata from JAR manifest.
36  */
37 public final class PluginManifest {
38
39   public static final String KEY = "Plugin-Key";
40   public static final String MAIN_CLASS = "Plugin-Class";
41   public static final String NAME = "Plugin-Name";
42   public static final String DESCRIPTION = "Plugin-Description";
43   public static final String ORGANIZATION = "Plugin-Organization";
44   public static final String ORGANIZATION_URL = "Plugin-OrganizationUrl";
45   public static final String LICENSE = "Plugin-License";
46   public static final String VERSION = "Plugin-Version";
47   public static final String SONAR_VERSION = "Sonar-Version";
48   public static final String DEPENDENCIES = "Plugin-Dependencies";
49   public static final String HOMEPAGE = "Plugin-Homepage";
50   public static final String TERMS_CONDITIONS_URL = "Plugin-TermsConditionsUrl";
51   public static final String BUILD_DATE = "Plugin-BuildDate";
52   public static final String ISSUE_TRACKER_URL = "Plugin-IssueTrackerUrl";
53
54   /**
55    * @since 0.3
56    */
57   public static final String USE_CHILD_FIRST_CLASSLOADER = "Plugin-ChildFirstClassLoader";
58
59   /**
60    * @since 1.1
61    */
62   public static final String EXTEND_PLUGIN = "Extend-Plugin";
63
64   private String key;
65   private String name;
66   private String mainClass;
67   private String description;
68   private String organization;
69   private String organizationUrl;
70   private String license;
71   private String version;
72   private String sonarVersion;
73   private String[] dependencies = new String[0];
74   private String homepage;
75   private String termsConditionsUrl;
76   private Date buildDate;
77   private String issueTrackerUrl;
78   private boolean useChildFirstClassLoader = false;
79   private String extendPlugin;
80
81   /**
82    * Load the manifest from a JAR file.
83    */
84   public PluginManifest(File file) throws IOException {
85     JarFile jar = null;
86     try {
87       jar = new JarFile(file);
88       if (jar.getManifest() != null) {
89         loadManifest(jar.getManifest());
90       }
91     } catch (Exception e) {
92       throw new RuntimeException("Unable to read plugin manifest from jar : " + file.getAbsolutePath(), e);
93     } finally {
94       if (jar != null) {
95         jar.close();
96       }
97     }
98   }
99
100   /**
101    * @param manifest can not be null
102    */
103   public PluginManifest(Manifest manifest) {
104     loadManifest(manifest);
105   }
106
107   public PluginManifest() {
108   }
109
110   private void loadManifest(Manifest manifest) {
111     Attributes attributes = manifest.getMainAttributes();
112     this.key = PluginKeyUtils.sanitize(attributes.getValue(KEY));
113     this.mainClass = attributes.getValue(MAIN_CLASS);
114     this.name = attributes.getValue(NAME);
115     this.description = attributes.getValue(DESCRIPTION);
116     this.license = attributes.getValue(LICENSE);
117     this.organization = attributes.getValue(ORGANIZATION);
118     this.organizationUrl = attributes.getValue(ORGANIZATION_URL);
119     this.version = attributes.getValue(VERSION);
120     this.homepage = attributes.getValue(HOMEPAGE);
121     this.termsConditionsUrl = attributes.getValue(TERMS_CONDITIONS_URL);
122     this.sonarVersion = attributes.getValue(SONAR_VERSION);
123     this.issueTrackerUrl = attributes.getValue(ISSUE_TRACKER_URL);
124     this.buildDate = toDate(attributes.getValue(BUILD_DATE), true);
125     this.useChildFirstClassLoader = StringUtils.equalsIgnoreCase(attributes.getValue(USE_CHILD_FIRST_CLASSLOADER), "true");
126     this.extendPlugin = attributes.getValue(EXTEND_PLUGIN);
127
128     String deps = attributes.getValue(DEPENDENCIES);
129     this.dependencies = StringUtils.split(StringUtils.defaultString(deps), ' ');
130   }
131
132   public String getKey() {
133     return key;
134   }
135
136   public PluginManifest setKey(String key) {
137     this.key = key;
138     return this;
139   }
140
141   public String getName() {
142     return name;
143   }
144
145   public PluginManifest setName(String name) {
146     this.name = name;
147     return this;
148   }
149
150   public String getDescription() {
151     return description;
152   }
153
154   public PluginManifest setDescription(String description) {
155     this.description = description;
156     return this;
157   }
158
159   public String getOrganization() {
160     return organization;
161   }
162
163   public PluginManifest setOrganization(String organization) {
164     this.organization = organization;
165     return this;
166   }
167
168   public String getOrganizationUrl() {
169     return organizationUrl;
170   }
171
172   public PluginManifest setOrganizationUrl(String url) {
173     this.organizationUrl = url;
174     return this;
175   }
176
177   public String getLicense() {
178     return license;
179   }
180
181   public PluginManifest setLicense(String license) {
182     this.license = license;
183     return this;
184   }
185
186   public String getVersion() {
187     return version;
188   }
189
190   public PluginManifest setVersion(String version) {
191     this.version = version;
192     return this;
193   }
194
195   public String getSonarVersion() {
196     return sonarVersion;
197   }
198
199   public PluginManifest setSonarVersion(String sonarVersion) {
200     this.sonarVersion = sonarVersion;
201     return this;
202   }
203
204   public String getMainClass() {
205     return mainClass;
206   }
207
208   public PluginManifest setMainClass(String mainClass) {
209     this.mainClass = mainClass;
210     return this;
211   }
212
213   public String[] getDependencies() {
214     return dependencies;
215   }
216
217   public PluginManifest setDependencies(String[] dependencies) {
218     this.dependencies = dependencies;
219     return this;
220   }
221
222   public Date getBuildDate() {
223     return buildDate;
224   }
225
226   public PluginManifest setBuildDate(Date buildDate) {
227     this.buildDate = buildDate;
228     return this;
229   }
230
231   public String getHomepage() {
232     return homepage;
233   }
234
235   public PluginManifest setHomepage(String homepage) {
236     this.homepage = homepage;
237     return this;
238   }
239
240   public String getTermsConditionsUrl() {
241     return termsConditionsUrl;
242   }
243
244   public PluginManifest setTermsConditionsUrl(String termsConditionsUrl) {
245     this.termsConditionsUrl = termsConditionsUrl;
246     return this;
247   }
248
249   public String getIssueTrackerUrl() {
250     return issueTrackerUrl;
251   }
252
253   public PluginManifest setIssueTrackerUrl(String issueTrackerUrl) {
254     this.issueTrackerUrl = issueTrackerUrl;
255     return this;
256   }
257
258   /**
259    * @since 0.3
260    */
261   public boolean isUseChildFirstClassLoader() {
262     return useChildFirstClassLoader;
263   }
264
265   /**
266    * @since 0.3
267    */
268   public PluginManifest setUseChildFirstClassLoader(boolean useChildFirstClassLoader) {
269     this.useChildFirstClassLoader = useChildFirstClassLoader;
270     return this;
271   }
272
273   /**
274    * @since 1.1
275    */
276   public String getExtendPlugin() {
277     return extendPlugin;
278   }
279
280   /**
281    * @since 1.1
282    */
283   public PluginManifest setExtendPlugin(String extendPlugin) {
284     this.extendPlugin = extendPlugin;
285     return this;
286   }
287
288   @Override
289   public String toString() {
290     return new ReflectionToStringBuilder(this).toString();
291   }
292
293   public boolean isValid() {
294     return StringUtils.isNotBlank(key) && StringUtils.isNotBlank(version);
295   }
296 }