chenxz 7 anni fa
parent
commit
4fb3aad7bb

+ 3 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/Application.java

@@ -1,5 +1,8 @@
 package cn.iselab.mooctest.site;
 
+import cn.iselab.mooctest.site.service.updownload.DownloadService;
+import cn.iselab.mooctest.site.service.updownload.impl.DownloadServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.MessageSourceAutoConfiguration;
 import org.springframework.boot.autoconfigure.SpringBootApplication;

+ 1 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/acyncTask/MutationCallBack.java

@@ -90,6 +90,6 @@ public class MutationCallBack extends AsyncTaskCallBack {
 
     @Override
     public void onError(String error) {
-        LOG.info("mutation onError");
+        LOG.info("mutation onError:"+error);
     }
 }

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

@@ -6,7 +6,7 @@ import lombok.Getter;
  * Created by tangshanshan on 2018/2/26.
  */
 public enum AsyncJobTool {
-    MUTATION("mockTool",(short)1),PDF("pdf",(short)2);
+    MOCKTOOL("mockTool",(short)1),PDF("pdf",(short)2),MUTATION("mutation",(short)3);
 
     @Getter
     private String name;

+ 2 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/AsyncTaskService.java

@@ -16,6 +16,8 @@ public interface AsyncTaskService {
 
     AsyncTaskDTO getAsyncTask(AsyncJobTool toolType, Long examId, Long caseId);
 
+    AsyncTaskDTO getAsyncTaskForOne(AsyncJobTool toolType, Long examId, Long caseId, Long participantId);
+
     AsyncTaskDTO getAsyncTask(String sessionId);
 
     AsyncTaskDTO getAsyncTaskByJobId(String jobId);

+ 15 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/AsyncTaskServiceImpl.java

@@ -81,6 +81,21 @@ public class AsyncTaskServiceImpl extends BaseService implements AsyncTaskServic
     }
 
     @Override
+    public AsyncTaskDTO getAsyncTaskForOne(AsyncJobTool toolType, Long examId, Long caseId, Long participantId){
+        HttpHeaders headers = MongoAPIUtils.createAuthHeaderForMongo();
+        HttpEntity<String> entity = new HttpEntity<>(headers);
+
+        RestTemplate rt = new RestTemplate();
+        String filter = String.format("{'type': %d,'jobs':{'$elemMatch':{'contexts.examId':'%d','contexts.caseId':'%d','contexts.participantId':'%d'}}}",
+                toolType.getIndex(),examId,caseId,participantId);
+        String url = MongoAPIUtils.generateFilterUrl(mongoDBConfig.getDb(),
+                MongoAPIUtils.MONGODB_COLLECTION_ASYNC_TASK)+"&sort=-createTime&page=1&pagesize=1";
+        ResponseEntity<JSONObject> dto = rt.exchange(url, HttpMethod.GET, entity, JSONObject.class, filter);
+
+        return extractAsyncTask(dto);
+    }
+
+    @Override
     public AsyncTaskDTO getAsyncTask(String sessionId) {
         HttpHeaders headers = MongoAPIUtils.createAuthHeaderForMongo();
         HttpEntity<String> entity = new HttpEntity<>(headers);

+ 12 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/updownload/DownloadService.java

@@ -0,0 +1,12 @@
+package cn.iselab.mooctest.site.service.updownload;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 下午12:34 2018/3/16
+ * @Modified By:
+ */
+public interface DownloadService {
+
+    String generateUrlForDevAnalysis(long taskID,long stuID,String caseName);
+}

+ 86 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/updownload/impl/DownloadServiceImpl.java

@@ -0,0 +1,86 @@
+package cn.iselab.mooctest.site.service.updownload.impl;
+
+import cn.iselab.mooctest.site.service.updownload.DownloadService;
+import com.aliyun.oss.HttpMethod;
+import com.aliyun.oss.OSSClient;
+import com.aliyun.oss.model.GeneratePresignedUrlRequest;
+import com.aliyun.oss.model.OSSObjectSummary;
+import com.aliyun.oss.model.ObjectListing;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.io.File;
+import java.util.List;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 下午12:35 2018/3/16
+ * @Modified By:
+ */
+@Service
+public class DownloadServiceImpl implements DownloadService {
+
+    @Value("${aliOSS.endPoint}")
+    private String endPoint;
+    @Value("${aliOSS.accessKeyId}")
+    private String accessKeyId;
+    @Value("${aliOSS.accessKeySecret}")
+    private String accessKeySecret;
+    @Value("${aliOSS.bucketName.dev}")
+    private String bucketNameDev;
+    @Value("${host}")
+    private String host;
+
+    private String LOCAL_PATH = "/var/www/download/";
+
+    private String DOWNLOAD_PATH = "/download/";
+
+    @Override
+    public String generateUrlForDevAnalysis(long taskID,long stuID,String caseName){
+        //生成路径
+        String ossDir = "data/answers/" + taskID + "/" + stuID + "/";
+        System.out.println(accessKeyId+" "+endPoint+" "+accessKeySecret);
+        OSSClient client = new OSSClient(endPoint, accessKeyId, accessKeySecret);
+
+        ObjectListing objectListing = client.listObjects(bucketNameDev, ossDir);
+        List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
+        long latestTimestamp = 0;
+        //遍历该目录下所有的文件找到最新的提交文件
+        for (OSSObjectSummary s : sums) {
+            String zipFullName = s.getKey();
+            latestTimestamp=checkoutTimestamp(zipFullName, caseName);
+        }
+        if(latestTimestamp != 0){
+            String ossUrl = ossDir + caseName + "_" + latestTimestamp + ".zip";
+            GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketNameDev, ossUrl, HttpMethod.GET);
+            return client.generatePresignedUrl(request).toString();
+        }else {
+            File file=new File(LOCAL_PATH+ossDir);
+            if(file.exists()){
+                for(File childFile:file.listFiles()){
+                    String fileName=childFile.getName();
+                    latestTimestamp=checkoutTimestamp(fileName,caseName);
+                    String downloadUrl = DOWNLOAD_PATH + caseName + "_" + latestTimestamp + ".zip";
+                    return host+downloadUrl;
+                }
+            }
+            return null;
+        }
+    }
+
+    private long checkoutTimestamp(String zipFullName,String caseName){
+        long latestTimestamp = 0;
+        if (!zipFullName.endsWith("/") && zipFullName.contains(caseName)) {
+            String zipName = zipFullName.split("/")[zipFullName.split("/").length - 1];
+            if (zipName.startsWith(caseName)) {
+                String zipNameWithoutPostfix = zipName.split("\\.")[0];
+                long currentTimestamp = Long.parseLong(zipNameWithoutPostfix.split("_")[1]);
+                if (currentTimestamp > latestTimestamp) {
+                    latestTimestamp = currentTimestamp;
+                }
+            }
+        }
+        return latestTimestamp;
+    }
+}

+ 2 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/MutationProgressLogic.java

@@ -9,6 +9,8 @@ public interface MutationProgressLogic {
 
     MutationProgressVO getMutationProgress(Long examId, Long caseId);
 
+    MutationProgressVO getMutationProgressForOne(Long examId, Long caseId, Long participantId);
+
     boolean stopMutation(String taskId);
 
     boolean retrySession(String sessionId);

+ 67 - 4
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/MutationProgressLogicImpl.java

@@ -8,8 +8,10 @@ import cn.iselab.mooctest.site.data.UserDTOForMT;
 import cn.iselab.mooctest.site.models.AssignedTask;
 import cn.iselab.mooctest.site.models.Weight;
 import cn.iselab.mooctest.site.service.*;
+import cn.iselab.mooctest.site.service.updownload.DownloadService;
 import cn.iselab.mooctest.site.web.data.MutationJobVO;
 import cn.iselab.mooctest.site.web.data.MutationProgressVO;
+import cn.iselab.mooctest.site.web.data.forMongo.AsyncJobDTO;
 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;
@@ -19,6 +21,7 @@ import org.apache.commons.collections.map.HashedMap;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -52,6 +55,9 @@ public class MutationProgressLogicImpl extends BaseLogic implements MutationProg
     @Autowired
     CaseService caseService;
 
+    @Autowired
+    DownloadService downloadService;
+
     @Override
     public MutationProgressVO getMutationProgress(Long examId, Long caseId) {
         AsyncTaskDTO asyncTaskDTO = asyncTaskService.getAsyncTask(AsyncJobTool.MUTATION, examId, caseId);
@@ -87,6 +93,33 @@ public class MutationProgressLogicImpl extends BaseLogic implements MutationProg
     }
 
     @Override
+    public MutationProgressVO getMutationProgressForOne(Long examId, Long caseId, Long participantId){
+        AsyncTaskDTO asyncTaskDTO = asyncTaskService.getAsyncTaskForOne(AsyncJobTool.MUTATION, examId, caseId, participantId);
+        if (asyncTaskDTO == null) {
+            asyncTaskDTO = triggerOneMutation(examId, caseId, participantId);
+        }
+        Map<String, AsyncJobStatus> jobStatusMap = asyncScheduleService.getStatusMap(asyncTaskDTO.getSessionId());
+        AsyncJobDTO asyncJobDTO=asyncTaskDTO.getJobs().get(0);
+        Long userId= Long.parseLong(asyncJobDTO.getContexts().get("userId"));
+        UserDTOForMT tempUser=userService.findByUserId(userId);
+        MutationJobVO mutationJobVO = new MutationJobVO();
+        mutationJobVO.setJobId(asyncJobDTO.getJobId());
+        mutationJobVO.setStatus(asyncJobDTO.getStatus());
+        mutationJobVO.setUserId(Long.parseLong(asyncJobDTO.getContexts().get("userId")));
+        AsyncJobStatus tempStatus = jobStatusMap.get(asyncJobDTO.getJobId());
+        mutationJobVO.setProgressStatus(tempStatus!=null?tempStatus.getStatus():"");
+        mutationJobVO.setUserName(tempUser!=null?tempUser.getName():null);
+        List<MutationJobVO> jobVOS=new ArrayList<>();
+        jobVOS.add(mutationJobVO);
+        MutationProgressVO mutationProgressVO = new MutationProgressVO();
+        mutationProgressVO.setSessionId(asyncTaskDTO.getSessionId());
+        mutationProgressVO.setExamId(examId);
+        mutationProgressVO.setCaseId(caseId);
+        mutationProgressVO.setJobs(jobVOS);
+        return mutationProgressVO;
+    }
+
+    @Override
     public boolean stopMutation(String taskId) {
         return asyncScheduleService.stop(taskId);
     }
@@ -121,15 +154,19 @@ public class MutationProgressLogicImpl extends BaseLogic implements MutationProg
         }
         List<Map<String, String>> params;
         List<Map<String, String>> contexts;
-        List<AssignedTask> assignedTasks = assignedTaskService.getSubmittedRecordsByExamId(examId);
-        params = assignedTasks.stream().map(assignedTask -> {
+        List<AssignedTask> assignedTasks = assignedTaskService.getSubmittedRecordsByExamId(examId).subList(0,1);
+        params = assignedTasks.stream()
+                .filter(assignedTask -> downloadService.generateUrlForDevAnalysis(examId,caseId,caseService.getCaseById(caseId).getName())!=null)
+                .map(assignedTask -> {
             Map<String, String> param = new HashedMap();
-            String downloadUrl = pluginLogic.getAnalysisSignature(examId,caseId,caseService.getCaseById(caseId).getName());
+            String downloadUrl = downloadService.generateUrlForDevAnalysis(examId,caseId,caseService.getCaseById(caseId).getName());
             param.put("downloadURL", downloadUrl);
             param.put("extraArgs", generateNodeExtraArgs(downloadUrl));
             return param;
         }).collect(Collectors.toList());
-        contexts = assignedTasks.stream().map(assignedTask -> {
+        contexts = assignedTasks.stream()
+                .filter(assignedTask -> downloadService.generateUrlForDevAnalysis(examId,caseId,caseService.getCaseById(caseId).getName())!=null)
+                .map(assignedTask -> {
             Map<String, String> param = new HashedMap();
             param.put("examId", examId.toString());
             param.put("caseId", caseId.toString());
@@ -141,6 +178,32 @@ public class MutationProgressLogicImpl extends BaseLogic implements MutationProg
         return asyncScheduleService.start(AsyncJobTool.MUTATION, params,contexts,MutationCallBack.class);
     }
 
+    private AsyncTaskDTO triggerOneMutation(Long examId, Long caseId, Long participantId) {
+        if (weightService.getWeightByTidAndCid(examId, caseId) == null) {
+            throw new HttpBadRequestException("unmatched examId and caseId");
+        }
+        Weight weight = weightService.getWeightByTidAndCid(examId, caseId);
+        if (weight.getMutation() == 0) {
+            throw new HttpBadRequestException(caseId + "'s 变异分析 is 0");
+        }
+        List<Map<String, String>> params=new ArrayList<>();
+        List<Map<String, String>> contexts=new ArrayList<>();
+        AssignedTask assignedTask =  assignedTaskService.getAssignedTask(examId,participantId);
+        Map<String, String> param = new HashedMap();
+        String downloadUrl = downloadService.generateUrlForDevAnalysis(examId,caseId,caseService.getCaseById(caseId).getName());
+        param.put("downloadURL", downloadUrl);
+        param.put("extraArgs", generateNodeExtraArgs(downloadUrl));
+        params.add(param);
+        Map<String, String> context = new HashedMap();
+        param.put("examId", examId.toString());
+        param.put("caseId", caseId.toString());
+        param.put("userId", assignedTask.getParticipantId().toString());
+        param.put("type", MutationResultType.MUTAION_NODE);
+        contexts.add(context);
+
+        return asyncScheduleService.start(AsyncJobTool.MUTATION, params,contexts,MutationCallBack.class);
+    }
+
     private String generateNodeExtraArgs(String downloadUrl){
         String zipName = downloadUrl.split("/")[downloadUrl.split("/").length - 1];
         return "-F "+ zipName + " -T "+MutationResultType.MUTAION_NODE;

+ 1 - 1
mooctest-site-server/src/main/resources/application.yaml

@@ -93,7 +93,7 @@ featureSwitch:
         rpcKibugService: true
         rpcSourceService: true
         mongoServer: true
-        UserService: true
+        UserService: false
 
 mongodb:
       host: 114.55.91.27