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