From 53fe884463c5785c221e3ce2d0323aa8974ce90d Mon Sep 17 00:00:00 2001 From: youys <1272586223@qq.com> Date: Fri, 14 Jan 2022 18:16:25 +0800 Subject: [PATCH] local test --- .../net/educoder/ecsonar/model/Metrics.java | 1 + .../ecsonar/services/ReportService.java | 41 ++- .../ecsonar/services/SonarService.java | 10 +- .../ecsonar/task/ReadExcelRunnable.java | 18 +- .../net/educoder/ecsonar/utils/ExcelUtil.java | 338 +++++++++++++----- src/main/resources/application.properties | 8 +- src/main/resources/template1.xlsx | Bin 13450 -> 13059 bytes .../ecsonar/EcsonarApplicationTests.java | 10 +- 8 files changed, 316 insertions(+), 110 deletions(-) diff --git a/src/main/java/net/educoder/ecsonar/model/Metrics.java b/src/main/java/net/educoder/ecsonar/model/Metrics.java index dfaf52c..f1713c1 100644 --- a/src/main/java/net/educoder/ecsonar/model/Metrics.java +++ b/src/main/java/net/educoder/ecsonar/model/Metrics.java @@ -2,6 +2,7 @@ package net.educoder.ecsonar.model; public class Metrics { + // 复杂度 private String complexity; private int lines; diff --git a/src/main/java/net/educoder/ecsonar/services/ReportService.java b/src/main/java/net/educoder/ecsonar/services/ReportService.java index 219327d..02eba48 100644 --- a/src/main/java/net/educoder/ecsonar/services/ReportService.java +++ b/src/main/java/net/educoder/ecsonar/services/ReportService.java @@ -31,7 +31,7 @@ public class ReportService { public Metrics getMetrics(String name) { Project project = projectDao.findByName(name); if (project==null){ - return null; + return getDefault(); } String uuid = project.getProject_uuid(); @@ -57,6 +57,29 @@ public class ReportService { return metrics; } + public Metrics getDefault(){ + Metrics metrics = new Metrics(); + metrics.setComplexity("0"); + metrics.setLines(0); + metrics.setBlock_bugs(0); + metrics.setBlock_code_smells(0); + metrics.setBlock_violations(0); + metrics.setCritical_bugs(0); + metrics.setCritical_code_smells(0); + metrics.setCritical_violations(0); + metrics.setMajor_bugs(0); + metrics.setMajor_code_smells(0); + metrics.setMajor_violations(0); + metrics.setMinor_bugs(0); + metrics.setMinor_code_smells(0); + metrics.setMinor_violations(0); + metrics.setBugs("A"); + metrics.setViolations("A"); + metrics.setCode_smells("A"); + + return metrics; + } + /** * 将结果写进excel @@ -70,6 +93,22 @@ public class ReportService { ExcelUtil.saveExcel(workbook,outPath); } + /** + * 写入指定模板 + * @param stuId + * @param name + * @param metrics + * @param templatePath + * @param outPath + * @throws Exception + */ + public void writeSpecifyTemplateToExcel(String stuId, String name, + Metrics metrics, String templatePath, String outPath) throws Exception { + Workbook workbook = ExcelUtil.getWorkbok(new File(templatePath)); + ExcelUtil.writeToTemplateOne(metrics, stuId, name,workbook); + ExcelUtil.saveExcel(workbook,outPath); + } + /** * 获取复杂度 * diff --git a/src/main/java/net/educoder/ecsonar/services/SonarService.java b/src/main/java/net/educoder/ecsonar/services/SonarService.java index e430e5b..f0d70cf 100644 --- a/src/main/java/net/educoder/ecsonar/services/SonarService.java +++ b/src/main/java/net/educoder/ecsonar/services/SonarService.java @@ -36,8 +36,8 @@ public class SonarService { @Value("${sonar.url}") String sonarUrl; -// @Value("${sonar.token}") -// String sonarToken; + @Value("${sonar.token}") + String sonarToken; @Value("${extract.path}") String extractProgramPath; @@ -120,12 +120,14 @@ public class SonarService { public void sonar(String projectPath, String key) { - String command = "source ~/.bash_profile && sonar-scanner " + + String command = "cppcheck --xml --xml-version=2 --enable=all "+projectPath+" 2> /tmp/"+key+"-result.xml &&" + + "source ~/.bash_profile && sonar-scanner " + "-Dsonar.host.url=" + sonarUrl + " " + "-Dsonar.sourceEncoding=utf-8 " + "-Dsonar.projectKey=" + key + " " + -// "-Dsonar.login=" + sonarToken + " " + + "-Dsonar.login=" + sonarToken + " " + "-Dsonar.java.binaries=./ " + + "-Dsonar.cxx.cppcheck.reportPath=/tmp/"+ key+"-result.xml " + "-Dsonar.projectBaseDir=" + projectPath; log.info("projectPath:{},key:{}, command: {}", projectPath,key, command); SystemUtil.executeAndGetExitStatus(command); diff --git a/src/main/java/net/educoder/ecsonar/task/ReadExcelRunnable.java b/src/main/java/net/educoder/ecsonar/task/ReadExcelRunnable.java index c2022c2..860d3a8 100644 --- a/src/main/java/net/educoder/ecsonar/task/ReadExcelRunnable.java +++ b/src/main/java/net/educoder/ecsonar/task/ReadExcelRunnable.java @@ -44,15 +44,15 @@ public class ReadExcelRunnable implements Runnable{ if(!file.exists()){ file.mkdir(); } - for (Person person : sonarRequest.getPersonList()) { - String[] split = StringUtils.split(person.getDownloadUrl(), "/"); - String zipFilename = UrlUtil.getURLDecoderString(split[split.length - 1]); - try { - download(person.getDownloadUrl(),path+zipFilename); - } catch (IOException e) { - e.printStackTrace(); - } - } +// for (Person person : sonarRequest.getPersonList()) { +// String[] split = StringUtils.split(person.getDownloadUrl(), "/"); +// String zipFilename = UrlUtil.getURLDecoderString(split[split.length - 1]); +// try { +// download(person.getDownloadUrl(),path+zipFilename); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } String key = String.format("%d-%s", homeworkId, uid); log.info("开始调用sonar:{}",key); sonarService.sonar(path,key); diff --git a/src/main/java/net/educoder/ecsonar/utils/ExcelUtil.java b/src/main/java/net/educoder/ecsonar/utils/ExcelUtil.java index 300ddc6..a92847c 100644 --- a/src/main/java/net/educoder/ecsonar/utils/ExcelUtil.java +++ b/src/main/java/net/educoder/ecsonar/utils/ExcelUtil.java @@ -3,6 +3,7 @@ package net.educoder.ecsonar.utils; import net.educoder.ecsonar.model.Metrics; import net.educoder.ecsonar.model.api.Person; import org.apache.commons.lang3.StringUtils; +import org.apache.poi.hssf.usermodel.HSSFDataFormat; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; @@ -18,6 +19,11 @@ public class ExcelUtil { private static final String EXCEL_XLS = "xls"; private static final String EXCEL_XLSX = "xlsx"; + private static final String SCORE ="IFERROR(分数转化说明!B$4*V#line+分数转化说明!G$4*W#line+分数转化说明!L$4*X#line,\" \")"; + private static final String BUG ="IFERROR(100-SUMPRODUCT(代码检测结果!D#line:G#line,分数转化说明!B$6:E$6)/代码检测结果!$T#line*100,\" \")"; + private static final String VULNERABILITY ="IFERROR(100-SUMPRODUCT(代码检测结果!I#line:L#line,分数转化说明!G$6:J$6)/代码检测结果!$T#line*100,\" \")"; + private static final String CODE_SMELL ="IFERROR(100-SUMPRODUCT(代码检测结果!N#line:Q#line,分数转化说明!L$6:O$6)/代码检测结果!$T#line*100,\" \")"; + /** * 检查此用户是否查验过 @@ -60,121 +66,279 @@ public class ExcelUtil { Workbook workBook, int index) throws IOException { - // sheet 对应一个工作页 - Sheet sheet = workBook.getSheetAt(0); - /** - * 删除原有数据,除了属性列 - */ - int rowNumber = sheet.getLastRowNum(); // 第一行从0开始算 - - //从第三行开始 - Row newRow = null; - - for (int i = 3; i < rowNumber+1; ++i) { - Row row = sheet.getRow(i); - - if (row != null) { - Cell cell = row.getCell(1); - cell.setCellType(CellType.STRING); - if (StringUtils.isEmpty(cell.getStringCellValue()) - || StringUtils.equals(cell.getStringCellValue(), uid)) { - - newRow = row; - break; - } + // sheet 对应一个工作页 + Sheet sheet = workBook.getSheetAt(0); + + + /** + * 删除原有数据,除了属性列 + */ + int rowNumber = sheet.getLastRowNum(); // 第一行从0开始算 + + //从第三行开始 + Row newRow = null; + + for (int i = 3; i < rowNumber+1; ++i) { + Row row = sheet.getRow(i); + + if (row != null) { + Cell cell = row.getCell(1); + + cell.setCellType(CellType.STRING); + if (StringUtils.isEmpty(cell.getStringCellValue()) + || StringUtils.equals(cell.getStringCellValue(), uid)) { + + newRow = row; + break; } } + } - if (newRow == null) { - newRow = sheet.createRow(rowNumber+1); - } + if (newRow == null) { + newRow = sheet.createRow(rowNumber+1); + } + + //一直往下找,直到找到空的,或者与学号匹配的行,进行写入 + //学号 + Cell uidCell = newRow.createCell(1); + uidCell.setCellType(CellType.STRING); + uidCell.setCellValue(uid); + + Cell cell2 = newRow.createCell(2); + cell2.setCellType(CellType.STRING); + cell2.setCellValue(name); + + int offset = 0; + if (index == 2) { + offset = 17; + } + Cell cell3 = newRow.createCell(3 + offset); + cell3.setCellType(CellType.NUMERIC); + cell3.setCellValue(metrics.getBlock_bugs()); + + Cell cell4 = newRow.createCell(4 + offset); + cell4.setCellType(CellType.NUMERIC); + cell4.setCellValue(metrics.getCritical_bugs()); + + cell4 = newRow.createCell(5 + offset); + cell4.setCellType(CellType.NUMERIC); + cell4.setCellValue(metrics.getMajor_bugs()); + + cell4 = newRow.createCell(6 + offset); + cell4.setCellType(CellType.NUMERIC); + cell4.setCellValue(metrics.getMinor_bugs()); + + cell4 = newRow.createCell(7 + offset); + cell4.setCellType(CellType.STRING); + cell4.setCellValue(metrics.getBugs()); + + + cell4 = newRow.createCell(8 + offset); + cell4.setCellType(CellType.NUMERIC); + cell4.setCellValue(metrics.getBlock_violations()); + + cell4 = newRow.createCell(9 + offset); + cell4.setCellType(CellType.NUMERIC); + cell4.setCellValue(metrics.getCritical_violations()); + + cell4 = newRow.createCell(10 + offset); + cell4.setCellType(CellType.NUMERIC); + cell4.setCellValue(metrics.getMajor_violations()); + + cell4 = newRow.createCell(11 + offset); + cell4.setCellType(CellType.NUMERIC); + cell4.setCellValue(metrics.getMinor_violations()); + + cell4 = newRow.createCell(12 + offset); + cell4.setCellType(CellType.STRING); + cell4.setCellValue(metrics.getViolations()); + + + cell4 = newRow.createCell(13 + offset); + cell4.setCellType(CellType.NUMERIC); + cell4.setCellValue(metrics.getBlock_code_smells()); + + + cell4 = newRow.createCell(14 + offset); + cell4.setCellType(CellType.NUMERIC); + cell4.setCellValue(metrics.getCritical_code_smells()); + + cell4 = newRow.createCell(15 + offset); + cell4.setCellType(CellType.NUMERIC); + cell4.setCellValue(metrics.getMajor_violations()); + + cell4 = newRow.createCell(16 + offset); + cell4.setCellType(CellType.NUMERIC); + cell4.setCellValue(metrics.getMinor_code_smells()); - //一直往下找,直到找到空的,或者与学号匹配的行,进行写入 - //学号 - Cell uidCell = newRow.createCell(1); - uidCell.setCellType(CellType.STRING); - uidCell.setCellValue(uid); + cell4 = newRow.createCell(17 + offset); + cell4.setCellType(CellType.STRING); + cell4.setCellValue(metrics.getCode_smells()); - Cell cell2 = newRow.createCell(2); - cell2.setCellType(CellType.STRING); - cell2.setCellValue(name); - int offset = 0; - if (index == 2) { - offset = 17; + cell4 = newRow.createCell(18 + offset); + cell4.setCellType(CellType.NUMERIC); + cell4.setCellValue(metrics.getComplexity()); + + cell4 = newRow.createCell(19 + offset); + cell4.setCellType(CellType.NUMERIC); + cell4.setCellValue(metrics.getLines()); + + } + + + /** + * 根据template1写入excel + * @param metrics + * @param uid + * @param name + * @param workBook + * @throws IOException + */ + public static void writeToTemplateOne(Metrics metrics, String uid, + String name, + Workbook workBook) throws IOException { + + + // sheet 对应一个工作页 + Sheet sheet = workBook.getSheetAt(0); + sheet.setForceFormulaRecalculation(true); + CellStyle cellStyle = workBook.createCellStyle(); + cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00")); + + + /** + * 删除原有数据,除了属性列 + */ + int rowNumber = sheet.getLastRowNum(); // 第一行从0开始算 + + //从第三行开始 + Row newRow = null; + + for (int i = 3; i < rowNumber+1; ++i) { + Row row = sheet.getRow(i); + + if (row != null) { + Cell cell = row.getCell(1); + + cell.setCellType(CellType.STRING); + if (StringUtils.isEmpty(cell.getStringCellValue()) + || StringUtils.equals(cell.getStringCellValue(), uid)) { + + newRow = row; + break; + } } - Cell cell3 = newRow.createCell(3 + offset); - cell3.setCellType(CellType.NUMERIC); - cell3.setCellValue(metrics.getBlock_bugs()); + } + + if (newRow == null) { + newRow = sheet.createRow(rowNumber+1); + } + + //一直往下找,直到找到空的,或者与学号匹配的行,进行写入 + //学号 + Cell uidCell = newRow.createCell(1); + uidCell.setCellType(CellType.STRING); + uidCell.setCellValue(uid); + + Cell cell2 = newRow.createCell(2); + cell2.setCellType(CellType.STRING); + cell2.setCellValue(name); + + + Cell cell3 = newRow.createCell(3); + cell3.setCellType(CellType.NUMERIC); + cell3.setCellValue(metrics.getBlock_bugs()); + + Cell cell4 = newRow.createCell(4); + cell4.setCellType(CellType.NUMERIC); + cell4.setCellValue(metrics.getCritical_bugs()); + + cell4 = newRow.createCell(5); + cell4.setCellType(CellType.NUMERIC); + cell4.setCellValue(metrics.getMajor_bugs()); + + cell4 = newRow.createCell(6); + cell4.setCellType(CellType.NUMERIC); + cell4.setCellValue(metrics.getMinor_bugs()); + + cell4 = newRow.createCell(7); + cell4.setCellType(CellType.STRING); + cell4.setCellValue(metrics.getBugs()); - Cell cell4 = newRow.createCell(4 + offset); - cell4.setCellType(CellType.NUMERIC); - cell4.setCellValue(metrics.getCritical_bugs()); - cell4 = newRow.createCell(5 + offset); - cell4.setCellType(CellType.NUMERIC); - cell4.setCellValue(metrics.getMajor_bugs()); + cell4 = newRow.createCell(8); + cell4.setCellType(CellType.NUMERIC); + cell4.setCellValue(metrics.getBlock_violations()); - cell4 = newRow.createCell(6 + offset); - cell4.setCellType(CellType.NUMERIC); - cell4.setCellValue(metrics.getMinor_bugs()); + cell4 = newRow.createCell(9); + cell4.setCellType(CellType.NUMERIC); + cell4.setCellValue(metrics.getCritical_violations()); - cell4 = newRow.createCell(7 + offset); - cell4.setCellType(CellType.STRING); - cell4.setCellValue(metrics.getBugs()); + cell4 = newRow.createCell(10 ); + cell4.setCellType(CellType.NUMERIC); + cell4.setCellValue(metrics.getMajor_violations()); + cell4 = newRow.createCell(11 ); + cell4.setCellType(CellType.NUMERIC); + cell4.setCellValue(metrics.getMinor_violations()); - cell4 = newRow.createCell(8 + offset); - cell4.setCellType(CellType.NUMERIC); - cell4.setCellValue(metrics.getBlock_violations()); + cell4 = newRow.createCell(12); + cell4.setCellType(CellType.STRING); + cell4.setCellValue(metrics.getViolations()); - cell4 = newRow.createCell(9 + offset); - cell4.setCellType(CellType.NUMERIC); - cell4.setCellValue(metrics.getCritical_violations()); - cell4 = newRow.createCell(10 + offset); - cell4.setCellType(CellType.NUMERIC); - cell4.setCellValue(metrics.getMajor_violations()); + cell4 = newRow.createCell(13); + cell4.setCellType(CellType.NUMERIC); + cell4.setCellValue(metrics.getBlock_code_smells()); - cell4 = newRow.createCell(11 + offset); - cell4.setCellType(CellType.NUMERIC); - cell4.setCellValue(metrics.getMinor_violations()); - cell4 = newRow.createCell(12 + offset); - cell4.setCellType(CellType.STRING); - cell4.setCellValue(metrics.getViolations()); + cell4 = newRow.createCell(14); + cell4.setCellType(CellType.NUMERIC); + cell4.setCellValue(metrics.getCritical_code_smells()); + cell4 = newRow.createCell(15); + cell4.setCellType(CellType.NUMERIC); + cell4.setCellValue(metrics.getMajor_violations()); - cell4 = newRow.createCell(13 + offset); - cell4.setCellType(CellType.NUMERIC); - cell4.setCellValue(metrics.getBlock_code_smells()); + cell4 = newRow.createCell(16); + cell4.setCellType(CellType.NUMERIC); + cell4.setCellValue(metrics.getMinor_code_smells()); + cell4 = newRow.createCell(17); + cell4.setCellType(CellType.STRING); + cell4.setCellValue(metrics.getCode_smells()); - cell4 = newRow.createCell(14 + offset); - cell4.setCellType(CellType.NUMERIC); - cell4.setCellValue(metrics.getCritical_code_smells()); - cell4 = newRow.createCell(15 + offset); - cell4.setCellType(CellType.NUMERIC); - cell4.setCellValue(metrics.getMajor_violations()); + cell4 = newRow.createCell(18); + cell4.setCellType(CellType.NUMERIC); + cell4.setCellValue(metrics.getComplexity()); - cell4 = newRow.createCell(16 + offset); - cell4.setCellType(CellType.NUMERIC); - cell4.setCellValue(metrics.getMinor_code_smells()); + cell4 = newRow.createCell(19); + cell4.setCellType(CellType.NUMERIC); + cell4.setCellValue(metrics.getLines()); - cell4 = newRow.createCell(17 + offset); - cell4.setCellType(CellType.STRING); - cell4.setCellValue(metrics.getCode_smells()); + String rowStr = String.valueOf(rowNumber+2); + cell4 = newRow.createCell(20); + cell4.setCellType(CellType.FORMULA); + cell4.setCellStyle(cellStyle); + cell4.setCellFormula(SCORE.replaceAll("#line", rowStr)); - cell4 = newRow.createCell(18 + offset); - cell4.setCellType(CellType.NUMERIC); - cell4.setCellValue(metrics.getComplexity()); + cell4 = newRow.createCell(21); + cell4.setCellType(CellType.FORMULA); + cell4.setCellStyle(cellStyle); + cell4.setCellFormula(BUG.replaceAll("#line", rowStr)); - cell4 = newRow.createCell(19 + offset); - cell4.setCellType(CellType.NUMERIC); - cell4.setCellValue(metrics.getLines()); + cell4 = newRow.createCell(22); + cell4.setCellType(CellType.FORMULA); + cell4.setCellStyle(cellStyle); + cell4.setCellFormula(VULNERABILITY.replaceAll("#line", rowStr)); + cell4 = newRow.createCell(23); + cell4.setCellType(CellType.FORMULA); + cell4.setCellStyle(cellStyle); + cell4.setCellFormula(CODE_SMELL.replaceAll("#line", rowStr)); } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 07d38f3..0b02acd 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,7 +1,7 @@ -#spring.datasource.url=jdbc:postgresql://127.0.0.1:5432/sonar7.7 -spring.datasource.url=jdbc:postgresql://117.50.14.123:5432/sonar -spring.datasource.username=sonar -spring.datasource.password=sonar +spring.datasource.url=jdbc:postgresql://127.0.0.1:5432/sonar7.7 +#spring.datasource.url=jdbc:postgresql://117.50.14.123:5432/sonar +spring.datasource.username=root +spring.datasource.password=root spring.datasource.driver-class-name=org.postgresql.Driver diff --git a/src/main/resources/template1.xlsx b/src/main/resources/template1.xlsx index 6e80e04fd60022f9299b7bdb2d705d1726fa699b..b828e405f8fa6824020ddfb8f07d53028fd39135 100644 GIT binary patch delta 8262 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 YrY`@vzlM!i#-T*Op+rv$IR6p$U+d^(I{*Lx delta 8653 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 O=rJD%g_-9cvHt-Er6qR& diff --git a/src/test/java/net/educoder/ecsonar/EcsonarApplicationTests.java b/src/test/java/net/educoder/ecsonar/EcsonarApplicationTests.java index 9112652..dd4056a 100644 --- a/src/test/java/net/educoder/ecsonar/EcsonarApplicationTests.java +++ b/src/test/java/net/educoder/ecsonar/EcsonarApplicationTests.java @@ -100,7 +100,7 @@ public class EcsonarApplicationTests { Metrics metrics = reportService.getMetrics(projectName); String templatePath = this.getClass().getClassLoader().getResource("template1.xlsx").getPath(); - String outPath = "/Users/youyongsheng/Desktop/20210101.xlsx"; + String outPath = "/Users/youyongsheng/Desktop/202100000004.xlsx"; System.out.println("第"+(i++)+"个学生," + uid); if (CollectionUtils.isEmpty(collect.get(uid))) { @@ -109,12 +109,12 @@ public class EcsonarApplicationTests { continue; } - reportService.writeToExcel(uid, + + reportService.writeSpecifyTemplateToExcel(uid, collect.get(uid).get(0).getName(), metrics, - outPath, - outPath, - 1); + i == 2? templatePath : outPath, + outPath); }