com.github.dennisit.vplus.data.utils.SonarUtils Maven / Gradle / Ivy
package com.github.dennisit.vplus.data.utils;
import com.alibaba.fastjson.JSON;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.val;
import org.jsoup.Jsoup;
import java.util.ArrayList;
import java.util.Arrays;
public class SonarUtils {
public static String SONAR_TIPS = "bug:{$bug},漏洞:{$leak},坏味道:{$code_smell},覆盖率:{$coverage},重复:{$density},状态:{$status}";
public static String SONAR_ADDR = "$sonarUrl/api/measures/search?projectKeys=$projectName&metricKeys=alert_status,bugs,reliability_rating,vulnerabilities,security_rating,code_smells,sqale_rating,duplicated_lines_density,coverage,ncloc,ncloc_language_distribution";
public static String sonar(String sonarUrl, String projectName) {
try {
val doc = Jsoup.connect(SONAR_ADDR.replace("$sonarUrl", sonarUrl).replace("$projectName", projectName))
.header("Accept", "*/*")
.header("Accept-Encoding", "gzip, deflate")
.header("Accept-Language", "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3")
.header("Content-Type", "application/json;charset=UTF-8")
.ignoreContentType(true);
val html = doc.get().body().html();
Result json = JSON.parseObject(html, Result.class);
if (json.measures.size() > 0) {
ParseResult r = new ParseResult();
json.measures.forEach(item -> {
if (item.metric.equals("bugs")) {
r.bug = item.value;
} else if (item.metric.equals("vulnerabilities")) {
r.leak = item.value;
} else if (item.metric.equals("code_smells")) {
r.code_smell = item.value;
} else if (item.metric.equals("coverage")) {
r.coverage = item.value;
} else if (item.metric.equals("duplicated_lines_density")) {
r.density = item.value;
} else if (item.metric.equals("alert_status")) {
r.status = item.value;
}
});
val sonarResult = new String[]{SONAR_TIPS};
Arrays.stream(r.getClass().getDeclaredFields()).forEach(c -> {
c.setAccessible(true);
try {
sonarResult[0] = sonarResult[0].replace("{$" + c.getName() + "}", c.get(r).toString());
} catch (Exception e) {
}
});
return sonarResult[0];
}
throw new Exception("访问异常");
} catch (Exception e) {
return "访问sonar出错:" + e.getMessage();
}
}
@Data
@AllArgsConstructor
@NoArgsConstructor
private static class Result {
private ArrayList measures = new ArrayList<>();
}
@Data
@AllArgsConstructor
@NoArgsConstructor
private static class Metric {
private String metric;
private Object value;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
private static class ParseResult {
private Object bug = "[未知]";
private Object leak = "[未知]";
private Object code_smell = "[未知]";
private Object coverage = "[未知]";
private Object density = "[未知]";
private Object status = "[未知]";
}
}