diff options
10 files changed, 72 insertions, 15 deletions
diff --git a/sonar-core/src/main/resources/org/sonar/core/issue/IssueMapper.xml b/sonar-core/src/main/resources/org/sonar/core/issue/IssueMapper.xml index bb1703815de..117db37a925 100644 --- a/sonar-core/src/main/resources/org/sonar/core/issue/IssueMapper.xml +++ b/sonar-core/src/main/resources/org/sonar/core/issue/IssueMapper.xml @@ -92,18 +92,21 @@ <sql id="selectQueryConditions"> from issues i - <if test="components != null and components.size() > 0"> + <if test="componentRoots != null and componentRoots.size() > 0"> , projects p, snapshots root, snapshots s </if> + <if test="components != null and components.size() > 0"> + , projects project_component + </if> <if test="ruleRepository != null and rule != null"> , rules r </if> <where> - <if test="components != null and components.size() > 0"> + <if test="componentRoots != null and componentRoots.size() > 0"> and p.enabled=${_true} and p.kee in - <foreach item="component" index="index" collection="components" open="(" separator="," close=")"> - #{component} + <foreach item="componentRoot" index="index" collection="componentRoots" open="(" separator="," close=")"> + #{componentRoot} </foreach> and root.project_id=p.id and root.islast=${_true} @@ -120,6 +123,13 @@ and s.islast=${_true} and i.resource_id=s.project_id </if> + <if test="components != null"> + and project_component.enabled=${_true} + and project_component.kee in + <foreach item="component" index="index" collection="components" open="(" separator="," close=")">#{component} + </foreach> + and i.resource_id=project_component.id + </if> <if test="keys != null"> and i.uuid in <foreach item="key" index="index" collection="keys" open="(" separator="," close=")">#{key} diff --git a/sonar-core/src/test/java/org/sonar/core/issue/IssueDaoTest.java b/sonar-core/src/test/java/org/sonar/core/issue/IssueDaoTest.java index 9d9c7d10cce..aea9b603599 100644 --- a/sonar-core/src/test/java/org/sonar/core/issue/IssueDaoTest.java +++ b/sonar-core/src/test/java/org/sonar/core/issue/IssueDaoTest.java @@ -177,10 +177,10 @@ public class IssueDaoTest extends AbstractDaoTestCase { } @Test - public void should_return_issues_from_resource_tree() { + public void should_return_issues_from_component_root() { setupData("select-with-component-children"); - IssueQuery issueQuery = IssueQuery.builder().components(newArrayList("key")).build(); + IssueQuery issueQuery = IssueQuery.builder().componentRoots(newArrayList("key")).build(); List<IssueDto> issues = newArrayList(dao.select(issueQuery)); assertThat(issues).hasSize(2); assertThat(issues.get(0).getId()).isEqualTo(100); diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/issue/IssueQuery.java b/sonar-plugin-api/src/main/java/org/sonar/api/issue/IssueQuery.java index e7cf30e7cf7..ab6ec98a9cd 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/issue/IssueQuery.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/issue/IssueQuery.java @@ -38,6 +38,7 @@ public class IssueQuery { private final List<String> statuses; private final List<String> resolutions; private final List<String> components; + private final List<String> componentRoots; private final String ruleRepository; private final String rule; private final List<String> userLogins; @@ -52,6 +53,7 @@ public class IssueQuery { this.statuses = builder.statuses; this.resolutions = builder.resolutions; this.components = builder.components; + this.componentRoots = builder.componentRoots; this.ruleRepository = builder.ruleRepository; this.rule = builder.rule; this.userLogins = builder.userLogins; @@ -82,6 +84,10 @@ public class IssueQuery { return components; } + public List<String> componentRoots() { + return componentRoots; + } + public String ruleRepository() { return ruleRepository; } @@ -137,6 +143,7 @@ public class IssueQuery { private List<String> statuses; private List<String> resolutions; private List<String> components; + private List<String> componentRoots; private String ruleRepository; private String rule; private List<String> userLogins; @@ -174,6 +181,11 @@ public class IssueQuery { return this; } + public Builder componentRoots(List<String> l) { + this.componentRoots = l; + return this; + } + public Builder ruleRepository(String ruleRepository) { this.ruleRepository = ruleRepository; return this; diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/issue/IssueQueryTest.java b/sonar-plugin-api/src/test/java/org/sonar/api/issue/IssueQueryTest.java index bc61e359408..ef7fcc4c354 100644 --- a/sonar-plugin-api/src/test/java/org/sonar/api/issue/IssueQueryTest.java +++ b/sonar-plugin-api/src/test/java/org/sonar/api/issue/IssueQueryTest.java @@ -22,6 +22,8 @@ package org.sonar.api.issue; import com.google.common.collect.Lists; import org.junit.Test; +import java.util.Date; + import static org.fest.assertions.Assertions.assertThat; public class IssueQueryTest { @@ -32,14 +34,30 @@ public class IssueQueryTest { .keys(Lists.newArrayList("ABCDE")) .severities(Lists.newArrayList(Issue.SEVERITY_BLOCKER)) .statuses(Lists.newArrayList(Issue.STATUS_RESOLVED)) + .resolutions(Lists.newArrayList(Issue.RESOLUTION_FALSE_POSITIVE)) + .components(Lists.newArrayList("components")) + .componentRoots(Lists.newArrayList("componentRoots")) + .ruleRepository("ruleRepository") + .rule("rule") + .userLogins(Lists.newArrayList("user")) .assigneeLogins(Lists.newArrayList("gargantua")) + .createdAfter(new Date()) + .createdBefore(new Date()) .limit(125) .offset(33) .build(); assertThat(query.keys()).containsExactly("ABCDE"); assertThat(query.severities()).containsExactly(Issue.SEVERITY_BLOCKER); assertThat(query.statuses()).containsExactly(Issue.STATUS_RESOLVED); + assertThat(query.resolutions()).containsExactly(Issue.RESOLUTION_FALSE_POSITIVE); + assertThat(query.components()).containsExactly("components"); + assertThat(query.componentRoots()).containsExactly("componentRoots"); + assertThat(query.userLogins()).containsExactly("user"); assertThat(query.assigneeLogins()).containsExactly("gargantua"); + assertThat(query.ruleRepository()).isEqualTo("ruleRepository"); + assertThat(query.rule()).isEqualTo("rule"); + assertThat(query.createdAfter()).isNotNull(); + assertThat(query.createdBefore()).isNotNull(); assertThat(query.limit()).isEqualTo(125); assertThat(query.offset()).isEqualTo(33); } diff --git a/sonar-server/src/main/java/org/sonar/server/issue/DefaultJRubyIssues.java b/sonar-server/src/main/java/org/sonar/server/issue/DefaultJRubyIssues.java index 0b931981245..13874b798d0 100644 --- a/sonar-server/src/main/java/org/sonar/server/issue/DefaultJRubyIssues.java +++ b/sonar-server/src/main/java/org/sonar/server/issue/DefaultJRubyIssues.java @@ -56,6 +56,7 @@ public class DefaultJRubyIssues implements JRubyIssues { builder.statuses(toStringList(props.get("statuses"))); builder.resolutions(toStringList(props.get("resolutions"))); builder.components(toStringList(props.get("components"))); + builder.componentRoots(toStringList(props.get("componentRoots"))); builder.rule(toString(props.get("rule"))); builder.ruleRepository(toString(props.get("ruleRepository"))); builder.userLogins(toStringList(props.get("userLogins"))); diff --git a/sonar-server/src/main/webapp/WEB-INF/app/controllers/drilldown_controller.rb b/sonar-server/src/main/webapp/WEB-INF/app/controllers/drilldown_controller.rb index 1f1a1b1c060..d4b108a90a0 100644 --- a/sonar-server/src/main/webapp/WEB-INF/app/controllers/drilldown_controller.rb +++ b/sonar-server/src/main/webapp/WEB-INF/app/controllers/drilldown_controller.rb @@ -212,11 +212,7 @@ class DrilldownController < ApplicationController @rule_measures = @snapshot.rule_measures(metrics) end - snapshot = @drilldown.highlighted_snapshot || @snapshot - # FIXME For the moment the issues API return issues for all the resource tree, so it's imposible to know if there are issues only for the project for instance - # issues = Api.issues.find({'componentKey' => snapshot.project.key}, current_user.id).issues - #@display_viewers = true if snapshot.file? || issues.size>0 - @display_viewers = snapshot.file? + @display_viewers=display_issue_viewers?(@drilldown.highlighted_snapshot || @snapshot) end private @@ -266,6 +262,12 @@ class DrilldownController < ApplicationController snapshot.violations.size>0 end + def display_issue_viewers?(snapshot) + return true if snapshot.file? + issues = Api.issues.find({'components' => snapshot.project.key}, current_user ? current_user.id : nil).issues + issues.size>0 + end + def guess_rule_severity(snapshot, rule, metric_prefix) Severity::KEYS.each do |severity| if snapshot.rule_measure(Metric.by_key("#{metric_prefix}#{severity.downcase}_violations"), rule) diff --git a/sonar-server/src/main/webapp/WEB-INF/app/controllers/resource_controller.rb b/sonar-server/src/main/webapp/WEB-INF/app/controllers/resource_controller.rb index d32ca9e5518..1445b6fec67 100644 --- a/sonar-server/src/main/webapp/WEB-INF/app/controllers/resource_controller.rb +++ b/sonar-server/src/main/webapp/WEB-INF/app/controllers/resource_controller.rb @@ -488,8 +488,7 @@ class ResourceController < ApplicationController end end - user = current_user ? current_user.id : nil - issues = Api.issues.find(options, user).issues + issues = Api.issues.find(options, current_user ? current_user.id : nil).issues issues.each do |issue| # sorted by severity => from blocker to info if @lines && issue.line && issue.line>0 && issue.line<=@lines.size diff --git a/sonar-server/src/test/java/org/sonar/server/issue/DefaultJRubyIssuesTest.java b/sonar-server/src/test/java/org/sonar/server/issue/DefaultJRubyIssuesTest.java index e8446364eb9..7eefbe14d40 100644 --- a/sonar-server/src/test/java/org/sonar/server/issue/DefaultJRubyIssuesTest.java +++ b/sonar-server/src/test/java/org/sonar/server/issue/DefaultJRubyIssuesTest.java @@ -60,6 +60,7 @@ public class DefaultJRubyIssuesTest { map.put("statuses", newArrayList("CLOSED")); map.put("resolutions", newArrayList("FALSE-POSITIVE")); map.put("components", newArrayList("org.apache")); + map.put("componentRoots", newArrayList("org.sonar")); map.put("userLogins", newArrayList("marilyn")); map.put("assigneeLogins", newArrayList("joanna")); map.put("createdAfter", "2013-04-16T09:08:24+0200"); @@ -74,6 +75,8 @@ public class DefaultJRubyIssuesTest { assertThat(query.severities()).containsExactly("MAJOR", "MINOR"); assertThat(query.statuses()).containsOnly("CLOSED"); assertThat(query.resolutions()).containsOnly("FALSE-POSITIVE"); + assertThat(query.components()).containsOnly("org.apache"); + assertThat(query.componentRoots()).containsOnly("org.sonar"); assertThat(query.userLogins()).containsOnly("marilyn"); assertThat(query.assigneeLogins()).containsOnly("joanna"); assertThat(query.rule()).isEqualTo("rule"); diff --git a/sonar-ws-client/src/main/java/org/sonar/wsclient/services/IssueQuery.java b/sonar-ws-client/src/main/java/org/sonar/wsclient/services/IssueQuery.java index a621517c384..e64c38df6f8 100644 --- a/sonar-ws-client/src/main/java/org/sonar/wsclient/services/IssueQuery.java +++ b/sonar-ws-client/src/main/java/org/sonar/wsclient/services/IssueQuery.java @@ -34,6 +34,7 @@ public final class IssueQuery extends Query<Issue> { private String[] status; private String[] resolutions; private String[] components; + private String[] componentRoots; private String ruleRepository; private String rule; private String[] userLogins; @@ -108,6 +109,15 @@ public final class IssueQuery extends Query<Issue> { return this; } + public String[] getComponentRoots() { + return componentRoots; + } + + public IssueQuery setComponentRoots(String... componentRoots) { + this.componentRoots = componentRoots; + return this; + } + public String getRuleRepository() { return ruleRepository; } @@ -190,6 +200,7 @@ public final class IssueQuery extends Query<Issue> { appendUrlParameter(url, "status", status); appendUrlParameter(url, "resolutions", resolutions); appendUrlParameter(url, "components", components); + appendUrlParameter(url, "componentRoots", componentRoots); appendUrlParameter(url, "ruleRepository", ruleRepository); appendUrlParameter(url, "rule", rule); appendUrlParameter(url, "userLogins", userLogins); diff --git a/sonar-ws-client/src/test/java/org/sonar/wsclient/services/IssueQueryTest.java b/sonar-ws-client/src/test/java/org/sonar/wsclient/services/IssueQueryTest.java index 2d7bb8a6684..f0a89b5ff17 100644 --- a/sonar-ws-client/src/test/java/org/sonar/wsclient/services/IssueQueryTest.java +++ b/sonar-ws-client/src/test/java/org/sonar/wsclient/services/IssueQueryTest.java @@ -40,6 +40,7 @@ public class IssueQueryTest extends QueryTestCase { .setKeys("key1", "key2") .setAssigneeLogins("assigneeLogin1", "assigneeLogin2") .setComponents("component1", "component2") + .setComponentRoots("componentRoot1", "componentRoot2") .setLimit(1) .setMinSeverity("minSev") .setResolutions("resoltion1", "resolution2") @@ -50,8 +51,8 @@ public class IssueQueryTest extends QueryTestCase { .setUserLogins("userLogin1", "userLogin2") ; assertThat(query.getUrl()).isEqualTo("/api/issues/search?keys=key1,key2&severities=sev1,sev2&minSeverity=minSev&status=status1,status2&" + - "resolutions=resoltion1,resolution2&components=component1,component2&ruleRepository=ruleRepo&rule=rule&userLogins=userLogin1,userLogin2&" + - "assigneeLogins=assigneeLogin1,assigneeLogin2&limit=1&"); + "resolutions=resoltion1,resolution2&components=component1,component2&componentRoots=componentRoot1,componentRoot2&ruleRepository=ruleRepo&rule=rule&" + + "userLogins=userLogin1,userLogin2&assigneeLogins=assigneeLogin1,assigneeLogin2&limit=1&"); } @Test |