]> source.dussan.org Git - sonarqube.git/blob
1b262701eb96e219921ed5b8cbad485b5e69f82c
[sonarqube.git] /
1 /*
2  * SonarQube
3  * Copyright (C) 2009-2016 SonarSource SA
4  * mailto:contact AT sonarsource DOT com
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 3 of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19  */
20 package org.sonar.server.qualityprofile.index;
21
22 import java.sql.PreparedStatement;
23 import java.sql.ResultSet;
24 import java.sql.SQLException;
25 import org.apache.commons.lang.StringUtils;
26 import org.sonar.api.rule.RuleKey;
27 import org.sonar.db.DbClient;
28 import org.sonar.db.DbSession;
29 import org.sonar.db.ResultSetIterator;
30 import org.sonar.db.qualityprofile.ActiveRuleKey;
31 import org.sonar.db.rule.SeverityUtil;
32 import org.sonar.server.qualityprofile.ActiveRule;
33
34 /**
35  * Scrolls over table ACTIVE_RULES and reads documents to populate the active rules index
36  */
37 public class ActiveRuleResultSetIterator extends ResultSetIterator<ActiveRuleDoc> {
38
39   private static final String[] FIELDS = {
40     // column 1
41     "a.failure_level",
42     "a.inheritance",
43     "r.plugin_rule_key",
44     "r.plugin_name",
45     "qp.kee",
46     "profile_parent.kee",
47     "a.created_at_ms",
48     "a.updated_at_ms"
49   };
50
51   private static final String SQL_ALL = "SELECT " + StringUtils.join(FIELDS, ",") + " FROM active_rules a " +
52     "INNER JOIN rules_profiles qp ON qp.id=a.profile_id " +
53     "INNER JOIN rules r ON r.id = a.rule_id " +
54     "LEFT JOIN rules_profiles profile_parent ON profile_parent.kee=qp.parent_kee ";
55
56   private static final String SQL_AFTER_DATE = SQL_ALL + " WHERE a.updated_at_ms>?";
57
58   private ActiveRuleResultSetIterator(PreparedStatement stmt) throws SQLException {
59     super(stmt);
60   }
61
62   static ActiveRuleResultSetIterator create(DbClient dbClient, DbSession session, long afterDate) {
63     try {
64       String sql = afterDate > 0L ? SQL_AFTER_DATE : SQL_ALL;
65       PreparedStatement stmt = dbClient.getMyBatis().newScrollingSelectStatement(session, sql);
66       if (afterDate > 0L) {
67         stmt.setLong(1, afterDate);
68       }
69       return new ActiveRuleResultSetIterator(stmt);
70     } catch (SQLException e) {
71       throw new IllegalStateException("Fail to prepare SQL request to select all active rules", e);
72     }
73   }
74
75   @Override
76   protected ActiveRuleDoc read(ResultSet rs) throws SQLException {
77     RuleKey ruleKey = RuleKey.of(rs.getString(4), rs.getString(3));
78     ActiveRuleKey activeRuleKey = ActiveRuleKey.of(rs.getString(5), ruleKey);
79
80     ActiveRuleDoc doc = new ActiveRuleDoc(activeRuleKey);
81
82     // all the fields must be present, even if value is null
83     doc.setSeverity(SeverityUtil.getSeverityFromOrdinal(rs.getInt(1)));
84
85     String inheritance = rs.getString(2);
86     if (inheritance != null) {
87       doc.setInheritance(inheritance);
88     } else {
89       doc.setInheritance(ActiveRule.Inheritance.NONE.name());
90     }
91
92     String parentProfileKey = rs.getString(6);
93     if (parentProfileKey != null) {
94       doc.setParentKey(ActiveRuleKey.of(parentProfileKey, ruleKey).toString());
95     } else {
96       doc.setParentKey(null);
97     }
98
99     doc.setCreatedAt(rs.getLong(7));
100     doc.setUpdatedAt(rs.getLong(8));
101
102     return doc;
103   }
104
105 }