|
@@ -2,9 +2,9 @@ package cn.iselab.mooctest.site.web.logic.impl;
|
|
|
|
|
|
import cn.iselab.mooctest.site.common.enums.OnlineJudgeMode;
|
|
import cn.iselab.mooctest.site.common.enums.OnlineJudgeMode;
|
|
import cn.iselab.mooctest.site.data.OnlineJudgeIODataDTO;
|
|
import cn.iselab.mooctest.site.data.OnlineJudgeIODataDTO;
|
|
-import cn.iselab.mooctest.site.web.data.OnlineJudgeResultVO;
|
|
|
|
-import cn.iselab.mooctest.site.web.data.OnlineJudgeVO;
|
|
|
|
-import cn.iselab.mooctest.site.web.data.SubmissionResultVO;
|
|
|
|
|
|
+import cn.iselab.mooctest.site.models.Target;
|
|
|
|
+import cn.iselab.mooctest.site.service.TargetService;
|
|
|
|
+import cn.iselab.mooctest.site.web.data.*;
|
|
import cn.iselab.mooctest.site.web.logic.OSSLogic;
|
|
import cn.iselab.mooctest.site.web.logic.OSSLogic;
|
|
import cn.iselab.mooctest.site.web.logic.OnlineJudgeLogic;
|
|
import cn.iselab.mooctest.site.web.logic.OnlineJudgeLogic;
|
|
import cn.iselab.mooctest.site.web.logic.asyncProgress.OnlineJudgeProcessLogic;
|
|
import cn.iselab.mooctest.site.web.logic.asyncProgress.OnlineJudgeProcessLogic;
|
|
@@ -36,14 +36,22 @@ public class OnlineJudgeLogicImpl implements OnlineJudgeLogic {
|
|
|
|
|
|
@Autowired
|
|
@Autowired
|
|
private OnlineJudgeProcessLogic onlineJudgeProcessLogic;
|
|
private OnlineJudgeProcessLogic onlineJudgeProcessLogic;
|
|
-
|
|
|
|
|
|
+ @Autowired
|
|
|
|
+ private TargetService targetService;
|
|
@Autowired
|
|
@Autowired
|
|
private OSSLogic ossLogic;
|
|
private OSSLogic ossLogic;
|
|
|
|
|
|
private OnlineJudgeResultVO STARTED = new OnlineJudgeResultVO("started");
|
|
private OnlineJudgeResultVO STARTED = new OnlineJudgeResultVO("started");
|
|
|
|
+ private OnlineJudgeResultsVO PSTARTED = new OnlineJudgeResultsVO("started");
|
|
private static final String BASE_DIR = "code";
|
|
private static final String BASE_DIR = "code";
|
|
|
|
|
|
- private final static Cache<String, OnlineJudgeResultVO> RESULT_CACHE_FROM_CELERY = CacheBuilder
|
|
|
|
|
|
+ private final static Cache<String,OnlineJudgeResultVO> RESULT_CACHE_FROM_CELERY = CacheBuilder
|
|
|
|
+ .newBuilder()
|
|
|
|
+ .initialCapacity(50)
|
|
|
|
+ .concurrencyLevel(5)
|
|
|
|
+ .expireAfterWrite(30, TimeUnit.SECONDS)
|
|
|
|
+ .build();
|
|
|
|
+ private final static Cache<String,OnlineJudgeResultsVO> RESULTS_CACHE_FROM_CELERY = CacheBuilder
|
|
.newBuilder()
|
|
.newBuilder()
|
|
.initialCapacity(50)
|
|
.initialCapacity(50)
|
|
.concurrencyLevel(5)
|
|
.concurrencyLevel(5)
|
|
@@ -61,7 +69,9 @@ public class OnlineJudgeLogicImpl implements OnlineJudgeLogic {
|
|
|
|
|
|
if (OnlineJudgeMode.RUN.equals(onlineJudgeVO.getMode())) {
|
|
if (OnlineJudgeMode.RUN.equals(onlineJudgeVO.getMode())) {
|
|
// 需要有数据文件
|
|
// 需要有数据文件
|
|
- String dataOssUrl = "http://mooctest-site-dev.oss-cn-shanghai.aliyuncs.com/code/data.json";
|
|
|
|
|
|
+ Target target = targetService.getTargetByCaseId(onlineJudgeVO.getCaseId());
|
|
|
|
+ //String dataOssUrl = "http://mooctest-site-dev.oss-cn-shanghai.aliyuncs.com/code/data.json";
|
|
|
|
+ String dataOssUrl = target.getUrl();
|
|
List<String> list = Lists.newArrayList(codeOssUrl, dataOssUrl);
|
|
List<String> list = Lists.newArrayList(codeOssUrl, dataOssUrl);
|
|
onlineJudgeProcessLogic.triggerRunOnlineJudge(onlineJudgeVO, list);
|
|
onlineJudgeProcessLogic.triggerRunOnlineJudge(onlineJudgeVO, list);
|
|
} else if(OnlineJudgeMode.ONLYRUN.equals(onlineJudgeVO.getMode())) {
|
|
} else if(OnlineJudgeMode.ONLYRUN.equals(onlineJudgeVO.getMode())) {
|
|
@@ -71,7 +81,7 @@ public class OnlineJudgeLogicImpl implements OnlineJudgeLogic {
|
|
//上传数据到 {osspath}/{mode}/{userId}/{examId}/{caseId}/data_{submissionId}_{timestamp}.json
|
|
//上传数据到 {osspath}/{mode}/{userId}/{examId}/{caseId}/data_{submissionId}_{timestamp}.json
|
|
String dataOssUrl = uploadDataToOss(onlineJudgeVO);
|
|
String dataOssUrl = uploadDataToOss(onlineJudgeVO);
|
|
List<String> list = Lists.newArrayList(codeOssUrl, dataOssUrl);
|
|
List<String> list = Lists.newArrayList(codeOssUrl, dataOssUrl);
|
|
- onlineJudgeProcessLogic.triggerRunOnlineJudge(onlineJudgeVO, list);
|
|
|
|
|
|
+ onlineJudgeProcessLogic.triggerExecuteOnlineJudge(onlineJudgeVO, list);
|
|
}
|
|
}
|
|
|
|
|
|
return onlineJudgeVO.getSubmissionId();
|
|
return onlineJudgeVO.getSubmissionId();
|
|
@@ -81,8 +91,9 @@ public class OnlineJudgeLogicImpl implements OnlineJudgeLogic {
|
|
public String postAnOnlineJudgeSubmissionAndCulScore(OnlineJudgeVO onlineJudgeVO) {
|
|
public String postAnOnlineJudgeSubmissionAndCulScore(OnlineJudgeVO onlineJudgeVO) {
|
|
onlineJudgeVO.setSubmissionId(generalSubmissionId());
|
|
onlineJudgeVO.setSubmissionId(generalSubmissionId());
|
|
String codeOssurl = uploadCodeToOss(onlineJudgeVO);
|
|
String codeOssurl = uploadCodeToOss(onlineJudgeVO);
|
|
- // 需要有数据文件
|
|
|
|
- String dataOssUrl = "http://mooctest-site-dev.oss-cn-shanghai.aliyuncs.com/code/data.json";
|
|
|
|
|
|
+ Target target = targetService.getTargetByCaseId(onlineJudgeVO.getCaseId());
|
|
|
|
+ //String dataOssUrl = "http://mooctest-site-dev.oss-cn-shanghai.aliyuncs.com/code/data.json";
|
|
|
|
+ String dataOssUrl = target.getUrl();
|
|
List<String> list = Lists.newArrayList(codeOssurl, dataOssUrl);
|
|
List<String> list = Lists.newArrayList(codeOssurl, dataOssUrl);
|
|
// 触发onlinejudge任务
|
|
// 触发onlinejudge任务
|
|
onlineJudgeProcessLogic.triggerSubmitOnlineJudge(onlineJudgeVO, list);
|
|
onlineJudgeProcessLogic.triggerSubmitOnlineJudge(onlineJudgeVO, list);
|
|
@@ -100,6 +111,16 @@ public class OnlineJudgeLogicImpl implements OnlineJudgeLogic {
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
|
+ public OnlineJudgeResultsVO pcheckSubmissionById(String submissionId) {
|
|
|
|
+ OnlineJudgeResultsVO result = getResultsFromCache(submissionId);
|
|
|
|
+ if (result == null) {
|
|
|
|
+ return PSTARTED;
|
|
|
|
+ }
|
|
|
|
+ result.setState("success");
|
|
|
|
+ return result;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
public SubmissionResultVO getLatestAnswersForThisCaseAndExam(long examId, long caseId, long userId) {
|
|
public SubmissionResultVO getLatestAnswersForThisCaseAndExam(long examId, long caseId, long userId) {
|
|
|
|
|
|
//FIXME:这里效率太低了,考虑缓存
|
|
//FIXME:这里效率太低了,考虑缓存
|
|
@@ -148,6 +169,12 @@ public class OnlineJudgeLogicImpl implements OnlineJudgeLogic {
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
|
+ public OnlineJudgeResultsVO getResultsFromCache(String submissionId) {
|
|
|
|
+ return RESULTS_CACHE_FROM_CELERY.getIfPresent(submissionId);
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
public OnlineJudgeResultVO generalOnlineJudgeResultVO(String result) {
|
|
public OnlineJudgeResultVO generalOnlineJudgeResultVO(String result) {
|
|
if("".equals(result)) {
|
|
if("".equals(result)) {
|
|
return new OnlineJudgeResultVO("failed");
|
|
return new OnlineJudgeResultVO("failed");
|
|
@@ -157,10 +184,26 @@ public class OnlineJudgeLogicImpl implements OnlineJudgeLogic {
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
|
+ public OnlineJudgeResultsVO generalOnlineJudgeResultsVO(String result) {
|
|
|
|
+ if("".equals(result)) {
|
|
|
|
+ return new OnlineJudgeResultsVO("failed");
|
|
|
|
+ }
|
|
|
|
+ Gson gson = new Gson();
|
|
|
|
+ return gson.fromJson(result, OnlineJudgeResultsVO.class);
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
public void setResultToCache(String submissionId, OnlineJudgeResultVO result) {
|
|
public void setResultToCache(String submissionId, OnlineJudgeResultVO result) {
|
|
RESULT_CACHE_FROM_CELERY.put(submissionId, result);
|
|
RESULT_CACHE_FROM_CELERY.put(submissionId, result);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ @Override
|
|
|
|
+ public void setResultsToCache(String submissionId, OnlineJudgeResultsVO result) {
|
|
|
|
+ RESULTS_CACHE_FROM_CELERY.put(submissionId, result);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -225,21 +268,32 @@ public class OnlineJudgeLogicImpl implements OnlineJudgeLogic {
|
|
}
|
|
}
|
|
|
|
|
|
private String uploadDataToOss(OnlineJudgeVO onlineJudgeVO) {
|
|
private String uploadDataToOss(OnlineJudgeVO onlineJudgeVO) {
|
|
- String data = wapperdata(onlineJudgeVO.getInput(),onlineJudgeVO.getOutput());
|
|
|
|
|
|
+ String data = wapperdata(onlineJudgeVO.getData());
|
|
InputStream inputStream = generalCodeFileInputStream(data);
|
|
InputStream inputStream = generalCodeFileInputStream(data);
|
|
return ossLogic.uploadByUrl(generalFileNameForUploadToOss(onlineJudgeVO,"data",".json"), inputStream);
|
|
return ossLogic.uploadByUrl(generalFileNameForUploadToOss(onlineJudgeVO,"data",".json"), inputStream);
|
|
}
|
|
}
|
|
|
|
|
|
- private String wapperdata(String input, String output) {
|
|
|
|
|
|
+ private String wapperdata(List<OnlineJudgeIODataVO> data) {
|
|
//TODO 保留output接口 方便扩展
|
|
//TODO 保留output接口 方便扩展
|
|
- List<OnlineJudgeIODataDTO> list = Lists.newArrayList();
|
|
|
|
- list.add(new OnlineJudgeIODataDTO(input,"surprise!"));
|
|
|
|
- Gson gson = new Gson();
|
|
|
|
- String result = gson.toJson(list);
|
|
|
|
|
|
+ Gson gson = new GsonBuilder().serializeNulls().create();
|
|
|
|
+ String result = gson.toJson(data);
|
|
log.info("general data is:{}",result);
|
|
log.info("general data is:{}",result);
|
|
return result;
|
|
return result;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ public static void main(String[] args) {
|
|
|
|
+ OnlineJudgeLogicImpl onlineJudgeLogic = new OnlineJudgeLogicImpl();
|
|
|
|
+ List<OnlineJudgeIODataVO> list = Lists.newArrayList();
|
|
|
|
+ OnlineJudgeIODataVO data1 = new OnlineJudgeIODataVO();
|
|
|
|
+ data1.setInput("1 2");
|
|
|
|
+ //data1.setOutput("3");
|
|
|
|
+
|
|
|
|
+ OnlineJudgeIODataVO data2 = new OnlineJudgeIODataVO();
|
|
|
|
+ data2.setInput("3 4");
|
|
|
|
+ list.add(data1);
|
|
|
|
+ list.add(data2);
|
|
|
|
+ onlineJudgeLogic.wapperdata(list);
|
|
|
|
+ }
|
|
private InputStream generalCodeFileInputStream(String code) {
|
|
private InputStream generalCodeFileInputStream(String code) {
|
|
if(code==null) code = "";
|
|
if(code==null) code = "";
|
|
return new ByteArrayInputStream(code.getBytes());
|
|
return new ByteArrayInputStream(code.getBytes());
|