浏览代码

add plugin controller

chenxz 8 年之前
父节点
当前提交
18270715b8
共有 17 个文件被更改,包括 1035 次插入6 次删除
  1. 11 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/fromDev/VersionDao.java
  2. 32 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/fromDev/Version.java
  3. 1 1
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/fromDev/PluginService.java
  4. 9 1
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/fromDev/impl/PluginServiceImpl.java
  5. 65 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/fromDev/IndexController.java
  6. 75 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/fromDev/PluginController.java
  7. 79 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/fromDev/AddGradeVO.java
  8. 91 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/fromDev/DevTaskVO.java
  9. 82 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/fromDev/StResponse.java
  10. 45 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/wrapper/fromDev/ResponseVOWrapper.java
  11. 9 4
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/fromDev/IndexLogic.java
  12. 45 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/fromDev/PluginLogic.java
  13. 42 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/fromDev/impl/IndexLogicImpl.java
  14. 132 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/fromDev/impl/PluginLogicImpl.java
  15. 7 0
      mooctest-site-server/src/main/resources/application.yaml
  16. 171 0
      mooctest-site-server/src/test/java/cn/iselab/mooctest/site/web/ctrl/fromDev/IndexControllerTest.java
  17. 139 0
      mooctest-site-server/src/test/java/cn/iselab/mooctest/site/web/ctrl/fromDev/PluginControllerTest.java

+ 11 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/fromDev/VersionDao.java

@@ -0,0 +1,11 @@
+package cn.iselab.mooctest.site.dao.fromDev;
+
+import cn.iselab.mooctest.site.models.fromDev.Version;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+/**
+ * @author Alan on 2017/3/27
+ */
+public interface VersionDao extends JpaRepository<Version, String> {
+    Version findByArea(String area);
+}

+ 32 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/fromDev/Version.java

@@ -0,0 +1,32 @@
+package cn.iselab.mooctest.site.models.fromDev;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * @author Alan on 2017/3/27
+ */
+@Entity
+@Table(name = "version")
+public class Version {
+    private String version;
+    @Id
+    private String area;
+
+    public String getVersion() {
+        return version;
+    }
+
+    public void setVersion(String version) {
+        this.version = version;
+    }
+
+    public String getArea() {
+        return area;
+    }
+
+    public void setArea(String area) {
+        this.area = area;
+    }
+}

+ 1 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/fromDev/PluginService.java

