From b48041242e02bb54f89f2020c66de1ba50f6ad86 Mon Sep 17 00:00:00 2001 From: Fan-Wu Yang Date: Fri, 2 Jun 2017 02:05:45 +1200 Subject: [PATCH] Trips are now in a hash map --- src/main/java/model/DataManager.java | 38 ++++++++++++++---- .../java/utils/DataManagerSerialiser.java | 20 +++++---- target/classes/model/DataManager.class | Bin 10178 -> 11578 bytes target/classes/serialisation/drivers.json | 2 +- .../classes/serialisation/notifications.json | 2 +- target/classes/serialisation/rides.json | 2 +- target/classes/serialisation/routes.json | 2 +- target/classes/serialisation/stops.json | 2 +- target/classes/serialisation/trips.json | 2 +- .../utils/DataManagerSerialiser$1.class | Bin 692 -> 692 bytes .../utils/DataManagerSerialiser$2.class | Bin 692 -> 692 bytes .../utils/DataManagerSerialiser$3.class | Bin 693 -> 693 bytes .../utils/DataManagerSerialiser$4.class | Bin 653 -> 692 bytes .../utils/DataManagerSerialiser$5.class | Bin 659 -> 659 bytes .../utils/DataManagerSerialiser$6.class | Bin 669 -> 669 bytes .../utils/DataManagerSerialiser$7.class | Bin 671 -> 671 bytes .../utils/DataManagerSerialiser$8.class | Bin 693 -> 693 bytes .../classes/utils/DataManagerSerialiser.class | Bin 9536 -> 9934 bytes 18 files changed, 50 insertions(+), 20 deletions(-) diff --git a/src/main/java/model/DataManager.java b/src/main/java/model/DataManager.java index 469ff9f..e622385 100644 --- a/src/main/java/model/DataManager.java +++ b/src/main/java/model/DataManager.java @@ -17,17 +17,17 @@ public class DataManager { private Map> rides; private Map> stops; private Map> routes; - private ObservableList trips; + private Map> trips; private ObservableList sharedTrips; private Map users; private Map drivers;//seperated from users as they are two different types of accounts private Map> notifications; //indexed by user name - public DataManager(Map> rides, Map> stops, Map> routes, List trips, List sharedTrips, Map users, Map drivers, Map> notifications){ + public DataManager(Map> rides, Map> stops, Map> routes, Map> trips, List sharedTrips, Map users, Map drivers, Map> notifications){ this.rides = convertRideMapToObserver(rides); this.stops = convertStopMapToObserver(stops); this.routes = convertRouteMapToObserver(routes); - this.trips = FXCollections.observableArrayList(trips); + this.trips = convertTripMapToObserver(trips); this.sharedTrips = FXCollections.observableArrayList(sharedTrips); this.users = users; this.drivers = drivers; @@ -35,7 +35,7 @@ public class DataManager { } public DataManager(){ - this(new HashMap<>(), new HashMap<>(), new HashMap<>(), FXCollections.observableArrayList(), FXCollections.observableArrayList(), new HashMap(), new HashMap(), new HashMap>()); + this(new HashMap<>(), new HashMap<>(), new HashMap<>(), new HashMap<>(), FXCollections.observableArrayList(), new HashMap(), new HashMap(), new HashMap>()); } //////////////////////////////////////// @@ -109,10 +109,34 @@ public class DataManager { return convertRouteMapToList(routes); } + ////////////////////////////////// + //Route + ////////////////////////////////// + private Map> convertTripMapToObserver(Map> trips){ + HashMap> ob = new HashMap<>(); + for (String key: trips.keySet()){ + ob.put(key, FXCollections.observableArrayList(trips.get(key))); + } + return ob; + } + + private Map> convertTripMapToList(Map> trips){ + HashMap> ob = new HashMap<>(); + for (String key: trips.keySet()){ + ob.put(key, new ArrayList<>(trips.get(key))); + } + return ob; + } + + public Map> tripsMapSerialised(){ + return convertTripMapToList(trips); + } + public void newLogged(){ rides.putIfAbsent(Session.session.getUser().getID(), FXCollections.observableArrayList()); stops.putIfAbsent(Session.session.getUser().getID(), FXCollections.observableArrayList()); routes.putIfAbsent(Session.session.getUser().getID(), FXCollections.observableArrayList()); + trips.putIfAbsent(Session.session.getUser().getID(), FXCollections.observableArrayList()); notifications.putIfAbsent(Session.session.getUser().getID(), FXCollections.observableArrayList()); } ////////////////////////////// @@ -163,16 +187,16 @@ public class DataManager { } public ObservableList getTrips() { - return trips; + return trips.get(Session.session.getUser().getID()); } public boolean addTrip(Trip trip){ - for (Trip t: trips){ + for (Trip t: trips.get(Session.session.getUser().getID())){ if (trip.equals(t)){ return false; } } - trips.add(trip); + trips.get(Session.session.getUser().getID()).add(trip); return true; } diff --git a/src/main/java/utils/DataManagerSerialiser.java b/src/main/java/utils/DataManagerSerialiser.java index 8818def..674827a 100644 --- a/src/main/java/utils/DataManagerSerialiser.java +++ b/src/main/java/utils/DataManagerSerialiser.java @@ -30,7 +30,7 @@ public class DataManagerSerialiser extends Serialiser { Map> rides = dataManager.rideMapSerialised(); Map> stops = dataManager.stopsMapSerialised(); Map> routes = dataManager.routesMapSerialised(); - ArrayList trips = new ArrayList<>(dataManager.getTrips()); + Map> trips = dataManager.tripsMapSerialised(); ArrayList sharedTrips = new ArrayList<>(dataManager.getSharedTrips()); boolean serialRidesSuccess = serialise(rides, "serialisation/rides.json"); boolean serialStopsSuccess = serialise(stops, "serialisation/stops.json"); @@ -74,9 +74,12 @@ public class DataManagerSerialiser extends Serialiser { * @param filepath File path to serialise it to. * @return */ - public boolean serialiseTrips(ArrayList trips, String filepath){ - for (Trip trip: trips){ - trip.serialise(); + public boolean serialiseTrips(Map> trips, String filepath){ + for (String key: trips.keySet()) { + List tripsList = trips.get(key); + for (Trip trip : tripsList) { + trip.serialise(); + } } try{ String path = getClass().getClassLoader().getResource(filepath).getPath(); @@ -188,11 +191,14 @@ public class DataManagerSerialiser extends Serialiser { } Reader reader4 = new InputStreamReader(getClass().getClassLoader().getResourceAsStream("serialisation/trips.json"), "UTF-8"); - ArrayList trips = gson.fromJson(reader4, new TypeToken>(){}.getType()); + HashMap> trips = gson.fromJson(reader4, new TypeToken>>(){}.getType()); reader4.close(); - for (Trip trip: trips){ - trip.deserialise(); + for (String key: trips.keySet()) { + List tripsList = trips.get(key); + for (Trip trip : tripsList) { + trip.deserialise(); + } } Reader reader5 = new InputStreamReader(getClass().getClassLoader().getResourceAsStream("serialisation/sharedtrips.json"), "UTF-8"); diff --git a/target/classes/model/DataManager.class b/target/classes/model/DataManager.class index a0e1a71d9c2c8bce70034f3d669c8e54eb7dcf3a..38b8cf8f5a5d392010166c838f2fdc0fd4b90405 100644 GIT binary patch literal 11578 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 DgOFHz literal 10178 zcmcIq33yc189jHhJTiGi9YYd2|?x)lg_r0Ymp8vi#Z{EDT36lsPJ20SatbCNt?f$!mk zFq0R<_&$ChLtZlQawVqXhm!nAl2@eq$6@>gKNatPCUs94_<0!h_=SOAhA|Vb8h9;? z2E1B9JFkaPjbF*AUrX{#1%89q4gA)??-a^X@lGqPFrxL`*w$D>PbS{ouq?KvNui=W z-j#@DdQz6c%KX*^cCkB_=xS)sq~eLLCS9}f!iJ7ycemA%i6;~3hUFX5R%&Z(L$}o$ zPiGdiZccVu-3==^VN)~zaPo8}xrLJ-O!MtD>6kB1C3`XgZq>nbUuVeS{ z?d${h%5t=lb~Qtl=}obe)hT7p(^$NPc6Xf3bPtz;78(xBguP0u*k6w{I#cnjdaUig zE0G`(*khOK5qfl0BAJPAjCaJeA{0(O@ccO)+N#lIuheYqlrM-U;+bZJOKS6N+ER4g z9H1!nz0Llz?1O=A*R574T|!yQ28t)Fww}!!tkg=8yu#?#WJj!fbu1N^vQt@_*%aqG zjBz%@(pV<8ES89Mk!^*Mp4qfB3f1{Wwr$B8TIA_VM}t0O}2Q*e&jZi zYW1z*5YPj?o9aBii*K}Xp0!Oh+;0+vP;!GPI47@DV(CrxsI~oT3n3ZoVNundiFKSOKx8}d z+%@ofg`0gy3e9H616hV_jCIc;ANE2P2J7!wKm9Vf!b!z5G=R^=10S5*MRGBqXQSjw z!F6i482P&6X{%FVRISf46}H4*SBUumXUnQw_OXb=qw<3-MmJOx&whW`T_Zk13V|TnxY_LseQXlRn+O1C4n=*JQVHl6OC!$kr9VpNrxo zcbq8PI`rTsp7I9P?2qj4NM>H&#`WXG7FtX3eDq&V?*zqyA0(?omYUbMF)88KFSe!c zAfUPH#fMkIx}Y`L)g^IrSeK>GZ(bRvIo1cn%dk49n0~%PkQ2o^JLN>=L?ddwFExF| zm58ojdg~R!DQk0bt0kj&3$BeyPZj4+)b?985X}wBA7|4k81zR99(QzG-I<&#tsAoL z=z7v7ROw|=m^&yA9PS+wq{OSZOM-5dX%#O{RapvjtvsLY?y^qKBW+N4-G`pwm4XMa zZqpO<+K>gSD@j2{_Z`k@b1yxTJ%2F3b0h7yno#aO8x_W7Dachei94em4m{NqL)tS^ zz{msA14h3m_2S7(G>1pm+j@~KAHm&rq4Pyi-3( z6^7@x(Qh(ncl1cLh^Zap@)ctwO|<1dbECyz$laeMat5HZAG+c8WKXKYYKhC6a-`?M zI7xx?{gFX#s7E@$(dZ@eiJgW z5C7-eA=kDjm5OZ>{4&=YCOXCG&64!sOapJ4cnkYYZa!tGkf};ksj14u#uTwJU@SCM zxiU;O%uXsy6;_poGEG&bhMQ^x4WiO{63ZrL6+T8m*j2L6q~<0fv}wa~f*t4)W#@G}~w^Fw+}cJok+JxxiB4~gb@y1yH}V5hz6qxX zag|%=_r$uXy{dGkr;}dUAGi8VnnS=FVI~$&q)(GC2d1+jbl}Ale%@~6C--3pNtlAd z@hpYV#2*GLw|oN23|Ve@Ab-MItkMQN9aCq^5KahV4Q{q^3+~!jT%* zS4L`#T`(gxY^r*Yc1qC3G=ebG@hHUvRAC}NzfZ!EI0CgyXJay%n1T~<6p>8Da`t?$ z?E_B787$Eoha<@eJ0V>syp-tNiC96~(z=AXGMy6^%5_fg8#*V*hoPPMh|_-_RuaE$ zca>{*wPQDmQ`z5MnKhcHwM@wqI*3Td9T#~7!`Jm zoQ}CTS_3z2qYm(p9AoSu6YizM0&KBkW?6k7Ml1Azv9@hyAI9=^gz3zTQ+NW^$Cu8i zDXp(5?ZaUqmJjC|?MBU-?fYMz@c^xq>e;Kc#Rft=hD$Md3HAj0Q1l3|3-owQZ zY8ShUvDjG*A?7TcP5*?@YK=tNgiyQf9M-L8+i-;5#8?9{0~_}7UuA4UJJ`z8jj7;! zmWw6$S_Z-w$;bBy#;@~W?8O8d_kZ~CdyLSLMYb_3q2yJaGbHpinAYYGLE4` zCx#Xhbux)Mg<^1ff%!5xPbjG3>JgYizEDE*j!Ky+i2(_WY47=cydXIStk+Z zAso3IlXqhZ&!RpYRf09FEeotQ0&A=K*XGVH`}8=Ukw1kQNb`iq(2X9CqwAayrtm&o z?5yUA{4EYv=Q-#cQ&au0FY;Kc&I^c_(8{H_jH#R+a&*h3U{at}9+mG3VNK3;``Epd zH<8Qq1oq)I$(ev=@P2%NrWGzPeu`-UQ(Vp|t~lTnR}_U}LLa6FOmQ`*xTe4qSK=y- z;_5*9b4n;g|Fs3_zlL@{hz~iA-%HiWO)Oe+!bFi+AC6Y|ERL*~!o)qO)f4PS-K{7q z*>Pn^ZQuWjG`aH1I^e8S=?)sRua4vOCGI-#Ey~N`^_Yh1c!Risht!SQxykGoLLCIE zC?M)CViecn!*p;xYr`mc10i+PKHf1DJ`zYrZVP0+@vHHcf^>Y8Rf7pP?#2ww(DwbW1r9Al&mEYBPw_=@C$A=V@pAGRtRek! zlNNer5&re~xL%>`mZWp|1nX>iOrd82Z)X$t(RD?7v)i?SCE2cJ^rynl$K4)2%JO#S zjU4nz+{9FN=j{$3jbfw#{Fxg5ED!vOLTK;d{=An$*uhKleZ0xvkK^!wi*^#x-i%u` z+D2Cljl3P-LU-2F9gQ}eLwj2w+OQw(&Vp!fr{O!e0R7R13!rV#Xpixr4HrVYhiLnV z_Fh($ delta 13 UcmdnWx|MZ94in>+$+=7(03vz>k^lez diff --git a/target/classes/utils/DataManagerSerialiser$4.class b/target/classes/utils/DataManagerSerialiser$4.class index ec5e4be12b3f0b0bd8fadc88df5f126c11d94b0a..125f6aa1c0792d3e347d106edef8f411bf301c8c 100644 GIT binary patch delta 67 zcmeBW-NHKIF;l+JB^M03bjFVgLXD delta 13 UcmbQwI-hkz7!%{Q$>B^M03ad+TmS$7 diff --git a/target/classes/utils/DataManagerSerialiser$8.class b/target/classes/utils/DataManagerSerialiser$8.class index ba8700ef715459a1143a0533b614e06d2bb4f8c8..5dde6902fa2de30013eed05d00117706934b2141 100644 GIT binary patch delta 13 UcmdnWx|MZ94in?!$+=7(03&4t!2kdN delta 13 UcmdnWx|MZ94in?u$+=7(03$~Py8r+H diff --git a/target/classes/utils/DataManagerSerialiser.class b/target/classes/utils/DataManagerSerialiser.class index e7016748c994ad7bdd10742c3e3026bde9e7aa2e..65e9425bdbf3e007389b0ed1879348d97cd77633 100644 GIT binary patch delta 2821 zcmZuz3sh9s72W5-%p2akK~VuG`~^SY2MJ;k{6?jss3@SK(m2YfC_!b=N@B$r(SMWg%C8cF~|+E#yfzQ=%;llNi0kYNYO_crCd@gT+}Gt>286SX1IH6zGQn zhG7)0>*WTyN`fhg7K-${BK}Yy zt39a}Dzv9UZ%ktYrKc&qOzEwf<%=|TV4<(pUs+mPwKO1zE?VSU;mcfJS5=)ks=E@@*brNXU{VO zE1iN+3pP?+aMY)V*AYQr7u~a@(qEk!#1lklZ$Re~ge~^h3lf#jinZF)38twAGgWnV z#<<#D!<9H<)j4OZn(pkcK6g%ya4Zk_Ygt03T4QE5t}=_m)K?M1!gahlVI5D%pbXS~ z?871FBwN)#~a=@a%k{TP&>aZc) z^R?YG`5-p1ZMNh|z9~a(879L`Nw;N$jI?Ex+@(f(qQgeZ7&XJwD`l)L1@e7U#@SLR z<4u`hOOZ@8Ws)tErI=||ao29D(bKcn6oI3xw4i^kCOp-a5-ByM%$8{~-IN)&lw&@t zR9hTf!)%$UxAETUKc>_H8dfIY%fSc+vZU|~CIX@#LPevSaGaKvB} z>S#HbWi6It1#f|Vs3+=5m<>$2ln*Q6V(R(0msSJ`%*K7Rcu+AFt7y4NrT{;pWixpm zR@3qjVgMRwMPd!<3}T89mHRuWtnHxkKnIm|9aJ7fvJ*e%);=(9V;4G^c*w-VCLZbd zYrGnJSd?_18JV4Ddd(&b+I#!*-rI-Ol=u;9U-xdaCLtM<(I3Sq!W8~aMJZWNM;WV` z#>%F%=oxs36|F}(eu9~7$1H3?MX;r_S#1&d?8Gl&5~Vj;Z02(^tJ$q$y;)MH3cYcj zU2L|4L={`PPA&5e$o&-?&vU~{7XXsPxB7hrwauB-{|FKUk0FLeqTm>^^TNI1LGGUh ziBE{@Hf$lhq>xB8Q&5e8xCf)DXAu>hLgh*+OBq!wr=GKzRO>&E6unGCvT8?MmaI@` z;_@B8CXuIAWc)AkSCV!;CAk+_6m2BsDxpxbDUlBkppqi_aX*pPQo?l|h{=?1x4Iag zCHqxWLR{E>{6=LaBsrcT?z6-lsx~Fe%zv2Jj}Uu3u{RL=r^Mb!>`la0#NJHoEyUbP z?4NxH_JJVw0X!GPexBF|)uW02l*c&J+js`HbH;bD3s3Qz>Tx#z34S*{$wAwx5|eU@ z8rcb92Zr(tY-P*W(6-w>jd+2Uo+1-Qz{KNDZU%!6(cOgRkV1~yjcC_xthR!}CFNOOm)B~-_+v=Pb9>!K(1W42*KQAu)mFR4 z9)ih~sF%CA8vGyoA5vx44RzB^<9vJdR5WPRMAyDwFY=)Zldq;0;-UlTwdU zvKgmkAI``#cuP*=ZFv)C zxM*z0C&m-FWE{eujMMnDaTb5kvWk=Ub98D_LrrK9;bHpFsd1A`Hg;1Wiz)S(9)`^v z9vq=BlBgaQwUt*BRcOD&VvKiKWDAw*XS8zUTd7uov5UpF@aCv6HgNn~d2_5Zma+I2 zqHZ?Ic|2Mh;FNH=%(K-3{yQS4c}7~{lFd?%m+6a;eKIO|+gWmjqw@-VZWjI-_A}0A zx!Z!h^|0u*)S{IH4{`2($GA=`IG&oclIj|&HJ_t%oJDTpk&b9Dw_y+O#1Q8bO#h{}Vo+6lZt0->}gnKqQ{_e`dTcr_w#vvscERd~w8X%pXGw*j}1 z!Fyo4i5(`k-9$ngj9VD-P1rWIF)elsx2)&eHY9xeRU3N#-y_a2rOmcx;Z3}Sw{e!m OyhERXch$|basLIk8+I=M delta 2613 zcmbVOc~sQb75?sz8Q$>YH-J$#WmrT(Q9vSE9B?5t)U>z-F+rsjBPybT0v2QK7^Sa%HKFTkyJ#B{*Z2-v zskmh0bNt=LWqe`dOZ>w|FZz@~iP*>x%OfE+#)>NpOT}$Vs3==J5~jqqkt5-T-329% zja*z(;4ZjRga*d6tGSn=?jHhTNF}B1SXK^-)%ubOEQxb2Z z*eJz3hC-Y-%ctZj!bm-lQ`RFQsd|DM z<`k5ysa;mJI@@gM!>&S`w^EdhX3g{$u1j_rlg&IcN%~9oMxCWHV_gkAD{!v5nJ>uG z*(%y|#hnf)pN>_rGR>IvNmsPquF_p0HB}os4ycw8y*d0zUpliUu&-~rrK+x>x^`{7 zk}*ogD#=hXPA_nBqQ*<6BUxt2mQ2A=ouh_EIx<0W98}4*j!cvseazV;ZF-V7)$<72 z9LbeTy~OMDv}1=Olc;R-CV37TWipk6-qFd2v4ash@-@j*GQ|*u1diOT^K#0Gu?jWRh=jGM1@nV;)L|Vg*!T%=tRs^s>_I&x z7kt=>1~l?i2AZ*fQYg_j;=5>q3J|o8N)tSUUXEKSg^|EwY@%e7#*O$MrEu;QV>2a( z0De+xf|qL+0+b@Kg>-TW5u|e4AeH7pDnA&cvUQNkHYA5)JFkv`)rb9vRJdK?hYELG z`EBWVIPM9#wv7%~0Fu-X0aP%b6K7{0gHLcjVkjgEdXVdP#k)E&slD$b-7|c;UXw6v z>TJYg4iXtt3S*goQWRl6N>GM*D5tc5(oK|Z#v(>*(mWH2cic?nPxbMH9BI@aCybD- z+VLgj{fy~m)Bpc;s_1$->8v1~YSLLnIyI!Tnsn+&XASABC7oK*S@&P* zP9om@9}o}y55z-wv>)*?A|BRVNmVKLu&lIeBg$G0N5ETm@H2)I63Rcs7J^OtK&7B=jC&x>s+wX~2 zowzRE!(Q`;#fJ@aTda`=+Rcu)J29ud?+@BPa=h2=x8uXi4H_qQ)Q_AYfk#OiIDi;F z*6}z*`j7D)9YzI7RT966_`As9$2iKLCvXDC@FBYJ5xVgwJc;u-E-pMJ3Fwg&JR{R^ zLW=OL6ytfRzzfod7v)x*lzZ`#?7=D7i__AHSL8Hal{0uPPd>xzmW4Bx8*f+%c+<+o zThK2%4;E_%&^A?6T50 zr@9d;E_ocsY2(+jw3>+(fJZ8%98b|0CXG_qKfG+|WViOv7S1UDh<&{5Ftk=YO`Dei zHZ#xNB-qR*d4{$~2A9Bmca!QCR%04n1DqOv`g8wOHC_JFBN1^p|_%6fh zg}?t)3oV!7>%}*|qEEl#gxjNg@h>V~BC5lD=HL`w#%a95fL^7|!fSea+RT3fz&tMk