aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sonar-core/src/main/resources/org/sonar/core/issue/IssueMapper.xml18
-rw-r--r--sonar-core/src/test/java/org/sonar/core/issue/IssueDaoTest.java4
-rw-r--r--sonar-plugin-api/src/main/java/org/sonar/api/issue/IssueQuery.java12
-rw-r--r--sonar-plugin-api/src/test/java/org/sonar/api/issue/IssueQueryTest.java18
-rw-r--r--sonar-server/src/main/java/org/sonar/server/issue/DefaultJRubyIssues.java1
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/app/controllers/drilldown_controller.rb12
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/app/controllers/resource_controller.rb3
-rw-r--r--sonar-server/src/test/java/org/sonar/server/issue/DefaultJRubyIssuesTest.java3
-rw-r--r--sonar-ws-client/src/main/java/org/sonar/wsclient/services/IssueQuery.java11
-rw-r--r--sonar-ws-client/src/test/java/org/sonar/wsclient/services/IssueQueryTest.java5
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