@@ -25,7 +25,7 @@ public interface PluginService {
 
 	boolean saveGrade(long workerID, long taskID, long caseID, double statement_coverage, double branch_coverage, double prime_path_coverage, double mcdc_coverage, double all_use_coverage, double all_def_coverage, double all_def_use_coverage, double score);
 
-//	String getVersion(String area);
+	String getVersion(String area);
 //
 //	boolean saveCoverage(long workerId, long taskId, long caseId, String functionName, String coverageList);
 //

+ 9 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/fromDev/impl/PluginServiceImpl.java

@@ -5,6 +5,7 @@ import cn.iselab.mooctest.site.dao.DevCaseDao;
 import cn.iselab.mooctest.site.dao.GradeDao;
 import cn.iselab.mooctest.site.dao.WeightDao;
 import cn.iselab.mooctest.site.dao.fromDev.MutatorsDao;
+import cn.iselab.mooctest.site.dao.fromDev.VersionDao;
 import cn.iselab.mooctest.site.models.Grade;
 import cn.iselab.mooctest.site.models.Weight;
 import cn.iselab.mooctest.site.models.fromDev.Mutators;
@@ -38,6 +39,8 @@ public class PluginServiceImpl extends BaseService implements PluginService{
     @Autowired
     MutatorsDao mutatorsDao;
     @Autowired
+    VersionDao versionDao;
+    @Autowired
     ApiService apiService;
     @Autowired
     AnalysisLogic analysisLogic;
@@ -103,7 +106,7 @@ public class PluginServiceImpl extends BaseService implements PluginService{
                 sendScore.setResultUrl("grade.html#/case/" + taskID + "/" + workerID + "/" + caseID);
 
                 String picked = apiService.checkCaseAssignment(workerID, Long.toString(caseID), taskID, "dev.mooctest.net");
-                System.out.print(picked);
+
                 return apiService.addScore(sendScore.getWorkerId(),new Long(sendScore.getCaseId()),sendScore.getScore(),sendScore.getResultUrl(),picked,"dev.mooctest.net");
             } else {
                 grade.setScore(score);
@@ -189,4 +192,9 @@ public class PluginServiceImpl extends BaseService implements PluginService{
             return apiService.addScore(sendScore.getWorkerId(),new Long(sendScore.getCaseId()),sendScore.getScore(),sendScore.getResultUrl(),picked,"dev.mooctest.net");
         }
     }
+
+    @Override
+    public String getVersion(String area) {
+        return versionDao.findByArea(area).getVersion();
+    }
 }

+ 65 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/fromDev/IndexController.java

@@ -0,0 +1,65 @@
+package cn.iselab.mooctest.site.web.ctrl.fromDev;
+
+import cn.iselab.mooctest.site.common.constant.UrlConstants;
+import cn.iselab.mooctest.site.models.Weight;
+import cn.iselab.mooctest.site.web.data.fromDev.DevTaskVO;
+import cn.iselab.mooctest.site.web.data.fromDev.ResponseVO;
+import cn.iselab.mooctest.site.web.data.fromDev.StResponse;
+import cn.iselab.mooctest.site.web.data.fromDev.WeightVO;
+import cn.iselab.mooctest.site.web.logic.TaskLogic;
+import cn.iselab.mooctest.site.web.logic.fromDev.IndexLogic;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * Created by ROGK on 2017/6/28.
+ */
+@RestController
+public class IndexController {
+
+    @Autowired
+    IndexLogic indexLogic;
+
+    @Autowired
+    TaskLogic taskLogic;
+
+    @RequestMapping(value = UrlConstants.API_DEV + "/taskInfo", method = RequestMethod.GET)
+    public ResponseVO<DevTaskVO> analyze(@RequestParam(name = "taskID") long taskID,
+                                         @RequestParam(name = "stuID") long stuID) {
+        return indexLogic.getTaskInfo(taskID, stuID);
+    }
+
+    @RequestMapping(value = UrlConstants.API_DEV + "/weight", method = RequestMethod.GET)
+    public Weight getWeight(@RequestParam(name = "cid") long cid,
+                              @RequestParam(name = "tid") long tid) {
+        return indexLogic.getWeight(cid, tid);
+    }
+
+    @RequestMapping(value = UrlConstants.API_DEV + "/taskSecret", method = RequestMethod.GET)
+    public ResponseVO<String> getTaskSecret(@RequestParam(name = "stuID") String stuID,
+                                            @RequestParam(name = "taskID") String taskID) {
+        return indexLogic.getTaskSecret(stuID, taskID);
+    }
+
+    @RequestMapping(value = UrlConstants.API_DEV + "/source", method = RequestMethod.GET)
+    public String getSourceUrl(@RequestParam(name = "taskID") long taskID,
+                               @RequestParam(name = "stuID") long stuID,
+                               @RequestParam(name = "caseID") long caseID) {
+        String url = taskLogic.getSourceUrl(taskID, stuID, caseID);
+        if (url != null) {
+            return StResponse.success(url);
+        } else {
+            return StResponse.failure();
+        }
+    }
+
+    @RequestMapping(value = UrlConstants.API_DEV + "/username", method = RequestMethod.GET)
+    public List<String> getUserName(@RequestParam(value = "workerIds")String workerIds){
+        return indexLogic.getUserNameList(workerIds);
+    }
+}

+ 75 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/fromDev/PluginController.java

@@ -0,0 +1,75 @@
+package cn.iselab.mooctest.site.web.ctrl.fromDev;
+
+import cn.iselab.mooctest.site.common.constant.UrlConstants;
+import cn.iselab.mooctest.site.web.ctrl.BaseController;
+import cn.iselab.mooctest.site.web.data.fromDev.AddGradeVO;
+import cn.iselab.mooctest.site.web.data.fromDev.StResponse;
+import cn.iselab.mooctest.site.web.logic.fromDev.PluginLogic;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * Created by ROGK on 2017/6/29.
+ */
+@RestController
+public class PluginController extends BaseController{
+
+    @Autowired
+    PluginLogic pluginLogic;
+
+    @RequestMapping(value = UrlConstants.API_DEV + "/plugin/downloadSig", method = RequestMethod.GET)
+    public String getDownloadSignature(HttpServletRequest request) {
+        String taskID = request.getParameter("taskID"),
+                workerID = request.getParameter("workerID"),
+                taskType = request.getParameter("taskType"),
+                caseName = request.getParameter("caseName");
+        String signature = pluginLogic.getDownloadSignature(taskID, workerID, taskType, caseName);
+        if (signature == null) {
+            return StResponse.failure("签名未能生成");
+        } else {
+            return StResponse.success(signature);
+        }
+    }
+
+    @RequestMapping(value =UrlConstants.API_DEV  + "/plugin/submitSig", method = RequestMethod.GET)
+    public String getSubmitSignature(HttpServletRequest request) {
+        String taskID = request.getParameter("taskID"),
+                workerID = request.getParameter("workerID"),
+                caseName = request.getParameter("caseName");
+        String signature = pluginLogic.getSubmitSignature(taskID, workerID, caseName);
+        if (signature == null) {
+            return StResponse.failure("签名未能生成");
+        } else {
+            return StResponse.success(signature);
+        }
+    }
+
+    @RequestMapping(value =UrlConstants.API_DEV + "/plugin/submitAnswersSig", method = RequestMethod.GET)
+    public String getSubmitAnswersSignature(HttpServletRequest request) {
+        String taskID = request.getParameter("taskID"),
+                workerID = request.getParameter("workerID"),
+                caseName = request.getParameter("caseName");
+        String signature = pluginLogic.getSubmitAnswersSignature(taskID, workerID, caseName);
+        if (signature == null) {
+            return StResponse.failure("签名未能生成");
+        } else {
+            return StResponse.success(signature);
+        }
+    }
+
+    @RequestMapping(value =UrlConstants.API_DEV + "/plugin/grade", method = RequestMethod.POST)
+    public boolean addGrade(@RequestBody AddGradeVO addGradeVO,
+                            @RequestParam(name = "workerId") long workerId,
+                            @RequestParam(name = "caseId") long caseId,
+                            @RequestParam(name = "taskId") long taskId) {
+        return pluginLogic.addGrade(workerId, taskId, caseId, addGradeVO);
+
+    }
+
+    @RequestMapping(value =UrlConstants.API_DEV + "/plugin/version", method = RequestMethod.GET)
+    public String getVersion(@RequestParam(name = "area") String area) {
+        return pluginLogic.getVersion(area);
+    }
+}

+ 79 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/fromDev/AddGradeVO.java

@@ -0,0 +1,79 @@
+package cn.iselab.mooctest.site.web.data.fromDev;
+
+/**
+ * @author Alan on 2017/3/27
+ */
+public class AddGradeVO {
+    private double score;
+    private double statement_coverage;
+    private double branch_coverage;
+    private double prime_path_coverage;
+    private double mcdc_coverage;
+    private double all_use_coverage;
+    private double all_def_coverage;
+    private double all_def_use_coverage;
+
+    public double getScore() {
+        return score;
+    }
+
+    public void setScore(double score) {
+        this.score = score;
+    }
+
+    public double getStatement_coverage() {
+        return statement_coverage;
+    }
+
+    public void setStatement_coverage(double statement_coverage) {
+        this.statement_coverage = statement_coverage;
+    }
+
+    public double getBranch_coverage() {
+        return branch_coverage;
+    }
+
+    public void setBranch_coverage(double branch_coverage) {
+        this.branch_coverage = branch_coverage;
+    }
+
+    public double getPrime_path_coverage() {
+        return prime_path_coverage;
+    }
+
+    public void setPrime_path_coverage(double prime_path_coverage) {
+        this.prime_path_coverage = prime_path_coverage;
+    }
+
+    public double getMcdc_coverage() {
+        return mcdc_coverage;
+    }
+
+    public void setMcdc_coverage(double mcdc_coverage) {
+        this.mcdc_coverage = mcdc_coverage;
+    }
+
+    public double getAll_use_coverage() {
+        return all_use_coverage;
+    }
+
+    public void setAll_use_coverage(double all_use_coverage) {
+        this.all_use_coverage = all_use_coverage;
+    }
+
+    public double getAll_def_coverage() {
+        return all_def_coverage;
+    }
+
+    public void setAll_def_coverage(double all_def_coverage) {
+        this.all_def_coverage = all_def_coverage;
+    }
+
+    public double getAll_def_use_coverage() {
+        return all_def_use_coverage;
+    }
+
+    public void setAll_def_use_coverage(double all_def_use_coverage) {
+        this.all_def_use_coverage = all_def_use_coverage;
+    }
+}

+ 91 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/fromDev/DevTaskVO.java

@@ -0,0 +1,91 @@
+package cn.iselab.mooctest.site.web.data.fromDev;
+
+import java.util.List;
+
+/**
+ * Created by ROGK on 2017/6/28.
+ */
+public class DevTaskVO {
+
+    private String information;
+    private long duration;
+    private String managerName;
+    private String name;
+    private String beginTime;
+    private String endTime;
+    private long beginTimeMillis;
+    private long endTimeMillis;
+    private List<String> groups;
+
+    public String getInformation() {
+        return information;
+    }
+
+    public void setInformation(String information) {
+        this.information = information;
+    }
+
+    public long getDuration() {
+        return duration;
+    }
+
+    public void setDuration(long duration) {
+        this.duration = duration;
+    }
+
+    public String getManagerName() {
+        return managerName;
+    }
+
+    public void setManagerName(String managerName) {
+        this.managerName = managerName;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getBeginTime() {
+        return beginTime;
+    }
+
+    public void setBeginTime(String beginTime) {
+        this.beginTime = beginTime;
+    }
+
+    public String getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(String endTime) {
+        this.endTime = endTime;
+    }
+
+    public long getBeginTimeMillis() {
+        return beginTimeMillis;
+    }
+
+    public void setBeginTimeMillis(long beginTimeMillis) {
+        this.beginTimeMillis = beginTimeMillis;
+    }
+
+    public long getEndTimeMillis() {
+        return endTimeMillis;
+    }
+
+    public void setEndTimeMillis(long endTimeMillis) {
+        this.endTimeMillis = endTimeMillis;
+    }
+
+    public List<String> getGroups() {
+        return groups;
+    }
+
+    public void setGroups(List<String> groups) {
+        this.groups = groups;
+    }
+}

+ 82 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/fromDev/StResponse.java

@@ -0,0 +1,82 @@
+package cn.iselab.mooctest.site.web.data.fromDev;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+
+/**
+ * 标准Response结构
+ * Created by Alan on 2017/1/24.
+ */
+public class StResponse {
+    /**
+     * 正确,无参数返回
+     *
+     * @return JSON数据
+     */
+    public static String success() {
+        return success(null);
+    }
+
+    /**
+     * 获取数据正常返回json字符串
+     *
+     * @param data 数据
+     * @return JSON数据
+     */
+    public static String success(Object data) {
+        Gson gson = new Gson();
+        JsonObject object = new JsonObject();
+        JsonElement element = gson.toJsonTree(data);
+        object.addProperty("condition", "success");
+        object.addProperty("msg", "");
+        object.add("data", element);
+        return object.toString();
+    }
+
+    /**
+     * 错误,无参数返回
+     *
+     * @return JSON数据
+     */
+    public static String failure() {
+        return failure("", null);
+    }
+
+    /**
+     * 获取数据异常,返回错误数据
+     *
+     * @param data 错误数据
+     * @return JSON数据
+     */
+    public static String failure(Object data) {
+        return failure("", data);
+    }
+
+    /**
+     * 获取数据异常,返回错误提示信息
+     *
+     * @param message 错误提示信息
+     * @return JSON数据
+     */
+    public static String failure(String message) {
+        return failure(message, null);
+    }
+
+    /**
+     * 获取数据异常,返回错误提示信息和错误数据
+     *
+     * @param message 错误提示信息
+     * @param data    错误数据
+     * @return JSON数据
+     */
+    public static String failure(String message, Object data) {
+        Gson gson = new Gson();
+        JsonObject object = new JsonObject();
+        JsonElement element = gson.toJsonTree(data);
+        object.addProperty("condition", "fail");
+        object.addProperty("msg", message);
+        object.add("data", element);
+        return object.toString();
+    }
+}

+ 45 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/wrapper/fromDev/ResponseVOWrapper.java

@@ -0,0 +1,45 @@
+package cn.iselab.mooctest.site.web.data.wrapper.fromDev;
+
+import cn.iselab.mooctest.site.web.data.fromDev.DevTaskVO;
+import cn.iselab.mooctest.site.web.data.fromDev.ResponseVO;
+import com.google.gson.Gson;
+import org.springframework.stereotype.Service;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * Created by ROGK on 2017/6/29.
+ */
+@Service
+public class ResponseVOWrapper {
+
+    public ResponseVO<DevTaskVO> wrap(ResponseVO responseVO) {
+        Gson gson = new Gson();
+        DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");
+        DevTaskVO taskVO = gson.fromJson(responseVO.getData().toString(), DevTaskVO.class);
+        if (taskVO != null) {
+            try {
+                Date start = format.parse(taskVO.getBeginTime()),
+                        end = format.parse(taskVO.getEndTime());
+
+                taskVO.setBeginTime(taskVO.getBeginTime());
+                taskVO.setEndTime(taskVO.getEndTime());
+                taskVO.setBeginTimeMillis(start.getTime());
+                taskVO.setEndTimeMillis(end.getTime());
+                long duration = (end.getTime() - start.getTime()) / 1000 / 60;
+                taskVO.setDuration(duration);
+
+            } catch (ParseException e) {
+                e.printStackTrace();
+            }
+        }
+        ResponseVO<DevTaskVO> response = new ResponseVO<>();
+        response.setStatus(responseVO.getStatus());
+        response.setMessage(responseVO.getMessage());
+        response.setData(taskVO);
+        return response;
+    }
+}

+ 9 - 4
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/fromDev/IndexLogic.java

@@ -1,9 +1,7 @@
 package cn.iselab.mooctest.site.web.logic.fromDev;
 
-import cn.iselab.mooctest.site.web.data.fromDev.AllGradeVO;
-import cn.iselab.mooctest.site.web.data.fromDev.DebugGradeVO;
-import cn.iselab.mooctest.site.web.data.fromDev.DevCaseVO;
-import cn.iselab.mooctest.site.web.data.fromDev.WeightVO;
+import cn.iselab.mooctest.site.models.Weight;
+import cn.iselab.mooctest.site.web.data.fromDev.*;
 
 import java.util.List;
 
@@ -27,4 +25,11 @@ public interface IndexLogic {
     boolean setWeight(WeightVO weightVO);
 
     String getCode(String caseName, String className, int sline, int eline);
+
+    ResponseVO<DevTaskVO> getTaskInfo(long taskID, long stuID);
+
+    Weight getWeight(long cid, long tid);
+
+    ResponseVO<String> getTaskSecret(String stuID, String taskID);
+
 }

+ 45 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/fromDev/PluginLogic.java

@@ -0,0 +1,45 @@
+package cn.iselab.mooctest.site.web.logic.fromDev;
+
+import cn.iselab.mooctest.site.web.data.fromDev.AddGradeVO;
+
+/**
+ * Created by ROGK on 2017/6/29.
+ */
+public interface PluginLogic {
+
+    /**
+     * 获取下载文件的签名
+     *
+     * @param examID
+     * @param stuID
+     * @param examType
+     * @param examName
+     * @return
+     */
+    String getDownloadSignature(String examID, String stuID, String examType, String examName);
+
+    /**
+     * 获取上传文件的签名
+     *
+     * @param examID
+     * @param stuID
+     * @param examName
+     * @return
+     */
+    String getSubmitSignature(String examID, String stuID, String examName);
+
+    /**
+     * 获取上传答案的签名
+     *
+     * @param examID
+     * @param stuID
+     * @param examName
+     * @return
+     */
+    String getSubmitAnswersSignature(String examID, String stuID, String examName);
+
+    boolean addGrade(long workerId, long taskId, long caseId, AddGradeVO addGradeVO);
+
+    String getVersion(String area);
+
+}

+ 42 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/fromDev/impl/IndexLogicImpl.java

@@ -4,13 +4,17 @@ import cn.iselab.mooctest.site.data.WeightStatus;
 import cn.iselab.mooctest.site.models.Case;
 import cn.iselab.mooctest.site.models.DevCase;
 import cn.iselab.mooctest.site.models.Grade;
+import cn.iselab.mooctest.site.models.Weight;
+import cn.iselab.mooctest.site.service.application.ApiService;
 import cn.iselab.mooctest.site.service.fromDev.IndexService;
 import cn.iselab.mooctest.site.service.fromDev.MutationService;
 import cn.iselab.mooctest.site.service.fromDev.PluginService;
 import cn.iselab.mooctest.site.service.worker.PersonalService;
+import cn.iselab.mooctest.site.util.data.EncryptionUtil;
 import cn.iselab.mooctest.site.web.data.fromDev.*;
 import cn.iselab.mooctest.site.web.data.wrapper.fromDev.AllGradeVOWrapper;
 import cn.iselab.mooctest.site.web.data.wrapper.fromDev.DevCaseVOWrapper;
+import cn.iselab.mooctest.site.web.data.wrapper.fromDev.ResponseVOWrapper;
 import cn.iselab.mooctest.site.web.logic.BaseLogic;
 import cn.iselab.mooctest.site.web.logic.TaskLogic;
 import cn.iselab.mooctest.site.web.logic.fromDev.IndexLogic;
@@ -19,6 +23,7 @@ import com.aliyun.oss.model.OSSObject;
 import com.google.gson.Gson;
 import net.dongliu.requests.Parameter;
 import net.dongliu.requests.Requests;
+import org.json.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -43,12 +48,16 @@ public class IndexLogicImpl extends BaseLogic implements IndexLogic{
     @Autowired
     AllGradeVOWrapper allGradeVOWrapper;
     @Autowired
+    ResponseVOWrapper responseVOWrapper;
+    @Autowired
     PersonalService personalService;
     @Autowired
     MutationService mutationService;
     @Autowired
     PluginService pluginService;
     @Autowired
+    ApiService apiService;
+    @Autowired
     TaskLogic taskLogic;
 
     private final static String endPoint = "oss-cn-shanghai.aliyuncs.com";
@@ -175,6 +184,39 @@ public class IndexLogicImpl extends BaseLogic implements IndexLogic{
         return result;
     }
 
+    @Override
+    public ResponseVO<DevTaskVO> getTaskInfo(long taskID, long stuID) {
+        String result = apiService.getTaskWithCases(taskID, stuID);
+        ResponseVO responseVO=new ResponseVO(result);
+        if(result==""){
+            responseVO.setMessage("task, worker of task not found");
+            responseVO.setStatus("200");
+        }
+        else {
+            responseVO.setMessage("success");
+            responseVO.setStatus("200");
+        }
+        return responseVOWrapper.wrap(responseVO);
+    }
+
+    @Override
+    public Weight getWeight(long cid, long tid) {
+        return indexService.getWeight(tid, cid);
+
+    }
+
+    @Override
+    public ResponseVO<String> getTaskSecret(String stuID, String taskID) {
+        try {
+            String secret = EncryptionUtil.encryptDES(taskID + "_" + stuID);
+            return new ResponseVO<>(secret);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
     private DevCase getCase(long caseID) {
         return indexService.getCase(caseID);
     }

+ 132 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/fromDev/impl/PluginLogicImpl.java

@@ -0,0 +1,132 @@
+package cn.iselab.mooctest.site.web.logic.fromDev.impl;
+
+import cn.iselab.mooctest.site.service.fromDev.PluginService;
+import cn.iselab.mooctest.site.web.data.fromDev.AddGradeVO;
+import cn.iselab.mooctest.site.web.logic.BaseLogic;
+import cn.iselab.mooctest.site.web.logic.fromDev.PluginLogic;
+import com.aliyun.oss.HttpMethod;
+import com.aliyun.oss.OSSClient;
+import com.aliyun.oss.model.GeneratePresignedUrlRequest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.net.URL;
+import java.util.Date;
+
+/**
+ * Created by ROGK on 2017/6/29.
+ */
+@Service
+public class PluginLogicImpl extends BaseLogic implements PluginLogic{
+
+    @Autowired
+    PluginService pluginService;
+
+    @Value("${aliOSS.endPoint}")
+    private String endPoint;
+    @Value("${aliOSS.accessKeyId}")
+    private String accessKeyId;
+    @Value("${aliOSS.accessKeySecret}")
+    private String accessKeySecret;
+    @Value("${aliOSS.bucketName.dev}")
+    private String bucketName;
+
+    @Override
+    public String getDownloadSignature(String taskID, String workerID, String taskType, String caseName) {
+        //TODO 查找taskID中是否存在该workerID
+        //TODO 判断当前时间是否在考试开始时间之后
+        if (taskID == null || workerID == null || taskType == null || caseName == null) {
+            return null;
+        }
+
+        //生成OSS的路径
+        String path = "data/files/" + taskType + "/" + caseName + ".zip";
+
+        //打开OSS连接
+        OSSClient client = new OSSClient(endPoint, accessKeyId, accessKeySecret);
+
+        //生成签名
+        Date expiration = new Date(System.currentTimeMillis() + 5 * 1000 * 60);//签名5分钟过期
+        GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, path, HttpMethod.GET);
+        request.setExpiration(expiration);
+        URL signedUrl = client.generatePresignedUrl(request);
+
+        LOG.info("signed url for getObject: " + signedUrl.toString());
+
+        //TODO 将行为记录至数据库
+
+        //关闭OSS连接
+        client.shutdown();
+
+        return signedUrl.toString();
+    }
+
+    @Override
+    public String getSubmitSignature(String taskID, String workerID, String caseName) {
+        //TODO 查找examID中是否存在该stuID
+        //TODO 判断当前时间是否在考试结束时间之前
+        if (taskID == null || workerID == null || caseName == null) {
+            return null;
+        }
+        String path = "data/records/" + taskID + "/" + workerID + "/" + caseName + "_" + System.currentTimeMillis() + ".zip";
+
+        //打开OSS连接
+        OSSClient client = new OSSClient(endPoint, accessKeyId, accessKeySecret);
+
+        //生成签名
+        Date expiration = new Date(System.currentTimeMillis() + 5 * 1000 * 60);//签名5分钟过期
+        GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, path, HttpMethod.PUT);
+        request.setExpiration(expiration);
+        request.setContentType("application/octet-stream");
+        // 添加user meta
+        request.addUserMetadata("author", "aliy");
+        URL signedUrl = client.generatePresignedUrl(request);
+
+        LOG.info("signed url for putObject: " + signedUrl.toString());
+        //TODO 将行为记录至数据库
+
+        //关闭OSS连接
+        client.shutdown();
+        return signedUrl.toString();
+    }
+
+    @Override
+    public String getSubmitAnswersSignature(String taskID, String workerID, String caseName) {
+        //TODO 查找examID中是否存在该stuID
+        //TODO 判断当前时间是否在考试结束时间之前
+        if (taskID == null || workerID == null || caseName == null) {
+            return null;
+        }
+        String path = "data/answers/" + taskID + "/" + workerID + "/" + caseName + "_" + System.currentTimeMillis() + ".zip";
+
+        //打开OSS连接
+        OSSClient client = new OSSClient(endPoint, accessKeyId, accessKeySecret);
+
+        //生成签名
+        Date expiration = new Date(System.currentTimeMillis() + 5 * 1000 * 60);//签名5分钟过期
+        GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, path, HttpMethod.PUT);
+        request.setExpiration(expiration);
+        request.setContentType("application/octet-stream");
+        // 添加user meta
+        request.addUserMetadata("author", "aliy");
+        URL signedUrl = client.generatePresignedUrl(request);
+
+        LOG.info("signed url for getObject: " + signedUrl.toString());
+        //TODO 将行为记录至数据库
+
+        //关闭OSS连接
+        client.shutdown();
+        return signedUrl.toString();
+    }
+
+    @Override
+    public boolean addGrade(long workerId, long taskId, long caseId, AddGradeVO addGradeVO) {
+        return pluginService.saveGrade(workerId, taskId, caseId, addGradeVO.getStatement_coverage(), addGradeVO.getBranch_coverage(), addGradeVO.getPrime_path_coverage(), addGradeVO.getMcdc_coverage(), addGradeVO.getAll_use_coverage(), addGradeVO.getAll_def_coverage(), addGradeVO.getAll_def_use_coverage(), addGradeVO.getScore());
+    }
+
+    @Override
+    public String getVersion(String area) {
+        return pluginService.getVersion(area);
+    }
+}

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

@@ -41,6 +41,13 @@ oss:
     expireTime: 600
     roleArn: acs:ram::1525065817051996:role/oss-archive
 
+aliOSS:
+    endPoint: oss-cn-shanghai.aliyuncs.com
+    accessKeyId: IvS323TIcWUT57MG
+    accessKeySecret: dYml7rvT8stQkoSjMYlfRTxNj9dEsI
+    bucketName:
+        dev: mooctest-dev
+        static: mooctest-mutation
 ---
 # 开发环境
 spring:

+ 171 - 0
mooctest-site-server/src/test/java/cn/iselab/mooctest/site/web/ctrl/fromDev/IndexControllerTest.java

@@ -0,0 +1,171 @@
+package cn.iselab.mooctest.site.web.ctrl.fromDev;
+
+import cn.iselab.mooctest.site.Application;
+import cn.iselab.mooctest.site.models.Weight;
+import cn.iselab.mooctest.site.web.data.fromDev.DevTaskVO;
+import cn.iselab.mooctest.site.web.data.fromDev.ResponseVO;
+import cn.iselab.mooctest.site.web.data.fromDev.StResponse;
+import cn.iselab.mooctest.site.web.logic.TaskLogic;
+import cn.iselab.mooctest.site.web.logic.fromDev.IndexLogic;
+import net.sf.json.JSON;
+import org.json.JSONObject;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.springframework.boot.test.SpringApplicationConfiguration;
+import org.springframework.test.context.web.WebAppConfiguration;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.MvcResult;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.*;
+
+import static org.mockito.Matchers.*;
+import static org.mockito.Mockito.when;
+import static org.mockito.MockitoAnnotations.initMocks;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
+
+/**
+ * Created by ROGK on 2017/6/29.
+ */
+@WebAppConfiguration
+@SpringApplicationConfiguration(classes = Application.class)
+@RunWith(MockitoJUnitRunner.class)
+public class IndexControllerTest {
+
+    private MockMvc mockMvc;
+
+    @InjectMocks
+    IndexController indexController=new IndexController();
+
+    @Mock
+    IndexLogic indexLogic;
+    @Mock
+    TaskLogic taskLogic;
+
+    ResponseVO expect;
+    DevTaskVO devTaskVO=new DevTaskVO();
+
+    @Before
+    public void setupMockMvc() throws Exception {
+        initMocks(this);
+        mockMvc= MockMvcBuilders.standaloneSetup(indexController).build();
+
+//        expect.setStatus("test");
+//        expect.setMessage("test");
+//
+//        devTaskVO.setBeginTime("test");
+//        devTaskVO.setBeginTimeMillis(1);
+//        devTaskVO.setDuration(1);
+//        devTaskVO.setEndTime("test");
+//        devTaskVO.setEndTimeMillis(1);
+//        devTaskVO.setGroups(new ArrayList<String>());
+//        devTaskVO.setManagerName("test");
+//        devTaskVO.setInformation("test");
+    }
+
+    @Test
+    public void should_return_DevTaskVO_when_DevTaskVOExists() throws Exception{
+        expect=new ResponseVO(devTaskVO);
+
+        when(indexLogic.getTaskInfo(anyLong(),anyLong())).thenReturn(expect);
+
+        MvcResult result=mockMvc.perform(
+                get("/api/dev/taskInfo")
+                        .param("taskID","306")
+                        .param("stuID","1")
+        ).andDo(print()).andExpect(status().isOk()).andReturn();
+
+        Assert.assertEquals("{\"status\":null,\"message\":null,\"data\":{\"information\":null,\"duration\":0,\"managerName\":null" +
+                ",\"name\":null,\"beginTime\":null,\"endTime\":null,\"beginTimeMillis\":0,\"endTimeMillis\":0,\"groups\":null}}",result.getResponse().getContentAsString());
+    }
+
+    @Test
+    public void should_return_Weight_when_WeightExists()throws Exception{
+        Weight expect=new Weight();
+        expect.setId(1);
+        expect.setCid(1);
+        expect.setTid(1);
+        expect.setAd(0.5);
+        expect.setAdu(0.5);
+        expect.setApfd(0.5);
+        expect.setAu(0.5);
+        expect.setBc(0.5);
+        expect.setCovercom(1);
+        expect.setMc_dc(0.5);
+        expect.setMutation(0.5);
+        expect.setMutationcom(1);
+        expect.setPpc(0.5);
+        expect.setSc(0.5);
+        when(indexLogic.getWeight(anyLong(),anyLong())).thenReturn(expect);
+
+        MvcResult result=mockMvc.perform(
+                get("/api/dev/weight")
+                        .param("cid","11")
+                        .param("tid","303")
+        ).andDo(print()).andExpect(status().isOk()).andReturn();
+
+
+        JSONObject jsonObject=new JSONObject(result.getResponse().getContentAsString());
+        Assert.assertEquals(expect.getId(),jsonObject.getLong("id"));
+    }
+
+    @Test
+    public void should_return_TaskSecret_when_TaskSecretExists() throws Exception{
+        String secret="test";
+        expect=new ResponseVO(secret);
+
+        when(indexLogic.getTaskSecret(anyString(),anyString())).thenReturn(expect);
+
+        MvcResult result=mockMvc.perform(
+                get("/api/dev/taskSecret")
+                        .param("stuID","1")
+                        .param("taskID","1")
+        ).andDo(print()).andExpect(status().isOk()).andReturn();
+
+        JSONObject jsonObject=new JSONObject(result.getResponse().getContentAsString());
+
+        Assert.assertEquals(expect.getData(),jsonObject.getString("data"));
+    }
+
+    @Test
+    public void should_return_SourceUrl_when_SourceUrlExists()throws Exception{
+        String url="test";
+        String expect= StResponse.success(url);
+        when(taskLogic.getSourceUrl(anyLong(),anyLong(),anyLong())).thenReturn(url);
+
+        MvcResult result=mockMvc.perform(
+                get("/api/dev/source")
+                        .param("taskID","1")
+                        .param("stuID","1")
+                        .param("caseID","1")
+        ).andDo(print()).andExpect(status().isOk()).andReturn();
+
+        Assert.assertEquals(expect,result.getResponse().getContentAsString());
+    }
+
+    @Test
+    public void should_return_UserNameList_when_UserNameListExists() throws Exception{
+        List<String> expect=new ArrayList<>();
+        expect.add("test");
+
+        when(indexLogic.getUserNameList(anyString())).thenReturn(expect);
+
+        MvcResult result=mockMvc.perform(
+                get("/api/dev/username").param("workerIds","test")
+        ).andDo(print()).andExpect(status().isOk()).andReturn();
+
+        Assert.assertEquals("[\"test\"]",result.getResponse().getContentAsString());
+    }
+
+}

+ 139 - 0
mooctest-site-server/src/test/java/cn/iselab/mooctest/site/web/ctrl/fromDev/PluginControllerTest.java

@@ -0,0 +1,139 @@
+package cn.iselab.mooctest.site.web.ctrl.fromDev;
+
+import cn.iselab.mooctest.site.Application;
+import cn.iselab.mooctest.site.models.fromDev.Version;
+import cn.iselab.mooctest.site.web.data.fromDev.AddGradeVO;
+import cn.iselab.mooctest.site.web.logic.fromDev.PluginLogic;
+import com.sun.org.apache.xml.internal.security.Init;
+import org.json.JSONObject;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.springframework.boot.test.SpringApplicationConfiguration;
+import org.springframework.http.MediaType;
+import org.springframework.test.context.web.WebAppConfiguration;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.MvcResult;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+
+import static org.junit.Assert.*;
+
+import static org.mockito.Matchers.*;
+import static org.mockito.Mockito.when;
+import static org.mockito.MockitoAnnotations.initMocks;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
+
+/**
+ * Created by ROGK on 2017/6/29.
+ */
+@RunWith(MockitoJUnitRunner.class)
+@WebAppConfiguration
+@SpringApplicationConfiguration(classes = Application.class)
+public class PluginControllerTest {
+
+    private MockMvc mockMvc;
+
+    @InjectMocks
+    PluginController pluginController=new PluginController();
+
+    @Mock
+    PluginLogic pluginLogic;
+
+    String expect;
+
+    @Before
+    public void setupMockMvc() {
+        initMocks(this);
+        mockMvc= MockMvcBuilders.standaloneSetup(pluginController).build();
+        expect="{\"condition\":\"success\",\"msg\":\"\",\"data\":\"test\"}";
+    }
+
+    @Test
+    public void should_return_DownloadSignature_when_DownloadSignatureExists() throws Exception{
+        when(pluginLogic.getDownloadSignature("1","1","1","Matrix")).thenReturn("test");
+
+        MvcResult result=mockMvc.perform(
+                get("/api/dev/plugin/downloadSig")
+                        .param("taskID","1")
+                        .param("workerID","1")
+                        .param("taskType","1")
+                        .param("caseName","Matrix")
+        ).andDo(print()).andExpect(status().isOk()).andReturn();
+
+        Assert.assertEquals(result.getResponse().getContentAsString(),expect);
+    }
+
+    @Test
+    public void should_return_SubmitSignature_when_SubmitSignatureExists() throws Exception{
+        when(pluginLogic.getSubmitSignature("1","1","Matrix")).thenReturn("test");
+        MvcResult result=mockMvc.perform(
+                get("/api/dev/plugin/submitSig")
+                        .param("taskID","1")
+                        .param("workerID","1")
+                        .param("caseName","Matrix")
+        ).andDo(print()).andExpect(status().isOk()).andReturn();
+
+        Assert.assertEquals(result.getResponse().getContentAsString(),expect);
+    }
+
+    @Test
+    public void should_return_AnswersSignature_when_AnswersSignatureExsits() throws Exception{
+        when(pluginLogic.getSubmitAnswersSignature("1","1","Matrix")).thenReturn("test");
+
+        MvcResult result = mockMvc.perform(
+                get("/api/dev/plugin/submitAnswersSig")
+                        .param("taskID","1")
+                        .param("workerID","1")
+                        .param("caseName","Matrix")
+        ).andDo(print()).andExpect(status().isOk()).andReturn();
+
+        Assert.assertEquals(result.getResponse().getContentAsString(),expect);
+    }
+
+    @Test
+    public void should_return_AddResult_when_AddGrade() throws Exception{
+        boolean expect=true;
+        when(pluginLogic.addGrade(anyLong(),anyLong(),anyLong(),any(AddGradeVO.class))).thenReturn(true);
+
+        JSONObject jsonObject=new JSONObject();
+        jsonObject.put("score",90.0);
+        jsonObject.put("statement_coverage",0.5);
+        jsonObject.put("branch_coverage",0.5);
+        jsonObject.put("prime_path_coverage",0.5);
+        jsonObject.put("mcdc_coverage",0.5);
+        jsonObject.put("all_use_coverage",90.0);
+        jsonObject.put("all_def_coverage",90.0);
+        jsonObject.put("all_def_use_coverage",90.0);
+
+        MvcResult mvcResult=mockMvc.perform(
+                post("/api/dev/plugin/grade")
+                        .param("workerId","1")
+                        .param("caseId","11")
+                        .param("taskId","306")
+                .contentType(MediaType.APPLICATION_JSON).content(jsonObject.toString())
+        ).andDo(print()).andExpect(status().isOk()).andReturn();
+
+        Assert.assertEquals(expect,Boolean.valueOf(mvcResult.getResponse().getContentAsString()));
+    }
+
+    @Test
+    public void should_return_Version_when_VersionExsits() throws Exception{
+        Version expect=new Version();
+
+        when(pluginLogic.getVersion(anyString())).thenReturn(expect.toString());
+
+        MvcResult mvcResult=mockMvc.perform(
+                get("/api/dev/plugin/version").param("area","test")
+        ).andDo(print()).andExpect(status().isOk()).andReturn();
+
+        Assert.assertEquals(expect.toString(),mvcResult.getResponse().getContentAsString());
+    }
+}