public void writeToFileSystem(RFile rfile) {
   try {
     BufferedWriter bw =
         new BufferedWriter(new FileWriter("FileStore/" + rfile.getMeta().getFilename()));
     bw.write(rfile.getContent());
     bw.flush();
     bw.close();
   } catch (IOException e) {
     System.err.println(e.getMessage());
   }
 }
Example #2
0
 // ============================================================
 // <T>将指定内容存储到一个指定的文件中。</T>
 // <P>如果指定文件的目录不存在,则自动创建目录。</P>
 //
 // @param fileName 文件名称
 // ============================================================
 public void saveToFile(String fileName) {
   // 建立目录
   fileName = RFile.formatFileName(fileName);
   int find = fileName.lastIndexOf(File.separator);
   if (-1 != find) {
     String path = fileName.substring(0, find);
     File directory = new File(path);
     if (!directory.isDirectory()) {
       directory.mkdirs();
     }
   }
   // 存储文件
   BufferedOutputStream outputStream = null;
   try {
     File file = new File(fileName);
     outputStream = new BufferedOutputStream(new FileOutputStream(file));
     if (_memory != null) {
       outputStream.write(_memory, 0, _length);
     }
   } catch (Exception e) {
     throw new FFatalError(e, "Save file failure. (file_name={1})", fileName);
   } finally {
     if (outputStream != null) {
       try {
         outputStream.close();
       } catch (Exception e) {
         throw new FFatalError(e, "Close file failure. (file_name={0})", fileName);
       }
     }
   }
 }
 @Override
 public RFile readFile(String filename) throws SystemException, TException {
   if (fileStoreMap.get(filename) != null) {
     String content = fileStoreMap.get(filename);
     RFileMetadata rFileMetadata = new RFileMetadata();
     rFileMetadata.setFilename(filename);
     RFile rFile = new RFile();
     rFile.setMeta(rFileMetadata);
     rFile.setContent(content);
     return rFile;
   } else {
     SystemException systemException = new SystemException();
     systemException.setMessage("File does not exist");
     throw systemException;
   }
 }
  @Override
  public TwoPhaseCommitMessage writeFile(RFile rFile, TwoPhaseCommitMessage tpcm)
      throws SystemException, TException {

    if (tpcm.getMessage().equals("vote_request")) {

      if (knowConcurrencyStatus(rFile.getMeta().getFilename())) {
        tpcm.setMessage("vote_abort");
        createLogEntry(tpcm, rFile, "write");
        return tpcm;
      } else {
        createLogEntry(tpcm, rFile, "write");
      }

      System.out.println("****writeFile TEST CASES****");
      System.out.println("1. reply vote_commit for " + rFile.getMeta().getFilename());
      System.out.println(
          "2. reply vote_commit for " + rFile.getMeta().getFilename() + " and crash");
      System.out.println("3. reply vote_abort for " + rFile.getMeta().getFilename());
      System.out.println("Enter choice: ");
      Scanner sc = new Scanner(System.in);
      int choice = sc.nextInt();
      switch (choice) {
        case 1:
          tpcm.setMessage("vote_commit");
          updateLogEntry(tpcm);
          return tpcm;

        case 2:
          tpcm.setMessage("vote_commit");
          updateLogEntry(tpcm);
          tpcm.setMessage("vote_commit_and_crash");
          Runnable crash =
              new Runnable() {
                @Override
                public void run() {
                  crash();
                }
              };
          new Thread(crash).start();
          return tpcm;

        case 3:
          tpcm.setMessage("vote_abort");
          updateLogEntry(tpcm);
          return tpcm;

        default:
          System.out.println("Wrong choice! Transaction being aborted!");
          tpcm.setMessage("vote_abort");
          break;
      }
    } else if (tpcm.getMessage().equals("global_commit")) {
      Connection con = null;
      Statement statement = null;
      String filename = null;
      String content = null;
      try {

        Class.forName("org.sqlite.JDBC");
        con = DriverManager.getConnection("jdbc:sqlite:twoPC.db");

        statement = con.createStatement();
        ResultSet rs =
            statement.executeQuery("SELECT * FROM LOG WHERE TID = " + tpcm.getTid() + ";");
        filename = rs.getString("FILENAME");
        content = rs.getString("CONTENT");
        rs.close();
        statement.close();
        con.close();
      } catch (Exception e) {
        e.printStackTrace();
        System.err.println(e.getClass().getName() + ": " + e.getMessage());
      }
      fileStoreMap.put(filename, content);
      RFile rFile2 = new RFile();
      rFile2.setContent(content);
      RFileMetadata rFileMetadata = new RFileMetadata();
      rFileMetadata.setFilename(filename);
      rFile2.setMeta(rFileMetadata);
      writeToFileSystem(rFile2);
      updateLogEntry(tpcm);
    } else if (tpcm.getMessage().equals("global_abort")) {
      updateLogEntry(tpcm);
    }

    return tpcm;
  }