2121
2222import java .nio .file .Path ;
2323import java .time .LocalDateTime ;
24- import java .time .ZoneId ;
24+ import java .time .ZoneOffset ;
2525import java .util .List ;
26+ import java .util .Map ;
27+ import java .util .stream .Stream ;
2628import org .jooq .Configuration ;
2729import org .jooq .Record ;
2830import org .sonarsource .sonarlint .core .commons .KnownFinding ;
2931import org .sonarsource .sonarlint .core .commons .KnownFindingType ;
3032import org .sonarsource .sonarlint .core .commons .LineWithHash ;
3133import org .sonarsource .sonarlint .core .commons .api .TextRangeWithHash ;
3234import org .sonarsource .sonarlint .core .commons .storage .SonarLintDatabase ;
35+ import org .sonarsource .sonarlint .core .commons .storage .model .tables .records .KnownFindingsRecord ;
3336
3437import static org .sonarsource .sonarlint .core .commons .storage .model .Tables .KNOWN_FINDINGS ;
3538
@@ -41,6 +44,56 @@ public KnownFindingsRepository(SonarLintDatabase database) {
4144 this .database = database ;
4245 }
4346
47+ public void storeFindings (Map <String , Map <Path , Findings >> findingsPerFilePerConfigScopeId ) {
48+ database .dsl ().batchMerge (findingsPerFilePerConfigScopeId .entrySet ().stream ()
49+ .flatMap (configScopeEntry -> {
50+ var configScopeId = configScopeEntry .getKey ();
51+ return configScopeEntry .getValue ().entrySet ().stream ()
52+ .flatMap (fileEntry -> {
53+ var filePath = fileEntry .getKey ();
54+ var findings = fileEntry .getValue ();
55+ return Stream .<KnownFindingsRecord >concat (
56+ findings .issues ().stream ()
57+ .map (finding -> createRecord (finding , configScopeId , filePath , KnownFindingType .ISSUE )),
58+ findings .hotspots ().stream ()
59+ .map (finding -> createRecord (finding , configScopeId , filePath , KnownFindingType .HOTSPOT )));
60+ });
61+ })
62+ .toList ())
63+ .execute ();
64+ }
65+
66+ private static KnownFindingsRecord createRecord (KnownFinding finding , String configScopeId , Path filePath , KnownFindingType type ) {
67+ var textRangeWithHash = finding .getTextRangeWithHash ();
68+ var startLine = textRangeWithHash == null ? null : textRangeWithHash .getStartLine ();
69+ var startLineOffset = textRangeWithHash == null ? null : textRangeWithHash .getStartLineOffset ();
70+ var endLine = textRangeWithHash == null ? null : textRangeWithHash .getEndLine ();
71+ var endLineOffset = textRangeWithHash == null ? null : textRangeWithHash .getEndLineOffset ();
72+ var textRangeHash = textRangeWithHash == null ? null : textRangeWithHash .getHash ();
73+
74+ var lineWithHash = finding .getLineWithHash ();
75+ var line = lineWithHash == null ? null : lineWithHash .getNumber ();
76+ var lineHash = lineWithHash == null ? null : lineWithHash .getHash ();
77+ var introDate = LocalDateTime .ofInstant (finding .getIntroductionDate (), ZoneOffset .UTC );
78+
79+ return new KnownFindingsRecord (
80+ finding .getId (),
81+ configScopeId ,
82+ filePath .toString (),
83+ finding .getServerKey (),
84+ finding .getRuleKey (),
85+ finding .getMessage (),
86+ introDate ,
87+ type .name (),
88+ startLine ,
89+ startLineOffset ,
90+ endLine ,
91+ endLineOffset ,
92+ textRangeHash ,
93+ line ,
94+ lineHash );
95+ }
96+
4497 public void storeKnownIssues (String configurationScopeId , Path clientRelativePath , List <KnownFinding > newKnownIssues ) {
4598 storeKnownFindings (configurationScopeId , clientRelativePath , newKnownIssues , KnownFindingType .ISSUE );
4699 }
@@ -69,7 +122,7 @@ private void storeKnownFindings(String configurationScopeId, Path clientRelative
69122 var lineWithHash = finding .getLineWithHash ();
70123 var line = lineWithHash == null ? null : lineWithHash .getNumber ();
71124 var lineHash = lineWithHash == null ? null : lineWithHash .getHash ();
72- var introDate = LocalDateTime .ofInstant (finding .getIntroductionDate (), ZoneId . systemDefault () );
125+ var introDate = LocalDateTime .ofInstant (finding .getIntroductionDate (), ZoneOffset . UTC );
73126 trx .dsl ().mergeInto (KNOWN_FINDINGS )
74127 .using (trx .dsl ().selectOne ())
75128 .on (KNOWN_FINDINGS .ID .eq (finding .getId ()))
@@ -95,8 +148,7 @@ private void storeKnownFindings(String configurationScopeId, Path clientRelative
95148 .values (finding .getId (), configurationScopeId , clientRelativePath .toString (), finding .getServerKey (), finding .getRuleKey (),
96149 finding .getMessage (), introDate , type .name (),
97150 startLine , startLineOffset , endLine , endLineOffset , textRangeHash ,
98- line , lineHash
99- )
151+ line , lineHash )
100152 .execute ();
101153 }));
102154 }
@@ -106,8 +158,7 @@ private List<KnownFinding> getKnownFindingsForFile(String configurationScopeId,
106158 .selectFrom (KNOWN_FINDINGS )
107159 .where (KNOWN_FINDINGS .CONFIGURATION_SCOPE_ID .eq (configurationScopeId )
108160 .and (KNOWN_FINDINGS .IDE_RELATIVE_FILE_PATH .eq (filePath .toString ()))
109- .and (KNOWN_FINDINGS .FINDING_TYPE .eq (type .name ()))
110- )
161+ .and (KNOWN_FINDINGS .FINDING_TYPE .eq (type .name ())))
111162 .fetch ();
112163 return issuesInFile .stream ()
113164 .map (KnownFindingsRepository ::recordToKnownFinding )
@@ -116,7 +167,7 @@ private List<KnownFinding> getKnownFindingsForFile(String configurationScopeId,
116167
117168 private static KnownFinding recordToKnownFinding (Record rec ) {
118169 var id = rec .get (KNOWN_FINDINGS .ID );
119- var introductionDate = rec .get (KNOWN_FINDINGS .INTRODUCTION_DATE ).atZone ( ZoneId . systemDefault ()). toInstant ();
170+ var introductionDate = rec .get (KNOWN_FINDINGS .INTRODUCTION_DATE ).toInstant (ZoneOffset . UTC );
120171 var textRangeWithHash = getTextRangeWithHash (rec );
121172 var lineWithHash = getLineWithHash (rec );
122173 return new KnownFinding (
@@ -125,25 +176,27 @@ private static KnownFinding recordToKnownFinding(Record rec) {
125176 textRangeWithHash , lineWithHash ,
126177 rec .get (KNOWN_FINDINGS .RULE_KEY ),
127178 rec .get (KNOWN_FINDINGS .MESSAGE ),
128- introductionDate
129- );
179+ introductionDate );
130180 }
131181
132182 private static LineWithHash getLineWithHash (Record rec ) {
133- if (rec .get (KNOWN_FINDINGS .LINE ) == null ) return null ;
134183 var line = rec .get (KNOWN_FINDINGS .LINE );
184+ if (line == null ) {
185+ return null ;
186+ }
135187 var hash = rec .get (KNOWN_FINDINGS .LINE_HASH );
136188 return new LineWithHash (line , hash );
137189 }
138190
139191 private static TextRangeWithHash getTextRangeWithHash (Record rec ) {
140- if (rec .get (KNOWN_FINDINGS .START_LINE ) == null ) return null ;
141192 var startLine = rec .get (KNOWN_FINDINGS .START_LINE );
193+ if (startLine == null ) {
194+ return null ;
195+ }
142196 var endLine = rec .get (KNOWN_FINDINGS .END_LINE );
143197 var startLineOffset = rec .get (KNOWN_FINDINGS .START_LINE_OFFSET );
144198 var endLineOffset = rec .get (KNOWN_FINDINGS .END_LINE_OFFSET );
145199 var hash = rec .get (KNOWN_FINDINGS .TEXT_RANGE_HASH );
146200 return new TextRangeWithHash (startLine , startLineOffset , endLine , endLineOffset , hash );
147201 }
148-
149202}
0 commit comments