From a38296fabb62f645fbd4ad72643c6803e367b003 Mon Sep 17 00:00:00 2001 From: Stephane Gamard Date: Mon, 19 May 2014 15:18:06 +0200 Subject: [PATCH] SONAR-5007 - Added Notes to Rule WS --- .../java/org/sonar/server/rule2/Rule.java | 8 +++++- .../org/sonar/server/rule2/index/RuleDoc.java | 21 +++++++++----- .../sonar/server/rule2/index/RuleIndex.java | 15 ++++++++++ .../server/rule2/index/RuleNormalizer.java | 11 +++++++- .../org/sonar/server/search/IndexUtils.java | 14 +++++++--- .../server/rule2/RuleServiceMediumTest.java | 17 ++++++----- .../server/rule2/ws/RulesWebServiceTest.java | 28 +++++++++++++++++++ 7 files changed, 92 insertions(+), 22 deletions(-) diff --git a/sonar-server/src/main/java/org/sonar/server/rule2/Rule.java b/sonar-server/src/main/java/org/sonar/server/rule2/Rule.java index f12863dcbed..2582e03c57b 100644 --- a/sonar-server/src/main/java/org/sonar/server/rule2/Rule.java +++ b/sonar-server/src/main/java/org/sonar/server/rule2/Rule.java @@ -83,8 +83,14 @@ public interface Rule { String internalKey(); @CheckForNull - String noteAsMarkdown(); + String markdownNote(); @CheckForNull String noteLogin(); + + @CheckForNull + Date noteCreatedAt(); + + @CheckForNull + Date noteUpdatedAt(); } diff --git a/sonar-server/src/main/java/org/sonar/server/rule2/index/RuleDoc.java b/sonar-server/src/main/java/org/sonar/server/rule2/index/RuleDoc.java index 770c1a022f8..dc316d10a88 100644 --- a/sonar-server/src/main/java/org/sonar/server/rule2/index/RuleDoc.java +++ b/sonar-server/src/main/java/org/sonar/server/rule2/index/RuleDoc.java @@ -62,6 +62,11 @@ class RuleDoc implements Rule { return (String) fields.get(RuleField.INTERNAL_KEY.key()); } + @Override + public String markdownNote() { + return (String) fields.get(RuleField.NOTE.key()); + } + @Override @CheckForNull public String language() { @@ -191,16 +196,18 @@ class RuleDoc implements Rule { @Override @CheckForNull - public String noteAsMarkdown() { - // TODO - return null; + public String noteLogin() { + return (String) fields.get(RuleField.NOTE_LOGIN.key()); } @Override - @CheckForNull - public String noteLogin() { - // TODO - return null; + public Date noteCreatedAt() { + return IndexUtils.parseDateTime((String) fields.get(RuleField.NOTE_CREATED_AT.key())); + } + + @Override + public Date noteUpdatedAt() { + return IndexUtils.parseDateTime((String) fields.get(RuleField.NOTE_UPDATED_AT.key())); } @Override diff --git a/sonar-server/src/main/java/org/sonar/server/rule2/index/RuleIndex.java b/sonar-server/src/main/java/org/sonar/server/rule2/index/RuleIndex.java index 5210808909c..bb7dec369f5 100644 --- a/sonar-server/src/main/java/org/sonar/server/rule2/index/RuleIndex.java +++ b/sonar-server/src/main/java/org/sonar/server/rule2/index/RuleIndex.java @@ -67,6 +67,10 @@ public class RuleIndex extends BaseIndex { RuleNormalizer.RuleField.REPOSITORY.key(), RuleNormalizer.RuleField.PARAMS.key(), RuleNormalizer.RuleField.TEMPLATE.key(), + RuleNormalizer.RuleField.NOTE.key(), + RuleNormalizer.RuleField.NOTE_CREATED_AT.key(), + RuleNormalizer.RuleField.NOTE_UPDATED_AT.key(), + RuleNormalizer.RuleField.NOTE_LOGIN.key(), RuleNormalizer.RuleField.INTERNAL_KEY.key(), RuleNormalizer.RuleField.UPDATED_AT.key(), RuleNormalizer.RuleField.DEBT_FUNCTION_TYPE.key(), @@ -136,6 +140,17 @@ public class RuleIndex extends BaseIndex { addMatchField(mapping, RuleNormalizer.RuleField.SEVERITY.key(), "string"); addMatchField(mapping, RuleNormalizer.RuleField.STATUS.key(), "string"); + + mapping.startObject(RuleNormalizer.RuleField.NOTE_CREATED_AT.key()) + .field("type", "date") + .field("format", "date_time") + .endObject(); + + mapping.startObject(RuleNormalizer.RuleField.NOTE_UPDATED_AT.key()) + .field("type", "date") + .field("format", "date_time") + .endObject(); + mapping.startObject(RuleNormalizer.RuleField.CREATED_AT.key()) .field("type", "date") .field("format", "date_time") diff --git a/sonar-server/src/main/java/org/sonar/server/rule2/index/RuleNormalizer.java b/sonar-server/src/main/java/org/sonar/server/rule2/index/RuleNormalizer.java index 60136da024d..0a0d8951a9b 100644 --- a/sonar-server/src/main/java/org/sonar/server/rule2/index/RuleNormalizer.java +++ b/sonar-server/src/main/java/org/sonar/server/rule2/index/RuleNormalizer.java @@ -58,7 +58,11 @@ public class RuleNormalizer extends BaseNormalizer { DEBT_FUNCTION_TYPE("debtFunction"), DEBT_FUNCTION_COEFFICIENT("debtCoefficient"), DEBT_FUNCTION_OFFSET("debtOffset"), - SUB_CHARACTERISTIC("subCharacteristicKey"); + SUB_CHARACTERISTIC("subCharacteristicKey"), + NOTE("note"), + NOTE_LOGIN("noteLogin"), + NOTE_CREATED_AT("noteCreatedAt"), + NOTE_UPDATED_AT("noteUpdatedAt"); private final String key; @@ -135,6 +139,11 @@ public class RuleNormalizer extends BaseNormalizer { update.put(RuleField.INTERNAL_KEY.key(), rule.getConfigKey()); update.put(RuleField.TEMPLATE.key(), rule.getCardinality() == Cardinality.MULTIPLE); + update.put(RuleField.NOTE.key(), rule.getNoteData()); + update.put(RuleField.NOTE_LOGIN.key(), rule.getNoteUserLogin()); + update.put(RuleField.NOTE_CREATED_AT.key(), rule.getNoteCreatedAt()); + update.put(RuleField.NOTE_UPDATED_AT.key(), rule.getNoteUpdatedAt()); + //TODO Change on key when available String subChar = null; if (rule.getDefaultSubCharacteristicId() != null) { diff --git a/sonar-server/src/main/java/org/sonar/server/search/IndexUtils.java b/sonar-server/src/main/java/org/sonar/server/search/IndexUtils.java index 99d6254c9c9..a0f41d71660 100644 --- a/sonar-server/src/main/java/org/sonar/server/search/IndexUtils.java +++ b/sonar-server/src/main/java/org/sonar/server/search/IndexUtils.java @@ -19,6 +19,7 @@ */ package org.sonar.server.search; +import javax.annotation.CheckForNull; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -30,12 +31,17 @@ public class IndexUtils { // only static stuff } + @CheckForNull public static Date parseDateTime(String s) { DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); - try { - return sdf.parse(s); - } catch (ParseException e) { - throw new IllegalArgumentException("Cannot parse ES date: " + s, e); + if (s == null) { + return null; + } else { + try { + return sdf.parse(s); + } catch (ParseException e) { + throw new IllegalArgumentException("Cannot parse ES date: " + s, e); + } } } } diff --git a/sonar-server/src/test/java/org/sonar/server/rule2/RuleServiceMediumTest.java b/sonar-server/src/test/java/org/sonar/server/rule2/RuleServiceMediumTest.java index ecc17fba96d..81ce6355efb 100644 --- a/sonar-server/src/test/java/org/sonar/server/rule2/RuleServiceMediumTest.java +++ b/sonar-server/src/test/java/org/sonar/server/rule2/RuleServiceMediumTest.java @@ -145,10 +145,10 @@ public class RuleServiceMediumTest { index.refresh(); Rule rule = index.getByKey(ruleKey); // TODO -// assertThat(rule.getNote()).isEqualTo("my *note*"); -// assertThat(rule.getNoteCreatedAt()).isNotNull(); -// assertThat(rule.getNoteUpdatedAt()).isNotNull(); -// assertThat(rule.getNoteUserLogin()).isEqualTo("marius"); + assertThat(rule.markdownNote()).isEqualTo("my *note*"); + assertThat(rule.noteCreatedAt()).isNotNull(); + assertThat(rule.noteUpdatedAt()).isNotNull(); + assertThat(rule.noteLogin()).isEqualTo("marius"); // 2. DELETE NOTE service.setNote(ruleKey, null); @@ -160,11 +160,10 @@ public class RuleServiceMediumTest { assertThat(dto.getNoteUserLogin()).isNull(); index.refresh(); rule = index.getByKey(ruleKey); - // TODO - // assertThat(rule.getNote()).isNull(); -// assertThat(rule.getNoteCreatedAt()).isNull(); -// assertThat(rule.getNoteUpdatedAt()).isNull(); -// assertThat(rule.getNoteUserLogin()).isNull(); + assertThat(rule.markdownNote()).isNull(); + assertThat(rule.noteCreatedAt()).isNull(); + assertThat(rule.noteUpdatedAt()).isNull(); + assertThat(rule.noteLogin()).isNull(); } diff --git a/sonar-server/src/test/java/org/sonar/server/rule2/ws/RulesWebServiceTest.java b/sonar-server/src/test/java/org/sonar/server/rule2/ws/RulesWebServiceTest.java index 0d214c7b7db..ebf47ae0f13 100644 --- a/sonar-server/src/test/java/org/sonar/server/rule2/ws/RulesWebServiceTest.java +++ b/sonar-server/src/test/java/org/sonar/server/rule2/ws/RulesWebServiceTest.java @@ -42,6 +42,7 @@ import org.sonar.core.rule.RuleDto; import org.sonar.core.rule.RuleParamDto; import org.sonar.server.qualityprofile.persistence.ActiveRuleDao; import org.sonar.server.rule2.RuleService; +import org.sonar.server.rule2.index.RuleNormalizer; import org.sonar.server.rule2.persistence.RuleDao; import org.sonar.server.tester.ServerTester; import org.sonar.server.user.MockUserSession; @@ -300,6 +301,33 @@ public class RulesWebServiceTest { result.assertJson(this.getClass(),"get_tags.json"); } + @Test + public void get_notes() throws Exception { + QualityProfileDto profile = newQualityProfile(); + tester.get(QualityProfileDao.class).insert(profile, session); + + RuleDto rule = newRuleDto(RuleKey.of(profile.getLanguage(), "S001")) + .setNoteData("Note1"); + ruleDao.insert(rule, session); + + RuleDto rule2 = newRuleDto(RuleKey.of(profile.getLanguage(), "S002")) + .setNoteData("Note2"); + ruleDao.insert(rule2, session); + + session.commit(); + tester.get(RuleService.class).refresh(); + + + MockUserSession.set(); + WsTester.TestRequest request = wsTester.newGetRequest("api/rules", "search"); + request.setParam("f", RuleNormalizer.RuleField.NOTE.key()); + WsTester.Result result = request.execute(); + + System.out.println("result.outputAsString() = " + result.outputAsString()); + + result.assertJson(this.getClass(),"get_tags.json"); + } + private QualityProfileDto newQualityProfile() { -- 2.39.5