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.core.i18n;
021    
022    import com.google.common.collect.Lists;
023    import org.apache.commons.lang.StringUtils;
024    import org.sonar.api.ServerComponent;
025    
026    import java.util.List;
027    import java.util.Locale;
028    
029    public class RuleI18nManager implements ServerComponent {
030    
031      private static final String NAME_SUFFIX = ".name";
032      private static final String RULE_PREFIX = "rule.";
033    
034      private I18nManager i18nManager;
035      private RuleKey[] ruleKeys;
036    
037      public RuleI18nManager(I18nManager i18nManager) {
038        this.i18nManager = i18nManager;
039      }
040    
041      public void start() {
042        List<RuleKey> list = Lists.newArrayList();
043        for (String propertyKey : i18nManager.getPropertyKeys()) {
044          if (isRuleProperty(propertyKey)) {
045            list.add(extractRuleKey(propertyKey));
046          }
047        }
048        this.ruleKeys = list.toArray(new RuleKey[list.size()]);
049      }
050    
051      public String getName(String repositoryKey, String ruleKey, Locale locale) {
052        return message(repositoryKey, ruleKey, locale, NAME_SUFFIX);
053      }
054    
055      public String getDescription(String repositoryKey, String ruleKey, Locale locale) {
056        String relatedProperty = new StringBuilder().append(RULE_PREFIX).append(repositoryKey).append(".").append(ruleKey).append(NAME_SUFFIX).toString();
057    
058        Locale localeWithoutCountry = (locale.getCountry()==null ? locale : new Locale(locale.getLanguage()));
059        String description = i18nManager.messageFromFile(localeWithoutCountry, ruleKey + ".html", relatedProperty, true);
060        if (description == null && !"en".equals(localeWithoutCountry.getLanguage())) {
061          description = i18nManager.messageFromFile(Locale.ENGLISH, ruleKey + ".html", relatedProperty, true);
062        }
063        return description;
064      }
065    
066      public String getParamDescription(String repositoryKey, String ruleKey, String paramKey, Locale locale) {
067        return message(repositoryKey, ruleKey, locale, ".param." + paramKey);
068      }
069    
070      String message(String repositoryKey, String ruleKey, Locale locale, String suffix) {
071        String propertyKey = new StringBuilder().append(RULE_PREFIX).append(repositoryKey).append(".").append(ruleKey).append(suffix).toString();
072        return i18nManager.message(locale, propertyKey, null);
073      }
074    
075      public List<RuleKey> searchNames(String search, Locale locale) {
076        List<RuleKey> result = Lists.newArrayList();
077        for (RuleKey ruleKey : ruleKeys) {
078          String name = i18nManager.message(locale, ruleKey.getNameProperty(), null);
079          if (name != null && StringUtils.indexOfIgnoreCase(name, search) >= 0) {
080            result.add(ruleKey);
081          }
082        }
083        return result;
084      }
085    
086      RuleKey[] getRuleKeys() {
087        return ruleKeys;
088      }
089    
090      static RuleKey extractRuleKey(String propertyKey) {
091        String s = StringUtils.substringBetween(propertyKey, RULE_PREFIX, NAME_SUFFIX);
092        String ruleKey = StringUtils.substringAfter(s, ".");
093        String repository = StringUtils.substringBefore(s, ".");
094        return new RuleKey(repository, ruleKey);
095      }
096    
097      static boolean isRuleProperty(String propertyKey) {
098        return StringUtils.startsWith(propertyKey, RULE_PREFIX) && StringUtils.endsWith(propertyKey, NAME_SUFFIX) && !propertyKey.contains(".param.");
099      }
100    
101      public static class RuleKey {
102        private String repositoryKey;
103        private String key;
104    
105        RuleKey(String repositoryKey, String key) {
106          this.repositoryKey = repositoryKey;
107          this.key = key;
108        }
109    
110        public String getRepositoryKey() {
111          return repositoryKey;
112        }
113    
114        public String getKey() {
115          return key;
116        }
117    
118        public String getNameProperty() {
119          return new StringBuilder().append(RULE_PREFIX).append(repositoryKey).append(".").append(key).append(NAME_SUFFIX).toString();
120        }
121    
122        @Override
123        public boolean equals(Object o) {
124          if (this == o) {
125            return true;
126          }
127          if (o == null || getClass() != o.getClass()) {
128            return false;
129          }
130          RuleKey ruleKey = (RuleKey) o;
131          if (!key.equals(ruleKey.key)) {
132            return false;
133          }
134          if (!repositoryKey.equals(ruleKey.repositoryKey)) {
135            return false;
136          }
137          return true;
138        }
139    
140        @Override
141        public int hashCode() {
142          int result = repositoryKey.hashCode();
143          result = 31 * result + key.hashCode();
144          return result;
145        }
146    
147        @Override
148        public String toString() {
149          return new StringBuilder().append(repositoryKey).append(":").append(key).toString();
150        }
151      }
152    }