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 org.apache.commons.configuration.Configuration;
023 import org.slf4j.LoggerFactory;
024 import org.sonar.api.config.PropertyDefinitions;
025 import org.sonar.api.config.Settings;
026 import org.sonar.api.platform.ComponentContainer;
027 import org.sonar.api.platform.PluginMetadata;
028 import org.sonar.api.platform.PluginRepository;
029 import org.sonar.api.profiles.ProfileExporter;
030 import org.sonar.api.profiles.ProfileImporter;
031 import org.sonar.api.resources.Language;
032 import org.sonar.api.resources.ResourceType;
033 import org.sonar.api.resources.ResourceTypes;
034 import org.sonar.api.rules.RulePriority;
035 import org.sonar.api.rules.RuleRepository;
036 import org.sonar.api.utils.ValidationMessages;
037 import org.sonar.api.web.*;
038 import org.sonar.core.i18n.RuleI18nManager;
039 import org.sonar.core.persistence.Database;
040 import org.sonar.core.persistence.DatabaseMigrator;
041 import org.sonar.core.purge.PurgeDao;
042 import org.sonar.core.resource.ResourceIndexerDao;
043 import org.sonar.markdown.Markdown;
044 import org.sonar.server.configuration.Backup;
045 import org.sonar.server.configuration.ProfilesManager;
046 import org.sonar.server.filters.Filter;
047 import org.sonar.server.filters.FilterExecutor;
048 import org.sonar.server.filters.FilterResult;
049 import org.sonar.server.notifications.reviews.ReviewsNotificationManager;
050 import org.sonar.server.platform.Platform;
051 import org.sonar.server.platform.ServerIdGenerator;
052 import org.sonar.server.platform.ServerSettings;
053 import org.sonar.server.plugins.*;
054 import org.sonar.server.rules.ProfilesConsole;
055 import org.sonar.server.rules.RulesConsole;
056 import org.sonar.updatecenter.common.Version;
057
058 import java.net.InetAddress;
059 import java.sql.Connection;
060 import java.util.Collection;
061 import java.util.List;
062 import java.util.Set;
063
064 public final class JRubyFacade {
065
066 private static final JRubyFacade SINGLETON = new JRubyFacade();
067 private JRubyI18n i18n;
068
069 public static JRubyFacade getInstance() {
070 return SINGLETON;
071 }
072
073 public FilterResult executeFilter(Filter filter) {
074 return getContainer().getComponentByType(FilterExecutor.class).execute(filter);
075 }
076
077 public Collection<ResourceType> getResourceTypesForFilter() {
078 return getContainer().getComponentByType(ResourceTypes.class).getAll(ResourceTypes.AVAILABLE_FOR_FILTERS);
079 }
080
081 public ResourceType getResourceType(String qualifier) {
082 return getContainer().getComponentByType(ResourceTypes.class).get(qualifier);
083 }
084
085 public Collection<String> getResourceLeavesQualifiers(String qualifier) {
086 return getContainer().getComponentByType(ResourceTypes.class).getLeavesQualifiers(qualifier);
087 }
088
089 public Collection<String> getResourceChildrenQualifiers(String qualifier) {
090 return getContainer().getComponentByType(ResourceTypes.class).getChildrenQualifiers(qualifier);
091 }
092
093 // UPDATE CENTER ------------------------------------------------------------
094
095 public void downloadPlugin(String pluginKey, String pluginVersion) {
096 getContainer().getComponentByType(PluginDownloader.class).download(pluginKey, Version.create(pluginVersion));
097 }
098
099 public void cancelPluginDownloads() {
100 getContainer().getComponentByType(PluginDownloader.class).cancelDownloads();
101 }
102
103 public List<String> getPluginDownloads() {
104 return getContainer().getComponentByType(PluginDownloader.class).getDownloads();
105 }
106
107 public void uninstallPlugin(String pluginKey) {
108 getContainer().getComponentByType(PluginDeployer.class).uninstall(pluginKey);
109 }
110
111 public void cancelPluginUninstalls() {
112 getContainer().getComponentByType(PluginDeployer.class).cancelUninstalls();
113 }
114
115 public List<String> getPluginUninstalls() {
116 return getContainer().getComponentByType(PluginDeployer.class).getUninstalls();
117 }
118
119 public UpdateCenterMatrix getUpdateCenterMatrix(boolean forceReload) {
120 return getContainer().getComponentByType(UpdateCenterMatrixFactory.class).getMatrix(forceReload);
121 }
122
123 // PLUGINS ------------------------------------------------------------------
124
125 public PropertyDefinitions getPropertyDefinitions() {
126 return getContainer().getComponentByType(PropertyDefinitions.class);
127 }
128
129 public boolean hasPlugin(String key) {
130 return getContainer().getComponentByType(PluginRepository.class).getPlugin(key) != null;
131 }
132
133 public Collection<PluginMetadata> getPluginsMetadata() {
134 return getContainer().getComponentByType(PluginRepository.class).getMetadata();
135 }
136
137
138 // SYNTAX HIGHLIGHTING ------------------------------------------------------
139
140 public String colorizeCode(String code, String language) {
141 try {
142 return getContainer().getComponentByType(CodeColorizers.class).toHtml(code, language);
143
144 } catch (Exception e) {
145 LoggerFactory.getLogger(getClass()).error("Can not highlight the code, language= " + language, e);
146 return code;
147 }
148 }
149
150 public static String markdownToHtml(String input) {
151 return Markdown.convertToHtml(input);
152 }
153
154
155 public List<ViewProxy<Widget>> getWidgets(String resourceScope, String resourceQualifier, String resourceLanguage) {
156 return getContainer().getComponentByType(Views.class).getWidgets(resourceScope, resourceQualifier, resourceLanguage);
157 }
158
159 public List<ViewProxy<Widget>> getWidgets() {
160 return getContainer().getComponentByType(Views.class).getWidgets();
161 }
162
163 public ViewProxy<Widget> getWidget(String id) {
164 return getContainer().getComponentByType(Views.class).getWidget(id);
165 }
166
167 public List<ViewProxy<Page>> getPages(String section, String resourceScope, String resourceQualifier, String resourceLanguage) {
168 return getContainer().getComponentByType(Views.class).getPages(section, resourceScope, resourceQualifier, resourceLanguage);
169 }
170
171 public List<ViewProxy<Page>> getResourceTabs() {
172 return getContainer().getComponentByType(Views.class).getPages(NavigationSection.RESOURCE_TAB, null, null, null);
173 }
174
175 public List<ViewProxy<Page>> getResourceTabs(String scope, String qualifier, String language) {
176 return getContainer().getComponentByType(Views.class).getPages(NavigationSection.RESOURCE_TAB, scope, qualifier, language);
177 }
178
179 public List<ViewProxy<Page>> getResourceTabsForMetric(String scope, String qualifier, String language, String metric) {
180 return getContainer().getComponentByType(Views.class).getPagesForMetric(NavigationSection.RESOURCE_TAB, scope, qualifier, language, metric);
181 }
182
183 public ViewProxy<Page> getPage(String id) {
184 return getContainer().getComponentByType(Views.class).getPage(id);
185 }
186
187 public Collection<RubyRailsWebservice> getRubyRailsWebservices() {
188 return getContainer().getComponentsByType(RubyRailsWebservice.class);
189 }
190
191 public Collection<Language> getLanguages() {
192 return getContainer().getComponentsByType(Language.class);
193 }
194
195 public Database getDatabase() {
196 return getContainer().getComponentByType(Database.class);
197 }
198
199 public boolean createDatabase() {
200 return getContainer().getComponentByType(DatabaseMigrator.class).createDatabase();
201 }
202
203 /* PROFILES CONSOLE : RULES AND METRIC THRESHOLDS */
204
205 public List<RuleRepository> getRuleRepositories() {
206 return getContainer().getComponentByType(RulesConsole.class).getRepositories();
207 }
208
209 public RuleRepository getRuleRepository(String repositoryKey) {
210 return getContainer().getComponentByType(RulesConsole.class).getRepository(repositoryKey);
211 }
212
213 public Set<RuleRepository> getRuleRepositoriesByLanguage(String languageKey) {
214 return getContainer().getComponentByType(RulesConsole.class).getRepositoriesByLanguage(languageKey);
215 }
216
217 public String backupProfile(int profileId) {
218 return getContainer().getComponentByType(ProfilesConsole.class).backupProfile(profileId);
219 }
220
221 public ValidationMessages restoreProfile(String xmlBackup) {
222 return getContainer().getComponentByType(ProfilesConsole.class).restoreProfile(xmlBackup);
223 }
224
225 public List<ProfileExporter> getProfileExportersForLanguage(String language) {
226 return getContainer().getComponentByType(ProfilesConsole.class).getProfileExportersForLanguage(language);
227 }
228
229 public List<ProfileImporter> getProfileImportersForLanguage(String language) {
230 return getContainer().getComponentByType(ProfilesConsole.class).getProfileImportersForLanguage(language);
231 }
232
233 public String exportProfile(int profileId, String exporterKey) {
234 return getContainer().getComponentByType(ProfilesConsole.class).exportProfile(profileId, exporterKey);
235 }
236
237 public ValidationMessages importProfile(String profileName, String language, String importerKey, String fileContent) {
238 return getContainer().getComponentByType(ProfilesConsole.class).importProfile(profileName, language, importerKey, fileContent);
239 }
240
241 public String getProfileExporterMimeType(String exporterKey) {
242 return getContainer().getComponentByType(ProfilesConsole.class).getProfileExporter(exporterKey).getMimeType();
243 }
244
245 public void renameProfile(int profileId, String newProfileName) {
246 getProfilesManager().renameProfile(profileId, newProfileName);
247 }
248
249 public void copyProfile(long profileId, String newProfileName) {
250 getProfilesManager().copyProfile((int) profileId, newProfileName);
251 }
252
253 public void deleteProfile(long profileId) {
254 getProfilesManager().deleteProfile((int) profileId);
255 }
256
257 public ValidationMessages changeParentProfile(int profileId, String parentName, String userName) {
258 return getProfilesManager().changeParentProfile(profileId, parentName, userName);
259 }
260
261 public void ruleActivated(int parentProfileId, int activeRuleId, String userName) {
262 getProfilesManager().activated(parentProfileId, activeRuleId, userName);
263 }
264
265 public void ruleParamChanged(int parentProfileId, int activeRuleId, String paramKey, String oldValue, String newValue, String userName) {
266 getProfilesManager().ruleParamChanged(parentProfileId, activeRuleId, paramKey, oldValue, newValue, userName);
267 }
268
269 public void ruleSeverityChanged(int parentProfileId, int activeRuleId, int oldSeverityId, int newSeverityId, String userName) {
270 getProfilesManager().ruleSeverityChanged(parentProfileId, activeRuleId, RulePriority.values()[oldSeverityId],
271 RulePriority.values()[newSeverityId], userName);
272 }
273
274 public void ruleDeactivated(int parentProfileId, int deactivatedRuleId, String userName) {
275 getProfilesManager().deactivated(parentProfileId, deactivatedRuleId, userName);
276 }
277
278 public void revertRule(int profileId, int activeRuleId, String userName) {
279 getProfilesManager().revert(profileId, activeRuleId, userName);
280 }
281
282 public List<Footer> getWebFooters() {
283 return getContainer().getComponentsByType(Footer.class);
284 }
285
286 public Backup getBackup() {
287 return getContainer().getComponentByType(Backup.class);
288 }
289
290 private ProfilesManager getProfilesManager() {
291 return getContainer().getComponentByType(ProfilesManager.class);
292 }
293
294 public void reloadConfiguration() {
295 getContainer().getComponentByType(ServerSettings.class).load();
296 }
297
298 public Settings getSettings() {
299 return getContainer().getComponentByType(Settings.class);
300 }
301
302 public String getConfigurationValue(String key) {
303 return getContainer().getComponentByType(Configuration.class).getString(key, null);
304 }
305
306 public List<InetAddress> getValidInetAddressesForServerId() {
307 return getContainer().getComponentByType(ServerIdGenerator.class).getAvailableAddresses();
308 }
309
310 public String generateServerId(String organisation, String ipAddress) {
311 return getContainer().getComponentByType(ServerIdGenerator.class).generate(organisation, ipAddress);
312 }
313
314 public Connection getConnection() {
315 try {
316 return getContainer().getComponentByType(Database.class).getDataSource().getConnection();
317 } catch (Exception e) {
318 /* activerecord does not correctly manage exceptions when connection can not be opened. */
319 return null;
320 }
321 }
322
323 public Object getCoreComponentByClassname(String className) {
324 if (className == null) {
325 return null;
326 }
327
328 try {
329 Class aClass = Class.forName(className);
330 return getContainer().getComponentByType(aClass);
331
332 } catch (ClassNotFoundException e) {
333 LoggerFactory.getLogger(getClass()).error("Component not found: " + className, e);
334 return null;
335 }
336 }
337
338 public Object getComponentByClassname(String pluginKey, String className) {
339 Object component = null;
340 ComponentContainer container = getContainer();
341 Class componentClass = container.getComponentByType(DefaultServerPluginRepository.class).getClass(pluginKey, className);
342 if (componentClass != null) {
343 component = container.getComponentByType(componentClass);
344 }
345 return component;
346 }
347
348 public String getMessage(String rubyLocale, String key, String defaultValue, Object... parameters) {
349 if (i18n == null) {
350 i18n = getContainer().getComponentByType(JRubyI18n.class);
351 }
352 return i18n.message(rubyLocale, key, defaultValue, parameters);
353 }
354
355 public String getRuleName(String rubyLocale, String repositoryKey, String key) {
356 if (i18n == null) {
357 i18n = getContainer().getComponentByType(JRubyI18n.class);
358 }
359 return i18n.getRuleName(rubyLocale, repositoryKey, key);
360 }
361
362 public String getRuleDescription(String rubyLocale, String repositoryKey, String key) {
363 if (i18n == null) {
364 i18n = getContainer().getComponentByType(JRubyI18n.class);
365 }
366 return i18n.getRuleDescription(rubyLocale, repositoryKey, key);
367 }
368
369 public String getRuleParamDescription(String rubyLocale, String repositoryKey, String key, String paramKey) {
370 if (i18n == null) {
371 i18n = getContainer().getComponentByType(JRubyI18n.class);
372 }
373 return i18n.getRuleParamDescription(rubyLocale, repositoryKey, key, paramKey);
374 }
375
376 public List<RuleI18nManager.RuleKey> searchRuleName(String rubyLocale, String searchText) {
377 if (i18n == null) {
378 i18n = getContainer().getComponentByType(JRubyI18n.class);
379 }
380 return i18n.searchRuleName(rubyLocale, searchText);
381 }
382
383 public String getJsL10nDictionnary(String rubyLocale) {
384 if (i18n == null) {
385 i18n = getContainer().getComponentByType(JRubyI18n.class);
386 }
387 return i18n.getJsDictionnary(rubyLocale);
388 }
389
390 public void indexProjects() {
391 getContainer().getComponentByType(ResourceIndexerDao.class).indexProjects();
392 }
393
394 public void deleteProject(long rootProjectId) {
395 getContainer().getComponentByType(PurgeDao.class).deleteProject(rootProjectId);
396 }
397
398 public void logError(String message) {
399 LoggerFactory.getLogger(getClass()).error(message);
400 }
401
402 public ReviewsNotificationManager getReviewsNotificationManager() {
403 return getContainer().getComponentByType(ReviewsNotificationManager.class);
404 }
405
406 public ComponentContainer getContainer() {
407 return Platform.getInstance().getContainer();
408 }
409
410
411 }