001 /*
002 * Sonar, open source software quality management tool.
003 * Copyright (C) 2008-2012 SonarSource
004 * mailto:contact AT sonarsource DOT com
005 *
006 * Sonar is free software; you can redistribute it and/or
007 * modify it under the terms of the GNU Lesser General Public
008 * License as published by the Free Software Foundation; either
009 * version 3 of the License, or (at your option) any later version.
010 *
011 * Sonar is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014 * Lesser General Public License for more details.
015 *
016 * You should have received a copy of the GNU Lesser General Public
017 * License along with Sonar; if not, write to the Free Software
018 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
019 */
020 package org.sonar.server.ui;
021
022 import com.google.common.collect.Lists;
023 import org.apache.commons.configuration.Configuration;
024 import org.slf4j.LoggerFactory;
025 import org.sonar.api.CoreProperties;
026 import org.sonar.api.config.License;
027 import org.sonar.api.config.PropertyDefinitions;
028 import org.sonar.api.config.Settings;
029 import org.sonar.api.platform.ComponentContainer;
030 import org.sonar.api.platform.PluginMetadata;
031 import org.sonar.api.platform.PluginRepository;
032 import org.sonar.api.profiles.ProfileExporter;
033 import org.sonar.api.profiles.ProfileImporter;
034 import org.sonar.api.resources.Language;
035 import org.sonar.api.resources.ResourceType;
036 import org.sonar.api.resources.ResourceTypes;
037 import org.sonar.api.rules.RulePriority;
038 import org.sonar.api.rules.RuleRepository;
039 import org.sonar.api.utils.ValidationMessages;
040 import org.sonar.api.web.*;
041 import org.sonar.core.i18n.RuleI18nManager;
042 import org.sonar.core.persistence.Database;
043 import org.sonar.core.persistence.DatabaseMigrator;
044 import org.sonar.core.purge.PurgeDao;
045 import org.sonar.core.resource.ResourceIndexerDao;
046 import org.sonar.markdown.Markdown;
047 import org.sonar.server.configuration.Backup;
048 import org.sonar.server.configuration.ProfilesManager;
049 import org.sonar.server.filters.Filter;
050 import org.sonar.server.filters.FilterExecutor;
051 import org.sonar.server.filters.FilterResult;
052 import org.sonar.server.notifications.reviews.ReviewsNotificationManager;
053 import org.sonar.server.platform.GlobalSettingsUpdater;
054 import org.sonar.server.platform.Platform;
055 import org.sonar.server.platform.ServerIdGenerator;
056 import org.sonar.server.plugins.*;
057 import org.sonar.server.rules.ProfilesConsole;
058 import org.sonar.server.rules.RulesConsole;
059 import org.sonar.updatecenter.common.Version;
060
061 import javax.annotation.Nullable;
062 import java.net.InetAddress;
063 import java.sql.Connection;
064 import java.util.Collection;
065 import java.util.List;
066 import java.util.Set;
067
068 public final class JRubyFacade {
069
070 private static final JRubyFacade SINGLETON = new JRubyFacade();
071 private JRubyI18n i18n;
072
073 public static JRubyFacade getInstance() {
074 return SINGLETON;
075 }
076
077 public FilterResult executeFilter(Filter filter) {
078 return getContainer().getComponentByType(FilterExecutor.class).execute(filter);
079 }
080
081 public Collection<ResourceType> getResourceTypesForFilter() {
082 return getContainer().getComponentByType(ResourceTypes.class).getAll(ResourceTypes.AVAILABLE_FOR_FILTERS);
083 }
084
085 public Collection<ResourceType> getResourceTypes() {
086 return getContainer().getComponentByType(ResourceTypes.class).getAll();
087 }
088
089 public ResourceType getResourceType(String qualifier) {
090 return getContainer().getComponentByType(ResourceTypes.class).get(qualifier);
091 }
092
093 public String getResourceTypeStringProperty(String resourceTypeQualifier, String resourceTypeProperty) {
094 ResourceType resourceType = getResourceType(resourceTypeQualifier);
095 if (resourceType != null) {
096 return resourceType.getStringProperty(resourceTypeProperty);
097 }
098 return null;
099 }
100
101 public List<String> getQualifiersWithProperty(final String propertyKey) {
102 List<String> qualifiers = Lists.newArrayList();
103 for (ResourceType type : getResourceTypes()) {
104 if (type.getBooleanProperty(propertyKey) == Boolean.TRUE) {
105 qualifiers.add(type.getQualifier());
106 }
107 }
108 return qualifiers;
109 }
110
111 public Boolean getResourceTypeBooleanProperty(String resourceTypeQualifier, String resourceTypeProperty) {
112 ResourceType resourceType = getResourceType(resourceTypeQualifier);
113 if (resourceType != null) {
114 return resourceType.getBooleanProperty(resourceTypeProperty);
115 }
116 return null;
117 }
118
119 public Collection<String> getResourceLeavesQualifiers(String qualifier) {
120 return getContainer().getComponentByType(ResourceTypes.class).getLeavesQualifiers(qualifier);
121 }
122
123 public Collection<String> getResourceChildrenQualifiers(String qualifier) {
124 return getContainer().getComponentByType(ResourceTypes.class).getChildrenQualifiers(qualifier);
125 }
126
127 // UPDATE CENTER ------------------------------------------------------------
128
129 public void downloadPlugin(String pluginKey, String pluginVersion) {
130 getContainer().getComponentByType(PluginDownloader.class).download(pluginKey, Version.create(pluginVersion));
131 }
132
133 public void cancelPluginDownloads() {
134 getContainer().getComponentByType(PluginDownloader.class).cancelDownloads();
135 }
136
137 public List<String> getPluginDownloads() {
138 return getContainer().getComponentByType(PluginDownloader.class).getDownloads();
139 }
140
141 public void uninstallPlugin(String pluginKey) {
142 getContainer().getComponentByType(PluginDeployer.class).uninstall(pluginKey);
143 }
144
145 public void cancelPluginUninstalls() {
146 getContainer().getComponentByType(PluginDeployer.class).cancelUninstalls();
147 }
148
149 public List<String> getPluginUninstalls() {
150 return getContainer().getComponentByType(PluginDeployer.class).getUninstalls();
151 }
152
153 public UpdateCenterMatrix getUpdateCenterMatrix(boolean forceReload) {
154 return getContainer().getComponentByType(UpdateCenterMatrixFactory.class).getMatrix(forceReload);
155 }
156
157 // PLUGINS ------------------------------------------------------------------
158
159 public PropertyDefinitions getPropertyDefinitions() {
160 return getContainer().getComponentByType(PropertyDefinitions.class);
161 }
162
163 public boolean hasPlugin(String key) {
164 return getContainer().getComponentByType(PluginRepository.class).getPlugin(key) != null;
165 }
166
167 public Collection<PluginMetadata> getPluginsMetadata() {
168 return getContainer().getComponentByType(PluginRepository.class).getMetadata();
169 }
170
171
172 // SYNTAX HIGHLIGHTING ------------------------------------------------------
173
174 public String colorizeCode(String code, String language) {
175 try {
176 return getContainer().getComponentByType(CodeColorizers.class).toHtml(code, language);
177
178 } catch (Exception e) {
179 LoggerFactory.getLogger(getClass()).error("Can not highlight the code, language= " + language, e);
180 return code;
181 }
182 }
183
184 public static String markdownToHtml(String input) {
185 return Markdown.convertToHtml(input);
186 }
187
188
189 public List<ViewProxy<Widget>> getWidgets(String resourceScope, String resourceQualifier, String resourceLanguage, Object[] availableMeasures) {
190 return getContainer().getComponentByType(Views.class).getWidgets(resourceScope, resourceQualifier, resourceLanguage, (String[]) availableMeasures);
191 }
192
193 public List<ViewProxy<Widget>> getWidgets() {
194 return getContainer().getComponentByType(Views.class).getWidgets();
195 }
196
197 public ViewProxy<Widget> getWidget(String id) {
198 return getContainer().getComponentByType(Views.class).getWidget(id);
199 }
200
201 public List<ViewProxy<Page>> getPages(String section, String resourceScope, String resourceQualifier, String resourceLanguage, Object[] availableMeasures) {
202 return getContainer().getComponentByType(Views.class).getPages(section, resourceScope, resourceQualifier, resourceLanguage, (String[]) availableMeasures);
203 }
204
205 public List<ViewProxy<Page>> getResourceTabs() {
206 return getContainer().getComponentByType(Views.class).getPages(NavigationSection.RESOURCE_TAB, null, null, null, null);
207 }
208
209 public List<ViewProxy<Page>> getResourceTabs(String scope, String qualifier, String language, Object[] availableMeasures) {
210 return getContainer().getComponentByType(Views.class).getPages(NavigationSection.RESOURCE_TAB, scope, qualifier, language, (String[]) availableMeasures);
211 }
212
213 public List<ViewProxy<Page>> getResourceTabsForMetric(String scope, String qualifier, String language, Object[] availableMeasures, String metric) {
214 return getContainer().getComponentByType(Views.class).getPagesForMetric(NavigationSection.RESOURCE_TAB, scope, qualifier, language, (String[]) availableMeasures, metric);
215 }
216
217 public ViewProxy<Page> getPage(String id) {
218 return getContainer().getComponentByType(Views.class).getPage(id);
219 }
220
221 public Collection<RubyRailsWebservice> getRubyRailsWebservices() {
222 return getContainer().getComponentsByType(RubyRailsWebservice.class);
223 }
224
225 public Collection<Language> getLanguages() {
226 return getContainer().getComponentsByType(Language.class);
227 }
228
229 public Database getDatabase() {
230 return getContainer().getComponentByType(Database.class);
231 }
232
233 public boolean createDatabase() {
234 return getContainer().getComponentByType(DatabaseMigrator.class).createDatabase();
235 }
236
237 /* PROFILES CONSOLE : RULES AND METRIC THRESHOLDS */
238
239 public List<RuleRepository> getRuleRepositories() {
240 return getContainer().getComponentByType(RulesConsole.class).getRepositories();
241 }
242
243 public RuleRepository getRuleRepository(String repositoryKey) {
244 return getContainer().getComponentByType(RulesConsole.class).getRepository(repositoryKey);
245 }
246
247 public Set<RuleRepository> getRuleRepositoriesByLanguage(String languageKey) {
248 return getContainer().getComponentByType(RulesConsole.class).getRepositoriesByLanguage(languageKey);
249 }
250
251 public String backupProfile(int profileId) {
252 return getContainer().getComponentByType(ProfilesConsole.class).backupProfile(profileId);
253 }
254
255 public ValidationMessages restoreProfile(String xmlBackup) {
256 return getContainer().getComponentByType(ProfilesConsole.class).restoreProfile(xmlBackup);
257 }
258
259 public List<ProfileExporter> getProfileExportersForLanguage(String language) {
260 return getContainer().getComponentByType(ProfilesConsole.class).getProfileExportersForLanguage(language);
261 }
262
263 public List<ProfileImporter> getProfileImportersForLanguage(String language) {
264 return getContainer().getComponentByType(ProfilesConsole.class).getProfileImportersForLanguage(language);
265 }
266
267 /**
268 * @throws IllegalArgumentException if no such exporter
269 */
270 public String exportProfile(int profileId, String exporterKey) {
271 return getContainer().getComponentByType(ProfilesConsole.class).exportProfile(profileId, exporterKey);
272 }
273
274 public ValidationMessages importProfile(String profileName, String language, String importerKey, String fileContent) {
275 return getContainer().getComponentByType(ProfilesConsole.class).importProfile(profileName, language, importerKey, fileContent);
276 }
277
278 public String getProfileExporterMimeType(String exporterKey) {
279 return getContainer().getComponentByType(ProfilesConsole.class).getProfileExporter(exporterKey).getMimeType();
280 }
281
282 public void renameProfile(int profileId, String newProfileName) {
283 getProfilesManager().renameProfile(profileId, newProfileName);
284 }
285
286 public void copyProfile(long profileId, String newProfileName) {
287 getProfilesManager().copyProfile((int) profileId, newProfileName);
288 }
289
290 public void deleteProfile(long profileId) {
291 getProfilesManager().deleteProfile((int) profileId);
292 }
293
294 public ValidationMessages changeParentProfile(int profileId, String parentName, String userName) {
295 return getProfilesManager().changeParentProfile(profileId, parentName, userName);
296 }
297
298 public void ruleActivated(int parentProfileId, int activeRuleId, String userName) {
299 getProfilesManager().activated(parentProfileId, activeRuleId, userName);
300 }
301
302 public void ruleParamChanged(int parentProfileId, int activeRuleId, String paramKey, String oldValue, String newValue, String userName) {
303 getProfilesManager().ruleParamChanged(parentProfileId, activeRuleId, paramKey, oldValue, newValue, userName);
304 }
305
306 public void ruleSeverityChanged(int parentProfileId, int activeRuleId, int oldSeverityId, int newSeverityId, String userName) {
307 getProfilesManager().ruleSeverityChanged(parentProfileId, activeRuleId, RulePriority.values()[oldSeverityId],
308 RulePriority.values()[newSeverityId], userName);
309 }
310
311 public void ruleDeactivated(int parentProfileId, int deactivatedRuleId, String userName) {
312 getProfilesManager().deactivated(parentProfileId, deactivatedRuleId, userName);
313 }
314
315 public void revertRule(int profileId, int activeRuleId, String userName) {
316 getProfilesManager().revert(profileId, activeRuleId, userName);
317 }
318
319 public List<Footer> getWebFooters() {
320 return getContainer().getComponentsByType(Footer.class);
321 }
322
323 public Backup getBackup() {
324 return getContainer().getComponentByType(Backup.class);
325 }
326
327 private ProfilesManager getProfilesManager() {
328 return getContainer().getComponentByType(ProfilesManager.class);
329 }
330
331 public void setGlobalProperty(String key, @Nullable String value) {
332 getContainer().getComponentByType(GlobalSettingsUpdater.class).setProperty(key, value);
333 }
334
335 public Settings getSettings() {
336 return getContainer().getComponentByType(Settings.class);
337 }
338
339 public String getConfigurationValue(String key) {
340 return getContainer().getComponentByType(Configuration.class).getString(key, null);
341 }
342
343 public List<InetAddress> getValidInetAddressesForServerId() {
344 return getContainer().getComponentByType(ServerIdGenerator.class).getAvailableAddresses();
345 }
346
347 public String generateServerId(String organisation, String ipAddress) {
348 return getContainer().getComponentByType(ServerIdGenerator.class).generate(organisation, ipAddress);
349 }
350
351 public Connection getConnection() {
352 try {
353 return getContainer().getComponentByType(Database.class).getDataSource().getConnection();
354 } catch (Exception e) {
355 /* activerecord does not correctly manage exceptions when connection can not be opened. */
356 return null;
357 }
358 }
359
360 public Object getCoreComponentByClassname(String className) {
361 if (className == null) {
362 return null;
363 }
364
365 try {
366 Class aClass = Class.forName(className);
367 return getContainer().getComponentByType(aClass);
368
369 } catch (ClassNotFoundException e) {
370 LoggerFactory.getLogger(getClass()).error("Component not found: " + className, e);
371 return null;
372 }
373 }
374
375 public Object getComponentByClassname(String pluginKey, String className) {
376 Object component = null;
377 ComponentContainer container = getContainer();
378 Class componentClass = container.getComponentByType(DefaultServerPluginRepository.class).getClass(pluginKey, className);
379 if (componentClass != null) {
380 component = container.getComponentByType(componentClass);
381 }
382 return component;
383 }
384
385 public String getMessage(String rubyLocale, String key, String defaultValue, Object... parameters) {
386 if (i18n == null) {
387 i18n = getContainer().getComponentByType(JRubyI18n.class);
388 }
389 return i18n.message(rubyLocale, key, defaultValue, parameters);
390 }
391
392 public String getRuleName(String rubyLocale, String repositoryKey, String key) {
393 if (i18n == null) {
394 i18n = getContainer().getComponentByType(JRubyI18n.class);
395 }
396 return i18n.getRuleName(rubyLocale, repositoryKey, key);
397 }
398
399 public String getRuleDescription(String rubyLocale, String repositoryKey, String key) {
400 if (i18n == null) {
401 i18n = getContainer().getComponentByType(JRubyI18n.class);
402 }
403 return i18n.getRuleDescription(rubyLocale, repositoryKey, key);
404 }
405
406 public String getRuleParamDescription(String rubyLocale, String repositoryKey, String key, String paramKey) {
407 if (i18n == null) {
408 i18n = getContainer().getComponentByType(JRubyI18n.class);
409 }
410 return i18n.getRuleParamDescription(rubyLocale, repositoryKey, key, paramKey);
411 }
412
413 public List<RuleI18nManager.RuleKey> searchRuleName(String rubyLocale, String searchText) {
414 if (i18n == null) {
415 i18n = getContainer().getComponentByType(JRubyI18n.class);
416 }
417 return i18n.searchRuleName(rubyLocale, searchText);
418 }
419
420 public String getJsL10nDictionnary(String rubyLocale) {
421 if (i18n == null) {
422 i18n = getContainer().getComponentByType(JRubyI18n.class);
423 }
424 return i18n.getJsDictionnary(rubyLocale);
425 }
426
427 public void indexProjects() {
428 getContainer().getComponentByType(ResourceIndexerDao.class).indexProjects();
429 }
430
431 public void indexResource(long resourceId) {
432 getContainer().getComponentByType(ResourceIndexerDao.class).indexResource(resourceId);
433 }
434
435 public void deleteResourceTree(long rootProjectId) {
436 getContainer().getComponentByType(PurgeDao.class).deleteResourceTree(rootProjectId);
437 }
438
439 public void logError(String message) {
440 LoggerFactory.getLogger(getClass()).error(message);
441 }
442
443 public boolean hasSecretKey() {
444 return getContainer().getComponentByType(Settings.class).getEncryption().hasSecretKey();
445 }
446
447 public String encrypt(String clearText) {
448 return getContainer().getComponentByType(Settings.class).getEncryption().encrypt(clearText);
449 }
450
451 public String generateRandomSecretKey() {
452 return getContainer().getComponentByType(Settings.class).getEncryption().generateRandomSecretKey();
453 }
454
455 public License parseLicense(String base64) {
456 return License.readBase64(base64);
457 }
458
459 public String getServerHome() {
460 return getContainer().getComponentByType(Settings.class).getString(CoreProperties.SONAR_HOME);
461 }
462
463 public ReviewsNotificationManager getReviewsNotificationManager() {
464 return getContainer().getComponentByType(ReviewsNotificationManager.class);
465 }
466
467 public ComponentContainer getContainer() {
468 return Platform.getInstance().getContainer();
469 }
470 }