diff --git a/ClientAndLoggers/ClientMain.class b/ClientAndLoggers/ClientMain.class index 3c43107e0f47157f8c5d846fd50489c8ba1eb6a4..917b8b2fb573e063c4c48874232175fd7f090f8c 100644 Binary files a/ClientAndLoggers/ClientMain.class and b/ClientAndLoggers/ClientMain.class differ diff --git a/ClientAndLoggers/ClientMain.java b/ClientAndLoggers/ClientMain.java index 5b761bcd6b095e50e6848bdf4bcb4fa58be3b8cb..9e99b56079779c323d1f7e253befcf2304020f1a 100644 --- a/ClientAndLoggers/ClientMain.java +++ b/ClientAndLoggers/ClientMain.java @@ -13,7 +13,7 @@ public class ClientMain { if (!downloadFolder.mkdir()) throw new RuntimeException("Cannot create download folder (folder absolute path: " + downloadFolder.getAbsolutePath() + ")"); - testClient(cport, timeout, downloadFolder, uploadFolder); + testClient(cport, timeout, downloadFolder); } @@ -31,7 +31,7 @@ public class ClientMain { try { client.store(new File("test.txt")); } catch(IOException e) { e.printStackTrace(); } - try {Thread.sleep(10000);} catch (InterruptedException e) {System.out.println(e);} + try {Thread.sleep(5000);} catch (InterruptedException e) {System.out.println(e);} // try { client.store(new File("Clipboard01.pdf")); } catch(IOException e) { e.printStackTrace(); } // @@ -40,14 +40,14 @@ public class ClientMain { // String list[] = null; // try { list = list(client); } catch(IOException e) { e.printStackTrace(); } // - try { client.load("test.txt", downloadFolder); } catch(IOException e) { e.printStackTrace(); } +// try { client.load("test.txt", downloadFolder); } catch(IOException e) { e.printStackTrace(); } - /*if (list != null) - for (String filename : list) - try { client.remove(filename); } catch(IOException e) { e.printStackTrace(); } - try { client.remove(list[0]); } catch(IOException e) { e.printStackTrace(); } +// if (list != null) +// for (String filename : list) +// try { client.remove(filename); } catch(IOException e) { e.printStackTrace(); } + try { client.remove("test.txt"); } catch(IOException e) { e.printStackTrace(); } - try { list(client); } catch(IOException e) { e.printStackTrace(); }*/ +// try { list(client); } catch(IOException e) { e.printStackTrace(); } } finally { if (client != null) diff --git a/Dstores/dstore/test.txt b/Dstores/dstore/test.txt deleted file mode 100644 index abd91bd4652ea1bfd4969a0a8585cc2f8acb645f..0000000000000000000000000000000000000000 --- a/Dstores/dstore/test.txt +++ /dev/null @@ -1 +0,0 @@ -a test file \ No newline at end of file diff --git a/Dstores/dstore2/test.txt b/Dstores/dstore2/test.txt deleted file mode 100644 index abd91bd4652ea1bfd4969a0a8585cc2f8acb645f..0000000000000000000000000000000000000000 --- a/Dstores/dstore2/test.txt +++ /dev/null @@ -1 +0,0 @@ -a test file \ No newline at end of file diff --git a/Dstores/dstore3/test.txt b/Dstores/dstore3/test.txt deleted file mode 100644 index abd91bd4652ea1bfd4969a0a8585cc2f8acb645f..0000000000000000000000000000000000000000 --- a/Dstores/dstore3/test.txt +++ /dev/null @@ -1 +0,0 @@ -a test file \ No newline at end of file diff --git a/src/ftp/Controller.java b/src/ftp/Controller.java index ce797fce420443bb7fa8448fc2957d287a886fc0..30c4ecfc3c1472b6742efe43878c75487dc5f3cd 100644 --- a/src/ftp/Controller.java +++ b/src/ftp/Controller.java @@ -60,11 +60,13 @@ public class Controller extends Server { String command = args[0]; if (command.equals("JOIN")) { + Socket dStoreSock = client; + Integer port = Integer.parseInt(args[1]); - send("LIST", client); + send("LIST", dStoreSock); - String files = readSocket(client); + String files = readSocket(dStoreSock); DStoreConnection dStore; @@ -89,7 +91,7 @@ public class Controller extends Server { nextID++; - send("ACK", client); + send("JOINED", dStoreSock); } else if (command.equals("STORE")) { @@ -114,16 +116,15 @@ public class Controller extends Server { collect(Collectors.joining(" ")); - file.setStoreAcksQuota(r); + file.setAcksQuota(r); send("STORE_TO " + ports, client); Boolean fileStored = false; while (!fileStored) { - if (file.ackCheck()) { + if (file.storeAckCheck()) { file.setStoreInProgress(false); - file.setStoreComplete(true); fileStored = true; threadIDOutput("Store of file " + filename + " complete"); @@ -148,6 +149,67 @@ public class Controller extends Server { send("LOAD_FROM " + dStorePort + " " + file.getFilesize(), client); } + + else if (command.equals("REMOVE")) { + String filename = args[1]; + DStoreFile file = fileIndex.get(filename); + + file.setRemoveInProgress(true); + + + DStoreIndex dStores = file.getDStores(); + + dStores.entrySet().stream(). + forEach(x -> { + Socket dStore = connectToDStore(x.getValue()); + + if (dStore != null) { + send("REMOVE " + filename, dStore); + } else threadIDErr("Unable to connect to DataStore"); + + closeConnection("DataStore", dStore); + }); + + + Boolean fileRemoved = false; + while (!fileRemoved) { + if (file.removeAckCheck()) { + file.setRemoveInProgress(false); + fileRemoved = true; + + threadIDOutput("Remove of file " + filename + " complete"); + + send("STORE_COMPLETE", client); + } + } + } + + else if (command.equals("REMOVE_ACK")) { + String filename = args[1]; + DStoreFile file = fileIndex.get(filename); + + file.removeAck(); + } + } + + + + public Socket connectToDStore(DStoreConnection dStoreConnection) { + Socket dStore = null; + + Boolean joined = false; + + for (int i = 0; (i < 10) && !joined; i++) { + try { dStore = new Socket("localhost", dStoreConnection.getPort()); joined = true; } + catch (IOException e) { + threadIDErr(e.getMessage()); + + try {threadIDErr("Retrying Connection..."); Thread.sleep(1000);} + catch (InterruptedException exc) {threadIDErr(exc.getMessage());} + } + } + + return dStore; } } \ No newline at end of file diff --git a/src/ftp/DStore.java b/src/ftp/DStore.java index 8346c8d607433846a0829a35c59d4641f6db84f9..d252896dec2f5c453c4fdba11875cfb41b119728 100644 --- a/src/ftp/DStore.java +++ b/src/ftp/DStore.java @@ -84,6 +84,8 @@ public class DStore extends Server { String command = args[0]; if (command.equals("LIST")) { + Socket controller = client; + File folder = new File(file_folder); String fileMessage = "empty"; @@ -99,14 +101,14 @@ public class DStore extends Server { } - send(fileMessage, client); + send(fileMessage, controller); - String response = readSocket(client); - if (response.equals("ACK")) threadIDOutput("Successfully joined Controller"); + String response = readSocket(controller); + if (response.equals("JOINED")) threadIDOutput("Successfully joined Controller"); - closeConnection("Client", client); + closeConnection("Client", controller); } else if (command.equals("STORE")) { @@ -135,13 +137,23 @@ public class DStore extends Server { else if (command.equals("LOAD_DATA")) { String filename = args[1]; - try { sendFile(client, file_folder + "\\" + filename); } catch (IOException e) { threadIDErr(e.getMessage()); } } + + else if (command.equals("REMOVE")) { + Socket controller = client; + + String filename = args[1]; + + if (deleteFile(file_folder + "\\" + filename)) threadIDOutput("Deleted file " + filename); + else threadIDErr("Failed to delete file " + filename); + + send("REMOVE_ACK", controller); + } } @@ -193,4 +205,12 @@ public class DStore extends Server { //out.close(); } + + + public Boolean deleteFile(String filepath) { + File file = new File(filepath); + + return file.delete(); + } + } diff --git a/src/ftp/DStoreFile.java b/src/ftp/DStoreFile.java index ae22dcf4d5ef50da6db5d33d75bdb270013fa6f4..7539337c844990ece0b530626834a657aa1d2b54 100644 --- a/src/ftp/DStoreFile.java +++ b/src/ftp/DStoreFile.java @@ -6,13 +6,14 @@ public class DStoreFile { private Long filesize; private boolean storeInProgress; - private boolean storeComplete; private boolean removeInProgress; - private boolean removeComplete; private int storeAcksQuota; private int storeAcks = 0; + private int removeAcksQuota; + private int removeAcks = 0; + private DStoreIndex dStoreIndex; @@ -27,16 +28,12 @@ public class DStoreFile { public boolean isStoreInProgress() {return storeInProgress;} - public boolean isStoreComplete() {return storeComplete;} public boolean isRemoveInProgress() {return removeInProgress;} - public boolean isRemoveComplete() {return removeComplete;} public void setStoreInProgress(Boolean store) { storeInProgress = store; } - public void setStoreComplete(Boolean complete) { storeComplete = complete; } public void setRemoveInProgress(Boolean remove) { removeInProgress = remove; } - public void setRemoveComplete(Boolean complete) { removeComplete = complete; } @@ -45,17 +42,25 @@ public class DStoreFile { + public void setAcksQuota(int quota) { storeAcksQuota = quota; removeAcksQuota = quota; } + public void setStoreAcksQuota(int quota) { storeAcksQuota = quota; } public int getStoreAcks() { return storeAcks; } + public void setRemoveAcksQuota(int quota) { removeAcksQuota = quota; } + public int getStoreAcksQuota() { return storeAcksQuota; } + + + public int storeAck() { return storeAcks++; } + public Boolean storeAckCheck() { return storeAcks == storeAcksQuota; } - public Boolean storeAckCheck() { return storeAcks++ == storeAcksQuota; } - public Boolean ackCheck() { return storeAcks == storeAcksQuota; } + public int removeAck() { return removeAcks++; } + public Boolean removeAckCheck() { return removeAcks == removeAcksQuota; } @@ -67,4 +72,8 @@ public class DStoreFile { return dStoreIndex.getFirstAvailable(); } + + + public DStoreIndex getDStores() { return dStoreIndex; } + }