فهرست منبع

add checkstyle feature

guochao 6 سال پیش
والد
کامیت
dbb2d0b632

+ 99 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/acyncTask/ScriptAnalysisCallBack.java

@@ -0,0 +1,99 @@
+package cn.iselab.mooctest.site.common.acyncTask;
+
+import cn.iselab.mooctest.site.data.GeneralGradeDTO;
+import cn.iselab.mooctest.site.rpc.dev.data.MutationDTO;
+import cn.iselab.mooctest.site.service.CalculateScoreService;
+import cn.iselab.mooctest.site.service.GeneralCalculateScoreService;
+import cn.iselab.mooctest.site.service.SubmitRecordService;
+import cn.iselab.mooctest.site.service.TargetGraphService;
+import cn.iselab.mooctest.site.service.common.MongoAPIService;
+import cn.iselab.mooctest.site.service.fromDev.AnalysisService;
+import cn.iselab.mooctest.site.web.logic.CalculateSocreLogic;
+import cn.iselab.mooctest.site.web.logic.GeneralCalculateScoreLogic;
+import com.google.gson.Gson;
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Iterator;
+import java.util.Map;
+
+
+/**
+ * Created by tangshanshan on 2018/3/6.
+ */
+@Component
+public class ScriptAnalysisCallBack implements AsyncTaskCallBack {
+
+    protected final Logger LOG = LoggerFactory.getLogger(getClass());
+
+    @Autowired
+    SubmitRecordService submitRecordService;
+
+    @Autowired
+    CalculateScoreService calculateScoreService;
+
+    @Autowired
+    CalculateSocreLogic calculateSocreLogic;
+
+    @Autowired
+    MongoAPIService mongoAPIService;
+
+    @Autowired
+    AnalysisService analysisService;
+
+    @Autowired
+    TargetGraphService targetGraphService;
+
+    @Autowired
+    GeneralCalculateScoreService generalCalculateScoreService;
+
+    @Autowired
+    GeneralCalculateScoreLogic generalCalculateScoreLogic;
+
+    @Override
+    public void onSuccess(Map<String, String> context, String result) throws Exception {
+        LOG.info("------------------- scriptAnalysis onSuccess -------------------");
+        Long userId = 0L;
+        Long examId = 0L;
+        Long caseId = 0L;
+        Long targetId = 0L;
+        Long uploadId = 0L;
+        if (context.containsKey("userId")) {
+            userId = Long.parseLong(context.get("userId"));
+        }
+        if (context.containsKey("examId")) {
+            examId = Long.parseLong(context.get("examId"));
+        }
+        if (context.containsKey("caseId")) {
+            caseId = Long.parseLong(context.get("caseId"));
+        }
+        if (context.containsKey("targetId")) {
+            targetId = Long.parseLong(context.get("targetId"));
+        }
+        if (context.containsKey("uploadId")) {
+            uploadId = Long.parseLong(context.get("uploadId"));
+        }
+        processScriptAnalysisResult(result, userId, examId, caseId, uploadId);
+    }
+
+    private void processScriptAnalysisResult(String result, long userId, long examId, long caseId, long uploadId) {
+        JSONObject jsonObject = new JSONObject(result);
+        System.out.println("jsonObject:" + jsonObject);
+
+        Iterator<String> sIterator = jsonObject.keys();
+        while (sIterator.hasNext()) {
+            String type = sIterator.next();
+            double score = jsonObject.getDouble(type);
+            generalCalculateScoreService.updateTypeGrade(uploadId, type, score);
+        }
+    }
+
+    @Override
+    public void onError(Map<String, String> context, String error) {
+        LOG.info("------------------- mutation onError:" + error + " -------------------");
+    }
+}

+ 1 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/enums/AsyncJobTool.java

