From 936685b47e4944b2edee3e9c9c46232d0d59cef2 Mon Sep 17 00:00:00 2001 From: "isaacklugman@gmail.com" <ik1g19@soton.ac.uk> Date: Tue, 4 May 2021 21:15:22 +0100 Subject: [PATCH] add remove operation --- ClientAndLoggers/ClientMain.class | Bin 2868 -> 2734 bytes ClientAndLoggers/ClientMain.java | 16 +++---- Dstores/dstore/test.txt | 1 - Dstores/dstore2/test.txt | 1 - Dstores/dstore3/test.txt | 1 - src/ftp/Controller.java | 74 +++++++++++++++++++++++++++--- src/ftp/DStore.java | 30 ++++++++++-- src/ftp/DStoreFile.java | 25 ++++++---- 8 files changed, 118 insertions(+), 30 deletions(-) delete mode 100644 Dstores/dstore/test.txt delete mode 100644 Dstores/dstore2/test.txt delete mode 100644 Dstores/dstore3/test.txt diff --git a/ClientAndLoggers/ClientMain.class b/ClientAndLoggers/ClientMain.class index 3c43107e0f47157f8c5d846fd50489c8ba1eb6a4..917b8b2fb573e063c4c48874232175fd7f090f8c 100644 GIT binary patch delta 1274 zcmdlYwoa7m)W2Q(7#J9A7^ZLJYGdT(Vo+z$U}w<eVbEgGo_wCsNL-hZfz3H5Gc~V- zlR=-sfStjRhrx)!c(MeOYrPJGDGviHgBc@(q=u)bk57JjdTNmhh|0`M52-9jwbl&d zV$fl*;9;<2U}I!pPtMQFOHD3eXRu~u5Y9?0OVrQI*Z1^ytw>HSD9Oyv<6^L4u;pQ} z11aV&D9X$$2`))Y&JHO`Oil$E<iNw=2$JJU$t+IJw}u+#3^ObzF)v*o$uK7dTMh;{ zMh1?O)Z!Aol8O?L86G?go(x`-#hI1)g*&(y{22V%83K410vUoPdorsqhD^?5R^|?4 z2xn)A;9-blh?+cy*_b<qA(ovXj)x(hAz|_@W-AdLh9n+_WCmeI2DYNq-2Ads4u;gp zJ}e4CF%0P-Rl*>fGI<!X7_ukVu_$Zg@-Qef<S{acYIth;fISX&Yj8<XW?s6r5CaoK z0Z2vR<dZB-jFpppSS?s;7#V~o=d+43)=i$r8pzko#n8gg%FfURQrABDFY6J;&dG<^ zY=pZR8F>7&brcvC(lT>Wi>){qdM69AOEONFtj#XTGMSM<b+RU#Dl<F7)X4?xy29!V zObj5v!obMD%D~3J$WSzS1G|`FF#`jb$H2hCz{ya;P|Co>P{hE%P{+W`z{0@5U^n?W zyScEmjP4EwwT%o63``6l9dZopll?fv>jfBW8H5<h7#JA17#ROCm@_i6Gw?E$Gk{EE zWN>2O1f?gCT?`D2a~N0|I2afhrZf8OX3&Y0lHSCix1GVnPj?%G`EmwXD;7zXZ45TL z#~1{4w=vi+XW+78m1Nz<;IdJ7Hv?~^kn45^!EFrgAaRIF5eD!29Spw98F;N&HZg>P zbVut7xo%@fM5xg{#-I%`O$B1U%W?)OD>h_H*d^JwF}O&w?cd12#lX)X%pk^K#h}Qb z%AmpE#9+W+%izFZ#o*51%Mid2%n-$pz>v&f#gNBP#8ArMRL{V~Aj?qCz`$U@kOih& z89Ety7@QdD85+TSNO0LP@G~$lh%qoRNHOp;$S}w<m@+6bm@()x$S@c%C@{D)C^1BV z%`j!iV=!Z=XE0@GWiVry%wWzijllvO!0`<H{~5#>SinKd&Y;7<$j(r2^`AkIffXji z&R_)+bz=L)07~6fY#!_k!JHoK3|4Gj><mtx><ktE8F(1jVd@ze*cmDyI({%PF>o?u zF;qdLe=Y+v13Lo)gZCzeP@$A<3~5^17&3e|F@$RG+r^N>z_5)WjoDUvatW7seW*+e z6Qd;CE{1%ta0@Hr^8fd>H^9@15;)ea88{eh7<d`%7^E2N8Dtn77>pPk8Jrm$7(5xA z!5)-gVEWIX%D~3Xpu^5k%?QGb3=BUQl)>qVje&{5ilLT)85*n&42=v73?dB7S`1AL kj0_!MvI|W1F!V7nFn}_bK0`mlL<dQRNeojMrZGqY01ig)6951J delta 1430 zcmZ1{x<!oZ)W2Q(7#J9A80Ku`YGbtLU{Ggd;3&zDFD}V1O66eCWMq(o@f6bXb5c@^ z6jJh2ixu+nOB7NoGK)*N7_=F5*co(r81xwQC(mUx5;tUIU~|sNOwB9dWH4qhVP`Pq zVK8GbpZtu`wcdcil81qn!HSVVQp3~J$0t8MJ+(*$L}lishg24%T5E=JF&Hq|@G#gi zurV^QC+Fwor6!lKGuSgS2xldhCF*D9>wEgURwSnulw{`TaWU92IPx$!ffVx>6lLa> z1eYWxXNMFeCZ~c7a^Ycc1<7%xWELmqTSE<VhZ&ZWn3t}PWSAR+BL{;QC<s!EOY}-A zN<e1#@G$r?_)UJwq|C1_z{L>65X{aH!ov{C5H?wyS%ooTvJJB`cN9Z3J3|Z)Lo7qw z<Sb@m?gWNJc7`M#hGd46$t#$xEDRXZco@<dG8h?Ha`F>X7#Wl`e8BzzJ0ZBFC^IkJ z8X}UJukV(b0}2WbhOEiom=%N)7;-=+34>gd$HS1%P%v48MVYOLhe4U4cyb_%3|lFP zSvI+trHQd_@;4R>#>UC|tP+gPlRa1i`8v25IvKjy8M;A=dL}PtJ;K;GIfu<gcmg8> zkAJp~0;57&W=?9c6$itl$-CJkrKd77uz?~awTO{{8^nOd4m-n)$?w^;7-vnEV%PQ3 zW?*6f0Tu>E237_(21bT*1_lOM21W)(1_lOJt?dkq8yOfF7#S)U7{JmD3@i+s43!L3 z3`}69YZ;gsSQ!`?q9;#eH?QB#z#A!~ww*!HibaxT8-vI!2HxEa(vd<M+Zj~%OUvl) zV9){?#{@P`i-C)Qfq{d8oq>~qkAa&(f`NxYo`ILaoPnRgi9vwDi$Rbfgh7NMib0H_ znt_2qfPv{BgE=E3I|J_@1{rn+UWOV5kaHLr+!#1PNtdA>?0m+#46F<s3=9l282xrL z7(_}*Z(=ao&S2rEyN$tmIfE?3Z4SD}7zA~<F*q-0;Id+sWZlN#u~8T7e$VX;g4-Cp zLE>OvIEXO#?_daA&cJKMvWX!Q<gs{NAy1uc45<h;y2lu_b?d>#sX#37Sk542#fEGP zyCnNI1`kQL{Tms$82A~48N?Xu7!(;)88jH&7z`L}85|hw7~C0r83Gu>8KM{x8B!SR z81fm48Oj*k7?>Dj85$TE7z`M)!E_r#7eg<D8$$y_6POPQ(|QI5I|hCR1_mhxCI&eM zeg*{wSq4i6MFuMdeFg;v0|pfacLp_vC<c9oYz9k)d<H9q1_n!pHU=w(DGb&O(-~~Q z0Ugi4|DQpOfdw4Y><k7BjO+|{{}}`sSYaaU40a$vH@0644F2p4c5EK(4B?!f;UK0L zJA<1iJ45Y%1|9}>m<9$0c7|GrmLCjE44e%44E4|yG?#&yft`VY!Fv-!q)_HIhHR~E z47om=7$UXz?P4foVA#fxJ^3}KRDGmO3lpOx+b)I@uviN#<MRLawKp&@Fo3+yz@P+< zb9)931_uUS1}6q724@Bt1{Ve+23H1W1{VfT26wRUBp8_fGpI7Ku`?L3Gc+)QFe3xQ z4+dp$a$;j(Vz6UqVqj)y0h`>)(8j>PAi}_`#n8^c$j}QW`@!TyhRF;J3_=V{48{yo R7^XQ$GE8Tf$uOHi5&*n&7%>0< diff --git a/ClientAndLoggers/ClientMain.java b/ClientAndLoggers/ClientMain.java index 5b761bc..9e99b56 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 abd91bd..0000000 --- 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 abd91bd..0000000 --- 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 abd91bd..0000000 --- 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 ce797fc..30c4ecf 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 8346c8d..d252896 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 ae22dcf..7539337 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; } + } -- GitLab