From f970a7646dc4941eafa354749a7648482862147e Mon Sep 17 00:00:00 2001 From: pitsios-s Date: Thu, 11 Sep 2014 15:31:24 +0300 Subject: [PATCH 1/6] Added new design pattern. Implementation for the Model-View-Presenter pattern is now available. --- model-view-presenter/etc/data/test.txt | 2 + .../etc/model-view-presenter.jpg | Bin 0 -> 133615 bytes model-view-presenter/pom.xml | 23 ++ model-view-presenter/pom.xml~ | 23 ++ .../main/java/com/iluwatar/FileLoader.java | 78 +++++++ .../java/com/iluwatar/FileSelectorJFrame.java | 198 ++++++++++++++++++ .../com/iluwatar/FileSelectorPresenter.java | 74 +++++++ .../java/com/iluwatar/FileSelectorStub.java | 107 ++++++++++ .../java/com/iluwatar/FileSelectorView.java | 60 ++++++ .../iluwatar/FileselectorPresenterTest.java | 120 +++++++++++ .../iluwatar/FileselectorPresenterTest.java~ | 120 +++++++++++ .../src/main/java/com/iluwatar/MainApp.java | 11 + 12 files changed, 816 insertions(+) create mode 100644 model-view-presenter/etc/data/test.txt create mode 100644 model-view-presenter/etc/model-view-presenter.jpg create mode 100644 model-view-presenter/pom.xml create mode 100644 model-view-presenter/pom.xml~ create mode 100644 model-view-presenter/src/main/java/com/iluwatar/FileLoader.java create mode 100644 model-view-presenter/src/main/java/com/iluwatar/FileSelectorJFrame.java create mode 100644 model-view-presenter/src/main/java/com/iluwatar/FileSelectorPresenter.java create mode 100644 model-view-presenter/src/main/java/com/iluwatar/FileSelectorStub.java create mode 100644 model-view-presenter/src/main/java/com/iluwatar/FileSelectorView.java create mode 100644 model-view-presenter/src/main/java/com/iluwatar/FileselectorPresenterTest.java create mode 100644 model-view-presenter/src/main/java/com/iluwatar/FileselectorPresenterTest.java~ create mode 100644 model-view-presenter/src/main/java/com/iluwatar/MainApp.java diff --git a/model-view-presenter/etc/data/test.txt b/model-view-presenter/etc/data/test.txt new file mode 100644 index 000000000..997ae361a --- /dev/null +++ b/model-view-presenter/etc/data/test.txt @@ -0,0 +1,2 @@ +Test line 1 +Test line 2 \ No newline at end of file diff --git a/model-view-presenter/etc/model-view-presenter.jpg b/model-view-presenter/etc/model-view-presenter.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a51c914d005efca6fd2cf6cd16bcbe9103e2b02a GIT binary patch literal 133615 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 kysBV;kN zqg##EAtNM-@kzXGvhEN3v(MJ^emn|gv3Sl!1l^Wn#G_LxJZdXRHm0*m>@^ZmCCd)u!OQDqWDn4 z8APArmUqZrhinHKi9EcJYRd)gmw;&5I)o3rPy*5g7i3>Ur0+oG7Je#%wF7S5Idaqk z;gu6Z)G*O3x!uu^pT!N3)}T{I=F&qU&vT$zj51Ommw%`^flrU+ubXb1A>U#GUCa$U ztzg zvXENHI0V*x^xA@e06LF5JCUCsA+AAwk)k1x(acnX^3jk9K8GJBM-AUm4IF>zXgeV}_8(_BuFdqkGJL@bXzrNDq$PXuH z(HtKE9x$)J*f>l4ie3Kg4_uQdB=b8s7O^Nt z@feWzdnSE(0_i%Ts4C0bhKDJPb~27;zE6}+Jp(LD;%9|YK90Hu+{fW3vp*q?0*qb? zKXgtJMuGJ9m)LRgphcW{u$Bbfj!u=M3~Ve7+HmTY&b!%^TL++l=o-N>djUxss%a0T zcQZLLGasdVecBK*S-+VCC@(ZaB_dn~{bAaS7`W6@Y_@WP7}bPZ2$gk#i-NgK+~Ze# zX_0y7;E9F0m10gpoW&=4Ho_I*;M5|Qx)Wt4;kqi7lxw30>OPi%SVj$v|DV?8`d`+k z0GR+E7q+aFQH>ijRS=WfKws~?yG+)*P=Gbzy*3c&onMM! z%KC^83TC&1S^^x0l*UyB6kkBY(i-Fk2h`p_T_&LosauhTjkr>VMsO?zegu9Etqb?) z;WIAylHYb%Ss>J)daV@O?5=M^L~F47w>kg~HE>ALhNe7bB6)JX^TF8DxXAfTPR9*!3YvpfJT5hI!?4u6+v=+A2r2=lCw% zfTGTUdJCk72q07`)JBRb5)Ogl#Qe-pq+x>=*}CX3v2dmov2t(doD>1QrirV03h+Kq zn951FC1c?qS8i~f;_aRx^ZOx=;QK@BxOB<}L9p%-)9o+QI+a(Qk1UGy#7d z><8G3w1ui%Kk)?DNH0}JkPUsL5`d=1CFPNhF=?_jl(dCs2+x2qJmmU1HLWtz@$^-3 z4f=B7kl<3xdWw%j?R{r`@x-U@wZch9Y{}i=@W;5|&w|lEYzzL&60rZd#s}B1Ztvn7 zxqf*&Li@|YM_xd#vib7%PcBv7edqbJ4%wxdmmXo~sAAMb=t?Qymji@Pz{YmUW( zy7N!}OAyrm<0Jkzr29X4X-FQB(hx{_jpX2T(i+OnfS*49M}!Tj1Ah3>2cJx!hRw@S zH=SA}mv?3Ujb`NEX;}W9bI_K9GVO?qV-3|&tTw{dzSFiBX75|o#x4S2omSxFV@Drn zBX8hCN$joJ*yVFuIDI7rm+sz)F140v^KK#olWB-&BPt_vP@6-#_Ms?4uxWy|EDfzM zqoI*8yFCoZXDMt&9cvB4$Q<5_luMS{3Q{sq{;7LulXKW-2pPn@xsE9Im}Gw1N$LIw z(2)dNXQuw3at^(SO$+fc6qjW( z^bDx^?%Fwo$bdyXA+H}bw3g%vQ&>$yyp3+#@;igTu`72ddk-&TGbElKz7LiqnW)bU zF)K}mfsaEMM2t*1N{wI&U2hknc}A3=y&x+QCY3)In>-kz+Ddjg3jKQK&ClSIju#t0 zebkuh+VC{f;Moz6(cl)P7ypC3H;roYUibb{R8)kZpeP8bqM{;31wGQK^uk}B> z-DmHf^Zch5&kNUb0a>|+-*jEq_xrhgn+o}Vcr8x|X>>!HDeZ6Pb( zajFHDqpa!HpfNe8rRvL?k-%AcXW%KQzvnXUM7Qfs(>W^Xc<^ru(g@rSQ}nwzNybN(>e>fnv~&HR5H8fJeO6?Q#Q zH&FI%I52`Y)ZHE}1|zt$(lO)RY5UkX0|=^e2#c=k_2UYCpm*$Zv-WX@DHav&pXEi= zKMpJHy!+SWuUOwc`FUn!EIFF2l&unzN%I0A559o#Xr;}uTi)*}`wMGt-FtUF^3;hR zzxOQo)4l)Crv);qtPp2Z(xXA(fPMsaJl0Cm_oG!kq111+x3Ql0jv*fYHAw8N>+rG> zo;3u#p!LYfZddwcv^CE*gp)>{C-wDQUY9~$1Q(00guEtFTnSZAwU(VzVVM2Z&OrKe zyyR6@mZd{t*+9svV8f?AGqNu_V!dB`Ag4#LA^enEUv965UKb1ZydU^~Q+ zqtkWEC{-#((?X|0vWVvf;sbaC0gcE+MeBE>?h5Y=2fH!SfK1z^wOjD=rIo`ox)BzA zyEjT_(bi^lr*nczP>%bOB&LY4Dd8Hjfc1y5@t0PNj~?oKtZ>9yRu!3X4zrRZgVHGt z>Po~NA}c4<*I23V2Ca<|1v-OfO4%|bB`FHx+NOvIu?U0gn6D{2pXYL>^W2`86J4qz zRGSMz(k%{AB#{7R?g3+b_ZbE0Kqr<2O(-g4VlpFlqXY1#NO~kkJ8(FSW6i|}1O6g0 z3uj3=ZYySR_20RvkeMU&1Mq>1w6sIv zL-o3X*z)N3DF4Dkp|AQIcU(Ikx=XmN(QW?!gR83D6Nr(zg==|&e&PhZY=qbwTo6+i z7+ikLsqrz%2=Bcx#k*s&Xt9>*=MJ_+i;nW=a2q-t;}E9dj9YF8g#=MP)<&oUoeurSOkZd_L zgJM$G-{tzb$5syI9(Xq}^1L$kw0_GqOuV7P_#Dq))9?xJ1Cei2z-md`ll}@d6tjhqXYWV(~K!LP+e)0dA&Dt$e^_|0F$oqxIqyMfe)O!>Hct$ z4OEwTE)3H|vw)4W63Jyzz3PjV#~RCqdS70>+l#HOn>krl8Wuu47T)Kz{%O~Jm|)2L z*3RnQza?4ybJ`WxKz&7f!x7WdqR_FG{qB2!cuq+-r;Ik@7t>aNEb*J}!$^TLP=vZ% zKh8^05El(SidiO#j9zx3ZeTs&?VT4BAV#vrRmry?SvnGpV|Fypc`t67kFGTs&$>yq zNY*x}FK91Q_kd7)hPj+DF8G%f4azaplDc@)DEaf`;0R<&~$IH5C;P zAOFa`V;HqY_N&mMBLDY?vAL+Y^wmgjlKNU%Z)4J(k@N8`w3`ue7A>(CA`%Vz!g^ot zliz<3x@X;YEtYdRmXE&Ms6$jm^?))n{b-wQA?U-k0LLhCa?bx zXUL3K??tYtP(4?DpLTwY$JXVS$QI*kN}f;)-tbw6b3AW0WM061#NH5)uR&w2qCBk$7x~fTOL$|AdwJ+b%0iH&0BHpSU90ojgAcxcr)KE=bEbp+A9F~7$WO6SDc#G zIY3jKWZrI2aNAl6vD7Rih#bFO2@G&O3QN)=tXIi!onPvcPK~LO>FnEvv!QN+x4@tD z!$(y3dC1+yQ!`DuxpMT8w*SFv3KW0PEP**J`l$kZ4#-)Tw7x+iAoFKN3QiAQu+#a2 zYyi}_GtN5$!<;3^{nd7dSd!fEO}PV0!z|@8p&==H%20wr{Ctt;^sP7FP<>raUVEwQ zqc7(s0{AD24{Q<1Gh;lowgevo;^G)0iaSS{<(il{DoNoRpY!sHC8+r0Yn%#S`@O0L z+7QD8HpJLkPTrYSp^1g*jT7@?o~wx~9WZ@617u%SRaedK?~?V{$By%)i5rXFkN%vo zc6R^k#>3umJ0&}nhcBcmZsz6R#;@6ChssleR5id1&W>$<)WtZIoS>J-~>+ zw*CTdL_amLP~!@_{cLbbX9CC}*3|vlAFIc$aW&5{>9(Dmn<4CS|{b&DGI;+ptQ}3_`h&~Iz2DSJ0~lb-uLI~JgF$hvc)Y9 zz!ug1^IbD+&a;PlQ!aKO=t?Dq0xk|qh5tLw7)au?M%j}`G$48SJ2p7whVjcx6<%R3 z#SaxDlE1Td4Lme!X9l%qbYKeq9mDwLkbc#z#}Z`!lw@Y3&f)K{<3^A`T*!L@V8`fY z`rl#4E_!1_l@7Y4NoRGLcyI-OXB-1_45pIa<^i++&NwzscKttB2!PT5)idNcNKaAS z6|=E;-z+h0LnmH&2RhGo%DovOXFco>8V$E^b0iI&bfKq=Vf>P=X`khIkykI8L3<55AJ$hhVe{n5g8d+Q*l13)z#f;AjfQqmQoew~YRhj^ z{0<|f@Z#Zj)rEdRkaHtzk!*m%5!F3xsT>WrM3Qcd<^^wHQgaVH=Vjch>)z>doB8&7 zSx@hX%jsg$nTWg5)7?=2E7`GrfqMFUd~V*Nb>;zehdtMsulUdmy#OZ*8=D>98T9st z5JN%+dP4WaN5;={4#+!S<#8r9F7}K?%X|?Rb`W7rn})YI>>FQw7 z@uXVJz=Bq-}GKN{^bYwX~ztpRg_037+)(Jt$$k_Q9M+?m7Q2l zvf!1*&Ce;gJ)96%otK|pe3ux?4d_0;0@BwC}5aK9HoMlUY(<8Agx3cesAc?wF{AazD1@k4(3c}9*%px?v&f^X$ z%cl-t$-C_6MQY~OA*Q987#@4p`N$KfWcmjBAY%Fq?DW)F)eF3u2c2Sw!q*@-A@^rR zD5x~Y(zkQs+*K$cmf(+Ey@g3Rm!%FN7>6M3)1vdigP9YKvvyYQqUSddYs^xoc8aqQ zjvkmeB3!bwRYWG69S&(U`=)W;_WOs0OAamDcq?OW$(aM0Wvip^-MzQ`bG^mi|ATcD z_sLt4ix7ih{MedVpHND0TMf!Wa=U`)-ra)T*_&p~1>qapsAL5Zc<+Vr(RV5FA|1Mod*lZ3rf**TR{ov7nBK77 z<&nO5JDtDz;&xb`@wQ*K`P}($AI?5ikn|5fML&={jAH~ zBjy$pV`;EWGrDTS?Zmr3(=L#mJb7kxlIOP{ouAXKZ?3-T9&h$uFX_WyP#yeBWkRUA zuvA|$ebEC89=|nva^Az~N;P*>p}GQmzQ*`B1W3Zs&N=mTNWXr-4K=KDBwI5;HN&Eu zJA;yHq6U%-Ms<#JNR&x@DbmJGKzC?jDnAV2iE#0SNi+v(onN79)v;9v;2}BzzSkhR zp`|x72U}@;)#oefSne})CM`lIV?#$=S+7c!9%DUFZ$~42UfczGR4hhCyN8XP-An7t zCytdvvPKg0l}vF>cr2VEJcb0pJ6rs_u)#Q+3oiay9>vd>H)ns9Eh}{2iND?V`}gpC zkh)p>Vg3q`>X@5G&re_ItxJf4+nGk<0Gn_|D7R?2IaX2MmI!cE`Gbq_uUpQXPa zP7HT{Gm$NWj(YMIQBEd#gn$E6i-@=B5ui8&;w#G>@IEfUqfNkuMt0hTl6pl<1Qf5s6+np~S(q0vRooo<2ZWH2vo0;$Zr zNm(yye+QKmsbXd0=jbe{Q7{ELqh+heMhK}nd>4X&ikpCvRFcvg*<7YUl~XY+B>=AI zR@YxW2G!=>N3xp3Evmrb?l2EZ6RX4ef0Xk{EM!9ozQ(qR52RiuvAS&{=$%Z=p93^f z6PHXV38?fI<*suJ@hACxbLcUzY7nxi7-#AAGdDDok1B5MAUq%#-LSR|BZTNtPV<5g zkkFmC8A7vgwzLl3u6CUr#o+UHezYN{mnib}yifa^YzdbPGX!`OdNi34z6HvuI%6)5 zC5N#@&U9m}jgoIZf;Yjs%2`Ik;S1nH{cDjEI@|qTlYS+N-F8ouYp5Ui~hNAL99xC~!v|jV~v{tqy&Q3EA<~Q-tQTX{DX|!b&p<-}s zLP1}F5F7dPupW@RJ5om~8^z7NAT2X|M%|aK*Lg#RvGeUJvs&cUI7>Nz>^0Tbu|PE=%}^=q9$= zr2S&)7jRWr)L!vnspBkjU)4%4<`^ir&WJj5*`s2gWZA^7o;?Cu1&SequDu7HYa>Whdk<>{NC*S=r?f5a+&U=Y6TcRqZ-Q%3>=! zKo8V81@oTVr#&Yw;d;Z214s&7Cm(nMNrSp?A(9HDXjHTbQVDgN;RVHjSjR_UoyiJ} zS#OvN;;q}lXAHavP1r8@hLozO-Not9Ge+{eJrPzG3!Vg@5plvh<_F{@0wbUzEK#8QxvY3>@A4%RqduxB}UxNNA~8V3!gO@)OB zr@N)+rNQ`&bEB4Q6e;)nif(3^tnclS(OL0LExwsMsEE8IRpbfL47`zw?;VV1098NZ zlBs_PdQ8;WAt*w3R4?x|_c4zb5<S6{|9ziz{(X=1|Bro^j7tF(I*Xq>YkuEpqki9!odSQ~Y1{r|L!R6H z`%YW@`-a>V_WMqI;P(yrhH<2Lt1ERPCn8q(w;Me3b`R-f{;d}PDIiV=XtmMA zM?8LgRHQnBl->Y>sddihA0Rv4O8sVNe;!Ag8EuY4vxZoW)|h$8ud=uH?bqJsV&D&r z-KkgJ0HIheVgpSyxztGVl9P!VIz%7W|8`y0qOB7H`sea?w9FV1*$KHcP{?gOqS>CP zD}0_(MG8Ith+%;P=IAU6_0VAk(^s))sf9>-V5p^S7re3OZ>Z!J8*vDI*-p>SFA zx^GaehyHh|GZ0Zf%H{sRVu;!X^vyfZv?$1^=T^6$vM=QibfG<~Pt;wk)L6xxYkgL- z-!$~~>rgX)2ZCc-2|0no#x9j}=Jz8Qfq7s!3aaVqlB7);E{@l@<9saqcQ7GKS{Qy3taEh+xEhAogQKc=(GuVg;h6x=q7~^k~CD1 zzx~C{AM8nn&)AdeDDGg0Re(qS9gsWy=|^*=|L2I5ufETu}@HFkGom>+(r@^}+2ydJR!bA8eGo7@Ck8zPjK zI{C9>;<$rgV08!i2Fw=zrngot+}CmHo#F#EPVwr*`%3%q;(Yv$RqHanbDTvs%{>8M zCJp>~#rs$5%pjGhKraFEF9A4>*)prGFe020%wg1U79n*)mtRYQ)3cPAB}kUflXjCQ|XH?!c;Sio#y?fo2NxIpPMeR>t z{}7T9s^4?>FSNa}`*i{snbgUh^hk1w^T2wDmJ+QZX7hH#3sOLp1jN7>&Nx-0mjW5! zzQ=h7ktD^7y~?iecVa<)T>Ah;qV#zhyBaV9(|BeuKf5%$2T6Ftx=R}5FnAk~RkJ>L zhHeKE;`s=^i8#Y{%E1(zH8Oj&_4HRPFPM>zp}Iq7m8a{V(WAVKHJ#PvWfj;!c^aIa z-Z5O?m7UOk=Q{mN>Fd{ya*)8PVhHTrY(oaa=4fh=*4{my-bOXycKPcRASx#Pii@V zgVJ#@pv}ll;#r{Z=LDX5OVp6*6H6KSzeza`wwFtPIeyUKb#)*f1PxID{J}}5Mk^YsJF%aN z=%}HAjjfp0GOvDfVn=LE?AGzcRb^fUmXA01R<v=mG@axe}yEK;bpQ_m<)IHGZdNE_1o2WonAIk5l&DhGn*&oH* z*+#Wey)X>y0NBCt74I-N6rnyLDazI5rawjJb~JG+d^++Tq$+l~o30M0#(g>;cwE{h`WEmyDyH9D(s%{}B4{YkhnQ7J_3^`{dV(>Zt39w=`9Mb0K zoT$5X-vKUAJ22T^n03{xNBZQFg#%Ibc}=n$;sbngDPVV@7LN{~VSJj#W;Te{O|OzP zqAZRfr2@OMp?XO=ZXJaH1Q9jEv5rrDMvifvRO4Gk*gdyN^)&X~sCCI>8L$KZ2C~ng7a=|}5x+XVnUxG|119{FuCionwDcu=cGqY^g}O|R zGNsry7dapjIT^S(FHy}aLu`p^Nyg5~FIL3<LuQN(eXlsstL9yHU;+xRG3D=ZYzwzttXYK|a@O0q!|-gwGRo9JHU9U&;^Ocs3t z3`J>{L6TIiAEX0`8@44jLJs`sJ#1wlfB;JbJR8tf^S(VjlGDRcK5M%LvxLBJA-+U4 z0%6R?#nF zBT7hU!y1_pg)IzsiAH<0lGs#N^&tHmw3nd7 zED9R!8PEr>B7owqIK|tZr;v=FnT?>hfuP+X7;+Z%72?CRg_tQ;rVH^hJ_^*(#p)Yf zPFC?Ei|MhRa->e6ThCS+jI-f#Z&nlCFm8g;Tf<2&h4?+EkHZ8;hbSK_0}XdsCkH-cRiI}4OD6U|se>ev)gqNnGyb^EDLAf zsqw!xT1(pnqf&Ub)Xk9d_z^f^@QX}Yc-2Gb*9jrN2dxwff&Kb?i*JWhhSP-QNG~Tn z?qpl_=)yR!9B^g2MOUG}4IYNxa!RSOi1x+^&lsth4WJ%_nA$weMz?UXVasf!=3obJ zo8~-}o@Snj-Vo-1{W_Bzglq9k7qeku|-^$`|PZIK{3u_r>MF9tSCt4IZZ zX$&7olD{UWf=vFLTLU|guh1xp41ms#Bt@4;_ofE#e_${~7O`2u&W)H$bQ7JcW*-!o zGs#{=-AY_GGJt6xUkjb*C|%KWD1M^&gstVU+nNsSiMX5W`C^6PZrax8t9vJ{F&(Z5)OZ@mJEkHV}b%tDIiB#|*Nhar;U0FaGE^^&_;9_Zp(X!f*?zpF8PVchS8zI_sk z&3&jqEd!K}>1qB_M+~Sr3CIzZjmkbeY9kNgFl*dSD>O@;IO*r`M#EPTvT(q<+wa+o zUD&Zu%B5+cg-;8NRp(JlIQ#)Qu2kYy$F7(;$2kK3li4L0d$#iJ`Bg znN#CZns7^`wB6C{71)Ear3#qSWJL;u8Oc~rXj+sokuymKSpidxld_L&N_Fl!XXNoY zT*--Cz>IVZj_pb|Sg(*Fo7j!obJS4SF(JNbXDiKux>Z}~be(2dCoJ6BqC7`mh1;d; z0_B~tvt$V87OL^*0jO-IudWSU^+MWsU9)}zLxGu(xQo6E8NH&3MA8&|%b!6>;%S81 zRa?p>&w3&Zwcrt0U%;!MOOwcItl1DoFt8X-%E^j`jU{`5fznT#hjWaH$D5o6=_7q* z;KjJY7?qf~iu<*r(b;E3Hgv-gJZdd;^uhkPyOpK)M+V5?)Yj;L(~GjUMy}orrd(Ba zO4(*y6yzra_>vRSOe{{fr3y)bY}EPM8~jtOg|yb-oyDls&#G$?>0Md}zM7STv!`So zZs?fM%!%Vf<4mjCdDciz2<>*<` zBK;@u^568b#R6g~u<9u4I_!ZpP+!4GJ4ZGSrZ~tYDXIr;Td+=MJIxtKLNvyu@DJ6{>HqhBwQ^w7m#5C%K;fb58n-d}P!iOiFhvn({8Zq! z?#yp`Hf*6xOTao$giHSW{kCXfl<8)ir8ZB81B?}qvGSXvL<@Qht5?Lefe+DpPIrVp zY@-=#HpA=FfJ^fdmoOWsISI$+rraY^Q4p%h%J~cEPN8a3VO(LPQk;oftq)}>WSKY{ zp!!@=%f~e)N`F} z8vF@(?jYe&mlHmnXs*HE*jI0!Ov6#U4t3TT;RN=0A$u9PG)!au$&6xzs{ab?DHA#Q zvhn4!c#5kMpMB2WPQYGfUqi40N;#YTMdab~6 zF`tr3NeDZbR6ime!Mh)4m21-T~tFKSp3lqljl!VozvIXN@eTb~S2m^*NC_Srt zwQLS{k17a%0-Uul-5EldUwM*ZgYQ#Z7X3&h=aLYxC#Gm6Z#&yDR{O1o+ z1c4Si%jQY913BzKdTwCA%;P8ZvHlw@vhxCWgmT~0w&;X-qp69$5Vbo9>Xs3MNW4#r zX&jJE0~XOUmsFSg&iVMvPZnug$UK?4`({ktOa)h9X3xRT@}KP2qk@9pyl0&lk1+=b^DLpJb2@)|Y&KFw23>8PoxlHB zpVr(ky9R`zjIrls;UhcHMIkSI$!X}`_E4Vpd!qQR$GX;j5tdDr4ob()(-n(9Axq`A zi1U8>c)k}iZm*!Tij1q*v235ossS*GL0i*RN#)L)3;Ov2Jv-2tT3%Uq%rl+_S(ZG> zCAJ3to6+{Kn-SZ6C|8Nc&F|7);Prrsp=CdE;R0+&gnjCuQU!}qeO@A^j)s-{V8U52h+3JaZq_?gM)eU&mUHw zT(CScL)hxacyOsa*hKvuGp4ibQ2K`DF^6xA1g7n7yXNx!otsBGQm!4`52n=o-AI=r z%w3cZ{G~KQ#73+$C}`HL0DLC8fNn7qK)1xLKnP9jrExO-J)chNmUK(a=k2^5y7v6S zJAiiJ3&jJrn`soz5*BBE4Z?K3U|>@hmI(a&8MAwJ-4{}3#Zw%mSW&|eqAyt+BE=ON z59kuuR)J>~m5E=@KheOt$X+>qE{l~`voaUORKB;M0X4;!1(nyb}dGDcBc8_|n!#uRBNJ%zRb zSp?NJ^OtBgDOneF>+7CKbxRR11>-W+9cV!P`QtV!dNzF_Jqnec@TJtTmS8|@1&1u} zMA1xGdg+FTDkB4B0P_~fIXus@CHpd~VT>9P_0Y0*XO1_RE~T zaS<19&d&UZJz#E*#jSl*#<)4wwb>;5o?r1S=Phai-OUR@n6uF|(5%QX&hUkK(||o3 zUaGW1=L8U|z8)||&O#|Fd^36#zPS&qk7|7HJ(PYB;;gV00=*7WeE2a-op^<|F?=+@ zV!tH4x__Z3`R?e>damzq*~dAsoqDsjM3V$O-`0?{iJao{4xk28f}O{mZfJb8dAvE% zvWGdGI4gki)10{BHM>Gj0W2stBK!0LkJZ{xXbi zd9(~VfXX0Nt?pfM6P}Oiy3x-;DF5hA^yvRaEWqk!}L z%6F42CO!mz!A5(ZXJngZPmR4VfeDS_mOPl)$k7iPpnjoc9t@qsvu_6E+Ok0#+S z#^M*SU>gNJE$+G#W+^qG(~)U-_~N+_U|`T#O4Jh2P+lzL0eJ(1ODLNnqWMwe6!xP* z!P9tEyjW)Sin~wU2HFNN##K#=iY#fB-m6;vp`6S4V@kC9W`EkZU9)&Ov6Cx zyu|z7G5H5lVv{!1DGkRldpf4pLWzgRY^kP5+kT_I(g7zI+Vc!n~>jT!Ki<_$*+>DF)JD zzQTX{8RnIxnxg%_5_?4DwstlQxdNdS&g14F4m}9|KiK>!esfSX<@0lJ`cymZ4ReJ! z^_(Qr+6iI{>8u%Y8r9$g5JJXxF-`RpcSH*d8j3F)83(Hpl+vU~0fHWn=g1qVxF8hQaX`V8D6$Ba8DpBe;1 z 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%0A@X$RU;DZYb0;LJ-b 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 + + 4.0.0 + + com.iluwatar + java-design-patterns + 1.0-SNAPSHOT + + com.iluwatar + model-view-presenter + 1.0-SNAPSHOT + model-view-presenter + http://maven.apache.org + + + junit + junit + 3.8.1 + test + + + diff --git a/model-view-presenter/pom.xml~ b/model-view-presenter/pom.xml~ new file mode 100644 index 000000000..00099809a --- /dev/null +++ b/model-view-presenter/pom.xml~ @@ -0,0 +1,23 @@ + + + 4.0.0 + + com.iluwatar + java-design-patterns + 1.0-SNAPSHOT + + com.iluwatar + observer + 1.0-SNAPSHOT + observer + http://maven.apache.org + + + junit + junit + 3.8.1 + test + + + diff --git a/model-view-presenter/src/main/java/com/iluwatar/FileLoader.java b/model-view-presenter/src/main/java/com/iluwatar/FileLoader.java new file mode 100644 index 000000000..b89ca9a37 --- /dev/null +++ b/model-view-presenter/src/main/java/com/iluwatar/FileLoader.java @@ -0,0 +1,78 @@ +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; + +/** + * Every instance of this class represents the Model component + * in the Model-View-Presenter architectural pattern. + * + * It is responsible for reading and loading the contents of a given file. + */ +public class FileLoader { + + /** + * Indicates if the file is loaded or not. + */ + private boolean loaded = false; + + /** + * The name of the file that we want to load. + */ + private String fileName; + + /** + * Loads the data of the file specified. + */ + public String loadData() { + try { + BufferedReader br = new BufferedReader(new FileReader(new File(this.fileName))); + String text = ""; + String line = ""; + + while( (line = br.readLine()) != null ) { + text += line + "\n"; + } + + this.loaded = true; + br.close(); + + return text; + } + + catch(Exception e) { + e.printStackTrace(); + } + + return null; + } + + /** + * Sets the path of the file to be loaded, to the given value. + * + * @param fileName The path of the file to be loaded. + */ + public void setFileName(String fileName) { + this.fileName = fileName; + } + + /** + * @return fileName The path of the file to be loaded. + */ + public String getFileName() { + return this.fileName; + } + + /** + * @return True, if the file given exists, false otherwise. + */ + public boolean fileExists() { + return new File(this.fileName).exists(); + } + + /** + * @return True, if the file is loaded, false otherwise. + */ + public boolean isLoaded() { + return this.loaded; + } +} \ No newline at end of file diff --git a/model-view-presenter/src/main/java/com/iluwatar/FileSelectorJFrame.java b/model-view-presenter/src/main/java/com/iluwatar/FileSelectorJFrame.java new file mode 100644 index 000000000..38168512b --- /dev/null +++ b/model-view-presenter/src/main/java/com/iluwatar/FileSelectorJFrame.java @@ -0,0 +1,198 @@ +import java.awt.Color; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.JTextField; + +/** + * This class is the GUI implementation of the View component + * In the Model-View-Presenter pattern. + */ +public class FileSelectorJFrame extends JFrame implements FileSelectorView, ActionListener { + + /** + * Default serial version ID. + */ + private static final long serialVersionUID = 1L; + + /** + * The "OK" button for loading the file. + */ + private JButton OK; + + /** + * The cancel button. + */ + private JButton cancel; + + /** + * The information label. + */ + private JLabel info; + + /** + * The contents label. + */ + private JLabel contents; + + /** + * The text field for giving the name of the file + * that we want to open. + */ + private JTextField input; + + /** + * A text area that will keep the contents of the file opened. + */ + private JTextArea area; + + /** + * The panel that will hold our widgets. + */ + private JPanel panel; + + /** + * The Presenter component that the frame will interact with + */ + private FileSelectorPresenter presenter; + + /** + * The name of the file that we want to read it's contents. + */ + private String fileName; + + /** + * Constructor. + */ + public FileSelectorJFrame() { + super("File Loader"); + this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + this.setLayout(null); + this.setBounds(100, 100, 500, 200); + + /* + * Add the panel. + */ + this.panel = new JPanel(); + panel.setLayout(null); + this.add(panel); + panel.setBounds(0, 0, 500, 200); + panel.setBackground(Color.LIGHT_GRAY); + + /* + * Add the info label. + */ + this.info = new JLabel("File Name :"); + this.panel.add(info); + info.setBounds(30, 10, 100, 30); + + /* + * Add the contents label. + */ + this.contents = new JLabel("File contents :"); + this.panel.add(contents); + this.contents.setBounds(30, 100, 120, 30); + + /* + * Add the text field. + */ + this.input = new JTextField(100); + this.panel.add(input); + this.input.setBounds(150, 15, 200, 20); + + /* + * Add the text area. + */ + this.area = new JTextArea(100, 100); + JScrollPane pane = new JScrollPane(area); + pane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + pane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + this.panel.add(pane); + this.area.setEditable(false); + pane.setBounds(150, 100, 250, 80); + + /* + * Add the OK button. + */ + this.OK = new JButton("OK"); + this.panel.add(OK); + this.OK.setBounds(250, 50, 100, 25); + this.OK.addActionListener(this); + + /* + * Add the cancel button. + */ + this.cancel = new JButton("Cancel"); + this.panel.add(this.cancel); + this.cancel.setBounds(380, 50, 100, 25); + this.cancel.addActionListener(this); + + this.presenter = null; + this.fileName = null; + } + + @Override + public void actionPerformed(ActionEvent e) { + if(e.getSource() == this.OK) { + this.fileName = this.input.getText(); + presenter.fileNameChanged(); + presenter.confirmed(); + } + + else if(e.getSource() == this.cancel) { + presenter.cancelled(); + } + } + + @Override + public void open() { + this.setVisible(true); + } + + @Override + public void close() { + this.dispose(); + } + + @Override + public boolean isOpened() { + return this.isVisible(); + } + + @Override + public void setPresenter(FileSelectorPresenter presenter) { + this.presenter = presenter; + } + + @Override + public FileSelectorPresenter getPresenter() { + return this.presenter; + } + + @Override + public void setFileName(String name) { + this.fileName = name; + } + + @Override + public String getFileName() { + return this.fileName; + } + + @Override + public void showMessage(String message) { + JOptionPane.showMessageDialog(null, message); + } + + @Override + public void displayData(String data) { + this.area.setText(data); + } +} \ No newline at end of file diff --git a/model-view-presenter/src/main/java/com/iluwatar/FileSelectorPresenter.java b/model-view-presenter/src/main/java/com/iluwatar/FileSelectorPresenter.java new file mode 100644 index 000000000..d9d5d8bb3 --- /dev/null +++ b/model-view-presenter/src/main/java/com/iluwatar/FileSelectorPresenter.java @@ -0,0 +1,74 @@ +/** + * Every instance of this class represents the Presenter component + * in the Model-View-Presenter architectural pattern. + * + * It is responsible for reacting to the user's actions and update the View component. + */ +public class FileSelectorPresenter { + + /** + * The View component that the presenter interacts with. + */ + private FileSelectorView view; + + /** + * The Model component that the presenter interacts with. + */ + private FileLoader loader; + + /** + * Constructor + * + * @param view The view component that the presenter will interact with. + */ + public FileSelectorPresenter(FileSelectorView view) { + this.view = view; + } + + /** + * Sets the FileLoader object, to the value given as parameter. + * + * @param loader The new FileLoader object(the Model component). + */ + public void setLoader(FileLoader loader) { + this.loader = loader; + } + + /** + * Starts the presenter. + */ + public void start() { + view.setPresenter(this); + view.open(); + } + + /** + * An "event" that fires when the name of the file to be loaded changes. + */ + public void fileNameChanged() { + loader.setFileName(view.getFileName()); + } + + public void confirmed() { + if(loader.getFileName() == null || loader.getFileName().equals("")) { + view.showMessage("Please give the name of the file first!"); + return; + } + + if(loader.fileExists()) { + String data = loader.loadData(); + view.displayData(data); + } + + else { + view.showMessage("The file specified does not exist."); + } + } + + /** + * Cancels the file loading process. + */ + public void cancelled() { + view.close(); + } +} \ No newline at end of file diff --git a/model-view-presenter/src/main/java/com/iluwatar/FileSelectorStub.java b/model-view-presenter/src/main/java/com/iluwatar/FileSelectorStub.java new file mode 100644 index 000000000..0adb00aad --- /dev/null +++ b/model-view-presenter/src/main/java/com/iluwatar/FileSelectorStub.java @@ -0,0 +1,107 @@ +/** + * Every instance of this class represents the Stub component in + * the Model-View-Presenter architectural pattern. + * + * The stub implements the View interface and it is useful when + * we want the test the reaction to user events, such as mouse clicks. + * + * Since we can not test the GUI directly, the MVP pattern provides + * this functionality through the View's dummy implementation, the Stub. + */ +public class FileSelectorStub implements FileSelectorView { + + /** + * Indicates whether or not the view is opened. + */ + private boolean opened; + + /** + * The presenter Component. + */ + private FileSelectorPresenter presenter; + + /** + * The current name of the file. + */ + private String name; + + /** + * Indicates the number of messages that were "displayed" to the user. + */ + private int numOfMessageSent; + + /** + * Indicates if the data of the file where displayed or not. + */ + private boolean dataDisplayed; + + /** + * Constructor + */ + public FileSelectorStub() { + this.opened = false; + this.presenter = null; + this.name = ""; + this.numOfMessageSent = 0; + this.dataDisplayed = false; + } + + @Override + public void open() { + this.opened = true; + } + + @Override + public void setPresenter(FileSelectorPresenter presenter) { + this.presenter = presenter; + } + + @Override + public boolean isOpened() { + return this.opened; + } + + @Override + public FileSelectorPresenter getPresenter() { + return this.presenter; + } + + @Override + public String getFileName() { + return this.name; + } + + @Override + public void setFileName(String name) { + this.name = name; + } + + @Override + public void showMessage(String message) { + this.numOfMessageSent++; + } + + @Override + public void close() { + this.opened = false; + } + + @Override + public void displayData(String data) { + this.dataDisplayed = true; + } + + /** + * Returns the number of messages that were displayed to the user. + */ + public int getMessagesSent() { + return this.numOfMessageSent; + } + + /** + * @return True if the data where displayed, false otherwise. + */ + public boolean dataDisplayed() { + return this.dataDisplayed; + } +} \ No newline at end of file diff --git a/model-view-presenter/src/main/java/com/iluwatar/FileSelectorView.java b/model-view-presenter/src/main/java/com/iluwatar/FileSelectorView.java new file mode 100644 index 000000000..e1782381c --- /dev/null +++ b/model-view-presenter/src/main/java/com/iluwatar/FileSelectorView.java @@ -0,0 +1,60 @@ +/** + * This interface represents the View component in the + * Model-View-Presenter pattern. It can be implemented + * by either the GUI components, or by the Stub. + */ +public interface FileSelectorView { + + /** + * Opens the view. + */ + public void open(); + + /** + * Closes the view. + */ + public void close(); + + /** + * @return True, if the view is opened, false otherwise. + */ + public boolean isOpened(); + + /** + * Sets the presenter component, to the one given as parameter. + * + * @param presenter The new presenter component. + */ + public void setPresenter(FileSelectorPresenter presenter); + + /** + * @return The presenter Component. + */ + public FileSelectorPresenter getPresenter(); + + /** + * Sets the file's name, to the value given as parameter. + * + * @param name The new name of the file. + */ + public void setFileName(String name); + + /** + * @return The name of the file. + */ + public String getFileName(); + + /** + * Displays a message to the users. + * + * @param message The message to be displayed. + */ + public void showMessage(String message); + + /** + * Displays the data to the view. + * + * @param data The data to be written. + */ + public void displayData(String data); +} \ No newline at end of file diff --git a/model-view-presenter/src/main/java/com/iluwatar/FileselectorPresenterTest.java b/model-view-presenter/src/main/java/com/iluwatar/FileselectorPresenterTest.java new file mode 100644 index 000000000..0e5a0b227 --- /dev/null +++ b/model-view-presenter/src/main/java/com/iluwatar/FileselectorPresenterTest.java @@ -0,0 +1,120 @@ +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +/** + * This test case is responsible for testing our application + * by taking advantage of the Model-View-Controller architectural pattern. + */ +public class FileselectorPresenterTest { + + /** + * The Presenter component. + */ + private FileSelectorPresenter presenter; + + /** + * The View component, implemented this time as a Stub!!! + */ + private FileSelectorStub stub; + + /** + * The Model component. + */ + private FileLoader loader; + + + /** + * Initializes the components of the test case. + */ + @Before + public void setUp() { + this.stub = new FileSelectorStub(); + this.loader = new FileLoader(); + presenter = new FileSelectorPresenter(this.stub); + presenter.setLoader(loader); + } + + /** + * Tests if the Presenter was successfully connected with the View. + */ + @Test + public void wiring() { + presenter.start(); + + assertNotNull(stub.getPresenter()); + assertTrue(stub.isOpened()); + } + + /** + * Tests if the name of the file changes. + */ + @Test + public void updateFileNameToLoader() { + String EXPECTED_FILE = "Stamatis"; + stub.setFileName(EXPECTED_FILE); + + presenter.start(); + presenter.fileNameChanged(); + + assertEquals(EXPECTED_FILE, loader.getFileName()); + } + + /** + * Tests if we receive a confirmation when we attempt to open a file + * that it's name is null or an empty string. + */ + @Test + public void fileConfirmationWhenNameIsNull() { + stub.setFileName(null); + + presenter.start(); + presenter.fileNameChanged(); + presenter.confirmed(); + + assertFalse(loader.isLoaded()); + assertEquals(1, stub.getMessagesSent()); + } + + /** + * Tests if we receive a confirmation when we attempt to open a file + * that it doesn't exist. + */ + @Test + public void fileConfirmationWhenFileDoesNotExist() { + stub.setFileName("RandomName.txt"); + + presenter.start(); + presenter.fileNameChanged(); + presenter.confirmed(); + + assertFalse(loader.isLoaded()); + assertEquals(1, stub.getMessagesSent()); + } + + /** + * Tests if we can open the file, when it exists. + */ + @Test + public void fileConfirmationWhenFileExists() { + stub.setFileName("etc/data/test.txt"); + presenter.start(); + presenter.fileNameChanged(); + presenter.confirmed(); + + assertTrue(loader.isLoaded()); + assertTrue(stub.dataDisplayed()); + } + + /** + * Tests if the view closes after cancellation. + */ + @Test + public void cancellation() { + presenter.start(); + presenter.cancelled(); + + assertFalse(stub.isOpened()); + } +} diff --git a/model-view-presenter/src/main/java/com/iluwatar/FileselectorPresenterTest.java~ b/model-view-presenter/src/main/java/com/iluwatar/FileselectorPresenterTest.java~ new file mode 100644 index 000000000..0e5a0b227 --- /dev/null +++ b/model-view-presenter/src/main/java/com/iluwatar/FileselectorPresenterTest.java~ @@ -0,0 +1,120 @@ +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +/** + * This test case is responsible for testing our application + * by taking advantage of the Model-View-Controller architectural pattern. + */ +public class FileselectorPresenterTest { + + /** + * The Presenter component. + */ + private FileSelectorPresenter presenter; + + /** + * The View component, implemented this time as a Stub!!! + */ + private FileSelectorStub stub; + + /** + * The Model component. + */ + private FileLoader loader; + + + /** + * Initializes the components of the test case. + */ + @Before + public void setUp() { + this.stub = new FileSelectorStub(); + this.loader = new FileLoader(); + presenter = new FileSelectorPresenter(this.stub); + presenter.setLoader(loader); + } + + /** + * Tests if the Presenter was successfully connected with the View. + */ + @Test + public void wiring() { + presenter.start(); + + assertNotNull(stub.getPresenter()); + assertTrue(stub.isOpened()); + } + + /** + * Tests if the name of the file changes. + */ + @Test + public void updateFileNameToLoader() { + String EXPECTED_FILE = "Stamatis"; + stub.setFileName(EXPECTED_FILE); + + presenter.start(); + presenter.fileNameChanged(); + + assertEquals(EXPECTED_FILE, loader.getFileName()); + } + + /** + * Tests if we receive a confirmation when we attempt to open a file + * that it's name is null or an empty string. + */ + @Test + public void fileConfirmationWhenNameIsNull() { + stub.setFileName(null); + + presenter.start(); + presenter.fileNameChanged(); + presenter.confirmed(); + + assertFalse(loader.isLoaded()); + assertEquals(1, stub.getMessagesSent()); + } + + /** + * Tests if we receive a confirmation when we attempt to open a file + * that it doesn't exist. + */ + @Test + public void fileConfirmationWhenFileDoesNotExist() { + stub.setFileName("RandomName.txt"); + + presenter.start(); + presenter.fileNameChanged(); + presenter.confirmed(); + + assertFalse(loader.isLoaded()); + assertEquals(1, stub.getMessagesSent()); + } + + /** + * Tests if we can open the file, when it exists. + */ + @Test + public void fileConfirmationWhenFileExists() { + stub.setFileName("etc/data/test.txt"); + presenter.start(); + presenter.fileNameChanged(); + presenter.confirmed(); + + assertTrue(loader.isLoaded()); + assertTrue(stub.dataDisplayed()); + } + + /** + * Tests if the view closes after cancellation. + */ + @Test + public void cancellation() { + presenter.start(); + presenter.cancelled(); + + assertFalse(stub.isOpened()); + } +} diff --git a/model-view-presenter/src/main/java/com/iluwatar/MainApp.java b/model-view-presenter/src/main/java/com/iluwatar/MainApp.java new file mode 100644 index 000000000..ad40e1a51 --- /dev/null +++ b/model-view-presenter/src/main/java/com/iluwatar/MainApp.java @@ -0,0 +1,11 @@ + +public class MainApp { + + public static void main(String[] args) { + FileLoader loader = new FileLoader(); + FileSelectorJFrame jFrame = new FileSelectorJFrame(); + FileSelectorPresenter presenter = new FileSelectorPresenter(jFrame); + presenter.setLoader(loader); + presenter.start(); + } +} From 47907cb91baaf9f66d675b84b578391069357bbd Mon Sep 17 00:00:00 2001 From: Stamatis Pitsios Date: Thu, 11 Sep 2014 16:10:38 +0300 Subject: [PATCH 2/6] Update README.md --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index f47252648..8463ec21d 100644 --- a/README.md +++ b/README.md @@ -189,6 +189,15 @@ * a snapshot of an object's state must be saved so that it can be restored to that state later, and * a direct interface to obtaining the state would expose implementation details and break the object's encapsulation +##Model-View-Presenter +**Intent:** Apply a "Separation of Concerns" principle in a way that allows developers to build and test user interfaces. + +![alt text](https://github.com/pitsios-s/java-design-patterns/blob/master/model-view-presenter/etc/model-view-presenter.jpg "Model-View-Presenter") + +**Applicability:** Use the Model-View-Presenter in any of the following situations +* when you want to improve the "Separation of Concerns" principle in presentation logic +* when a user interface development and testing is necessary. + ##Observer **Intent:** Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically. From 9f00e00f34e6bfd6a7a79452035b03da3ff075e7 Mon Sep 17 00:00:00 2001 From: pitsios-s Date: Thu, 11 Sep 2014 16:14:40 +0300 Subject: [PATCH 3/6] Removed some unnecessary files. --- model-view-presenter/pom.xml~ | 23 ---- ...st.java => FileSelectorPresenterTest.java} | 0 .../iluwatar/FileselectorPresenterTest.java~ | 120 ------------------ 3 files changed, 143 deletions(-) delete mode 100644 model-view-presenter/pom.xml~ rename model-view-presenter/src/main/java/com/iluwatar/{FileselectorPresenterTest.java => FileSelectorPresenterTest.java} (100%) delete mode 100644 model-view-presenter/src/main/java/com/iluwatar/FileselectorPresenterTest.java~ diff --git a/model-view-presenter/pom.xml~ b/model-view-presenter/pom.xml~ deleted file mode 100644 index 00099809a..000000000 --- a/model-view-presenter/pom.xml~ +++ /dev/null @@ -1,23 +0,0 @@ - - - 4.0.0 - - com.iluwatar - java-design-patterns - 1.0-SNAPSHOT - - com.iluwatar - observer - 1.0-SNAPSHOT - observer - http://maven.apache.org - - - junit - junit - 3.8.1 - test - - - diff --git a/model-view-presenter/src/main/java/com/iluwatar/FileselectorPresenterTest.java b/model-view-presenter/src/main/java/com/iluwatar/FileSelectorPresenterTest.java similarity index 100% rename from model-view-presenter/src/main/java/com/iluwatar/FileselectorPresenterTest.java rename to model-view-presenter/src/main/java/com/iluwatar/FileSelectorPresenterTest.java diff --git a/model-view-presenter/src/main/java/com/iluwatar/FileselectorPresenterTest.java~ b/model-view-presenter/src/main/java/com/iluwatar/FileselectorPresenterTest.java~ deleted file mode 100644 index 0e5a0b227..000000000 --- a/model-view-presenter/src/main/java/com/iluwatar/FileselectorPresenterTest.java~ +++ /dev/null @@ -1,120 +0,0 @@ -import static org.junit.Assert.*; - -import org.junit.Before; -import org.junit.Test; - -/** - * This test case is responsible for testing our application - * by taking advantage of the Model-View-Controller architectural pattern. - */ -public class FileselectorPresenterTest { - - /** - * The Presenter component. - */ - private FileSelectorPresenter presenter; - - /** - * The View component, implemented this time as a Stub!!! - */ - private FileSelectorStub stub; - - /** - * The Model component. - */ - private FileLoader loader; - - - /** - * Initializes the components of the test case. - */ - @Before - public void setUp() { - this.stub = new FileSelectorStub(); - this.loader = new FileLoader(); - presenter = new FileSelectorPresenter(this.stub); - presenter.setLoader(loader); - } - - /** - * Tests if the Presenter was successfully connected with the View. - */ - @Test - public void wiring() { - presenter.start(); - - assertNotNull(stub.getPresenter()); - assertTrue(stub.isOpened()); - } - - /** - * Tests if the name of the file changes. - */ - @Test - public void updateFileNameToLoader() { - String EXPECTED_FILE = "Stamatis"; - stub.setFileName(EXPECTED_FILE); - - presenter.start(); - presenter.fileNameChanged(); - - assertEquals(EXPECTED_FILE, loader.getFileName()); - } - - /** - * Tests if we receive a confirmation when we attempt to open a file - * that it's name is null or an empty string. - */ - @Test - public void fileConfirmationWhenNameIsNull() { - stub.setFileName(null); - - presenter.start(); - presenter.fileNameChanged(); - presenter.confirmed(); - - assertFalse(loader.isLoaded()); - assertEquals(1, stub.getMessagesSent()); - } - - /** - * Tests if we receive a confirmation when we attempt to open a file - * that it doesn't exist. - */ - @Test - public void fileConfirmationWhenFileDoesNotExist() { - stub.setFileName("RandomName.txt"); - - presenter.start(); - presenter.fileNameChanged(); - presenter.confirmed(); - - assertFalse(loader.isLoaded()); - assertEquals(1, stub.getMessagesSent()); - } - - /** - * Tests if we can open the file, when it exists. - */ - @Test - public void fileConfirmationWhenFileExists() { - stub.setFileName("etc/data/test.txt"); - presenter.start(); - presenter.fileNameChanged(); - presenter.confirmed(); - - assertTrue(loader.isLoaded()); - assertTrue(stub.dataDisplayed()); - } - - /** - * Tests if the view closes after cancellation. - */ - @Test - public void cancellation() { - presenter.start(); - presenter.cancelled(); - - assertFalse(stub.isOpened()); - } -} From eeb8c58fe945b840b84046a1aad3b6cde2ce0342 Mon Sep 17 00:00:00 2001 From: pitsios-s Date: Fri, 12 Sep 2014 12:20:13 +0300 Subject: [PATCH 4/6] Made some overall changes. --- model-view-presenter/pom.xml | 4 ++-- .../src/main/java/com/iluwatar/FileLoader.java | 4 +++- .../src/main/java/com/iluwatar/FileSelectorJFrame.java | 4 +++- .../src/main/java/com/iluwatar/FileSelectorPresenter.java | 4 +++- .../src/main/java/com/iluwatar/FileSelectorStub.java | 4 +++- .../src/main/java/com/iluwatar/FileSelectorView.java | 4 +++- model-view-presenter/src/main/java/com/iluwatar/MainApp.java | 1 + .../java/com/iluwatar/FileSelectorPresenterTest.java | 4 +++- pom.xml | 3 ++- 9 files changed, 23 insertions(+), 9 deletions(-) rename model-view-presenter/src/{main => test}/java/com/iluwatar/FileSelectorPresenterTest.java (97%) diff --git a/model-view-presenter/pom.xml b/model-view-presenter/pom.xml index 14362e455..d0c73f087 100644 --- a/model-view-presenter/pom.xml +++ b/model-view-presenter/pom.xml @@ -15,8 +15,8 @@ junit - junit - 3.8.1 + junit-dep + 4.11 test diff --git a/model-view-presenter/src/main/java/com/iluwatar/FileLoader.java b/model-view-presenter/src/main/java/com/iluwatar/FileLoader.java index b89ca9a37..91c45ecca 100644 --- a/model-view-presenter/src/main/java/com/iluwatar/FileLoader.java +++ b/model-view-presenter/src/main/java/com/iluwatar/FileLoader.java @@ -1,3 +1,5 @@ +package com.iluwatar; + import java.io.BufferedReader; import java.io.File; import java.io.FileReader; @@ -75,4 +77,4 @@ public class FileLoader { public boolean isLoaded() { return this.loaded; } -} \ No newline at end of file +} diff --git a/model-view-presenter/src/main/java/com/iluwatar/FileSelectorJFrame.java b/model-view-presenter/src/main/java/com/iluwatar/FileSelectorJFrame.java index 38168512b..231128ca2 100644 --- a/model-view-presenter/src/main/java/com/iluwatar/FileSelectorJFrame.java +++ b/model-view-presenter/src/main/java/com/iluwatar/FileSelectorJFrame.java @@ -1,3 +1,5 @@ +package com.iluwatar; + import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -195,4 +197,4 @@ public class FileSelectorJFrame extends JFrame implements FileSelectorView, Acti public void displayData(String data) { this.area.setText(data); } -} \ No newline at end of file +} diff --git a/model-view-presenter/src/main/java/com/iluwatar/FileSelectorPresenter.java b/model-view-presenter/src/main/java/com/iluwatar/FileSelectorPresenter.java index d9d5d8bb3..3d1a22010 100644 --- a/model-view-presenter/src/main/java/com/iluwatar/FileSelectorPresenter.java +++ b/model-view-presenter/src/main/java/com/iluwatar/FileSelectorPresenter.java @@ -1,3 +1,5 @@ +package com.iluwatar; + /** * Every instance of this class represents the Presenter component * in the Model-View-Presenter architectural pattern. @@ -71,4 +73,4 @@ public class FileSelectorPresenter { public void cancelled() { view.close(); } -} \ No newline at end of file +} diff --git a/model-view-presenter/src/main/java/com/iluwatar/FileSelectorStub.java b/model-view-presenter/src/main/java/com/iluwatar/FileSelectorStub.java index 0adb00aad..a4b6cabf8 100644 --- a/model-view-presenter/src/main/java/com/iluwatar/FileSelectorStub.java +++ b/model-view-presenter/src/main/java/com/iluwatar/FileSelectorStub.java @@ -1,3 +1,5 @@ +package com.iluwatar; + /** * Every instance of this class represents the Stub component in * the Model-View-Presenter architectural pattern. @@ -104,4 +106,4 @@ public class FileSelectorStub implements FileSelectorView { public boolean dataDisplayed() { return this.dataDisplayed; } -} \ No newline at end of file +} diff --git a/model-view-presenter/src/main/java/com/iluwatar/FileSelectorView.java b/model-view-presenter/src/main/java/com/iluwatar/FileSelectorView.java index e1782381c..deb1bd841 100644 --- a/model-view-presenter/src/main/java/com/iluwatar/FileSelectorView.java +++ b/model-view-presenter/src/main/java/com/iluwatar/FileSelectorView.java @@ -1,3 +1,5 @@ +package com.iluwatar; + /** * This interface represents the View component in the * Model-View-Presenter pattern. It can be implemented @@ -57,4 +59,4 @@ public interface FileSelectorView { * @param data The data to be written. */ public void displayData(String data); -} \ No newline at end of file +} diff --git a/model-view-presenter/src/main/java/com/iluwatar/MainApp.java b/model-view-presenter/src/main/java/com/iluwatar/MainApp.java index ad40e1a51..cd342d539 100644 --- a/model-view-presenter/src/main/java/com/iluwatar/MainApp.java +++ b/model-view-presenter/src/main/java/com/iluwatar/MainApp.java @@ -1,3 +1,4 @@ +package com.iluwatar; public class MainApp { diff --git a/model-view-presenter/src/main/java/com/iluwatar/FileSelectorPresenterTest.java b/model-view-presenter/src/test/java/com/iluwatar/FileSelectorPresenterTest.java similarity index 97% rename from model-view-presenter/src/main/java/com/iluwatar/FileSelectorPresenterTest.java rename to model-view-presenter/src/test/java/com/iluwatar/FileSelectorPresenterTest.java index 0e5a0b227..507cad251 100644 --- a/model-view-presenter/src/main/java/com/iluwatar/FileSelectorPresenterTest.java +++ b/model-view-presenter/src/test/java/com/iluwatar/FileSelectorPresenterTest.java @@ -1,3 +1,5 @@ +package com.iluwatar; + import static org.junit.Assert.*; import org.junit.Before; @@ -7,7 +9,7 @@ import org.junit.Test; * This test case is responsible for testing our application * by taking advantage of the Model-View-Controller architectural pattern. */ -public class FileselectorPresenterTest { +public class FileSelectorPresenterTest { /** * The Presenter component. diff --git a/pom.xml b/pom.xml index 4da45cbe6..6f43e6cc7 100644 --- a/pom.xml +++ b/pom.xml @@ -36,6 +36,7 @@ iterator mediator memento + model-view-presenter observer state strategy @@ -59,4 +60,4 @@ - \ No newline at end of file + From 799a5ef5aac8f9c98d0811cb67b0ecd9430873ab Mon Sep 17 00:00:00 2001 From: pitsios-s Date: Fri, 12 Sep 2014 12:22:55 +0300 Subject: [PATCH 5/6] Updated pom.xml for module model-view-presenter. --- model-view-presenter/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/model-view-presenter/pom.xml b/model-view-presenter/pom.xml index d0c73f087..d0b71c179 100644 --- a/model-view-presenter/pom.xml +++ b/model-view-presenter/pom.xml @@ -15,7 +15,7 @@ junit - junit-dep + junit 4.11 test From 028aa396ee58767739256c24c17b07f935a1cf5e Mon Sep 17 00:00:00 2001 From: pitsios-s Date: Fri, 12 Sep 2014 12:29:49 +0300 Subject: [PATCH 6/6] Updated pom.xml for module model-view-presenter. --- model-view-presenter/pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/model-view-presenter/pom.xml b/model-view-presenter/pom.xml index d0b71c179..ef6a43260 100644 --- a/model-view-presenter/pom.xml +++ b/model-view-presenter/pom.xml @@ -19,5 +19,10 @@ 4.11 test + + net.java.dev.swing-layout + swing-layout + 1.0.2 +