@@ -7,7 +7,7 @@ import lombok.Getter;
  */
 public enum AsyncJobTool {
     MOCKTOOL("mockTool",(short)1),PDF("pdf",(short)2),MUTATION("mutation",(short)3),MCNODE("mcnode",(short)4),
-    PYTHON_NODE("python-node",(short)5),ONLINEJUDGE("onlinejudge",(short)6);
+    PYTHON_NODE("python-node",(short)5),ONLINEJUDGE("onlinejudge",(short)6),SCRIPTANALYSIS("scriptanalysis",(short)7);
 
     @Getter
     private String name;

+ 49 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/ScriptAnalysisProgressController.java

@@ -0,0 +1,49 @@
+package cn.iselab.mooctest.site.web.ctrl;
+
+import cn.iselab.mooctest.site.common.constant.UrlConstants;
+import cn.iselab.mooctest.site.web.data.ScriptAnalysisProgressVO;
+import cn.iselab.mooctest.site.web.logic.asyncProgress.ScriptAnalysisProgressLogic;
+import org.apache.shiro.authz.annotation.RequiresRoles;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
+
+/**
+ * Created by guochao on 2019/4/8.
+ */
+@RestController
+public class ScriptAnalysisProgressController {
+    @Autowired
+    ScriptAnalysisProgressLogic scriptAnalysisProgressLogic;
+
+    @RequiresRoles("admin")
+    @RequestMapping(value = UrlConstants.API + "scriptAnalysisProgress", method = RequestMethod.GET)
+    public ScriptAnalysisProgressVO getscriptAnalysis(@RequestParam(name = "examId") Long examId,
+                                          @RequestParam(name = "caseId") Long caseId) throws IOException {
+        return scriptAnalysisProgressLogic.getScriptAnalysisProgress(examId,caseId);
+    }
+
+    @RequiresRoles("admin")
+    @RequestMapping(value = UrlConstants.API + "scriptAnalysisProgress/{examId}", method = RequestMethod.DELETE)
+    public boolean getScriptAnalysis(@PathVariable String examId) throws IOException {
+        return scriptAnalysisProgressLogic.stopScriptAnalysis(examId);
+    }
+
+    @RequiresRoles("admin")
+    @RequestMapping(value = UrlConstants.API + "scriptAnalysisProgress/{sessionId}", method = RequestMethod.PUT)
+    public boolean retryScriptAnalysis(@PathVariable String sessionId,
+                                 @RequestParam(name = "examId") Long examId,
+                                 @RequestParam(name = "caseId") Long caseId) throws IOException {
+        return scriptAnalysisProgressLogic.reRunSession(sessionId,examId,caseId);
+    }
+
+    @RequiresRoles("admin")
+    @RequestMapping(value = UrlConstants.API + "retryScriptAnalysisJob/{sessionId}/{jobId}", method = RequestMethod.PUT)
+    public boolean retryScriptAnalysisJob(@PathVariable String sessionId,@PathVariable String jobId,
+                                    @RequestParam(name = "examId") Long examId,
+                                    @RequestParam(name = "caseId") Long caseId,
+                                    @RequestParam(name = "userId") Long userId) throws IOException {
+        return scriptAnalysisProgressLogic.retryJob(sessionId,jobId);
+    }
+}

+ 15 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/ScriptAnalysisJobVO.java

@@ -0,0 +1,15 @@
+package cn.iselab.mooctest.site.web.data;
+
+import lombok.Data;
+
+/**
+ * Created by tangshanshan on 2018/2/26.
+ */
+@Data
+public class ScriptAnalysisJobVO {
+    private String jobId;
+    private int status;
+    private String progressStatus;
+    private String userName;
+    private Long userId;
+}

+ 16 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/ScriptAnalysisProgressVO.java

@@ -0,0 +1,16 @@
+package cn.iselab.mooctest.site.web.data;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * Created by guochao on 2019/4/8.
+ */
+@Data
+public class ScriptAnalysisProgressVO {
+    private String sessionId;
+    private Long examId;
+    private Long caseId;
+    private List<ScriptAnalysisJobVO> jobs;
+}

+ 17 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/asyncProgress/ScriptAnalysisProgressLogic.java

@@ -0,0 +1,17 @@
+package cn.iselab.mooctest.site.web.logic.asyncProgress;
+
+import cn.iselab.mooctest.site.web.data.ScriptAnalysisProgressVO;
+
+/**
+ * Created by guochao on 2019/4/8.
+ */
+public interface ScriptAnalysisProgressLogic {
+
+    ScriptAnalysisProgressVO getScriptAnalysisProgress(Long examId, Long caseId);
+
+    boolean stopScriptAnalysis(String taskId);
+
+    boolean reRunSession(String sessionId, Long examId, Long caseId);
+
+    boolean retryJob(String sessionId, String jobId);
+}

+ 165 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/asyncProgress/impl/ScriptAanlysisProgressLogicImpl.java

@@ -0,0 +1,165 @@
+package cn.iselab.mooctest.site.web.logic.asyncProgress.impl;
+
+import cn.iselab.mooctest.site.common.acyncTask.ScriptAnalysisCallBack;
+import cn.iselab.mooctest.site.common.enums.AsyncJobTool;
+import cn.iselab.mooctest.site.data.AsyncJobStatus;
+import cn.iselab.mooctest.site.data.UploadRecordDTO;
+import cn.iselab.mooctest.site.data.UserDTOForMT;
+import cn.iselab.mooctest.site.models.SubmitRecord;
+import cn.iselab.mooctest.site.models.WeightGeneral;
+import cn.iselab.mooctest.site.service.*;
+import cn.iselab.mooctest.site.web.data.ScriptAnalysisJobVO;
+import cn.iselab.mooctest.site.web.data.ScriptAnalysisProgressVO;
+import cn.iselab.mooctest.site.web.data.forMongo.AsyncTaskDTO;
+import cn.iselab.mooctest.site.web.exception.HttpBadRequestException;
+import cn.iselab.mooctest.site.web.logic.BaseLogic;
+import cn.iselab.mooctest.site.web.logic.asyncProgress.ScriptAnalysisProgressLogic;
+import cn.iselab.mooctest.site.web.logic.fromDev.PluginLogic;
+import org.apache.commons.collections.map.HashedMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * Created by guochao on 2019/4/8.
+ */
+@Service
+public class ScriptAanlysisProgressLogicImpl extends BaseLogic implements ScriptAnalysisProgressLogic {
+
+    @Autowired
+    SubmitRecordService submitRecordService;
+
+    @Autowired
+    AsyncTaskService asyncTaskService;
+
+    @Autowired
+    AsyncScheduleService asyncScheduleService;
+
+    @Autowired
+    UserService userService;
+
+    @Autowired
+    PluginLogic pluginLogic;
+
+    @Autowired
+    CaseService caseService;
+
+    @Autowired
+    WeightGeneralService weightGeneralService;
+
+    @Autowired
+    GeneralCalculateScoreService generalCalculateScoreService;
+
+    @Override
+    public ScriptAnalysisProgressVO getScriptAnalysisProgress(Long examId, Long caseId) {
+        AsyncTaskDTO asyncTaskDTO = asyncTaskService.getAsyncTask(AsyncJobTool.SCRIPTANALYSIS, examId, caseId);
+        if (asyncTaskDTO == null) {
+            asyncTaskDTO = triggerScriptAnalysis(examId, caseId);
+        }
+
+        if(asyncTaskDTO == null){
+            return new ScriptAnalysisProgressVO();
+        }
+        Map<String, AsyncJobStatus> jobStatusMap = asyncScheduleService.getStatusMap(asyncTaskDTO.getSessionId());
+        List<Long> userIds = asyncTaskDTO.getJobs().stream().map(asyncJobDTO -> {
+            return Long.parseLong(asyncJobDTO.getContexts().get("userId"));
+        }).collect(Collectors.toList());
+
+        Map<Long, UserDTOForMT> userMap = userService.getUserMap(userIds);
+        List<ScriptAnalysisJobVO> jobs = asyncTaskDTO.getJobs().stream().map(asyncJobDTO -> {
+            ScriptAnalysisJobVO scriptAnalysisJobVO = new ScriptAnalysisJobVO();
+            scriptAnalysisJobVO.setJobId(asyncJobDTO.getJobId());
+            scriptAnalysisJobVO.setStatus(asyncJobDTO.getStatus());
+            scriptAnalysisJobVO.setUserId(Long.parseLong(asyncJobDTO.getContexts().get("userId")));
+            AsyncJobStatus tempStatus = jobStatusMap.get(asyncJobDTO.getJobId());
+            UserDTOForMT tempUser = userMap.get(Long.parseLong(asyncJobDTO.getContexts().get("userId")));
+            scriptAnalysisJobVO.setProgressStatus(tempStatus!=null?tempStatus.getStatus():"");
+            scriptAnalysisJobVO.setUserName(tempUser!=null?tempUser.getName():null);
+            return scriptAnalysisJobVO;
+        }).collect(Collectors.toList());
+        ScriptAnalysisProgressVO scriptAnalysisProgressVO = new ScriptAnalysisProgressVO();
+        scriptAnalysisProgressVO.setSessionId(asyncTaskDTO.getSessionId());
+        scriptAnalysisProgressVO.setExamId(examId);
+        scriptAnalysisProgressVO.setCaseId(caseId);
+        scriptAnalysisProgressVO.setJobs(jobs);
+        return scriptAnalysisProgressVO;
+    }
+
+    private AsyncTaskDTO triggerScriptAnalysis(Long examId, Long caseId) {
+        List<WeightGeneral> weightGenerals=weightGeneralService.get(examId,caseId);
+        if(weightGenerals==null || weightGenerals.isEmpty()){
+            throw new HttpBadRequestException("unmatched examId and caseId");
+        }
+        List<Map<String, String>> params;
+        List<Map<String, String>> contexts;
+        List<SubmitRecord> submitRecords = submitRecordService.getSubmittedRecordsByExamId(examId);
+        params = submitRecords.stream()
+                .filter(assignedTask -> {
+                    UploadRecordDTO uploadRecordDTO = generalCalculateScoreService.getLatestUploadRecord
+                        (assignedTask.getParticipantId(),examId,caseId);
+                    return uploadRecordDTO!=null && uploadRecordDTO.getOSSUrl()!=null;
+                    })
+                .map(assignedTask -> {
+            Map<String, String> param = new HashedMap();
+            UploadRecordDTO uploadRecordDTO = generalCalculateScoreService.getLatestUploadRecord
+                    (assignedTask.getParticipantId(),examId,caseId);
+            String downloadUrl = uploadRecordDTO.getOSSUrl();
+            param.put("downloadURL", uploadRecordDTO.getOSSUrl());
+            param.put("extraArgs", generateScriptAnalysisExtraArgs(downloadUrl));
+            return param;
+        }).collect(Collectors.toList());
+        contexts = submitRecords.stream()
+                .filter(assignedTask -> {
+                    UploadRecordDTO uploadRecordDTO = generalCalculateScoreService.getLatestUploadRecord
+                            (assignedTask.getParticipantId(),examId,caseId);
+                    return uploadRecordDTO!=null && uploadRecordDTO.getOSSUrl()!=null;
+                })
+                .map(assignedTask -> {
+            Map<String, String> param = new HashedMap();
+            param.put("examId", examId.toString());
+            param.put("caseId", caseId.toString());
+            param.put("userId", assignedTask.getParticipantId().toString());
+            UploadRecordDTO uploadRecordDTO = generalCalculateScoreService.getLatestUploadRecord
+                    (assignedTask.getParticipantId(),examId,caseId);
+            param.put("uploadId", uploadRecordDTO.getId()+"");
+            return param;
+        }).collect(Collectors.toList());
+
+        //return null when no one submits
+        if(params.size()==0&&contexts.size()==0){
+            return null;
+        }
+
+        return asyncScheduleService.start(AsyncJobTool.SCRIPTANALYSIS, params,contexts,ScriptAnalysisCallBack.class);
+    }
+
+    private String generateScriptAnalysisExtraArgs(String downloadUrl){
+        String zipName = downloadUrl.split("/")[downloadUrl.split("/").length - 1];
+        return "-F "+ zipName;
+    }
+
+    @Override
+    public boolean stopScriptAnalysis(String taskId) {
+        return asyncScheduleService.stop(taskId);
+    }
+
+    @Override
+    public boolean retryJob(String sessionId, String jobId) {
+        asyncScheduleService.retryJob(AsyncJobTool.SCRIPTANALYSIS,sessionId,jobId,ScriptAnalysisCallBack.class);
+        return true;
+    }
+
+    @Override
+    public boolean reRunSession(String sessionId, Long examId, Long caseId){
+        asyncScheduleService.stop(sessionId);
+        try {
+            triggerScriptAnalysis(examId, caseId);
+            return true;
+        }catch (Exception e){
+            return false;
+        }
+    }
+}