@Override
  public boolean compile(TestData data) {
    System.out.println("...enter JavaCompiler comple(data)...");

    if (data == null) return false;
    // 读取源码
    String source = data.getStr(JobConst.TARGET_SOURCE);

    //		System.out.println("++++++++++++++++++++++");
    //		System.out.println("souce code : " + source);
    //		if(source.indexOf("();")!=-1){
    //			String s = new String(source);
    //			Pattern pattern = Pattern.compile("=\\s*\\w*\\(\\)\\;");
    //			Matcher matcher = pattern.matcher(s);
    ////			System.out.println(matcher.replaceAll("= 5"));
    //			source = matcher.replaceAll(" = 5;\\/\\/need mocked");
    //		}
    String s = new String(source);
    Pattern pattern = Pattern.compile("valueReturned\\s*=\\s*\\w");
    Matcher matcher = pattern.matcher(s);
    //		System.out.println(matcher.replaceAll(s +"\\/\\/need mocked"));
    source = matcher.replaceAll("valueReturned = 8;\\/\\/need mocked");
    //		System.out.println("++++++++++++++++++++++");
    // 输出源码

    data.copyList(getSrc());
    // 组合输入文件名, 写入临时输出目录
    IOUtil.write(getSrc() + data.getSourceFile().getName(), source);
    setStaticSourceFileName(data.getSourceFile().getName());
    //		System.out.println("========++++++" + data.getSourceFile().getName());
    // 输出信息
    warnFile = getSrc() + WARN;

    String classPath = data.getStr(JobConst.CLASS_PATH);
    if (classPath.isEmpty()) {
      classPath = getClassPath();
    }
    // Debug.println(classPath);

    // 输出make文件
    StringBuilder sb = new StringBuilder();
    ArrayList<String> arr = data.getCompiledList();
    for (int i = 0; i < arr.size(); i++) {
      sb.append(getSrc() + arr.get(i) + JobConst.ENTER);
    }
    Log.println("1111" + getSrc());
    // Debug.println(classPath);
    IOUtil.write(getSrc() + MAKE, sb.toString());

    if (!compile(classPath, getBin(), "@" + getSrc() + MAKE, warnFile)) {
      data.getResult().addReport(IOUtil.read(warnFile));
      // data.put(JobConst.COMPILED_REPORT, IOUtil.read(warnFile));
      return false;
    } else return true;
  }
  /**
   * BP测试,以下三个参数是必的 <br>
   * FileName=[TestClass.java]<br>
   * TargetClass=[TestClass]<br>
   * TargetMethod=[testMethod]<br>
   */
  @Override
  public String testing(String code, String options) {

    // Add line number```
    // begin
    TestData data = new TestData();
    Properties ipro = PropertiesUtil.parse(options);

    String ifileName = ipro.getProperty(JobConst.FILENAME);
    data.setSourceCode(code, ifileName);
    data.put(JobConst.TARGET_CLASS, ipro.getProperty(JobConst.TARGET_CLASS));
    data.put(JobConst.TARGET_METHOD, ipro.getProperty(JobConst.TARGET_METHOD));

    JavaParser p = new JavaParser();
    BPVistor2 v = new BPVistor2();

    p.run(data);
    v.run(data);

    FlowGraph ifg = (FlowGraph) data.get(JobConst.CONTROL_FLOW_GRAPH);
    Iterator<GraphNode> iitGn = ifg.iterator();
    // end

    BPStumpWorker w = new BPStumpWorker();
    // TestData d = new TestData();
    Properties pro = PropertiesUtil.parse(options);

    String fileName = pro.getProperty(JobConst.FILENAME);
    // d.setSourceCode(code, fileName);
    // d.put(JobConst.TARGET_CLASS, pro.getProperty(JobConst.TARGET_CLASS));
    // d.put(JobConst.TARGET_METHOD,
    // pro.getProperty(JobConst.TARGET_METHOD));

    // boolean b = w.run(d);

    if (true) {

      // To generate the Flow Graph
      String rs = "<FlowGraph>\r\n";

      int preNodeLineNum = 1;
      boolean Flag = true;

      // test
      ArrayList<Integer> A = new ArrayList<Integer>();
      ArrayList<Integer> B = new ArrayList<Integer>();
      A.add(-1);
      B.add(-1);
      boolean isDual = false;
      Iterator<GraphNode> iitGn2 = ifg.iterator();

      while (iitGn2.hasNext()) {
        GraphNode inode = iitGn2.next(); // changed by me```
        if (inode.getFirstId() != -1) {
          A.add(inode.getId());
          B.add(inode.getFirstId());
        }
        if (inode.getSecondId() != -1) {

          A.add(inode.getId());
          B.add(inode.getFirstId());
        }
      }

      while (iitGn.hasNext()) {
        GraphNode inode = iitGn.next(); // changed by me```

        Flag = false;
        rs +=
            (("  <Node id=\""
                + inode.getId()
                + "\" name=\""
                + inode.getBeginLine()
                + " - "
                + inode.getEndline()
                + "\" nodeSize=\"30\" nodeColor=\"0x4682b4\"/>\r\n"));
        if (inode.getFirstId() != -1) {
          for (int i = 0; i < A.size(); i++) {
            if (A.get(i) == inode.getFirstId() && B.get(i) == inode.getId()) {
              isDual = true;
            }
          }
          if (isDual) {
            rs +=
                (("    <Edge fromID=\""
                    + inode.getId()
                    + "\" toID=\""
                    + inode.getFirstId()
                    + "\" color=\"0x4682b4\" edgeLabel=\"DUAL\"/>\r\n"));
          } else {
            rs +=
                (("    <Edge fromID=\""
                    + inode.getId()
                    + "\" toID=\""
                    + inode.getFirstId()
                    + "\" color=\"0x4682b4\"/>\r\n"));
          }
          isDual = false;
        }
        if (inode.getSecondId() != -1) {
          for (int i = 0; i < A.size(); i++) {
            if (A.get(i) == inode.getSecondId() && B.get(i) == inode.getId()) {
              isDual = true;
            }
          }
          if (isDual) {
            rs +=
                (("    <Edge fromID=\""
                    + inode.getId()
                    + "\" toID=\""
                    + inode.getSecondId()
                    + "\" color=\"0x4682b4\" edgeLabel=\"DUAL\"/>\r\n"));
          } else {
            rs +=
                (("    <Edge fromID=\""
                    + inode.getId()
                    + "\" toID=\""
                    + inode.getSecondId()
                    + "\" color=\"0x4682b4\"/>\r\n"));
          }
          isDual = false;
        }
      }

      // while (iitGn.hasNext())
      // {
      // GraphNode inode = iitGn.next();// changed by me```
      //
      // if (Flag)
      // {
      // Flag = false;
      // rs += (("  <Node id=\"" + inode.getId() + "\" name=\"" +
      // inode.getBeginLine() + " - "
      // + inode.getEndline() +
      // "\" nodeSize=\"10\" nodeColor=\"0x4682b4\"/>\r\n"));
      // if (inode.getFirstId() != -1)
      // {
      // rs += (("    <Edge fromID=\"" + inode.getId() + "\" toID=\"" +
      // inode.getFirstId() +
      // "\" color=\"0x4682b4\" edgeClass=\"rain\" flow=\"400\" />\r\n"));
      // }
      // if (inode.getSecondId() != -1)
      // {
      // rs += (("    <Edge fromID=\"" + inode.getId() + "\" toID=\"" +
      // inode.getSecondId() +
      // "\"  color=\"0xb682b4\" edgeClass=\"rain\" flow=\"1\" />\r\n"));
      // }
      // }
      // // preNodeLineNum = inode.getLineNum();
      // //
      // rs+=(("  <Node id=\""+node.getId()+"\" name=\""+preNodeLineNum+"-"+inode.getLineNum()+"\"
      // nodeSize=\"30\" nodeColor=\"0x4682b4\"/>\r\n"));
      // else
      // {
      // rs += (("  <Node id=\"" + inode.getId() + "\" name=\"" +
      // inode.getBeginLine() + " - "
      // + inode.getEndline() +
      // "\" nodeSize=\"10\" nodeColor=\"0x4682b4\"/>\r\n"));
      // // preNodeLineNum = inode.getLineNum();
      // if (inode.getFirstId() != -1)
      // {
      // rs += (("    <Edge fromID=\"" + inode.getId() + "\" toID=\"" +
      // inode.getFirstId() +
      // "\"   color=\"0x4682b4\" edgeClass=\"rain\" flow=\"400\" />\r\n"));
      // }
      // if (inode.getSecondId() != -1)
      // {
      // rs += (("    <Edge fromID=\"" + inode.getId() + "\" toID=\"" +
      // inode.getSecondId() +
      // "\"  color=\"0xb682b4\" edgeClass=\"rain\" flow=\"1\"  />\r\n"));
      // }
      // }
      // }

      rs += "</FlowGraph>\r\n";

      rs += "$$$$$\n";

      // To generate the Basic Path Set
      rs += "<basicPathSet>\r\n";
      String[] temp = null;
      ifg = (FlowGraph) data.get(JobConst.CONTROL_FLOW_GRAPH);
      GraphPathArray targetPaths = ifg.generatPaths();
      Iterator<GraphPath> itGp = targetPaths.iterator();
      while (itGp.hasNext()) {
        GraphPath path = itGp.next();
        rs += (("  <basicPath>\r\n"));
        temp = path.toString().substring(0, path.toString().indexOf(" {")).split(" ");
        for (int i = 0; i < temp.length; ++i) rs += (("    <node id = \"" + temp[i] + "\"/>\r\n"));
        rs += (("  </basicPath>\r\n"));
      }
      rs += "</basicPathSet>\r\n";
      return rs;

    } else {
      return data.getResult().getReport();
    }
  }