diff --git a/src/main/java/net/educoder/ecsonar/dao/GameCodesDao.java b/src/main/java/net/educoder/ecsonar/dao/GameCodesDao.java index f75069f..5735f24 100644 --- a/src/main/java/net/educoder/ecsonar/dao/GameCodesDao.java +++ b/src/main/java/net/educoder/ecsonar/dao/GameCodesDao.java @@ -9,7 +9,11 @@ import org.apache.ibatis.annotations.Select; * @Description: */ public interface GameCodesDao { - + @Select("select new_code code,path from game_codes where id=#{id}") GameCodes queryOriginalCodeById(Long id); + + + @Select("select code,path from student_work_shixun_codes where id=#{id}") + GameCodes queryShiXunOriginalCodeById(Long id); } diff --git a/src/main/java/net/educoder/ecsonar/dao/TaskInfoDetailDao.java b/src/main/java/net/educoder/ecsonar/dao/TaskInfoDetailDao.java index fc69287..fb8816a 100644 --- a/src/main/java/net/educoder/ecsonar/dao/TaskInfoDetailDao.java +++ b/src/main/java/net/educoder/ecsonar/dao/TaskInfoDetailDao.java @@ -20,7 +20,8 @@ public interface TaskInfoDetailDao { * * @param taskInfoDetail */ - @Insert("insert into task_info_detail(id,task_id,project_name,student_id,user_id,name,code_ids) values(#{id},#{taskId},#{projectName},#{studentId},#{userId} ,#{name},#{codeIds})") + @Insert("insert into task_info_detail(id,task_id,project_name,student_id,user_id,name,code_ids, shixun_code_ids) " + + "values(#{id},#{taskId},#{projectName},#{studentId},#{userId} ,#{name},#{codeIds}, #{shiXunCodeIds})") void insertTaskInfoDetail(TaskInfoDetail taskInfoDetail); /** @@ -47,7 +48,9 @@ public interface TaskInfoDetailDao { * @param id * @return */ - @Select("select id,task_id taskId,project_name projectName,student_id studentId,user_id userId,name,code_ids codeIds,status,create_time createTime,update_time updateTime from task_info_detail where id=#{id}") + @Select("select id,task_id taskId,project_name projectName,student_id studentId,user_id userId,name," + + "code_ids codeIds,shixun_code_ids shiXunCodeIds, status,create_time createTime,update_time updateTime " + + "from task_info_detail where id=#{id}") TaskInfoDetail selectById(String id); /** @@ -69,6 +72,9 @@ public interface TaskInfoDetailDao { * @param position * @return */ - @Select("select id,task_id taskId,project_name projectName,student_id studentId,user_id userId,name,code_ids codeIds,status,create_time createTime,update_time updateTime from task_info_detail where task_id=#{taskId} limit #{pageSize} offset #{position}") - List selectTaskInfoDetailPageList(@Param("taskId") String taskId, @Param("pageSize") Integer pageSize, @Param("position") Integer position); + @Select("select id,task_id taskId,project_name projectName,student_id studentId,user_id userId,name," + + "code_ids codeIds,shixun_code_ids shiXunCodeIds, status,create_time createTime,update_time updateTime " + + "from task_info_detail where task_id=#{taskId} limit #{pageSize} offset #{position}") + List selectTaskInfoDetailPageList(@Param("taskId") String taskId, + @Param("pageSize") Integer pageSize, @Param("position") Integer position); } diff --git a/src/main/java/net/educoder/ecsonar/model/TaskInfoDetail.java b/src/main/java/net/educoder/ecsonar/model/TaskInfoDetail.java index 1f34deb..007d30a 100644 --- a/src/main/java/net/educoder/ecsonar/model/TaskInfoDetail.java +++ b/src/main/java/net/educoder/ecsonar/model/TaskInfoDetail.java @@ -16,6 +16,7 @@ public class TaskInfoDetail { private Long userId; private String name; private String codeIds; + private String shiXunCodeIds; /** * 0处理中 1处理成功 -1 处理失败 */ @@ -103,4 +104,12 @@ public class TaskInfoDetail { public void setUpdateTime(Date updateTime) { this.updateTime = updateTime; } + + public String getShiXunCodeIds() { + return shiXunCodeIds; + } + + public void setShiXunCodeIds(String shiXunCodeIds) { + this.shiXunCodeIds = shiXunCodeIds; + } } diff --git a/src/main/java/net/educoder/ecsonar/model/vo/QualityInspectUserDataVO.java b/src/main/java/net/educoder/ecsonar/model/vo/QualityInspectUserDataVO.java index 978560b..887f960 100644 --- a/src/main/java/net/educoder/ecsonar/model/vo/QualityInspectUserDataVO.java +++ b/src/main/java/net/educoder/ecsonar/model/vo/QualityInspectUserDataVO.java @@ -30,6 +30,8 @@ public class QualityInspectUserDataVO implements Serializable { */ private List codeIds; + private List studentWorkShixunCodeIds; + public String getStudentId() { return studentId; } @@ -61,4 +63,12 @@ public class QualityInspectUserDataVO implements Serializable { public void setUserId(Long userId) { this.userId = userId; } + + public List getStudentWorkShixunCodeIds() { + return studentWorkShixunCodeIds; + } + + public void setStudentWorkShixunCodeIds(List studentWorkShixunCodeIds) { + this.studentWorkShixunCodeIds = studentWorkShixunCodeIds; + } } diff --git a/src/main/java/net/educoder/ecsonar/services/DbOperateService.java b/src/main/java/net/educoder/ecsonar/services/DbOperateService.java index 24823e3..495bc5c 100644 --- a/src/main/java/net/educoder/ecsonar/services/DbOperateService.java +++ b/src/main/java/net/educoder/ecsonar/services/DbOperateService.java @@ -45,6 +45,13 @@ public class DbOperateService { return gameCode; } + public GameCodes queryShiXunCodesById(Long id) { + DynamicDataSourceContextHolder.setContextKey(DynamicDataSourceConfig.READONLY); + GameCodes gameCode = gameCodesDao.queryShiXunOriginalCodeById(id); + DynamicDataSourceContextHolder.removeContextKey(); + return gameCode; + } + /** * 查询任务执行状态 * diff --git a/src/main/java/net/educoder/ecsonar/services/QualityInspectService.java b/src/main/java/net/educoder/ecsonar/services/QualityInspectService.java index b15236a..54f3e92 100644 --- a/src/main/java/net/educoder/ecsonar/services/QualityInspectService.java +++ b/src/main/java/net/educoder/ecsonar/services/QualityInspectService.java @@ -108,6 +108,7 @@ public class QualityInspectService { taskInfoDetail.setStudentId(userData.getStudentId()); taskInfoDetail.setUserId(userData.getUserId()); taskInfoDetail.setCodeIds(userData.getCodeIds().toString()); + taskInfoDetail.setShiXunCodeIds(userData.getStudentWorkShixunCodeIds().toString()); taskInfoDetailDao.insertTaskInfoDetail(taskInfoDetail); diff --git a/src/main/java/net/educoder/ecsonar/task/QualityInspectRunnable.java b/src/main/java/net/educoder/ecsonar/task/QualityInspectRunnable.java index c0c2b77..eb6fa2a 100644 --- a/src/main/java/net/educoder/ecsonar/task/QualityInspectRunnable.java +++ b/src/main/java/net/educoder/ecsonar/task/QualityInspectRunnable.java @@ -15,8 +15,11 @@ import org.slf4j.LoggerFactory; import java.io.File; import java.io.IOException; import java.nio.charset.Charset; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.List; import java.util.concurrent.ExecutorService; +import java.util.function.Function; /** @@ -41,9 +44,9 @@ public class QualityInspectRunnable implements Runnable { private SonarService sonarService; public QualityInspectRunnable(String taskId, String language, String homeworkId, - TaskInfoDetail taskInfoDetail, - QualityInspectUserDataVO userData, - ExecutorService queryResultPool) { + TaskInfoDetail taskInfoDetail, + QualityInspectUserDataVO userData, + ExecutorService queryResultPool) { this.taskId = taskId; this.language = language; this.homeworkId = homeworkId; @@ -59,43 +62,17 @@ public class QualityInspectRunnable implements Runnable { String path = String.format("/tmp/%s/%s/", homeworkId, projectName); List codeIds = userData.getCodeIds(); - boolean constantCFlag = true,constantCPPFlag = true,constantJavaFlag = true, constantPyFlag = true; - for (Long codeId : codeIds) { - File file = new File(path); - try { - FileUtils.forceMkdir(file); - } catch (IOException e) { - } + List shiXunCodeIds = userData.getStudentWorkShixunCodeIds(); - GameCodes gameCodes = dbOperateService.queryGameCodesById(codeId); - if(gameCodes == null){ - LOGGER.error("projectName:{}, game_codes_id:{}找不到对应的学员代码",projectName, codeId); - continue; - } - FileUtil.writeString(gameCodes.getCode(), path + gameCodes.getPath(), Charset.forName("UTF-8")); - - if (constantCFlag && gameCodes.getPath().toLowerCase().contains(".c")) { - constantCFlag = false; - } else if (constantCPPFlag && gameCodes.getPath().toLowerCase().contains(".cpp")) { - constantCPPFlag = false; - } else if (constantJavaFlag && gameCodes.getPath().toLowerCase().contains(".java")) { - constantJavaFlag = false; - } else if (constantPyFlag && gameCodes.getPath().toLowerCase().contains(".py")) { - constantPyFlag = false; - } + for (Long codeId : codeIds) { + processCodeId(codeId, path, projectName, dbOperateService::queryGameCodesById); } - // 需要自己判别语言,Java优先 - if(!constantJavaFlag){ - language = Constant.JAVA; - }else if(!constantPyFlag){ - language = Constant.PYTHON; - } else if(!constantCFlag){ - language = Constant.C; - }else if(!constantCPPFlag){ - language = Constant.CXX; + for (Long codeId : shiXunCodeIds) { + processCodeId(codeId, path, projectName, dbOperateService::queryShiXunCodesById); } + // 写完所有文件开始用sonar进行质量分析 SonarScannerParam param = new SonarScannerParam(projectName, path); if (Constant.C.equalsIgnoreCase(language) || Constant.CXX.equalsIgnoreCase(language)) { @@ -133,4 +110,45 @@ public class QualityInspectRunnable implements Runnable { public void setSonarService(SonarService sonarService) { this.sonarService = sonarService; } + + private void processCodeId(Long codeId, String path, String projectName, Function queryMethod) { + boolean constantCFlag = true, constantCPPFlag = true, constantJavaFlag = true, constantPyFlag = true; + File file = new File(path); + try { + FileUtils.forceMkdir(file); + } catch (IOException e) { + LOGGER.error("创建目录失败: {}", path, e); + } + + GameCodes gameCodes = queryMethod.apply(codeId); + if (gameCodes == null) { + LOGGER.error("projectName:{}, game_codes_id:{} 找不到对应的学员代码", projectName, codeId); + return; + } + + Path filePath = Paths.get(path, gameCodes.getPath()); + FileUtil.writeString(gameCodes.getCode(), filePath.toString(), Charset.forName("UTF-8")); + + String filePathLower = gameCodes.getPath().toLowerCase(); + if (constantCFlag && filePathLower.matches(".*\\.c$")) { + constantCFlag = false; + } else if (constantCPPFlag && filePathLower.matches(".*\\.cpp$")) { + constantCPPFlag = false; + } else if (constantJavaFlag && filePathLower.matches(".*\\.java$")) { + constantJavaFlag = false; + } else if (constantPyFlag && filePathLower.matches(".*\\.py$")) { + constantPyFlag = false; + } + + // 需要自己判别语言,Java优先 + if (!constantJavaFlag) { + language = Constant.JAVA; + } else if (!constantPyFlag) { + language = Constant.PYTHON; + } else if (!constantCFlag) { + language = Constant.C; + } else if (!constantCPPFlag) { + language = Constant.CXX; + } + } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 8a72a76..5be8e96 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -6,7 +6,7 @@ spring.datasource.initSize=20 #spring.datasource.master.url=jdbc:postgresql://127.0.0.1:5432/sonar7.7 -spring.datasource.master.url=jdbc:postgresql://117.50.14.123:5432/sonar +spring.datasource.master.url=jdbc:postgresql://106.75.25.158:5432/sonar spring.datasource.master.username=sonar spring.datasource.master.password=sonar spring.datasource.master.driverClassName=org.postgresql.Driver @@ -14,7 +14,7 @@ spring.datasource.master.driverClassName=org.postgresql.Driver #### test ###### spring.datasource.readonly.driverClassName=com.mysql.jdbc.Driver -spring.datasource.readonly.url=jdbc:mysql://rm-bp13v5020p7828r5rso.mysql.rds.aliyuncs.com:3306/preeducoderweb?userSSL=false&useUnicode=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false +spring.datasource.readonly.url=jdbc:mysql://testeducoder-public.mysql.polardb.rds.aliyuncs.com:3306/newtesteducoderweb?userSSL=false&useUnicode=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false spring.datasource.readonly.username=testeducoder spring.datasource.readonly.password=TEST@123