diff --git a/src/main/java/vslab1/src/FileReaderWriter/FileReaderWriter.java b/src/main/java/vslab1/src/FileReaderWriter/FileReaderWriter.java index c543a0e..9fa1a13 100644 --- a/src/main/java/vslab1/src/FileReaderWriter/FileReaderWriter.java +++ b/src/main/java/vslab1/src/FileReaderWriter/FileReaderWriter.java @@ -33,15 +33,14 @@ public class FileReaderWriter { * Creates directories at given path and file where info about this and other peers is getting stored. * @param filesPath the path where to find or create the info files. */ - public static void createInfoFilesIfNotExisting(String filesPath) { + public static synchronized void createInfoFilesIfNotExisting(String filesPath) { Path path = Paths.get(filesPath); boolean validPath = true; if (!Files.exists(path)) { try { Files.createDirectories(path); - System.out.println("Directories created successfully."); } catch (Exception e) { - System.out.println("Failed to create directories: " + e.getMessage()); + System.err.println("Failed to create directories: " + e.getMessage()); validPath = false; } } @@ -56,22 +55,20 @@ public class FileReaderWriter { if (!Files.exists(peerFilePath)) { try { Files.createFile(peerFilePath); - System.out.println("Created " + Constants.PEERCONFIGFILENAME + " file."); writeInitialInfoToConfigFile(); } catch (IOException e) { - System.out.println("Failed to create " + Constants.PEERCONFIGFILENAME + " file."); + System.err.println("Failed to create " + Constants.PEERCONFIGFILENAME + " file."); e.printStackTrace(); } } } } - private static void writeInitialInfoToConfigFile() { + private static synchronized void writeInitialInfoToConfigFile() { try { FileWriter writer = new FileWriter(Constants.PEERCONFIGFILEPATH + File.separator + Constants.PEERCONFIGFILENAME); writer.write(Constants.PEERCONFIGFILEINITIALCONTENT); writer.close(); - System.out.println("Initialized config file."); } catch (IOException e) { e.printStackTrace(); } @@ -107,35 +104,39 @@ public class FileReaderWriter { } } - public static List getPeers() { + public static synchronized List getPeers() { try { List peersList = new LinkedList(); FileReader reader = new FileReader(Constants.PEERCONFIGFILEPATH + File.separator + Constants.PEERCONFIGFILENAME); JSONObject peerFileAsJSONObject = new JSONObject(new JSONTokener(reader)); reader.close(); JSONArray peersJSONArray = peerFileAsJSONObject.getJSONArray("peers"); - - peersJSONArray.forEach((peer) -> { - JSONObject peerJSONObject = (JSONObject)peer; - String peerIPAddress = peerJSONObject.getString("ipAddress"); - int peerPort = peerJSONObject.getInt("port"); - Map peerFilesList = new HashMap(); - JSONArray peerFiles = peerJSONObject.getJSONArray("files"); - peerFiles.forEach((file) -> { - JSONObject fileInfo = (JSONObject)file; - String fileName = fileInfo.getString("fileName"); - String filePath = fileInfo.getString("filePath"); - peerFilesList.put(fileName, filePath); + if (peersJSONArray != null) { + peersJSONArray.forEach((peer) -> { + JSONObject peerJSONObject = (JSONObject)peer; + String peerIPAddress = peerJSONObject.getString("ipAddress"); + int peerPort = peerJSONObject.getInt("port"); + Map peerFilesList = new HashMap(); + JSONArray peerFiles = peerJSONObject.getJSONArray("files"); + if (peerFiles != null) { + peerFiles.forEach((file) -> { + JSONObject fileInfo = (JSONObject)file; + String fileName = fileInfo.getString("fileName"); + String filePath = fileInfo.getString("filePath"); + peerFilesList.put(fileName, filePath); + }); + } + String onlineState = peerJSONObject.getString("onlineStatus"); + if (onlineState.equals("online")) { + peersList.add(new Peer(peerIPAddress, peerPort, peerFilesList, EOnlineState.Online)); + } else if (onlineState.equals("offline")) { + peersList.add(new Peer(peerIPAddress, peerPort, peerFilesList, EOnlineState.Offline)); + } else { + peersList.add(new Peer(peerIPAddress, peerPort, peerFilesList, EOnlineState.Unknown)); + } }); - String onlineState = peerJSONObject.getString("onlineState"); - if (onlineState.equals("online")) { - peersList.add(new Peer(peerIPAddress, peerPort, peerFilesList, EOnlineState.Online)); - } else if (onlineState.equals("offline")) { - peersList.add(new Peer(peerIPAddress, peerPort, peerFilesList, EOnlineState.Offline)); - } else { - peersList.add(new Peer(peerIPAddress, peerPort, peerFilesList, EOnlineState.Unknown)); - } - }); + } + return peersList; } catch (FileNotFoundException e) { e.printStackTrace(); @@ -234,7 +235,9 @@ public class FileReaderWriter { getThisPeer(EUpdateFlag.Update); return; } else { - peersJSONArray.forEach((peer) -> { + boolean containsPeer = false; + + for (Object peer : peersJSONArray) { JSONObject peerObject = (JSONObject)peer; if (peerObject.getString("ipAddress").equals(peerToUpdate.ipAddress()) && (peerObject.getInt("port") == peerToUpdate.port())) { if (peerToUpdate.onlineState() == EOnlineState.Online) { @@ -266,8 +269,17 @@ public class FileReaderWriter { } }); } + containsPeer = true; } - }); + } + + if (containsPeer == false) { + JSONObject peerObject = new JSONObject( + "{\"ipAddress\":\"" + peerToUpdate.ipAddress() + + "\",\"port\":" + peerToUpdate.port() + + ",\"files\":[],\"onlineStatus\":\"offline\"}"); + peersJSONArray.put(peerObject); + } peerFileAsJSONObject.put("peers", peersJSONArray); FileWriter writer = new FileWriter(Constants.PEERCONFIGFILEPATH + File.separator + Constants.PEERCONFIGFILENAME); @@ -303,7 +315,7 @@ public class FileReaderWriter { BufferedReader reader = new BufferedReader(new FileReader(new File(filePath))); String line; while ((line = reader.readLine()) != null) { - stringBuilder.append(line).append("\n"); + stringBuilder.append(line + " "); } reader.close(); return stringBuilder.toString();