aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sonar-server/src/main/java/org/sonar/server/activity/ActivityService.java5
-rw-r--r--sonar-server/src/main/java/org/sonar/server/activity/index/ActivityIndex.java17
-rw-r--r--sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileActivity.java12
-rw-r--r--sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileService.java8
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/app/views/profiles/changelog2.html.erb7
-rw-r--r--sonar-server/src/test/java/org/sonar/server/qualityprofile/QProfileServiceMediumTest.java25
6 files changed, 52 insertions, 22 deletions
diff --git a/sonar-server/src/main/java/org/sonar/server/activity/ActivityService.java b/sonar-server/src/main/java/org/sonar/server/activity/ActivityService.java
index 08b6b350673..faae800057e 100644
--- a/sonar-server/src/main/java/org/sonar/server/activity/ActivityService.java
+++ b/sonar-server/src/main/java/org/sonar/server/activity/ActivityService.java
@@ -31,6 +31,8 @@ import org.sonar.server.search.QueryOptions;
import org.sonar.server.search.Result;
import org.sonar.server.user.UserSession;
+import javax.annotation.Nullable;
+
import java.util.List;
/**
@@ -49,8 +51,9 @@ public class ActivityService {
this.indexClient = indexClient;
}
+ @Nullable
private String getAuthor() {
- return (UserSession.get().login() != null) ? UserSession.get().login() : "UNKNOWN";
+ return (UserSession.get().login() != null) ? UserSession.get().login() : null;
}
private void save(DbSession session, ActivityDto log) {
diff --git a/sonar-server/src/main/java/org/sonar/server/activity/index/ActivityIndex.java b/sonar-server/src/main/java/org/sonar/server/activity/index/ActivityIndex.java
index e80c4cf87f5..0ab2db9db32 100644
--- a/sonar-server/src/main/java/org/sonar/server/activity/index/ActivityIndex.java
+++ b/sonar-server/src/main/java/org/sonar/server/activity/index/ActivityIndex.java
@@ -25,21 +25,13 @@ import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.common.settings.ImmutableSettings;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.unit.TimeValue;
-import org.elasticsearch.index.query.AndFilterBuilder;
-import org.elasticsearch.index.query.FilterBuilder;
-import org.elasticsearch.index.query.FilterBuilders;
-import org.elasticsearch.index.query.OrFilterBuilder;
-import org.elasticsearch.index.query.QueryBuilders;
+import org.elasticsearch.index.query.*;
+import org.elasticsearch.search.sort.SortOrder;
import org.sonar.core.activity.Activity;
import org.sonar.core.activity.db.ActivityDto;
import org.sonar.core.cluster.WorkQueue;
import org.sonar.core.profiling.Profiling;
-import org.sonar.server.search.BaseIndex;
-import org.sonar.server.search.ESNode;
-import org.sonar.server.search.IndexDefinition;
-import org.sonar.server.search.IndexField;
-import org.sonar.server.search.QueryOptions;
-import org.sonar.server.search.Result;
+import org.sonar.server.search.*;
import java.io.IOException;
import java.util.HashMap;
@@ -110,6 +102,9 @@ public class ActivityIndex extends BaseIndex<Activity, ActivityDto, String> {
esSearch.setFrom(options.getOffset());
esSearch.setSize(options.getLimit());
+ // Sort Date Desc
+ esSearch.addSort(ActivityNormalizer.LogFields.CREATED_AT.field(), SortOrder.DESC);
+
AndFilterBuilder filter = FilterBuilders.andFilter();
// implement Type Filtering
diff --git a/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileActivity.java b/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileActivity.java
index 6174556166f..dc1b01339bb 100644
--- a/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileActivity.java
+++ b/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileActivity.java
@@ -25,6 +25,9 @@ import org.sonar.core.activity.Activity;
import org.sonar.server.activity.index.ActivityDoc;
import org.sonar.server.activity.index.ActivityNormalizer;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
+
import java.util.Map;
/**
@@ -43,19 +46,21 @@ public class QProfileActivity extends ActivityDoc implements Activity {
}
}
+ @CheckForNull
public String ruleName() {
return ruleName;
}
- public void ruleName(String ruleName) {
+ public void ruleName(@Nullable String ruleName) {
this.ruleName = ruleName;
}
+ @CheckForNull
public String authorName() {
return authorName;
}
- public void authorName(String authorName) {
+ public void authorName(@Nullable String authorName) {
this.authorName = authorName;
}
@@ -67,8 +72,9 @@ public class QProfileActivity extends ActivityDoc implements Activity {
return RuleKey.parse((String) getField("ruleKey"));
}
+ @CheckForNull
public String login() {
- return getField(ActivityNormalizer.LogFields.LOGIN.field());
+ return getNullableField(ActivityNormalizer.LogFields.LOGIN.field());
}
public String severity(){
diff --git a/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileService.java b/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileService.java
index 9c888bc31d5..f511f5141b0 100644
--- a/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileService.java
+++ b/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileService.java
@@ -32,6 +32,7 @@ import org.sonar.core.permission.GlobalPermissions;
import org.sonar.core.persistence.DbSession;
import org.sonar.core.qualityprofile.db.ActiveRuleKey;
import org.sonar.core.qualityprofile.db.QualityProfileDto;
+import org.sonar.core.rule.RuleDto;
import org.sonar.core.user.UserDto;
import org.sonar.server.activity.index.ActivityIndex;
import org.sonar.server.db.DbClient;
@@ -45,6 +46,7 @@ import org.sonar.server.user.UserSession;
import javax.annotation.CheckForNull;
import javax.annotation.Nullable;
+
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
@@ -288,14 +290,14 @@ public class QProfileService implements ServerComponent {
SearchResponse response = index.get(ActivityIndex.class).search(query, options, activityFilter);
for (SearchHit hit : response.getHits().getHits()) {
QProfileActivity profileActivity = new QProfileActivity(hit.getSource());
- profileActivity.ruleName(
- db.ruleDao().getByKey(session, profileActivity.ruleKey()).getName());
+ RuleDto ruleDto = db.ruleDao().getNullableByKey(session, profileActivity.ruleKey());
+ profileActivity.ruleName(ruleDto != null ? ruleDto.getName() : null);
UserDto user = db.userDao().selectActiveUserByLogin(profileActivity.login(), session);
if (user != null) {
profileActivity.authorName(user.getName());
} else {
- profileActivity.authorName(profileActivity.login());
+ profileActivity.authorName(null);
}
results.add(profileActivity);
}
diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/profiles/changelog2.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/profiles/changelog2.html.erb
index 2a563d4e9ec..6f93e74a643 100644
--- a/sonar-server/src/main/webapp/WEB-INF/app/views/profiles/changelog2.html.erb
+++ b/sonar-server/src/main/webapp/WEB-INF/app/views/profiles/changelog2.html.erb
@@ -28,10 +28,11 @@
@changes.each do |change|
%>
<tr class="<%= cycle('even', 'odd') -%>">
- <td valign="top" width="1%" nowrap><%= change.time().to_s -%></td>
- <td valign="top" width="1%" nowrap><%= change.author() ? change.author() : 'System' %></td>
+ <td valign="top" width="1%" nowrap><%= Api::Utils.format_date(change.time()) -%></td>
+ <td valign="top" width="1%" nowrap><%= change.authorName() ? change.authorName() : change.login() ? !change.login().emtpy? : 'System' %></td>
<td valign="top" width="1%" nowrap><%= change.action() %></td>
- <td valign="top"><%= change.ruleKey() %></td>
+ <td valign="top"><%= change.ruleName() ? change.ruleName() : change.ruleKey() %></td>
+ <td valign="top"></td>
</tr>
<% end %>
</table>
diff --git a/sonar-server/src/test/java/org/sonar/server/qualityprofile/QProfileServiceMediumTest.java b/sonar-server/src/test/java/org/sonar/server/qualityprofile/QProfileServiceMediumTest.java
index 90e74c4f5dc..2f5ec282877 100644
--- a/sonar-server/src/test/java/org/sonar/server/qualityprofile/QProfileServiceMediumTest.java
+++ b/sonar-server/src/test/java/org/sonar/server/qualityprofile/QProfileServiceMediumTest.java
@@ -156,6 +156,29 @@ public class QProfileServiceMediumTest {
assertThat(activity.parameters().get("max")).isEqualTo("10");
assertThat(activity.severity()).isEqualTo(Severity.MAJOR);
assertThat(activity.ruleName()).isEqualTo(rule.getName());
- assertThat(activity.authorName()).isEqualTo("me");
+ assertThat(activity.login()).isEqualTo("me");
+ assertThat(activity.authorName()).isNull();
}
+
+ @Test
+ public void search_qprofile_activity_with_rule_not_found() throws InterruptedException {
+ MockUserSession.set().setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN).setLogin("me");
+
+ RuleKey ruleKey = RuleKey.of("xoo", "deleted_rule");
+
+ tester.get(ActivityService.class).write(dbSession, Activity.Type.QPROFILE,
+ ActiveRuleChange.createFor(ActiveRuleChange.Type.ACTIVATED, ActiveRuleKey.of(XOO_P1_KEY, ruleKey))
+ .setSeverity(Severity.MAJOR)
+ .setParameter("max", "10")
+ );
+ dbSession.commit();
+
+ List<QProfileActivity> activities = service.findActivities(new QProfileActivityQuery(), new QueryOptions());
+ assertThat(activities).hasSize(1);
+
+ QProfileActivity activity = activities.get(0);
+ assertThat(activity.ruleKey()).isEqualTo(ruleKey);
+ assertThat(activity.ruleName()).isNull();
+ }
+
}