From f992861dbc8cf7f769e7d1f2a7460b0e5b06a5dd Mon Sep 17 00:00:00 2001 From: Julien Lancelot Date: Fri, 20 Jun 2014 11:19:51 +0200 Subject: [PATCH] SONAR-5329 First display of new changelog --- .../server/activity/ActivityService.java | 5 +++- .../server/activity/index/ActivityIndex.java | 17 +++++-------- .../qualityprofile/QProfileActivity.java | 12 ++++++--- .../qualityprofile/QProfileService.java | 8 +++--- .../app/views/profiles/changelog2.html.erb | 7 +++--- .../QProfileServiceMediumTest.java | 25 ++++++++++++++++++- 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 { 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| %> - <%= change.time().to_s -%> - <%= change.author() ? change.author() : 'System' %> + <%= Api::Utils.format_date(change.time()) -%> + <%= change.authorName() ? change.authorName() : change.login() ? !change.login().emtpy? : 'System' %> <%= change.action() %> - <%= change.ruleKey() %> + <%= change.ruleName() ? change.ruleName() : change.ruleKey() %> + <% end %> 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 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(); + } + } -- 2.39.5