All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.dennisit.vplus.data.utils.SonarUtils Maven / Gradle / Ivy

There is a newer version: 2.0.8
Show newest version
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 = "[未知]";
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy