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()); } }
// ============================================================ // <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; }