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 */ 020package org.sonar.core.rule; 021 022import com.google.common.collect.BiMap; 023import com.google.common.collect.HashBiMap; 024import com.google.common.collect.Maps; 025import org.sonar.api.rules.Rule; 026import org.sonar.api.rules.RuleQuery; 027import org.sonar.core.rule.DefaultRuleFinder; 028import org.sonar.jpa.session.DatabaseSessionFactory; 029 030import java.util.Map; 031 032public final class CacheRuleFinder extends DefaultRuleFinder { 033 034 private BiMap<Integer, Rule> rulesById = HashBiMap.create(); 035 private Map<String, Map<String, Rule>> rulesByKey = Maps.newHashMap(); 036 037 public CacheRuleFinder(DatabaseSessionFactory sessionFactory) { 038 super(sessionFactory); 039 } 040 041 @Override 042 public Rule findById(int ruleId) { 043 Rule rule = rulesById.get(ruleId); 044 if (rule == null) { 045 rule = doFindById(ruleId); 046 if (rule != null) { 047 loadRepository(rule.getRepositoryKey()); 048 } 049 } 050 return rule; 051 } 052 053 @Override 054 public Rule findByKey(String repositoryKey, String ruleKey) { 055 Map<String, Rule> repository = loadRepository(repositoryKey); 056 return repository.get(ruleKey); 057 } 058 059 private Map<String, Rule> loadRepository(String repositoryKey) { 060 Map<String, Rule> repository = rulesByKey.get(repositoryKey); 061 if (repository == null) { 062 repository = Maps.newHashMap(); 063 rulesByKey.put(repositoryKey, repository); 064 065 for (Rule rule : findAll(RuleQuery.create().withRepositoryKey(repositoryKey))) { 066 repository.put(rule.getKey(), rule); 067 rulesById.put(rule.getId(), rule); 068 } 069 } 070 return repository; 071 } 072}