From 9bd3520e5fb2d0954162ce18056271e399706900 Mon Sep 17 00:00:00 2001 From: CHAN Kenny <126701465+kenny516@users.noreply.github.com> Date: Tue, 11 Feb 2025 19:12:57 +0300 Subject: [PATCH 1/9] fix param cast and acces path --- Build_jar/Framework.jar | Bin 33397 -> 34434 bytes src/Controller/FrontController.java | 8 ++-- src/Utils/AccesController.java | 55 ++++++++++++++++++++++------ src/Utils/Requestparam.java | 7 ++-- 4 files changed, 51 insertions(+), 19 deletions(-) diff --git a/Build_jar/Framework.jar b/Build_jar/Framework.jar index aa310fc9bfb09327edefff5c68e1687debf62cc6..cab87e6c791c8b0d6fe4c97d684608e3f3d4f0d3 100644 GIT binary patch delta 12663 zcmZX4WmsIn(kAZiPH=bE;O-XO-Q8h=1$TFM3GVJPxH|-QCjUbBOD=!{}Bn06#s~JD3cE&5fzM}fgk3dI#C~%?!!YAtn5E63phbywh#Qr+c7|3 zU|>N0z5of{^q=|#k-8xpLFb>#7exPmgfFtwKjIoC>K_3>>xKL4I8lV~Bh&^PLSC>B zK^ZYSz*FsD(SJId+=I1^gv7{6h?!bOgRCqJw!kR-s}YSb%EBB8ZbE=G<&>PJtzG5H zn?@Djf_6pTPQI==a6%|g-BxeS+D1pG!=@?I&aSB`QatHhV7rSgog94d-Rm^Sqx)s^ zF59KsWvjvW=OLd1p(l(`ViPwAydb_8(yj6*K-mh;8b$<_=tH=puM2xt)s-Bj&nfop z+^GT#oVjE>*%%L)f!QK0zJFg@v*s5+N%|#J#AOe1C zcgCAzp7eN#BWIa=1jrlkx17$&hPtwh_R*XY@DdIPc1VjqDamG^L-NIr5|k7{iffWs z07%2eS$X6{@J-)sCVuE_vD&H^5>qMf+?rL>f$Q@1^@(NCQ(q#uwMY)o^?!NzhQ48C zVKxyC+@0l&`N}+tex?wNuV+_~e;M<1HhPn z;liL*EX+&sm6G1A7GXk<>O0)XGJvb8oD){>3kNw+XF%FnKR^SYj!-v3ePB+qQhS_O z`rBT}G{S>dGt`4+%r*0* z?-MW$(3Q8q@!o3>29v)jtZC%n^Ma5Ep3O;$#A%GajL?MIzxpO)Cv zgH4*-H_XTS^fHD*6fQV`5V{teYxSu%DD$SL3Pe;RL64lJ*4~Rh3&sO~1~D;TY9&C2 zz!!tqV`&GFw%Ynab&^;67cN4QIx8)FwnyD z#4ad$r|NOZf)%SvSkgr6lJ*(;dqtDkxo*uI@Y)NyWe+K%n2N}zP<44|zA5jhM;9k_ zFtSOiWP#hf(UtFER-iWS#>S@XF*$mbgK@ate)7CpDy z3gx%M3yH-&eQ2NBWxynOI=gcI4C14&MA zi>>c^pT{-1%@Igng=TQZezk6cFX+5lOz^$lQb$$rzMHo{zx;NcL72qa2J~7xU8Dcb zPN?>9Q~c~!j+Ny>b53nEaeVyxZJLd$$4iBjr!2_yju!OiKE+KHuFpvb2Nefv^=Do` zj*$EV4C+@XOaPISM!RBu3Y0hep+|PFYklw)dR|CHY#w&A!XQ0;4tB3oeOEWoeKcAf z+XN93Yn!{Y9%VT6>jW{9oVIKN-X*Zrgl#UBOKVSLZsVM6ii|Fzc9{{^Xm95`W(CRIQNuUBVaVqe z76i0PDyV^eqx46giZVg1JN978YS^J)(OhLEIB=NABcm6wKJFl&MxE#2tNM9C*MAYu z4gOVJ#1Wu@DEM zqH;QFdExzfUpt0bg|2criW5@gj#(XFlT&swGQK0~A{0@lnYfE9j+O-5Ea$p!nl82$ zAY>7jNWv!Jn|T71M3w8~Z^jVEu`82TpW^*nfd!VEoOEs$COurmO;Nk0l zMrbLGoE!_vEONExip2+at^qb4@JpJP=Z_EvO-*KIn79cCkwu@F1g!~v!X72iVRYRm z6#$fDwng8MYsw+R1vD!ul8=eGbND4m5-V?d#Q;+wgBInnt0EO<(g-^)eTE{kb9K*0 zMYP1w#oM_?IA^<$jz)LL81~i=&?L1@!{OTw^0`}pYExb6`p85KXnjH*0En1-N)(Gj+(dDdik69}e< z$c4^o+NwGzO29rS8HYj6WpFlGQQ;ePmLSFzLN_0<9+E7V>%%Gc>49o7@Yftp95{SO ztA-m*hHLkLqa+&fY-Vq?7YIk+v#Ce+mhqtd&7au_6 zI2op3&@8rMW_sdSR{}~DEnEK(L9wE&J$E40(!Bwk$4-4F9WFgW&NaVlC4-f2|N0YX z^o%9YkgLtpNsCxAn^C@R=7;3!TdahC-RGUgdsV^SG{pES24DpxOb6YhJyH7H9*=e>q#&-F~6-xXCKLJ~&`t@uD2d|z2 z9CZ3Va(D5Di-5giG0cfLCZcW`#|@9!pjOp8?q&E2NygClI4g*@qu0lkp|wh7_ABx# zrfHY1>7)9|bnGna;d~|m>0Jw{Duf5iAZ^YKS)iysrg9I0JMP`u;dyGGXwQ@76?K}U z?NcR%@#*;2w=%zle82&Z4C5>=F+t%TlxSdf8g!)9KvSB4?>1bEabSxbx`&Cz+AV?6 zMlm$ZPbC)0<@CTxOC}W)Mg3!uy7C!)}pAzp~0&r!K*qIAZWcDI(GFulk|*-7RBsDni!Rm;N`2~ zL}oK&9}PH!tVwm3T{a^#Tb+dtf7KGgQGFO<>&v6L8TD5DL(EL`EzsufK2TgtN|O52 zy-3RezX^O^10Xn)xag@U=)W#ck82HHoKKR{r(-lNH18`hA(e49+=!>Icrndaf(X9?E+MM6TJS5U0-?Ed@$lslY3TxK?`-O z0*NJZv4;q{xYJc!Rvi2n(C~^QD|X3Cw17*ShSu9E4X)f$Y4r%kyox!zo^*^>Nmx5M z?)c&)d??YhPdp+*sfbV6Nbp?MswPu9jm6559S|AX2T8|No#r&9b(DDYm5Ejk!t8>x zFuH|ppiG$A&(N#P7$i`Q1%pC!y`_BkQU+{Gk2BNTLfXwPtEpepMyQ~rrl>aqy_T_& zvA&uT8e7N33xP@jM)$R@H+csaviR#su;=OvNqcAini zYXDK72@4ZObaTBsYTs1BrTuq7YpgLYihY@%Bzg$Y22SKR^ z;T4<5{A*zdZu*1TbK#^bjwoUdFu%^6006&S;jxTYlt)a5E>SAgQzq4Rf zR8sS9JJggnifF2Wp!s|EN`Ak%24t4<`7 z^GLowgDx!ZKkV7U(`1cw+#2e`VH1d`iuyCZ!)A#!5Dj*6^mT%3f}9T&U}!%=-KlEM zDSbk8ul*F_!TuEV=3j+%E>;{Oh9{lLTNi<_gX1 z>6TXcuvQ6}l}VF^F#Pt671t+3^xt0gVnA4<(f#5s3deOh_ynAkMB4r4@0;~P5}>fr zj&8CsI~5=~&U*Ys!2O~>_`ds<_N@W;CQG9^_e_)}dLWZOo5R0LNMRuRz7J4+=usNA zY``N;3-rsmnO{r;p81N{gOb&!qiBcG()UAZ0+VIAJCfKYP==j#Lp%)WGqiLF22joLWo**GD690zAxw6DNJh+4k4`piOR z@D660#ZUHGgyePMa^#l2DHjkyc8mUt=B5FpCoXqvI(#)`|25(@Fl;3`gR z`#ulU;E8Uv)VOM6k<)N|sAWu!GwS5*o$gtpflqmF@-;j+?PwHxFCN@yp zIJhYGx$-9{JZ2*-Uw%5TjJVjn(}#n6#X z9zKB^A@7@1o5#JOY)e2nozIwKt_9TKvFz_BboB>|&3ADYAC&Jk`57TE*FV1rMGr51 zW`F?S|4B^z?ATTc)KpAA&Fd-Q3@P-poTDP-V`2Q>le7#`714rl>W~ z`oW>5E~BF2E;P)FX1X!pS7te?xSrSAo&w6W_o7sU8t(ug?I$hKn9wGDXLSN> z!aR{H9C1k8Kg<+5MM(tyq8dYJOs8vRm9!tQ{oxAg)PrzEvh}^s%#&Ee^D}8{3SG^f z8=qhR@(!af%+DVZ{85CScwD<)8&Rph_F)7=3Zn*;qxwI&k6~<3K0HMMhb+uE+$%Yq zA-g{rX$yQ4Tn+31$h&R;Z`~M%M;#742A}8461VXeKF3PmLdU?3b*br-_Ji;1?a!*q zX1}5;qB%8~6}(En0avt!Wu93jIS=I6of5uV0td&Is8)J0mWT& zs3zp2bfa9T^I<=Fj|*RKEJDCV4|(wUY>S?d)AXL97~x|83_gS=hpcijh6vw7%VV$^ zT|);E7+wi|^%d|+eCGoVB_K|o;g_;MoU(jsR?U51EtKVg+I%IE6( zE#V8Qi)3zjwX}3LXhBVNHJj#!4Q&sYVSW6)I^KysuMcv@lda&TNq+~i&GlEOL6JE% zlg>_B0Gk~UuqH>MV-v+_UPRdll#)LtJCOO+(K-B^p)}}?@0bFd+<#>8l_eJv@g7;COefW4uYYo5p^mZ23K zKIoUp1+MmqinGFMRR?pIM(EL1>MC?mc&3H3)*f9ZU@;@1jb1dwElaBU#>($N?e6r< z?u4&hadLlxbzU%HbJ}`q8j--Ti+faaCD!9depGsfGUa!4u8^V(iud>dG4e$qj%{}5 z?gP#lf(!$jN>WAN(kQCeJll}fHKF(_NCiULKEs=dRv*6RHSb0FBZ>BY8AVDgkZ8yx zC#3rrpk>L$(5T69Kf{Qzyp(QBJL%&&tt|Q`tToXX!YP`$VOq@dOS zsbGVnEeXw4Z*gB|T?m_sb4W&ga5DpY%ISdIU7qezF?l1rNuz}7&NKL&x%K^kOoe!+ znDBb7r9)SDT=V9|;gavFs!r)ig_q*+(j-s>(96{t;2`o|VNO6)`nzYS`)vI@Dc7`2 zKs@8Be%2?W>G9>bA6YX#w@;D>K$kOgbdA20lZ&5gn}>R6Se@*EDdcmqiK}=%p1R0FpKq zl?YsOdLf}vwbAL3pdQCI5etzD!gXF{M5SxRLi{)=enQEva6?NL?{_aUVk?XWRld}& zDM4f>-8UF)g-8!0913c>3U!9jXGrwss;@d(KB1iPWfnkV8dYP zfywEteq;&<4~q9Ixn40o>5A{;fFl6e5S^{2!4UmxHpMfC`5K^B>^^@1=Q)MRT zX~#<%TKI-)gvIg-y^Nn*0HmSNF<;Z5dpLMpHa?FOQ5(8yDa)h{TyzTV|GG>K445|$ zAW1iF&O)AOlZtc5E{Ls$vw^#J3(_p@x5#cD&9KhyUf~_6(6v?9;>hX!QmviX^|}N} zUd6WT?UHR@W085*cIchcmg7(py~JOWDU{l2trjd7pU2UYH=}K+M`p_)a{UgXBnu7W zA2!{si30-il^x^{4-WBvS{{(xi{Kv(i%mX~zt{lEAM??{Xh;ym{imrB{?H`O3DX0b zzQB57Sm63o*|K(I!b)@Mg6g!y&FPxbh!?>YQxe#jqFaIs_ZB8@O0$}>H2{GnLW^q^ z4}%TXeJ>DAGCFRseJYJhL0Ci9UDaQPUIb^MAAVbyH>{eX&m6H#CuRe>-(R+_-rfKT z?>6V;U)^8XqR@Z|s7gu^tgz}Gi>LsO6qV?JmBa2$?f!VBW(h7=i|Syl2gEMcKs0OJ zlBmK`g!%!mMs89% z7I?6Wt2KNIioSQ4a=*XL7@xKXeEjBcGL0T?6`q1gk-^;z|@V#Y+Jx$o{#LUwzih) zKYTWpaUZf!i@TeOj=a#!;HB@Mg#Jy_Cj&X%OIzW{o;ie7ojbaf%Yp_*);u(qz&l^j zlx)ILlRR6IhiH>_YgLPjkGE%;5^Qs3A(1uKt)+=846;n;iM1A9PALXhl@601#5ma2 zSg=(NNH>~vuGTL#6yTJKdy%&Z%D};xnxbBq(TTx#ER0fsoF1mcQq5O@70xEAh_R9{ z1M%pXFI9EIZa1^ls1;||G^K?{#8bPlxBE`!>7X$aR4o@O92m^=Aa2vZ6{@BLd$98D zhyT?=r%wN)z9->W3?ktedK0 z*P%m5sU#VX#VE$;OSiV=Cp9WXJ2Nx=IL_AU-MQeoR?|7!>j;ShYwl#0 zFw>;dhq7|V(VqS1d%v2oJM0dpKcK)Ofe1-CM-XVu%421H2n7WQEj&OP0sCb?ziMe7 zwg2RZV1i5liOaG|H}Bei;3 zsf*yRM4EMRDd$}mxE>-!A-?uv%a-iKu8e845x{5Gsn$1feH#cqENWO?#BL%a$D;6C zq3;b2^7~*Vx8DUoF86|Mvigd?KtOEhyYjU*0m_E9_Jb@hYcfaJvTU3-#2Y?lC#-{c zI|D;EYps2EERg!LMv( z4G)JSkw}4@M3wYq{C)VocJK1c@JzH~^kxx{S5&u2P^KX>MMH@vs(6u6`C|T@UN%?M zIjZ!==S5BcEM6UsU-yQGKg6};T`4BNnZ5i%uOJhL&fu4cOBKc~OluedI{JaHsdbMgKdRpHc!Uvw$;ih(GY58UP ze?siO0N@nh`;kj{vb^a;pW<8Fanzs28c9wNf0Uw~a%rZd)D_Uo*B6e-C86^RU$rfr zTlVDOEO2x;!es)6pQISjs-MJhdIrCnzG_D;ZA+C+tmomA9mXAg`TCQlR{3G#Ehl{V zIZFTDUM-rOuZ+?QIBo=2H+RwW=*>|fUk?M_pFE0GeT_os@#`* zZ4r}4v*FZYU#4*}&7&sBe{)gy-s6+neNvvK+OUDOXp0Nj%RW!oNOaQg zKVWOPO?ympf;?-3`0+i7_{%HA;T3B4&{Gmb(+y71OB;1x=r5f^G`btqH(DZa!3dvU z2!LIaC+;3>YF)HFHnFuf^f(U!(Xum$e!h$t;S>E7@dFaIT%pOB5*8q2O#UMY8g|T& zTh%}9(rum7i(fF+psacvXTt2!#;Z6rpfP*t6gUHJZxx)iK`84ZwHheA5WC!*GL{V0 z3<5E&!9m9;m6_yO{mo1D!)8rpBXxTH)ByLU@upkqg(X8fX4be6f0W(BHAAd{b!0O7 zGOd-+cL8^tJ00-;_BA0apOI^k>HfnPoJ=w?zqHgzq?m|?&d*RAmJddtgA~-G)2G(n z9UyndUl=ruNqCq>D8B))d$Kv```r3^Z4^;6CutZzoQ`W`HQSR(L5bR+imF6-@cQYq>|5wq z6GA?`Caq`+s=h1e1*?7BtQ+X7@d|))F9r$MXR7d=U#1nWyzht_EpHAFk4fg@&Na+H z(w|{VJh|AHlgr|!fbz}aCZU%>Yh$tN9JG`7ww-*iAOWLm9R3wwyGin!_N%@p#L)|!Y%3kFFC4{;Rc+qggfWQf#*8GutV@bh!~>>T?DT!?KkPAGt6*ra(L1TT)a!OMRQC%0*ZfGclAHn-jAKcc{93J>u7 zqK!JCPoboyx~>{%oMd@@LLI`WR5#Y#A6^oDm@Lg^G!oUyLY+61{T;07f-hQ6VuLdS z&D@vTc1<3&*4LWV4IP98PU% z!Q4v|of9qG9FfhcSJ+6Eo`Az!r@A(sV}UuctR_aRpxH=gHq1m@f?0Az7l=+>7zFI> zUFGo7um6pQtD3GpS$s{FXCkP8?I?-U(R-ieIREvD864h?zTY^&m~MBFrWR0fn8cy?oro-gHm{p+-u36E`@c}`@j4tx*XsqXxDFVI9{hXwnxUHU9%y)+R5iX{#bPyGA z3@0}vF!dJ2F?YRd74*HT{U!hkZ77pRB6S}f4&6^mg5U53vtr@hs`|78tP9$f5JI9` zS1XNUs6^e92m~w5*Mqb0^8J=b?ej6Qtu#vu5wYQc*-AQj?8f?wC5CYEJ{J4ju5dgf zCfekM4$HFv3Xcg@$9!@=pVnkMkCqnf=}^kpw&{g8^7d40lWfh~@Mr-kry1w%4zd$k zWSc8R`H~~%uwLTbaHz!0XxWGMI;Zxtb(rg>0?N$IIdk|k*Wa>APWHbn4IJ>+#Oclv zM(|w};qXD|uBSfL5_a**-NSmK)zzBG0^zPrbx7%kdywd@lUo6+Q#)p9A_a zMjQQLN8@5DYjyI-P07!R$g;>`r)f}jg3Xv^#w%|m5SNcV(YNRwwKeXDSo<};vzhy>z zRCps%f8`0;Mw3PwZ+D*>$-MSQB%Zku)_PHgY+BLNdLx`|T}9)Bmgn?sJ2xjJPO-~V zYYw;%uG;?1Yd-{#g!yE|(I3td?GI61&3YYs^3@@>WZR?a#OeqQ@yWb%#v3%fWGsM6rdzXqXnKv}cnRXtPiH_VnpfRwv>pnMOaE zs6At!UaQVPZH$j26ASRkDssiVr}L_{qs7*8S4|&5u%-)OFaj<$dmINmf9`f_*YL^F z^A@BRARaqOu_+uQG?H+~87bOjQt^^B^&0ihY@sP1~>a_K@P^e>@B*c7t`;6OEqjufq0kNDZKZheUhysf`~V# z_0O@e2iXBPQK|z#KWTh|wrgO{&V5PdJ-W?hFk&(f(%oBYx5Gf$Kt&)jiGH%Ps!-CL zRhnS)+n1$kYj=HDFL#YYG8(suc3ZN>%7HMNM7$g$Fp2N$u!u}|wv+VdQSKC?;8O~c zP3)ZjTBY2cWzHNel0}Y=XivZrgZ_ZD+wycHv71XvlD&j%m@Y#%*Gu&EsnVz%d3|Gq z1mmGbW4WE*QgCQ&OkI8@d+ccx%5?r5#v;>!X18?O;W!vJU&YWcfhF58&lHTzZhBz( zj2O$nN&Pd~x9ljktm^kvk9%&bpGYO}CH)%!!ouD7_0FJRi_!A#9U9#!@&hCnXoSou4{|%U zPq~wzbf~qY`Ih_&iUERCxh=FpPp`Iew$KF|bmlLE1T0_B@18UD!+9d zBE^8Mfg5s`fvMlbOED@au?`o6Nz`xql!tw{(DZyw6LD@w$YMGPe6Cgf-=em)dFYP( z+(JK{o)Uj`NA796cJWsbM*Unm5KWr|$iwT|X|a~X?-^A6iYHwe`0gKq&m);x!*I_M z!ic@F$W^4Yq?Oy>7=i0yth)Jo=9KQ02I!CTMrMeIY|`hS<&VJDygyCYhs#JHvUklw zznQ@2hB47wet^tT;&@ptC5>Kq)oMlySkfv6Ax8S@S>|!YXZxo(j@^T|8 zuizFx%;?dHvM4I*bf4-(fWi$j8*bEvzIgu8+j&uI6E`{=6APQs{;xNQEnZPqP8P4}kx0~Wf~2!S^>80%Yv}Oku_JcJF9F=o`JN;c zoTx{#SWjiY^~D`{?-Q8REp*)R;OpOv+{dlO7PeGRT#ppg`;irw`_EYQv?_r8p}wZ94b`p#E#ZR%t-~`}p)l z#*D!rS}Jv7wUFGdHay=v;vT9QEDR^XaB0ksc_E7~vBxK8#aU;ERV>Q z8X9o9R%%b4zt^ta^qsEvRYiWN6gj3BKf2I(HKW4Mh+}!Ul;YQcWnw~ExE#SNF^-Rk zr_b*kPX$GIh(zaT0Qi2!!>jV(?JCboyEDj())maSKfFWg3o#!-YP*dQGtNb6(E_55 zGW_TtrmsRJ5x6!YnKl9vzD0CgiaGr@+MuEcP1>&|uilZ+DQ+ zN0C%rYXjzkU^o6#4E{R+{@e85063*t^S_J1w&lNiD!3H_^52>EL^MzC50v-({P9Gr zC+7!_dP;mCs@Ffcs+aHwpXw#_fooo(ANa{z>;o;l|Jjv$^L_9~-r^s~ix8lw?7{;Qm_txikGe6Jh{9CocaV3kOp(Tc*ES z43Ph+JZqEr)=0^Kfq-y9f`I%v@&8%^{D~<1_=)5G2p<8i`s0I52`1(X;w7R0{)zs2 zJ{1N5QFpbnb@~51|M$HO|G)f#fFOw^?g|qoM*nX&Spa-6CfUR`0LiDn`-J+hKfs@2 z`G2i4g~VPNyu>gsgb%~vLIy3tKcUM&{J9+dml+61xptz^SK<$&|CayXMwEJqfUm?K zd&~cd52mh{*!`91gT4O4vYRI&29STSv7Y!~zbzA$18_fBy8wJJN~^?(0NM}s&mrJ$ n+k$|YIXgQz|G$Tjc=pE_+%6F&Pz(&*Cs84g1PaCXZ%F?O5}Nno delta 11607 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 diff --git a/src/Controller/FrontController.java b/src/Controller/FrontController.java index dd09d1a..34913bb 100644 --- a/src/Controller/FrontController.java +++ b/src/Controller/FrontController.java @@ -152,7 +152,7 @@ public String getMethod() { if (returnValue instanceof ModelAndView modelView) { handleModelAndView(modelView, req, res); } else if (returnValue instanceof String) { - print.println(returnValue); + res.sendRedirect((String) returnValue); } else { assert returnValue != null; throw new IOException("Return type is not supported or contains error =>" + returnValue.getClass().getSimpleName()); @@ -241,7 +241,10 @@ public void init() throws ServletException { } String directory_controller = getServletContext().getInitParameter("controller"); String realPath = getServletContext().getRealPath(directory_controller); - String package_class = directory_controller.split("/")[directory_controller.split("/").length - 1]; + String package_class = directory_controller + .replace("WEB-INF/classes/", "") // Enlever le préfixe WEB-INF/classes/ + .replace("/", ".") // Remplacer / par . + .replace("\\", "."); ArrayList> controllers_list = AccesController.getControllerList(package_class, realPath); for (Class controller : controllers_list) { for (Method method : controller.getMethods()) { @@ -255,7 +258,6 @@ public void init() throws ServletException { Mapping mp = new Mapping(); mp.setClass_name(controller.getName()); mp.getVerbActions().add(verbAction); - road_controller.put(url, mp); } else { if (!controller.getName().equals(mappingCurrent.getClass_name())) { diff --git a/src/Utils/AccesController.java b/src/Utils/AccesController.java index 46107cc..aa1609a 100644 --- a/src/Utils/AccesController.java +++ b/src/Utils/AccesController.java @@ -5,32 +5,63 @@ import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.ArrayList; +import java.util.List; import java.util.Objects; public class AccesController { - public static ArrayList> getControllerList(String package_class, String directoryPath) throws ServletException { + public static ArrayList> getControllerList(String packageClass, String directoryPath) throws ServletException { ArrayList> classFiles = new ArrayList<>(); - File b = new File(directoryPath); - if (!b.exists()) { - throw new ServletException("Directory of controller not found =>" + directoryPath); + File baseDirectory = new File(directoryPath); + + if (!baseDirectory.exists()) { + throw new ServletException("Directory of controller not found => " + directoryPath); } - if (Objects.requireNonNull(b.listFiles()).length == 0) { - throw new ServletException("Liste de Controller vide =>" + directoryPath); + + if (Objects.requireNonNull(baseDirectory.listFiles()).length == 0) { + throw new ServletException("Liste de Controller vide => " + directoryPath); } - for (File onefile : Objects.requireNonNull(b.listFiles())) { - if (onefile.isFile() && onefile.getName().endsWith(".class")) { - Class clazz; + + try { + List classPaths = new ArrayList<>(); + + // Parcours récursif des fichiers dans le répertoire + Files.walk(baseDirectory.toPath()) + .filter(Files::isRegularFile) + .filter(path -> path.toString().endsWith(".class")) + .forEach(classPaths::add); + + for (Path classPath : classPaths) { + String className = buildClassName(packageClass, baseDirectory, classPath.toFile()); + try { - clazz = Class.forName(package_class + "." + onefile.getName().split(".class")[0]); - if (clazz.isAnnotationPresent(Controller.class)) + Class clazz = Class.forName(className); + if (clazz.isAnnotationPresent(Controller.class)) { classFiles.add(clazz); + } } catch (ClassNotFoundException e) { - e.printStackTrace(); + e.printStackTrace(); // Vous pouvez logger l'erreur ici } } + } catch (IOException e) { + throw new ServletException("Erreur lors du parcours des fichiers : " + e.getMessage()); } + return classFiles; } + + /** + * Construit le nom complet de la classe en fonction du package et du chemin du fichier. + */ + private static String buildClassName(String basePackage, File baseDirectory, File classFile) { + String relativePath = classFile.getAbsolutePath().substring(baseDirectory.getAbsolutePath().length() + 1); + String className = relativePath.replace(File.separator, ".").replace(".class", ""); + return basePackage + "." + className; + } + + } diff --git a/src/Utils/Requestparam.java b/src/Utils/Requestparam.java index fce4499..74c00e2 100644 --- a/src/Utils/Requestparam.java +++ b/src/Utils/Requestparam.java @@ -70,7 +70,7 @@ private ArrayList collectObjectParameters(Parameter param, String name) if (valueNameParts.length > 1 && valueNameParts[0].equals(name)) { listOfParamObj.add(paramName); - } else if (param.isAnnotationPresent(Param.class) && valueNameParts[0].equals(param.getAnnotation(Param.class).name())) { + } else if (param.isAnnotationPresent(Param.class) && valueNameParts[0].equals(param.getAnnotation(Param.class).name()) && valueNameParts.length > 1) { listOfParamObj.add(paramName); } } @@ -114,12 +114,11 @@ private Object castValue(String value, Class paramType) { private Object getParameterValue(Parameter param, String name) { // Check if the parameter exists in the request if (request.getParameter(name) != null) { - return request.getParameter(name); + return castValue(request.getParameter(name),param.getType()); } - // Handle annotated parameter if (param.isAnnotationPresent(Param.class)) { String paramName = param.getAnnotation(Param.class).name(); - return request.getParameter(paramName); + return castValue(request.getParameter(paramName),param.getType()); } return null; From 5ef59ccaac1928501c1e88a0acbca48f9affd736 Mon Sep 17 00:00:00 2001 From: CHAN Kenny <126701465+kenny516@users.noreply.github.com> Date: Tue, 11 Feb 2025 22:44:40 +0300 Subject: [PATCH 2/9] refactor an fix redirection --- Build_jar/Framework.jar | Bin 34434 -> 34710 bytes src/Controller/FrontController.java | 4 ++++ src/Model/ModelAndView.java | 9 +++++++++ src/Utils/AccesController.java | 4 +++- 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/Build_jar/Framework.jar b/Build_jar/Framework.jar index cab87e6c791c8b0d6fe4c97d684608e3f3d4f0d3..37d1eb30fdc6fa5bdbc1e48f7623d3d2d823f075 100644 GIT binary patch delta 10533 zcmZ9SWmH_jllF0!;O_1gT!OnLxVtk94#5Tn3oe7Z1b6pf!69gHcL@#w5@aEJ-gp1I z_rv|&r+T{UcF**gs#6V)fk}yjK~qhRR0J%X13ICrqLS}vI9)+y@PjbSN zLC~;J|2f5lLPA1)d zd%FgEGGUlESwg`J^3(iz`}`x57RddXD!x{Lk`R}U1*`lEaskz^Fc~nVZIl!@Ei6Pi zEuC`F-k`1u&%r^bx7uE%t{FULDxT2HUNyh04R8Q7MFCFBtBfj1Ud~tVthp5szPxPI zJoaV&J#+ohcHn2z=Cxnff=LQ9W!nU2+G|5IDItaex0fji%9OgaEM>=v1;&IyJjg~Y zz1FD3^j9$?dVk65&A8<(gjd>M?7(pw)^%EG1v(4~rv>7`50K?oH`{t!c`K<2 z^k#c%zNb(lTVD+`Q&x5#YRBF}(8;hZt>~(zBZ_lx;@7PHZGru>%~`C7X~>drZkBT~IS_^`5+wA?Lp{0O7i0%2l(86rO@ zWY8B8k`SPLJ)>(Npudo`ww4Ezy|t-4jthr|3H(!rcfuUkWaRZ3s=>KA#s?8SO+|g* zRALDSv}HL@UF7dKY7a?B+u1bClEZDPh|AGVXxiH&;R`i@peIXpIF9fA=J;wudwht$ zHWwZ9S+F3mWGXsHkw^qzK=+Fb*d;rE!c553fw7G~@s}w}0-6UMPViUxV1HX3C>7m; z%LBh-v4zB+$6q0^w%@rC$Ljicua2Glq%0~FL69krqmB80>>|HzWBPaGr9Eb*!CicHnIxqf2tc6Bnjn z<evF!>nd#|>vK{3i8o|3#;Qw+$8Q^ z1h_D+2-w1%inv@Y8>v^rj7dz~YUP6E2b|lcZKxxPb!}{D)6rVWIQ-Xo$?g#>#Ld-} z@v}rMae{X|gGXITg1Z(E27`EAKrtY+Z95TJa}SnMQ(&INv};SSuQSIJXYh`5X2jKH zjyBHIx|Yi&mkUH&W1br9{}L#$@1q6fFJQWp7yS1!&~%&2PMzOqYYacreO6ILg^Y4= zx*^AWUji}wk_|k`W`-}_H_f;0`5+84-a~e<3BX?PA{7Y<=c%0eNOkoBGUr8d>0bs? zkq>wQ{3d%XytCRGKz+x$A&I+H`W@zC{hG0XH*nWR+TvHtq91a;p6YT)(^Q=WrktTv zQ3&4G6}zxmHa6Q3>Nj->JMP$FyDE`iJN~jaAVW66@6ouA2+rNMaVpOwPz-b3b7fn) z6}fanoZKQ%_8eKncGDFA8D~R~MJ9LPNxEGx9FnV95od@x*k@&-x(A~80uDCs?t?eK zR;~fjWoQ6SZcQtiXemzULo_5UnZ%+RA@gV(t;r{jj|tpX73mDAZTa&PGTz7_&kF(- zu#8L1b)UE9-^wyo zDI+hQ7ZjcQdp2HYo$>|3Nsg!LGPxc}aKiCN@uAU1H9P1eKp}5bASykD7raCh7k)P@ zF2nEvdeiVFch6=Ia5X)El^Xx_tj!HS3qF%MBfQ{|jLAJsK_1UPb63#3+&cW>8^EfS z4Z8%EQ{l_$7ZVgvL^;#Vj`J$+$efa`l%_^yWkZpz_{dCJj+H5CJd|H^^zc>Ez!;Ap zZD3NgyJeELXn_9Wca(i(CO6AQ$xjuLDe^X6b8{9&7iJRTk#*9+TXr(oNteya&b!j- z!);HostgPgveEaR8tHMw?+_ZZI1(YcKa?Hp@Sj zrjuC2;BH5#TMu_Q3ic=PG|>|BS|V62Z8k^8k8ZKbSrgSTAR@s0^y#8O=N9f5MQbUV zU5bDmt98EuarW)FbfNIs`FpHNj&@yh>+m(C((gs*72D1^=anE$HM$XT!Cv>vn zZ)BC8?1!+cMl4LM<)F22D_5e0FSpL(9R&qe2Gz*3rzkmoZlO6(xCJu}|5bP+~>?|tgN3mo>8ev>Dmzp^#Qrl&3!Aaa_Xv0M_qn6ZwbJm3_jA2=L zGR#U4PHeu20W~XUJ@+XEFQUwrYW;yQR{sZ<&+vqfj2wG~tzwW%bB{-1-S0&B#AGA3tOc2rD4O>4XPbyIi9?-U*~y8~2GN~l4ajI=ORCSe%<7NX5^+s!Z6nC9TkphH0q%{#c0 zf7+fV@mpI(&x9;Km%E?%oiEu##xDgD`F=uCPxG_G?NC93Z({E<^l?T{uh8Ybl{Np) z6uuyzz?7+9Nbq+hc))C3RSjRYYZIaK2W3rY$%pTf-}=7(hsIW=P}x{?bzdLFW-ca* z$zj+YeagCE{&Gv)52MTUx^{uat`Cv`0CaQ`BAFnoNcls%Z({ISzK9N)H779XT;NK* zUGm6AKN7}~Y46fJO7YG}?pw)&x1)hT@8enuQ;dG;FY@K$TDqC_0qZR9Y{8p65Vvr+ zHo|Hx-?*J=o~`+=4Xa(OduZydyA#roj-AV(=?bX>x{OZvHkSXL&~+jimde3U`EvT@ zvN>@aT*V8)0(r7B_?x$P)Mi@C8f>Y?mB0dOdDvulPCOHD+reY=qGT1qNCpsl{^Y@M zgV1?tejKm7+~uN)+2;NTyFzjeqz{vd(S*GdpDHuQ4y!WQ+RXd6{qu#FqJB2YAO+cT zc|=+UcOFGK1+T4MY?6}uAmX3H#h`doy8T}BV|6BL%(a%jsgMJWe)o>1x#%_-KC54AtS=?yJvqmBRNrenBm zb#tr1!OZ@e5BsF9&s1_!q;M&HmQhjWIKNH!czuvuP}oiEns8WRkQ=TTK<{8sBg}== z%6xc$G4%y=sV>rYzvpMaG5;r;{hsrfEB^LmpNrCgZwmD}`7j@gb8fKA9;Y#pnzc*~ zM5J@(KA7oM7L_#h!&?vDfgGd4M~?F~@f)DL&cn4sw@>w2;+wS`+4pBr@o}h5^Ggj9 ztk-Pp@ff3+oV~QSM2{A&`0FgKNf^;R>(JIwI{rrO&t`;c81jD|xUjcp$kD=Jp$*3$ z(cENQVaCzTMhg-X!Z8{~6W zCnXj$p@Utm)O5IKh>Xd&N@AYtLo-W>wr%t_xL8jk=xOG@Caw}r4-44S5H(#0w3P=R z<K<8Znvo#je7t&j*yk-1YX(|{9J z(Yx=3dr8H97L_FxRgYPMd)qBP@W(xZ^w;svB12XLh&edCXv{wwux1@*WUyiaHG`mgpKRTVQ+&+sQIrGnk%}k2`iw~o$Bd^Griw#FllJ5k;AR-o(JXSSs)FiiRSNR)v zuc2*)#7$}$8OE7pM*a_Ec~gd7>}G>`z1lRG!Ph!Qx?(%gvy=1_0R~AVn4`-8Sz@3~ zm^#GN=jBTM^9ML4b4JD5W`It_S~6T`hojiukL}}Q0f*3O?GJK5BZZ(QPE)pe{FQlZ zL{v8XD2+cKK}R`fUGhf(e>*8HN#&g_JYx=3+|%1l$momTXS%t@GC$j*@}BIc1!Vcc z#Yt;05(CW63MR4#jEsx}<`@%!pTYoa1X)6?34jwAH%Z}nO>OX*rLrs*tNFLU7rDIe z0)vFnp~DuAdRGFuvt0c*8$rOdNpeSc*_^z)a6gt}P|dDe*YMp#Gp^V-Se)|TQso$Z z#vK%)cho)m@_b6?GD~7o_sIQILkD)l{hIaF@e~&mE~#UXE2)6}k+|KVtg5e*2O`-f zx>`mWLhPZYAMyj2`j0Lw+NnOBsos3CJz@I1{Ej`zW|zV6R)bD8J!)jzrcF(a8!%)&0o8_cJ95r>1JfnN(4p zSj{o{oYukZmJ$9ZfheF=Zzt{#!RWz1kEYLs0-zv!(J#eKy`8XWn7@X$aWn4VuQhb_ zO(<_YYbirfkDnw!6!S=)`H}|b_@uI>-)i}E(4zw?4hrh_B`Ym;M2n7L4Wc;q!Y_s;dvj=SDH?tu z(~Tji3sW=<_is(ZHUfuVI6b1BT#^_@>VWDb;HtPW0Io30MWmU-ZBnW-()OR5pM$n) zy19s0y5mg>-UTS$b#{s$m29d!BtK@{r^g-a@?RO4dtxzlvvOc#{e1`7aLLIPp}F#X zfF;}3tk$O8W73}yuo#niZ!p>V#rlM<`gVk(OMTPz9w*`6CU~jGAkCt1O?GF6&<=~#7l6rlTUSF~QbD=e0 zv@Vu$_gjt=%r~2&A7inh8NGl_A89RVYlGr-Nt4{?e+#emv)6CnJiq){|LKu$%W)%A z&WWaJdFGsikgc5QNrEE4w%4kWgaZVB3fw9)O2ci$++m_NF=BjoQ*xn-0^h#q%aAgZKNSw21ZJXS$?P^lKk^FAtuu&4U00kZg4YPk&U8TT>M#y> zQP-OiOvXwdi)iVJ5G~O}B?iS7qptouHey6p*dJbSR};t_V?7Mgu$tS)RMK2=VBgK& z22O5kidjgT@UsyQG13x(5~IZp+RRBTc0I@GRS$6P#xBLSpHK`#?r1_VDZ!Yo16qD( zJvJ9qt6_25s)kXBbvSC29+Wu)5^HS7??;-Wa~+lB0+y^hC&EEY^@`7IFZthQ z$Snkh9ftYIX9Kr;N@*T1Y}#Or_CJ#d1HRrPj*~wiu%pB>`J)#e%&4q?w-qxf5yJZg{9OsJ}|E~8gIxdwmsk48I$D10X*>yKJXUY=QGgPfq+gW>&MBN47V0olc~ zED>!qYFZ^<`RHc7%%nkVnLOx?zkj9`7ib{Q&k+Zn@$B{B(DQJgY-Y}_W;>qC&zmKhT5U^NukX*x=2Os`=Xp!eVLGfR;QF!q(jz1|5+ z_Rqw`>-16-houDllUcO!>OF_*=AygdfS>7;hmMI{OA_^6xew3KXPfVMMuX=Tp1d)? zWlzt-B+bloV0Z0-(ya7S;?j!Jh+?W*t~!}5yL#)a^dl{PF6y&vFkiU4p!mtDFUJYP z@{jFP;9#!z_=T1p4`Jr+wZNoEnPYC5sY#jKzHbaCw*QDuwj8tl8uS9K9*n;=Xyt;` z=Q%Gbt2mJG=Wa%Xs0YOuQ>&}iIY`p>ZSZ56cE>Ya%s7D{<*n$X5UpgoIY9ojCWm!K z5ciS%NbwqBm0lJaKSg}$$TsG&rpiecZX2Zs>mpi?5(O&&O3PL-Wf(LS}@VVxE0mRwfVS;~4?rHx5zfWG$i46U^ z>8u-(Wj4bA&Fj%rV%s)#F<3;15-I)Ss_Wq{v{PC&k7<;}>VVYFGB=G9ek|T*c4*`c zvzV=$ARg;<)JSA^$nt<`XwY{=_{GmP-wc)$5R7kL!LVq_1H`oKnOo}^u+z<6DOlCe zY~?9V-z;Qt1ASWtewlSI%W5 zSz5}I4094$d_T?`7SY>uwnff=BWO91PxmWT6En}(Gb#VOD}<`V^mk}%H!R7oTv<$q zzC(EjMBh?Z*}O0I05*S5*J2sk!#_jyP8ctjsZGTJEX8AF7<;)9olB_v6A>K5-L_V` zAHT5bq3d)G5hnZ;rA%hD`*T`Vi!(k^_#`U$N1?z0rKCgfKyOb#TSvfmiTAEiWq%S) zBe+*`6aRwgSgV3*KDj!_D20-_+NyBOrx8gofao@?Wx7akVu;6mYYziO9DCF}ZVFPe zbu$LOeD}1-67JSz_>h?6_*hVX_vIH2#|9OJ;nF7DQhAZMF75?}{c@sFryKdPILgn8Cuyv>L!Nu|5h_Z-1>R(;>jto^q zgNlKXZ1Bp3gK6`*qiDG1J{!iFO{^{5SI|- zc=x=kZB1C~l)f!^90-lxJYPm^9al?8>~e!V*wK_Wk4=;;R|?sQADd(wK6wh4e%}jJ znJ`4kGLyvREN^6_i#rR;UWgLeSo<^uB4^{&pwDDG=y&~rvul7S#Q5<0$-~i3=w;irIuvP;k6ZP;WJw|6eXq5txU4t9j6g zP`{Nx6hz|wl|YuoSU_4&YP0INqH!^J_K4i3rG5hM>d1z_tC@a*i7dFLDd71N_1V!w zQ%SBFj9B@`$x^`Fi-gMFpVj~b_~!gL50@JE=F+uz-idS zFHtFdkOQtH(SxUZo<^@7x{*BB*Bs5U;%vwXSc6@Ep8?@#c{k^nwhHrMEYwHjuX0ix zGhb_++H36jq-w~A4LuxEG)72d;B7FH_zcH>i0y&KuS0N5s7KJU;m5dg`S|9?mzBO*XZ8i!N34Kkj2pfKKM;B?R0&C`QHel> z6lr3#Pgjs&vGeQ}ZogFV`fJXlPQdE9VNJZKX%@=&>t2S}$?^ATp(*%$!zMg47Cnwu zH-54;){m3N2>~=&tCDb}ZhQ{@%(TrYtql8fi0qrhic|8?@54$yMB29Fs~I`&zB_q9 zEDNu?Q57G^p3ZFvTdf@o$ih`8EWVzS1ZEQYAE}G`9ijzop{zBTMr!-uOf9Q&WdQVR zW;j&w3Y<7Q5L06O!|Q`BJ^cvQmi%wJmim{BvQ|>wE!e7PFy&EUB+t`IcuuvQefM}! zhS@@JQv4&q6r#``qIQ>bNN6-knjdAZh!r0Hi>nB9Nb9MDKT&a~N9bgh!3^iA>Iz-8 z1SI^k45v73Dx|)8OyK)tTs_)YMQqruJrY1$zavbzoDz$It0g=65dbo6h}gHr`L@!a zf{&GM|0lPkLvZys07;Qdkllk(k{O4?tlOK9(Z%ww?(GHg6^0L2oG=!3;*dh-Wmkb-f{h=FFL3CtK{zLXHI}q zgDJd)J_v_vSbRDB@k6zIadh~!C2@~`o0UsTG~)MLb@N*G$|;pB@|fwngrw(tinoo4 z1DfSEgoT2tLj3QI`QOFUxKbs3$h`#R+s-7GWC!UY8{#eyy7BcMl718qQ z2X#q$7r}C1==TzJ_Hk$(n1p)P^XYm8#i>XBi##fYU21?#KDkW1S}r>c-^H(jKE-$G z>vwhr7B4{SR4X%ym5rL`#m~TRcU>=Dpz|1;9AZ)UJeiM@jJ;@h(C9^s8tPp-6f+hI zYoK4RWy~d(?P_qnN0?pf3Ep^V#kn??ruq(7kr54%Lml8ryko1Csua6KGHAbwSlh87 z0hcO7ovF@-IZb0BNABDe(ErP!`aFg7C$Tk^@<;Oz`J`%dPIwJ?(s#$O?Wf0Fa*I+5 zTZ8S7F0;?A@@-*OVRnOt=+~Sky`2*N;vmP`@z%4m_p1RvNOkz>)@RHM7$B0R5=EMa z*yw8glJI*9$26yugO%-nL{E1BG=FEYv|P%<26QFEIt~0bTxOLGekqYOA2yEvaOW13 zz{#x=hp;LPSfP~D52H%;8kQMnhxxppGO2D-@%pP!HD;c+drAjXo{6Y8?CtA=j{wa9 z1j0IgUYj7rd@0i{+d`=v4Q&og*M@VNfxx0P&*S0Lm-y>L3!aE{3ske+NE|s~G?u_s z@QT1XF!teLK-l#8bGrBegLJZvnQYhy{mdCG&Uo|Xwlh=F9%v7^i#O=WE}>PXfVG=1 zvq$`}75zw?dc-*s<`U`Tsdgold?0d-VvyU%CM$$u#L!c_E{T3w$4_~`^?%cgu5-j> zdusT5!B_V-F)zP&?DbGCmP|(hBe2aGjghB9ue%zgsP>W_YSwA>^XZvxjj(E#ns^Bf z1n69?=jEfW5Me;z;2TaN_pQA!$|!M|Yhfp+Yf(G8#*;qxge6K16HK^Wih%GY7cO8{ zhl^{2M+NHeh3513ssVHmZhIcz8CmW+sxo2K5;6I_d1^YtFNXKpjh(*lbP}d0r^c>E zdAwa8r|xIiJH-1h_@;28x3lnP8x2JXIx68m%^Rb`nocYbs^)}893ahJpVD^zS*wr9 zAZGo#2zM)OF1awyi^eCn;sA<;|0~Sq)sW1GV==)M;_uA+)yk$uaT=**?B@>b3P6-y zb2W*@tGyC%(yAgQkhewYr2Xy~$0^*Iv`bA{IjmBn@7JlZnonI=>M)zu>defJ?nonx zrFMujQcJ0KdRXcX9z0@nT#umwN`smwm**4T$TKr~&7i}gf3|xZ#0r$5v7jyOBM9HE z+JEAr>l&4mqjGd%IZwG>DsGo_51hZi?@ZommSI-VVO-RG7ZtE}X1;=NEt0AUIg&|2 z-Uhrc=3IuEFe{+X}xN*oC)VIOi6NO%bmS< z?v2k>lV3UR12j6t_i&Iru617m!xpX$N5f$n_#rfT)hP}3p>T_aSS&J*sq}poiL{AO z*-C(3O?zn}Wt@zeBQr@Q+?{p;tI%w)Xy1DEoqVHn2i^i?tsO9Y$I7+&o1}8&^Qnxm zG|!}gwSLZ~*Z2LG!SqmmLh2N5Pee@Y&!4QgJxXV`BW@J%$vcV4MZ<>&32cg<`|FkBa_G5$D6B1;ebRg^e@mR8JL-(-3Q8MK&!a3FEMQ~j_sjr zNhOMArWjvcd(%ayaZZTmA)q6;rvsB}E z?U~JO&QCAo&rG0D9eD=8b#``CsR>*LTjH-HsXng<@K>=#$dm&^k<}@l@=gK#j+V?Z zOovWA&splEdTMg>P9K4oucX9#MQ>~M3ad8944-nT)+cRn_F-o9m~MQbHt@YzGt;OB z(=rQ>fY0rpQtapeoU zZLz&NQpIp9?)K5j2}xgmPrYn(Mw#5msCIh^rPkgrD{Cwo7oo@v2(B-&kBZPozU8QvXKmsZo*ODL0U}-qsYZi z%O00Mf!Ly^a4Bc^c+UFk%_<28l6#PH^uQktv$JJjI*{tza8Ky+wXkJt^&~XxzPiJm zqQrvow0>0UTtIogPv))sk`!ZF0yg_)_lf41^QPF8mhfz>M*uu^CC?e$n?3X{aSkoZ z;y^CW%veL*o&edh7KF=j!)q8o;O~}Iih0Go92tJec%BM9X&{<5X+tOx;5k{)bj_9O zDN{>~I^2e|F#Y6v4`8c>3oad)Fcgg(ihFvqqZ{SC9A&)5Z$G8w^~=gwi&AqN zl;0A&>dnmFj`m{lqqx)XL3Zhmo!o4QJ_2X7;b{uJE#R| zhL%&ij|euFw#v#330_2*het|PG5^k%S<*{#=F<%3a8(MFbhx17`1xasGC27h`6aKEMbxt@86G9AbcBB}Y{MflGKPa;X(};(+#E^)Q?= zVCWX;Jqg_6Fnr}w49KWQK2B1oL#&1C3ERgw1^aBd+$LA?f>|8a#u)WAe< z1F-~?5*mv@L8$;OtsFVjm7rm8q5faO2+0AHLW3b4U`EQf(f%`heN8X_ITj;^ zkOiZ?t?cWNyiJl&P+IPGj&A>FNG1LM{Gv$yV+<&$C5T@z^V>U>29v@_DMJQ>sovDl ztLjvPAcoMtDUJ|Qm@Wf|N(jZ9E2mc_WDIdJ!hz(5{BvIQYO#B>&_K>!Ew4QuUoG-B z5Or%pjJN5bysgCRnZ?(Z*F}WEvWFOl{#%L9uS&=sk{bH&9bP8^a}9uOh2s93yAtA4ffIxRKn&psV}>E{gBXNSA<+82P3yk^Y>M7= delta 10340 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 diff --git a/src/Controller/FrontController.java b/src/Controller/FrontController.java index 34913bb..93492ef 100644 --- a/src/Controller/FrontController.java +++ b/src/Controller/FrontController.java @@ -175,6 +175,10 @@ private void handleModelAndView(ModelAndView modelView, HttpServletRequest req, for (Map.Entry entry : modelData.entrySet()) { req.setAttribute(entry.getKey(), entry.getValue()); } + if(modelView.getIsRedirect()){ + res.sendRedirect(modelView.getUrl()); + return; + } RequestDispatcher dispatcher = req.getRequestDispatcher(modelView.getUrl()); dispatcher.forward(req, res); } diff --git a/src/Model/ModelAndView.java b/src/Model/ModelAndView.java index 2141beb..5f80f85 100644 --- a/src/Model/ModelAndView.java +++ b/src/Model/ModelAndView.java @@ -7,6 +7,7 @@ public class ModelAndView { String url; HashMap data; + Boolean isRedirect = false; public ModelAndView(String url){ this.setUrl(url); @@ -31,6 +32,14 @@ public String getUrl() { public void setUrl(String url) {this.url = url; } + public Boolean getIsRedirect() { + return isRedirect; + } + + public void setIsRedirect(Boolean redirect) { + isRedirect = redirect; + } + public void add_data(String name, Object value) throws Exception { if (this.url == null){ throw new Exception("url Model and view null"); diff --git a/src/Utils/AccesController.java b/src/Utils/AccesController.java index aa1609a..04ac52f 100644 --- a/src/Utils/AccesController.java +++ b/src/Utils/AccesController.java @@ -60,7 +60,9 @@ public static ArrayList> getControllerList(String packageClass, String private static String buildClassName(String basePackage, File baseDirectory, File classFile) { String relativePath = classFile.getAbsolutePath().substring(baseDirectory.getAbsolutePath().length() + 1); String className = relativePath.replace(File.separator, ".").replace(".class", ""); - return basePackage + "." + className; + + // ✅ Si basePackage est vide, ne pas ajouter un point + return basePackage.isEmpty() ? className : basePackage + (className.isEmpty() ? "" : "." + className); } From afa200b5ad059b1580476d91665730f998a260dc Mon Sep 17 00:00:00 2001 From: CHAN Kenny <126701465+kenny516@users.noreply.github.com> Date: Wed, 12 Feb 2025 20:42:32 +0300 Subject: [PATCH 3/9] fix param null --- Build_jar/Framework.jar | Bin 34710 -> 34721 bytes src/Utils/Requestparam.java | 3 +++ 2 files changed, 3 insertions(+) diff --git a/Build_jar/Framework.jar b/Build_jar/Framework.jar index 37d1eb30fdc6fa5bdbc1e48f7623d3d2d823f075..4e131e04d5267a41bed60176427494186c30eb3f 100644 GIT binary patch delta 3920 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 diff --git a/src/Utils/Requestparam.java b/src/Utils/Requestparam.java index 74c00e2..16e647b 100644 --- a/src/Utils/Requestparam.java +++ b/src/Utils/Requestparam.java @@ -88,6 +88,9 @@ private Method findSetterMethod(Method[] methods, String fieldName) { } private Object castValue(String value, Class paramType) { + if (value == null) { + return null; + } if (value.isEmpty()){ return null; } From d728bbf3c022ea74d2df5f0608ab3ee139747f07 Mon Sep 17 00:00:00 2001 From: CHAN Kenny <126701465+kenny516@users.noreply.github.com> Date: Tue, 18 Feb 2025 08:45:33 +0300 Subject: [PATCH 4/9] update error page --- Build_jar/Framework.jar | Bin 34721 -> 36058 bytes src/Controller/FrontController.java | 6 +- src/error/ErrorHandler.java | 485 ++++++++++++++++------------ 3 files changed, 288 insertions(+), 203 deletions(-) diff --git a/Build_jar/Framework.jar b/Build_jar/Framework.jar index 4e131e04d5267a41bed60176427494186c30eb3f..bcd9a4de930a81d81723b3992f0de6df65b9916b 100644 GIT binary patch delta 12291 zcmZX4WmKHOvMuiJ?(XjHGFS-i?gaNRIKeXv4uKGYySux)y9NvHknj?6*E{FF*MIh| z>i(*$yXVKOU6q>vwUQ2ns;&$Tg9HJA00D6;^A3c{0R0yPf}yYfKpWj(sNQFU{EM}i zP^A9|C$z{v;sQhdk0ip<{v$1L7Hh zBEMyT1A%~m0P%MdG-S(v)6b|3wO>#S-i+F3)WClv0NwQ;xxk41M}SyeNPh!^rAXh> zt#u$3f_iflk@ExRUvpCTRp{7hXkZ9%P@oc%KOx(P4B^3`#)QdE;YC^|#savG#=`ow z4Ky5L%GV9LopZD`OSIGpQ5cp~4C?E(T6I_TTbH#~SNeB)?#1uh(*cQ)JNLhi(Kpw; zQ{5*-e*jbbO~`;JU6c^lWyyiML)D-Y3iQX2Xy(w&kZPbzl^9vHQ+ycK?UyJSwO{69 z`fF&CzfWDf1vuqDYwFbxM5u8T@UCcWV#ayNNZpcN+Is&A4|p)6E`$hoal{cM2siHz zgPlH;VIhhNGrx^7cSLVPcB|ZD>Rvi&@*M{LX!N4pn( zNgk(v7s=n~3WL2XI(_C-G@VR`b$V9xL9wrAoit9%As|i0(|Ae7j)`M=pct*dwB#!f zPK>O@t;&<3qvdX3v=L)wLqmigmYLRa!D~&Hoi+|oi&kX3+XMH5qms#GUt6||pEhNQ zx>MeOB3eyG?b~t$Iw8cek&^A>cMglf0;Jq_)e9RwR4emX(SvbxBbljk zt5TpR*!1-{rm1waiJoPs&h2fL9PQ?gV;>^d)Mr<;iF()UP&gheH9cMRJ0Av6wSrwv zT1^SC7UqX=S|~C?5SnM@EE9J_TflB|?t+ZP`~@5FbJ)-3zAXP6E@z+9H^zs(q0Ppq`@(Ht_?CsEGKOqGw0tg(9HJ zodsKpkZ#0&1!ytMocKq536HCh4sV~dffOR}T?Y)aQ=Ncr_EGWRO7)afq~YM4u3x*uw$7Q&)zPCWaCN!qZ93CLSi?oBZY=E-rA znvThr;>dNr&P!(YY~0-)$qU0Hg{{Df{Tgez)Y+e3*j0-X{ zDqDp!5STFFyiNzv)+~3W(Zpgi3ELveXqsIDOxL4z8OVL`E+F8$fEaW96r=H7kl?qDSY8=y` zDB4*+89!QCoZX8BhT1kKNx2D764oC&E;{9zWGw;yFw%}Bas`l-aNCe^=xx1kHQ2AB zq(T^jaJTnW;J`1L9R1to03<3}?vkDwr~6R1nTXUy z^Zej97ls+RH8!9@5MkRcOPk8hQ%mTFtxP-Z;v$US;?+bUO_)C$Arf|goWz@67o;K+ zYl0kRDm(y1H=S~W={}BRS_;wOfK<%SZB*lt=hI$g_*C24-V&wG;S2YqFA}p&cwG7^ z+$iNM3)nT6D2UCp3BD62&IZ_MPM5oOFH_wK7Z&{UtSEFL%WloutA02>6WwZ;B48sb zKTz?t+WQ~hp(iIVk%`%X0uT90Iw`P6u|@`U+k=%C4#b_V7X~k?E=mJu{P5JkM+Y-}{R@c>q@iaJSy;d#2_p@A&IcUGbf&P!n zUs^dx&JpSKg|()CkWhD{SqnK*S}X!x`UXzWHo7uHhUpC@)$8Rg3_>_V0=8XZvKXLI zP+uy9$vt7H>RNwH5W3(Q>Me_q?0-uH;3ZTk#kW`wZXl3x%hfoVOT=pU$^-4vA_qtK-8Zd- z1U$a#5ML=JQbtV$d#!1#v*V~VzcL&_+pCyR+LHEJB&#+U$Mmfs#czfCkn)9KFa@=o zV`lM~JUSAz{sjIAP0F>~$X6?pDl0doIh_1r6{SLTCd+6bwProWWZ`@KNWh|9JYbP6 zIXio8G^1LngrqoyC~tJk-sS1?WFuDLwQf$3OZwOdmL;n26off7miVZ#pdguzU{#Q1 zHkuxvl~3D!XvWPjD%WTg_8zU4L~zhYRFDIsXkpU*yCe~J>6p3!)0ZzIO(@E==-hzc zKSoIm*jy}u6&Y@8oCnPyy}Ty2wDX~mxo(;AlTY zNSU?P3DhWQxAGZb#=4FI@YW1uz2*xFc~)vtl0n8mX^py#_=&z0TSv{dj!5hlL0WBb zpaIp~2uC#+j^nPX&Ud(%8aTo58e_KFeK+|H%5xlmDB71BDY!KSo|fW9de$&~1~D0E zM#UfX_T?njG75|o%E?ZnxUn7;8toMMv8^vPl6+k03MZ?ho(?Zq@22XJRfXcO9FHu6 zK_E<^P7^@-;DO>=Iej4GeFU3)3$2p;k=qCMF_G>NM`ALL@lO-p4Ht95Owtj^yi@9# z{poJ9yJdQ;N1m3o8vzH$j{mIYtiB1Lf01g|5HlTx zCtc1J6FGYDup>bIux6v5tF$E@AFw0?0lp5!Z1=w&mKX4Mntf@Z9mSh(EV+-^xfOd% zg9xk}r6+m(9uVD4gLfPSQy*p`a0szN7+cTarn}BhRw}Ms{{uY9F$kJe{XKRuT>b)V zUSrPzPp)3U%6Bk`FsHPp@u`0H1(s_nA5}T)sXld!z5OKf|P!Ji*wHkwwx+xe_TtQ~l_Go1`nB z>AV@ygP}%V@&qU3{`Ah(nS2f8_trMkBVUOZ1_Z}|3(d#` zkA%t@z3aJF?MB4X)mr*loJ)N22B9F{Ze88Y_K7ta8{OH*%Mvf^wuYhs>h6r!fqMCQ zq6`W=b9Iq3r+bRyB$0vJkYmtwF8z09l{3LgR=-^BP|IC4aUlW?snH?qN#&w*--L8e-jdlQ2o-(+O%gM-E?d&Ceve1Mj{hi8RW7o+LwS`Hj5zv@wY~fc z8^>&ije!VY0j01e47SN1C|<`za5B^sUdK9UI97eR6iP-nQS?IGe5<9n`P zarKZXzU3zy8~1O5Nxno5*Sk36IQCu+eb0X9AENFC^rd5Zh~fuO6cxFX;3S)C8ig^> zkjfD=X9pyfdsODou4`jIpeXxOM{)2L)2#Lq5z04$HINg)r9$awLV2JDlJ^jGzB(=^ zR3BK-pEmL9Ggmf_fqFEeiMwpN)=*`1#`CmlYf(N_c&C?4967wolcLoMu=&Nd33pzN zT3O#f7Pz?1GG(?g5j*R%*togn_87IgKTkBK(o1#tba+0i zLOWD$d+)fRCHQ5gr-SB0~5u2 zkawSXr?^4ZZw zOw!rn4_V1w31El;mxIiQZ=-X+JP2}D94ChLN**j&=gKmzo)FJ4MX-=VKnlq2_?V|G zM`w3ed2%2TFqfl4y6MU%nTB%QgD|hQ;xd@^;j~yO-M#>^SMqT4U4nfAWYBq))$ndW zc6@rlE8Ch=Aod}w(!j|t%FXCQW?w`0E11m`s>t&$Md181TwaGXAS%ufgB@Xt=gS40g6np&s z0;FPNJTgpcQDm4-qO6kyJ+N10FP}>TzxOfLO5=%7OqiSF;n{%u%NoafX2feRb?aP= z*nmGXR)8(=t|RJjsB@NiX6ipxmAR{CQ5+wmxH!sx>=h0X_Srvi>Z%Zr*rVwgUA&rm zVySxR>G}KcU2)q_6de_kPJcG|1z|n6cejgztT?t~phv+UwVYt;ENx72&KX-6fo}f0 zMdA#S1?JAe6$}3yb&qy>?K3;77ln8fE^0?mB{@(;>r^Jcfel|IgqaBG7z$R=5kOUk zExWQdXL?WBd45<6`OFC;GUBNultK3sQCiVl(eZ4sm37Ac!^OVHn2ltY>dwjxG5BFi zHCDMZU=MR`DM8IeJnJiI&T}+{5sk@mz@PQ$y54aUwrArJU+JupO zgb8THTho3>LRLgQ?;=&;D0QaUr3siPM<;>m5ajvK%`YJ{YW>7lAusRPS1;Py7&@s6 z@W5B2R}NI>?BA}4C$2#@x`E7{c^?3~_OkCPzR`vYG>G(7-4a^ABhEj9HGco91|#CK(E#SP`q0YsGy4^|lJG^}>f?xY;ov_Aub zEv7qBU0k!cvxOOH&YkLiJtXe1d9#nVK5N8&8?VdP-d)nc-SrHM`j(Ed0_rpVeX48@ zln(S%p-{VgcJWmC@;fljrQy7{@rC?B0BI>< z%Z|##Xo&oR_Rxb@u(y@+jSV@eONKtgS|c2rxg9#&a_ay?-Z1{+aUzhEaSiav0T@k+et^cy!6t zfFACwY1Bhiv@qf)_4>{gXoUa3Q*cR0`{HLiLm)>z0g+^iurh{gK-kw{#uvOIv&BB> zkML0H%D53ju@T8pu^;_2z&KKE8*VKMeaHB;%WN&I@Pe`}DD%=LzAboii-FV?XPqO+ zh>NgMNmPvf`qEb~WB$?ybuM_LPHum0&bzmrGpB?5|vk07udTP=o z;~QQM^^P6XiM10r!*+9^rTpauH38eLcAw_4wN2@V9-G)ByaC^1mLmzR+IE^(l9QeM zathLT&3KamTEU3@W8q88lTvf+HpQ!4wrjc^&Z9i}egbV|DKUQ0zCfb!uC@ zGW33arP)}((=ai^k86bf%a`zjs+*I76ZUs14GkIj5duy_sC#$Z0l6l0Se7>^>^?en z%Ax$Fb1y3rft^_;pf)3eSr0#2N$;EVjPG-F`yNnv@#D3q4R;F}1wERG3k!r{XT15{ zU^-9EpIc=1XT}ZpreuS7z#XxO-e0ue6q53D#==l8SK4xC_VU1OWir?}(S_{q3%Fyp;iL3SR!EX^I=KM`U5{`rMS# z{8X+HLrFO|q)y7uZD9jcUwA82>dAc6$KaQhKt1`sC3vgemW*Fmmf1O4>c(B^jb@${ zjcr@8-|LE*Vv1Lx@`}aAxS*|OKuH&DvC}-N5jtd_Rp{b?TG->kY)M zagF6ckv5`CvGX;2=@ya{6QZ6U^Re$QXb;+BS9|a4 zdIs#fER1#rD}C!8PzSaf(}GfCp$1yQW>&Lp`IzN^TZX!_D85gi@zH%9&^yFwca_^f z#fukLwC-vva_g$*@bU6zjMyO1p zshKP+`KSD;!}8#(ORh(c^fhy$*0q6}mKFH@+UV);YblseCTiglr|JQ8`)I64Xyb0K zdS|UbRB^5}`wRFNtD4oKgU^d?`}n$I`c*fb7F;8)KDHv%)+*`mSR@w;35b zj%dvP>qSt&Y*5bep){%RbXNDLJ}m5?)o{8X-cl;}u+t^Cw89gfo$QkvTnSAO1*m*Sz_X|UO@oX6&2HbzxvG75@$ME_U zORDxM{09v@yAoR<{Zp#)W0``}uniF@E9{tb;KFpcTZ@1j2xl0VO9{(IxgwFPS$}{4 z_})k@ODlJY#vm7EzF>q@))`!mSmqRS2}62HQ*bFI5@}ElUjDHq8_<(6)Imj;Bae#q zE9n&74VqNMMB_(po#I3-oolvf_*j*y*{D=%Yy(qWgRIocg5}A3b}Qx%RMdjgfDew* z_)_O`lJuIcml|X89hZY%=Q(Q=D9{V6KuuA3Ql78f3mGM5cMLJP8iU!UZ3d-wcqSvQv%#(E(2r6yz~gz~M3k{}ZQR^zCp5YK_8|5N?Yhxo4n_lIkF*g3kh|L-sd zQZ|ThpQ{7B-s05`t0AJidFBoL{uNE$8MC}Of{oV@-iWEqz`q$r`+xP7clHhcl0kNU zO9ssD%mma&3?Nz5d(EyOtfWh6OGICe5;b0(sVJL2uCns=eE3|hP+{2$ve1c|wXVDN z@;+ToA0IniQBpu+O@it^urEf=g+!vvmynVKVfzK;hD$Y{XF`cPk7&e8**$DzF3+Ey zm3^0Dq8I+K@x1ZeasEnro}mUjnoof2V*D2N6%t4UYn%9$P#>YrL^E1RN+%Yu(=)@H z;f7Eb>kx4Oz_N`UU_++B`edwG!JLvu<7kiTc}!Ci4^|u7nhY_x#Hhb6Fq_rJprDat zR)A?(n$vT^DKy2ljh+}_i>bnOAoT;^P9DWJ7=<`t&{g5u6#{y5Bi!u-)es#MCdv^T zwt%`BAVLdj4=mfjhZ&E6q}vV3ZqG|St$5f<@imR3wCAeiajt1i5Cz;@ti8Qs2T7FHQbK3$=KH^f`OvM&8 zD8jqEJHlhbYMw~WO~TtxyxgvsjO`KC7(kMsP$-hbubGUCm=e+wL$&B3OND_re_7imk2`Ze1R0t%2%rP&+gu48+N8L(4 zKLRQn^p!kA#P%l$d0K*C3z)M~TUp>J{?sqIUj^PD-O3v1v<>QE=LOj$u?D8Lxqt}J z!KCht+^Iup)^df2+Q~i`K#U#4G@Pw47xv<2X~9<&sWmCS(t0y?2-aIFSYzEHJKu_qr6_Y6i<~r*yV%5E z-OytrF${xZpxX38B26JhqcsKfk21P`r1*v*bGs($0?;{on(H1`8c_GI%$vho$O zSACK=3)U>K+Hf}_3S5d8Am6oP?BUbAx{uT*Uj4$&qHXhj=X=fV})0~LRil2q6!5K zfTFZ7OcMFhZK$^&n#}Q3+LN}I^SR6Xm-j)^2~I5&T?BImxIghHLxe?4kVFWA?9Aib z!*6c<0yb7-5$4(?5kevx^mJgH0H&e=rnV%mCl}4`rVko+XjYF*%%c}o&#X(|rX_=* z5GJGjjoe0E)~75t?kAbOhytNy#ALjBoVe>$vGj4yjBkS)@?TU@?$DDW+<5*d%xO`! z-HGVMyNHcFPIX`Q-=+VeWu5idD;zmLWhWb48f9E?6R|ojNKQgWAteP87ARY2y%&K^ zv74Kl8k$nz9mf)qAK*fch^9H3u1i$a0)NL*j$^md6@D#swz($dLz~In?G+=;MoW%S zE@&~#mnH(m6eedCu+v-lFMHXt8Baa!35?$GoGsi8H<&NE0><@mb&R-eMU?9SczWn} zolO}RCraWtb4LbAVG9A?kzNSDb4MLM{(Mj)=$B4U9h9+*R*m+ zZC>F@<|2=QnK`CM50n`JRiL0SW8qY#ZahLz?It(NNDr`9UkVj_1Xkei7)i(e)o%tFTragm$H(_*M!#-^4R%aep6sumfI|9>~|3%j?bNX z%g6N;#*t{{h1@Y(_F8sE5j^FyC9b$eqXf4URzN~p@;&ql`2JMDAg6mh(mYau854q= ztAT$a-F_|+9Io*m^4yXiz$d$C=iT5U|JA!37h>i?_ss%M8{SJ|Jm{2P9n(JCW=*n- zm%pHox^Jd$E>VG5fkg|-qim-UGC|(~!Z;YOs9G(qtd1qEV`UZ`I`WX}MvZ3_iHD2y~M#VkHS zDkoEtT?F zpy2f%YBJ95Jb(S}m?nq2WtGeuI{Eo^F^qtR@+&)0!-1Q&$CqK-MdY}rf-7w{;t2y> z=BzEkG=H5hhmuJso*%`6C992B%6Q$mMqg@$eqMWezca2$(;;r^jY7L2ujE!88Dk&( zDa90SskNH~TyP4d9=X8GcfKP#Bp1cwS#`6Sw_8EHvci^r=bqwVjoKL}N@U652#;(s z=jc>yEya`|O0aZd8DEk?CI9gx7!&Wly2R|5-EC=8C~A0clwY+AXCT-zN@AWR!!22E z3R%$N7vzbGME>O(Mv?vq3@T1m10TD#m7U186X^gp@GRasi?y}gD7*xBKdEBrPR0^- zacG4vFQv=K?olCRc&UY+>v8#B{Iz+0br;dG;`lRZ+4mpHX$p4Nd3csyXCbmUepB@E z!ZSiUoYZC1hRbqVJXsT7EVDxZ)onR#Rj#E6=CeMgNaU%5(Y>y_pSUEa{29=zPMgmd zZt0@6KwmlHypwXn637WOwF!%F@3`J;`!n!Ut~fPCGl}~Sk*V#STuUE8`TAd~k86Qy z@l@1gus~S3{KJ0kGB6r0fSUsU$x*+AL?zs!f&}`c60_m zlgLLHDwDCM)#Rw5Ed?1be0Jw_Qj{#d52`Y7K$lS-517}Osw0VEg%REwVYMUvD-U71CCOPk!?`?Um1bPdW3=1E$;w(LC3e7c5-F3_uNOMuSJ> zG%y!}kL-@;zR=`}=GOrTd5Bc*Zibhzkd51t%*wWj5UlNzxhYGnOS)9Cp1J1)OEtAc z+C@s``~wQki}kO4+n<}I$Ltzr6PSZ+6B=QPa|_Uf*?E!U;Q>E!41_5vXj}w!fZk(; z&r9(izCt0N8Al}ob8W5(y+yXkcq6vxSdcHi!>D!ZBv&v$=pC?Bv~s_sov#(sKNZFV z{d_>_`xkSeT~pj2wQX3BAE^Vt5Wq>Li}6?!11;g;=c?C`l+lx$wnS;K#%%+b2W_wD zUrxB*PG_#H!Ml)yEeX!Y4U%E!rj2&C@@ptRu1@P-+OY!Yv6VdlsS07jF#3*xi1a<) zlwSq$;W4wRr}}F2m;)fP@wfbGAH){wZNT_q6$Klkz3Ai77m`T>OkbR1E`Xt*T8+?b ztqaK$w`3na!-LM}jN%8#%GE39_5{U4ew#gDLI%DMArDPeVz@HM(@e={Sv8c6VG@M; zHT|@8NybLmi$QKNzV$m?f17@b9#$8$g{#YI^nK2YVyetR5VgKj+^^zyl^MlF2~1_T zni;&8c`LxwWKPXQ2`$R5k^?wE^Njig;t9|E8=9F;_5rGN zs4Dt(Ao>%+Yp9Z!xCV#b{E6;7HC7Le2uDBwfF@4YU5jQMhNxmk(^T#IQcpG}sII1v zGVz(C+0xN73te4;w3q1; z`QI~TX0f=pPBgEuV-2``W?_FSs5~)QV0}60m__KQOfZuB(MO_6(O{R-246DU>br3W zk1{QRxuyqQ$PC1P#}!kHWb`aXZRh}ds&VFw{C)DizwZ>5JXYAyR0HY9d*f?fo{ZDd z(4WDZ=39>a&8e0)auqM%gFjlRn^_u8_(h26D++Z~*!VrVCRXohQruk(9F_RnCDhrS z&lp%GBj9z$da>sYQ!jP!!RJgzr;*If43Zk))x`!Y7$^Ys0z$=amg-8zGrBt;F$P^V z&I3Jg^t;CGqg5RMw@$wg4{fAPJ+k>!;N3eDa|%@#-aCN+m;&3YO!p5J@P2g59a+>& z?gS4h0U{r!6+>2C0-7>&z1+NZ(M8)z8mzBOKaF+y!ye@LFX*+_f%!2B%En0NM>D@> zDIZL;D`o-f>OUh>x`EpCDA2cQB=HbP4D%LZshrc=RnKH!>w2uE0Ac6X+_wluZH7EQ zL){B}+drcZ#or2XEuv9unl>M!a^@dCK?#H8lF86OqkGX38&n|KgYO`sV?o-+?@UA5 zim5pEOlmOl_WnXU*d|j1^Rx)W!i{e zP0w~+yzs&6r_78j_2$il`az%B0+hFiyKUUhnI((|q@b7MI$7IlzMOWO4AWBFgW)fl z!%u0SKSz6ZK*x1ydq+9#U4tXZn~)8Nwp<=MTBioGNxjYdp>OU)tB_g~RU*%OjK>^Q zm@$BQ7Pa^=FF(WRmg3!h2B9q>`m66iGdPK#Zl5MJv3vsDUC(QV$P7WUy$d0siBxZ; z69BX*q9eIO&|uMW+ETSIZG;Jt$p!Dy1`p>6q?$_CJsVOdHTpP?k z??jf4bLpR_SYDfd+2t6)Av6h|H5$(eJF5U5;0ioLovJicEvlYtDIpoL8ucJ$o!CD< zj57QX80)c03m!B@WDv^~fcsS>DE$rb&P-7b<&GK-ev9I_Fx2`|Dg3i+wGF=rBxn3E z4UsKLd}3hY)}gMIM;VupHX&)R^bd+GdT2|GM>Jn+Plt%=1B3;D#O%pXfou>u0tEu_ z0tM4lS3=`L@LI^x$}^c&capfDoubR(bL7%}YDFl>M!k!5>1vHBOPn0tL_d6#*#-BP z87`R`UuB5UObycV_p0`Nv^sCI@ZU^(kj6m=RbOy=!@Z93rmB{FUYXW(bsgQv$Bk5w zV-SA!d~@-E%^na#jxkSds#@CE!KyYojsxt`lpn2$Wy$Kvo>Damr{IW+t zC~I)u+kOLIttzph=SHGT)wmRB>q9Dw)ohfe!G_>M{MtL?6r_2|-`8<_v(||Z@6_Ym zC_*mpA0V7z1-r59=OgkW7GZLfKPg>$^E(jE@@T)+|GeiOgP}c8oM@UgPw`wrgzPuu z_dqk;z$R?t4rFq>FdY!y>$5F1u&hUIGhB@~>51!NU0vZ@0_1Y=$j`7ZmiQzx#R;aP zjA7SQ&Eyq{?Nwpjj#z{#m~%D?Fp`__lZnzK7sfiRTw9GJL7P_)_#m+;$|+qm$VO`d z2ZFCupV@nA57#VX>5Eci+sqj7jAl&J-_ z*qt^G(hx-5SAEh4lxlXwc1&kKs6l^mSXQ&={Edsvh}S^a-<&V(+mp3}osq9#(cjE3 zvUd+y&gB=)cqk&GdHzV2Fu+JLxYlXHd+=^rSmIRVSqoiY7T~L27pJ2oBV`}jnh0a| z#rH#2#c4?*AqDVYO}O%uq|Dt503K26Qx$PLxpy{058{%fsyUok_|O+QOx1^_`-K`c z=>ZGzE_#WqaiLFhk_{DDERIH$U&t#$T!`os;B!%PsM1-~KEtM_;1}jQ25Qp4w8LCgP?!kOj2b z7%`!k2n2-62TLo*KWZf;6b{7yl|8{7p~O(;BH(NhVwV4BN*^0I%WL>2csV=-#2?A@ zzs9u~m|dI*EE4u6Y=ZypkSz5dJ@kL?01P9BYzAkBF;V=@_%!3FOyEz@ia#0ud5`}Z z)Bvyv02lo9KS2@0i6OJVwBht`hfw=t6@eYXDc-F3aAGK0W3ZVqF1RcFUuXLGAJ_Z8 zE^P3xaFVxGBoV|=+&173HU#K@kB0R3hW_;6|IbrHz1V?2M*O>?^gk_F=ryMY9tesK`_`ak`m4~Rr`+daZM+tC!Ou^5YJ=%V@y^?S77f3Xo2 zg7BZf3d#RZaD*cMCnQ2s{u4T2Ox^_$Dg;3zKioexNdE)T4V#=}^%COghd{RUZ9%?UBG*j#nXj;aE8tV`f3UVVHG4)s@69lXx zi}apIYf|t?ZB~})+VwNztl=G3*~ASj7jAXjiC0zHlM;h3USJl$#l{%Jk}H$pY+xMA z4w_6`a_hH}{BVEkBym93{4mIQP%v+3l4LknGBvNPr^JRWnctbs3BIVTT7M!cC zphTHya||AAa~f3|?>G{?WK$SOeN9k-fDkKaK%~h~n^6j(JQM*R1F91+3ArCB_RDDNR9n-%w-;eamzn zNLK9YGinV=NZZ-e&62`su8hmkNNC>M!{-dq0U;%eb=r>a-7yzgP#pcjTAPcG`NC7+ zUpf^XAdAb7#jO=C5$KeiKVih{Y(vvdm3U%EpMdB_i5^rW9pr1N38tV`aCzW!B)E|H z^QZ^}Y5AQEcC5aS1y_d>%Kckn|SdHpcZ2CJ1Qi;Mh#Rzv^;4e{m zW$6OB{*hR%%+2rM&IA4Ug;@p%v7AYwbrRL%gg-`&(u}k<1sD(WV0EA+@^eh3sN%Dy zPVDvgj`4m=S+>|M+V42So~u(vPYA@w?n!D47HkbtXxsgg2~7>*?U!hS&|LQX7KE}H zG^A*m1LC0okvjRzdGR6{!q&800!d+s2c_E53#}6B$X~u}&09*#a7c)K0F>MMuPab* zU3@+(udk#}L8SfoLZHhU()RxYS7nNe?)-Pg{^hlxSI4P^2TamNWaV^%6e7mIK==Ff!kL6lE!ZIWrhxUBGb;TLEetcFDyYjj+qfxmpK~fFYD?~ zm#j`84b^$FK;Jii?tL$HFkf!NoxGsmm;Q#^tX9fgdRt>ynXa?43JQcIgVT*U#`_|$ zVV8`7lZ-}K;(gPc+wPBi5aT_B2b*?i3mydg!C{}OW?z8oT5`LW^wZBGyjw`_-bOFhx!sH zM$@Ji3miamH=pf}6`Hdg(Y5V~wGQD21FRm^hlrruZ43K~Ol;Xu=RIe}rCa_>7ud-y zYGj+3ayxP4{CU!#X`{cfrbn&ZNr-D|jZPbxo6z#`MkH4}1J-XV%7uRtm`? z6MhO#k5IOr7|)_+QMUQ&ZPLlNJKcYUOZ^aN&+qEvPIr;S3G^V{UuhB znp#9M`oUc_Jr3_9Oj8zfB1r3p+@rr4LEYYNQ<;^lDsZ1Zn=G9{m4HVb;SxgD&2Q0F z!L3NNQ_aiE8O3IhuH3l@U>(iWSlL@XRO8)9_M*x*k-*EdrrxtHzD%SIKEaTVZxVyC z9iePK+-b|xpYW-f0*AvC#%yV`B|3g|i$Tg9x0V_f2I8kzH#rg;U*{-dYw_$-1mswq z>lI7?E>KA7NAn)P6yDFIomjTXm~p%THxUr|^$aX}v%N6Zu&53ePlMKEpoD$-*GOZK zZyv`Sp$wavz9PmhDl|sxQbKWqZC=}9lIOaU?6*QqEPY;6J6d{zc3}+_iG-T!`iZ8^ zB_8MRjtC)y4WkJNX3aLUnEBkTD#Wnmwpq->0RO6hT4|;fIomI-eIiO0|-=6+@-e1iAZB_qk`f_4BQry=r7gm{_2Nh(UEgE^XC zf-X66^BzFTy#hsvms1Zfx`!8uYi{xTKoWY&@woiK)Oj26ysLJJLk% zG!(QA2;+0v`td$`6Fz2~$ly!&;|RDLpZ(en;nDdj_%Q>3K6-kEB=xntw+%)7Ox*di}ugj`RhABirU$MM<>A&@-XmMJa%{|2A$>eYZ98XI3%5OUnzHp9$Ek* zA#7>)E{&sP@AagTvfyucgq&0Lo5?mP_g=XVwSIvplnTZt~dp!hjkut96{? zR)%?&#=8~_RiG-*M2SXLh>6gpKcyUmb zZ`cb&$?}0;Jw2l~(^}Uc%T%wp7Z55!C&O~$X*t>to?8}0t6@em9MI;EA9Xiy9GB+D zF)J#ZE}H2q9uCneMb`ijsX*jrw4L}=i8&@ng~7HKj^7<$E<9ub+3>X_i?H#A0I7h`o7gqJ(8K^23_&~XgF)3$Cjv9$;Q^Y| zHK9}U&pc*|-qrkPO8|v_j=gbKi zX;&4OHupoD58m5Gg#ky7^3|{!!932xG(xsdwOiv`)NPseXA!W_Nl)|3bP~+hEUYnU zqG%mGG`0i|7tOfpP0jIXklgDL*Wo*VNA1sMgsJLs6%AZiTT|z#BhyoaVU4J5(yY*- zYh@z_2=b!q4I{8B2wb+c7f#N$_1&Invtn%sZg$!LSLus?MFZDd`86Dlb@UGKmV}t= z1+C$eZ8z^zNtzUDUYFXlERoFwW11gXBT?WvIysJBph%|Bjw4z_vBlX5Vu+FwOK6b- zoz0Xq*=BI{30X^HUK>I(%W$_Xv^Q88P9vzu=ZX?nai)j4t;unlFSy$)f)4Y@vFxt% z3GycR#8$98O@NP6K!bUEYwt{pgz@l6y}EHIErqTMxtumogem{rsk))xF@wPU_rkrT z5+9SQ(#q=RES|mX)*o2oZUKOGth31A6>dCcW)E`XFFFiazcMlyP#jc)(gv&z;sSqk zIhwhA5jb?@nhl+q=65Lh6=fcIMMPJkJ9?aa&l8ACuK>(rP+~(!a;b5azH#*!+LlS& zB$JS!nMtPM5+cl-()D068qDj}AV&$h*3{Dy+=-r@q?+*4Ny0}NUAB|NbFc_i1{r$2 zT`7MNf}%C1k*#a7(~MY4hU)6H72Nx=eRRZa6EdwKB;}wd6VS|J$k>3jGLHs}z=##4 z`tUyfY zOd*Cs`Tk4&hZiOtq$+2MH{q7Yv|pA#G9_8;QtRHTQYxlLjci-AYs-)KZp$~MJ;rKl zJ?Q`m<0KFk_AX~@YRbD&sFBQ-l@vH}VARi=5Fz>cdr~Zt1FT+jbAlYeD$C0*v>0cI z?aS>dZO;13gLo$LfBu+QmK6zA4ajFMDZYWVH-k`gJ=F33LITgCrdW9YQT{NS1xA4ODxicv$?O%-C}VWhjihaTpnKrA@%;uz?@+J;cLHeUmL zC8fl@sU+z1F!Av+@H2ZGK=gK}Ut+#3NE_Xf%elkr%pot`#9H2zyl$5pJS@#3+1nSG zTs(A^-*zD)<;o>$_x}h8mSq^^(dtWq3{CcA*4UEO4JXu!!LJXM z)eZA)OGDEO47;#@Mm)a6*NxPy7l8s+vmx6#Lo62)WDd8BDN2Z2e`$FQ*sA@;ic9}3 z-k{*4pX_~Cm+)cfrovF$lfpI0ofRA_lj0a4AtzIX zAK|>GgZL|(-ze%f+oWVd3>|)JJ+|>qN*@D3)GJBPK)nNjhl=?6iuKcl`hecLV8;EO z6iXoIYziR8WJ4`_0gWosT-4G6-s6%yxzG0&TK#9Q&%k+p#S!4;nRCl_BSgxcym@)% z93O|Vg7!s(*w3=ptO=hP`qTlqRj!wY(S))?OJ<-)^YNziLLPpyYKhVv0o#?L~}7S?vX-?Nc7jaFrm+C!1><>n2oTPqku^5HsZH36tzl+moZTmVXwE_ zd~9s*zUa%~a`>l88x`)EC`m%AjgZeAymRZ+f>GC%=ZS%9IOS)WuF4QVoBOEiO%Yms zxzEKEl*O>7hyo&mf{RgCPtQ%rk(JiJF4$_YC5})Z2gwPU zQ}n4@?mL7FpL~5k7VgzvaT&kJ%#Du0+%g*$boFVFmd7Q1L*D|QVY=E^m#Kb+j6-*7 zGz;vadn-C;u%LRu*5Q1VXYos{wH$vKX^GCYm6P&YGVhuQqiv7{zB0b$f1M#R;U2ab z<|3N)-|i_Rf4;D2ht%8ug3o7H^Z+|f^a#TQA4}_tRCq9>u>Rdr(4dq%r*n!R#jo(N zBT6lyy4t*)O8)pd@QZIW;xCZQcO1h0sI}zfnMFp>F@kjZUf_Il8%KCvBdX3ni<+n!615AAO;N%nVI zy?EE9WWs-Xa@`U%DVM-#h2PozcGXetVw^6I{Ye9LR)tWfq?q^4$y|Iro~zuSh4CS! zOChErcE~wJ?iB7IO*=)lWSJ@8oY7h-Fj}Uz(7tKf5FDF59XR&|XXDDX48aZk*ha;< zT8r?v@4Sb?PL1vpNWar z>1FUXO9_DES;X<0J)4@A;`?F0pXrmoY!g|RL>jttA78=GHa~tE4Vqhc@kIHWJv|GN zG&9eP*1eZzrVUJqODj&pjj3+E>Y_94?yWZiM4J3u1ki8LUAQ{I`$#D-$MHdOjqMYo zqpbJ%gp?f(q2%thLZpZpqih)|i5c9oH-+I@e?}r)j@kb6)9YaNsQ! z%?yV%cQe9EHYiAwT2sBwjGwk|ffY-;JD%xe#Nr^o6%9-ZR!^p!v&)}WV>ZtSU^|o^ zDOtm**3LrYB91Q`*+w~1Q#j7TXhMqkky43Jz9L|MGm+ZO(Tq2haz63P3w#IT0*>o~ zM&PPbeB5O2?Or=wpcn8Y!@GmRb0Eb4oomeLhnMXc%JaMQf#SEr_sL62{-KkbuKE#4 zIwRzHZE|20nq_l0wMm2kuG|T0eGglqmE5XvOp_#PC#Y_gu6Y#abICTHO%q3`$!z@u z-dLBdY9fof3N{Cb=U~m2oKli}8fqUMgrty5L~6;$^1)(-1?T$x3&bi3@(_%DIFneQQOM zZcZY-_vd-tVk(QS_Q?6K*saIX={{vjg2wsU1{J?|c@gAje-DlAh9>z`$O~#xb;|Eh zwblcxTJ{AW1C7}!TTMfHxMoN{@?qxEwky~Kiha`4jlJB6&c%`c2^$!|*1lG@AHT5b zre%K);=@sik|)&L{W-0u&Jv%cz2)lDs`BS1{1lvk( z;_pC8hUy@46=%m7xe!8UO9kfnG+YsC$_;a%L^nQq4BohR-7kNB+a4vin}U>Vt&D;2 z@9rj9eBZRFg%WdYp9>o9!%xUb20yuJnxZ{6bEi*!n>J?tB>lB-8tC|JkabBXw+uAK zdYzznCB|x~WsP`Cg+4l#-*lMbSU2qeB5-ZmF@8(qgo^uwEpPkE_GMbGrF3*x8&mkA|BpRR-FLADd(xK7I)kXYX}Tn9zmG zG7`mLsc531j5`a>UWnq~SW}q-5;3x<9il|<*FAMdCqAUjsCt}hnn~eho2E_pe_P1d3e~Tsnu>W}elySfmjI8XL zOl*x@8e_OSA>WH3a{Q$4#TN(u*!Sv4gHSFc^`ElIe~pFtGgjTz%GQPXzxW#mMJ+zO zk7ki~f2V6KSNeeX-qWn(^{?8(rqA%+VWhtb_bv!q4F1!6u>Mz=VY6=e7t68Tdn_On zdpe-@7f*aC%(v<|>Cc=Bg+*3kDvP`d^n59ld`{bov7}BXg98y_Cq)#{%k}JuocgDc zYsn^%dtV(M+5j~vg{xCoj-d6``_E^U!tD+;_Xa*)>3SnGvMFm<^#%oN>0hqbGw=P* zyVEbR-&}?S!0vW7P}%c&g0V2GwTd^NXKjHgl!)f$=;*VhUq;pItd+UkJfuZjs$RsQ zjH-}H3yhJ}ps{70H7BpXwDfux%4aJeI$5N?Oe?4`U{4p|XVDVv|SU~jdH6$2N8Sz+qbX2(49*CvAi z#`G`TahFu9a)L&}vojk$K@Plgn@R#U?VNL)%%6|xfo7d{fKfI*d$dDbfz$oF;>W6- zZKtJQbHQ@1=HCe$Xf_tsk{Rlq-4-^1V&pA$OUrjnSPN9`0%LXxcZgJ7Msaga2XY(R zhpmibKXdf$qo|3P7rk#y9b@nEpxzh>VxMK;05w+^ zq%)zL-j8#y*sO!wpnhN?GmkbEun6-NchzOyjo~V z&OxaX5W9=B(9-AH|J}?@kAX5yt))^yd_)BhYCp_ICn8nQI# z4Q{&p6dRvvG}on`<#_=_3NvjtCT_Y;JKaVLXGaGB3M3}olIx^WC})?znVHN2z=k2@ zuANL8oAfC#f5W@Fm2OfudEL~;xxnHQR`AWFMAr}VjEz=1JISDy1!nM-Iay(2+&86=7;B_}lTg7dsVWVtc z6KQ$tvgiaVRh(I`X-hoQ@ib^~;j9o{LQ3%Sy5 z5!=ni(+*<$8${HPw~d=Dno4uzWTbHu-L}v#p3e+dQ=C+zUNE7QWqP~4J5gMTEt}@q zPl;XowR-`-CGX>q-!`!7qvd3+_uXOGZy(z<@?qNPCH*KnQes#jfMH`-Ay3@vEv22z z?H>1uCm=mvw+7)oJiKDDIKy&^?HIus@nMx3`*aZkhEnYy-gq;PQ4QH_ro^3~^44)h zu08#IRJGJdANo1HWnIdtGx)$3C%Ock40a`LPIQ>#1^F?=6HUF$JBtpkQN$qjLnl1k z{NM>pdm%j1C2D>UkQ|{}+!XjDL$CL%g$~!T%w5ruvyX00saweaT?=Wa$24b=K#yDc zM2e>@X4$;OwzfQ#o4;1Ra!B1%9#)*N27mPm|K4K+7GOM6B>M9sZFJ1%g(8UVET2Md&01U5zTl8O z_n~4Wtnjc8sPd?miq*MK6_VngAjV^c-em%&cU_<%;FW9=OU;W_BvwkO25?VX;aif) zC_iK_cd0jV05gS}r6mgFGV?;mwDreWr84(di%dl<(6i0iK2;yax(_y3eCJ;%&`xT# zXy4!Gj^UPA=SZWOD^s=0EPoVjHmWFLa3By83>-89{Mb+TwToy$YtOB&1WBz-v7TYs zsagVuN3VOKyt(_vikp~XM>)-tLTm)|FL}}~`r=oqfetEUo)|5`b?O5Ho=t(bQP?ad zYD^8=Of>9c(PX*9G>aJcm0bmwv@m2-jxum|bS+yd(D+!ilKU!MBvmCOiF-A1iqQBb zZZ%%tk(SKpn55)I(#paHo+9)xt4}CqkWb+9RV8$#b+K_Y>r(cWjvfPhN{2Q}rbc~7BTWdgs)w?h)+l1376}Uo9MM*{$XNaL0>?l2eQ=|4V8BR`` zg0MjOQ}FC$Cex85;Ephv>9`C-=kB;ii?AOKdQhEU5EX#IvrVUyni`3n!e6cvQ7C?h z63-R4{ehG~m6g_YT{$dNS?eQXKZYS+%{EjG*|#yl22*SEKP4rAK1L9WQ&9u>GRTEBhPh^80=zV8u|Pp`Enofph1_L`gnPp(AsvDYFqDUKdN6$eXu zlo`W_KY4Qx&9d*KFg*(wwq%0O@9z&#*}w$13_>A4Tiv$f=t!P%?=xPC%BsMzBk*ed z#n|mbx}1RH;iL|i_(|t}y4?@8VdW>w(Z7HFWh)iwq z{s&u+q+P-T2$uyaH?rjCt#+K}()deiJQ%JVaC$ubX(9~4kiL*n)Z|~KkMDp)&|?B8cO85^fc(oT2wivb@I@kX2lsWEr~8rDq5~=hW#^-+OICrz0j{3(;k)2-Kl^N zUi1aJ?yJaq8c&vezJjQASh;xyKgoNjFKNA`zV9#O`k>#oOnIMc2P1o|hc+WDI#PHU zJ=n8n+parfWl}4(c-GFxLi3wn?b3PK83_O09Z~ji2G?s%f(Gh`{=DhTS(K33l+^X_ ztjD~c8u_Kq+qfF0PlxI|$Bc1w5xhP75Y2GweW~pet7c7F!STTFgmI9`ycuOlRb$YX zS}s-Q{i%E4F3+L+>OP+kJGcLg>LmOww?EHQ=!^iFJ^y;U5$Dih$q6~Glz*eaKSJ@` z8(cMN->Oi7Q5tBCFoKE372m{2Q66JDaEW=+t65yq$^T{UTD{zg_-kmboXefeX=Zpo zQ@QV_iM8P0G6z^bL4!KsN0~)0t(SyK-g|yWIuhh4iFdzwTVzl93Y3zTJsy@fB2=jz zhCs0o=dURfjMLO07c9pK9(k@EI_ra$M5)p0+0TW~c4t5m>SUb|!kpSsLU*Y-fv_bi zPXUX|rsHWb@k#!ugY^LHpeKWMaVD=*p01j7JO>ra>x-0Ejf|(eiR$$t&zqZltn)^( zjO0)qhkk`i=q_*Y^NrOGf0Q-4ROWI1n5bX(epZPbrm;v5Sm}>^P?6^a=t4ate$rac zsD#!;!gxR-NmQZUs0)(Q9ly}yOP9U_=HbI{-(kyq5&R@RJ~5_0-R}kqO^pj}mp*`8 zXGw!Cbq8Wh{kH00i!({S1!qDv5yjhElP%rH-<&7(^IFB-_&!;a9?@7`i)H*K&uA={ zzZFhD0xx)~$Ci8R)suyzebU_e70wO&@EJ1|TyEMJyPMK$McaqLYX#!$AurmU+4Re7+sgTl7M`73eel7X9CSrQ>>jmv`H_jC6y4YLjr z#o><7z5yJbE>;M0Z&7iypOya+cHIV36q#wY*BGJLX@c)Z(2{ac$_dXf$ zNPGw}d61AiCjDPB46y$>D(LI3bRR?j1N-qOnm=a=|M7Hz^dqU?T?`g7Y771eS{4cn z4D~-Oz`%w?GLj%8{7dB3{2?H zkp{tk(MVW>M68KGNYVe+{m<*-e6<4uGjn!!aQ^>j{%05ezpF)N4Jn0^2H`CmnIuA=|| diff --git a/src/Controller/FrontController.java b/src/Controller/FrontController.java index 93492ef..9529f36 100644 --- a/src/Controller/FrontController.java +++ b/src/Controller/FrontController.java @@ -58,8 +58,8 @@ private void handleException(HttpServletRequest req, HttpServletResponse res, Ex ErrorHandler.handleException(req, res, e); } - private void handleRestApiException(HttpServletResponse res, Exception e) throws IOException { - ErrorHandler.handleRestApiException(res, e); + private void handleRestApiException(HttpServletRequest req,HttpServletResponse res, Exception e) throws IOException { + ErrorHandler.handleRestApiException(req,res, e); } @@ -162,7 +162,7 @@ public String getMethod() { } } catch (Exception e) { if (method.isAnnotationPresent(RestApi.class)) { - handleRestApiException(res, e); + handleRestApiException(req,res, e); } else { handleException(req, res, e); } diff --git a/src/error/ErrorHandler.java b/src/error/ErrorHandler.java index 8d5fb91..36d5dd7 100644 --- a/src/error/ErrorHandler.java +++ b/src/error/ErrorHandler.java @@ -3,238 +3,323 @@ import com.google.gson.Gson; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; + import java.io.IOException; import java.io.PrintWriter; +import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; +import java.util.stream.Collectors; public class ErrorHandler { private static final Gson gson = new Gson(); - private static String buildErrorPage(Exception e, int statusCode) { - LocalDateTime now = LocalDateTime.now(); - String formattedDate = now.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME); - - return """ - - - - - - Error %d - Server Error - - - -
-
-
- ⚠️ -
-

Server Error

-
- -
- Error %d -
- -
- Error Message: %s -
- -
-

Technical Details

-

An unexpected error occurred while processing your request. Our team has been notified and is working to resolve the issue.

-

Error Type: %s

-
- - - -
- Error occurred at: %s -
-
- - - """.formatted( - statusCode, - statusCode, - e.getMessage(), - e.getClass().getSimpleName(), - formattedDate - ); - } - public static void handleException(HttpServletRequest req, HttpServletResponse res, Exception e) throws IOException { int statusCode = HttpServletResponse.SC_INTERNAL_SERVER_ERROR; res.setStatus(statusCode); res.setContentType("text/html"); res.setCharacterEncoding("UTF-8"); - String errorPage = buildErrorPage(e, statusCode); + String errorPage = buildErrorPage(req, e, statusCode); res.getWriter().println(errorPage); - e.printStackTrace(res.getWriter()); } - public static void handleRestApiException(HttpServletResponse res, Exception e) throws IOException { + public static void handleRestApiException(HttpServletRequest req, HttpServletResponse res, Exception e) throws IOException { int statusCode = HttpServletResponse.SC_INTERNAL_SERVER_ERROR; res.setStatus(statusCode); res.setContentType("application/json"); res.setCharacterEncoding("UTF-8"); Map errorResponse = new HashMap<>(); - Map errorDetails = new HashMap<>(); + errorResponse.put("error", buildErrorDetails(req, e, statusCode)); - // Enhanced error details - errorDetails.put("timestamp", LocalDateTime.now().toString()); - errorDetails.put("status", statusCode); - errorDetails.put("error", "Internal Server Error"); - errorDetails.put("message", e.getMessage()); - errorDetails.put("type", e.getClass().getSimpleName()); - errorDetails.put("path", res.getHeader("X-Original-URL")); + try (PrintWriter out = res.getWriter()) { + out.print(gson.toJson(errorResponse)); + } + } + + private static String buildErrorPage(HttpServletRequest req, Exception e, int statusCode) { + LocalDateTime now = LocalDateTime.now(); + String formattedDate = now.format(DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss")); + String stackTrace = getFilteredStackTrace(e); + boolean isDevMode = isDevelopmentMode(); + String requestId = generateRequestId(); + + // Définir stackTraceDiv pour afficher ou non la stack trace selon le mode de développement + String stackTraceDiv = isDevMode + ? "

Stack Trace

" + escapeHtml(stackTrace) + "
" + : ""; + + return String.format(""" + + + + + + Erreur %d + + + +
+
+
⚠️
+

Erreur du serveur

+
+ +
+
+ Code : %d +
+
+ Date : %s +
+
+ Requête ID : %s +
+
+ +
+

Message d'erreur

+

%s

+
+ + %s + +
+ Retour à l'accueil + + Copié ! +
+
+ + + + + """, + statusCode, // %d (titre) + statusCode, // %d (bloc meta - Code) + formattedDate, // %s (bloc meta - Date) + requestId, // %s (bloc meta - Requête ID) + escapeHtml(e.getMessage()), // %s (bloc meta - Message d'erreur) + stackTraceDiv, // %s (bloc stack trace) + statusCode, // %d (script - Code d'erreur) + formattedDate, // %s (script - Date) + requestId, // %s (script - ID Requête) + escapeJs(e.getMessage()), // %s (script - Message) + escapeJs(e.getClass().getSimpleName()), // %s (script - Type) + escapeJs(stackTrace) // %s (script - StackTrace) + ); + } + + + private static Map buildErrorDetails(HttpServletRequest req, Exception e, int statusCode) { + Map details = new HashMap<>(); + details.put("timestamp", LocalDateTime.now().toString()); + details.put("status", statusCode); + details.put("error", e.getClass().getSimpleName()); + details.put("message", e.getMessage()); + details.put("path", req.getRequestURI()); + details.put("requestId", generateRequestId()); if (isDevelopmentMode()) { - String stackTrace = String.valueOf(java.util.Arrays.stream(e.getStackTrace()) + details.put("stackTrace", Arrays.stream(e.getStackTrace()) + .limit(10) .map(StackTraceElement::toString) - .limit(5) - .toList()); - errorDetails.put("stackTrace", stackTrace); + .collect(Collectors.toList())); } - errorResponse.put("error", errorDetails); + return details; + } + + private static String getFilteredStackTrace(Exception e) { + return Arrays.stream(e.getStackTrace()) + .limit(15) + .map(StackTraceElement::toString) + .collect(Collectors.joining("\n")); + } + + private static String generateRequestId() { + return Long.toHexString(System.currentTimeMillis()) + "-" + + (int) (Math.random() * 1000); + } + + private static String escapeHtml(String input) { + if (input == null) return ""; + return input.replace("&", "&") + .replace("<", "<") + .replace(">", ">") + .replace("\"", """) + .replace("'", "'"); + } - PrintWriter out = res.getWriter(); - out.print(gson.toJson(errorResponse)); - out.flush(); + private static String escapeJs(String input) { + if (input == null) return ""; + return input.replace("\\", "\\\\") + .replace("'", "\\'") + .replace("\"", "\\\"") + .replace("\n", "\\n"); } private static boolean isDevelopmentMode() { From 793326e5165aa145aa1863d50e8af0ffe6134498 Mon Sep 17 00:00:00 2001 From: CHAN Kenny <126701465+kenny516@users.noreply.github.com> Date: Wed, 19 Feb 2025 16:52:32 +0300 Subject: [PATCH 5/9] fix error redierct --- Build_jar/Framework.jar | Bin 36058 -> 36233 bytes src/Controller/FrontController.java | 9 +++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Build_jar/Framework.jar b/Build_jar/Framework.jar index bcd9a4de930a81d81723b3992f0de6df65b9916b..f10ae6f13be38519609c207fbe2319a72d9874de 100644 GIT binary patch delta 7676 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 DIf%== diff --git a/src/Controller/FrontController.java b/src/Controller/FrontController.java index 9529f36..9c904b9 100644 --- a/src/Controller/FrontController.java +++ b/src/Controller/FrontController.java @@ -137,6 +137,7 @@ public void process_request(HttpServletRequest req, HttpServletResponse res, Met if (!res.isCommitted()) { // Ensure response isn't committed for JSP// Ensure response isn't committed for JSP if (Validator.verifyErrorRequest(req) && method.isAnnotationPresent(RollBack.class)) { String urlformOrigin = method.getAnnotation(RollBack.class).rollBackUrl(); + System.out.println("urlformOrigin" + urlformOrigin); String rollBackmethod = method.getAnnotation(RollBack.class).method(); HttpServletRequest getRequest = new HttpServletRequestWrapper(req) { @@ -145,10 +146,9 @@ public String getMethod() { return rollBackmethod; } }; - req.getRequestDispatcher(urlformOrigin).forward(getRequest, res); - } else { + System.out.println("return value" +returnValue); if (returnValue instanceof ModelAndView modelView) { handleModelAndView(modelView, req, res); } else if (returnValue instanceof String) { @@ -194,7 +194,7 @@ private void handleFields(HttpServletRequest request, Class controllerClass, Obj } private Object handleMethod(HttpServletRequest request, Method method, Object controllerInstance) throws Exception { - + boolean errorIsForMe = !Validator.verifyErrorRequest(request); Parameter[] parameters = method.getParameters(); if (parameters.length == 0) { return method.invoke(controllerInstance); @@ -204,6 +204,7 @@ private Object handleMethod(HttpServletRequest request, Method method, Object co Paranamer paranamer = new BytecodeReadingParanamer(); String[] paramNames = paranamer.lookupParameterNames(method); + Requestparam requestparam = new Requestparam(request); for (int i = 0; i < parameters.length; i++) { if (parameters[i].getType() == CustomSession.class) { @@ -215,7 +216,7 @@ private Object handleMethod(HttpServletRequest request, Method method, Object co paramValues[i] = requestparam.mappingParam(parameters[i], paramNames[i]); } } - if (Validator.verifyErrorRequest(request)) { + if (Validator.verifyErrorRequest(request) && errorIsForMe) { return null; } // Invoke the method and get the return value From def40d7debf9bcba1694f67ba9f79e6fdb62a067 Mon Sep 17 00:00:00 2001 From: CHAN Kenny <126701465+kenny516@users.noreply.github.com> Date: Fri, 21 Feb 2025 09:20:11 +0300 Subject: [PATCH 6/9] add some documentation for method --- src/Model/ModelAndView.java | 18 ++++++++++++++---- src/Utils/UploadFile/UploadFile.java | 11 ++++++++--- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/Model/ModelAndView.java b/src/Model/ModelAndView.java index 5f80f85..5dcfaae 100644 --- a/src/Model/ModelAndView.java +++ b/src/Model/ModelAndView.java @@ -9,7 +9,7 @@ public class ModelAndView { HashMap data; Boolean isRedirect = false; - public ModelAndView(String url){ + public ModelAndView(String url) { this.setUrl(url); this.setData(new HashMap<>()); } @@ -30,7 +30,9 @@ public String getUrl() { return url; } - public void setUrl(String url) {this.url = url; } + public void setUrl(String url) { + this.url = url; + } public Boolean getIsRedirect() { return isRedirect; @@ -40,9 +42,17 @@ public void setIsRedirect(Boolean redirect) { isRedirect = redirect; } + + /** + * Adds a key-value pair to the model's data map. + * + * @param name The key for the data entry + * @param value The value to be associated with the key + * @throws Exception if the view URL is null + */ public void add_data(String name, Object value) throws Exception { - if (this.url == null){ - throw new Exception("url Model and view null"); + if (this.url == null) { + throw new Exception("url of ModelAndview is null"); } this.data.put(name, value); } diff --git a/src/Utils/UploadFile/UploadFile.java b/src/Utils/UploadFile/UploadFile.java index 6b3deb8..9f5b2fc 100644 --- a/src/Utils/UploadFile/UploadFile.java +++ b/src/Utils/UploadFile/UploadFile.java @@ -50,18 +50,22 @@ public static String extractFileName(Part part) { /** * Saves an uploaded file to the specified directory + * * @param uploadDir The directory to save the file to do not put just / or \ as it will save to the root directory put a name of directory or.. * the racine is tomcat + * @param fileName The name of the file to save you can make it null or empty if you want to keep the original name * @return The path of the saved file * @throws IOException if file operations fail - * @throws Exception if validation fails + * @throws Exception if validation fails */ - public String saveFile(String uploadDir) throws Exception { + public String saveFile(String uploadDir, String fileName) throws Exception { Path rootPath = (uploadDir == null || uploadDir.isEmpty()) ? Paths.get("").toAbsolutePath().resolve("uploads") : Paths.get(uploadDir).toAbsolutePath(); - String fileName = extractFileName(this.getPart()); + if (fileName == null || fileName.isEmpty()) { + fileName = extractFileName(this.getPart()); + } if (fileName == null || fileName.isEmpty()) { throw new Exception("File does not have a name"); } @@ -81,6 +85,7 @@ public String saveFile(String uploadDir) throws Exception { /** * Gets the byte array of an uploaded file + * * @return byte array containing the file data */ public byte[] getBytes() throws IOException { From af14b231239782e31366aff351f043c1a1f745ff Mon Sep 17 00:00:00 2001 From: CHAN Kenny <126701465+kenny516@users.noreply.github.com> Date: Fri, 21 Feb 2025 10:35:33 +0300 Subject: [PATCH 7/9] Create Framework.jar --- Build_jar/Framework.jar | Bin 36233 -> 36251 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Build_jar/Framework.jar b/Build_jar/Framework.jar index f10ae6f13be38519609c207fbe2319a72d9874de..395b3c703ca5a11b640284c14d358a83786630ad 100644 GIT binary patch delta 4126 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 M=e;BlcX8(b0SKfqx&QzG delta 4132 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 Date: Sun, 16 Mar 2025 12:55:43 +0300 Subject: [PATCH 8/9] Create Framework.jar --- Build_jar/Framework.jar | Bin 36251 -> 36362 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Build_jar/Framework.jar b/Build_jar/Framework.jar index 395b3c703ca5a11b640284c14d358a83786630ad..188dcb99588bb07474f76ce3c71199a6f40f806c 100644 GIT binary patch delta 5778 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 Dpws|p delta 5661 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 Date: Sun, 16 Mar 2025 12:55:47 +0300 Subject: [PATCH 9/9] Update ErrorHandler.java --- src/error/ErrorHandler.java | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/error/ErrorHandler.java b/src/error/ErrorHandler.java index 36d5dd7..70e9a23 100644 --- a/src/error/ErrorHandler.java +++ b/src/error/ErrorHandler.java @@ -6,11 +6,14 @@ import java.io.IOException; import java.io.PrintWriter; +import java.io.StringWriter; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; +import java.util.logging.Level; +import java.util.logging.Logger; import java.util.stream.Collectors; public class ErrorHandler { @@ -269,7 +272,7 @@ function showCopySuccess() { requestId, // %s (script - ID Requête) escapeJs(e.getMessage()), // %s (script - Message) escapeJs(e.getClass().getSimpleName()), // %s (script - Type) - escapeJs(stackTrace) // %s (script - StackTrace) + stackTrace // %s (script - StackTrace) ); } @@ -285,7 +288,6 @@ private static Map buildErrorDetails(HttpServletRequest req, Exc if (isDevelopmentMode()) { details.put("stackTrace", Arrays.stream(e.getStackTrace()) - .limit(10) .map(StackTraceElement::toString) .collect(Collectors.toList())); } @@ -294,11 +296,16 @@ private static Map buildErrorDetails(HttpServletRequest req, Exc } private static String getFilteredStackTrace(Exception e) { - return Arrays.stream(e.getStackTrace()) - .limit(15) - .map(StackTraceElement::toString) - .collect(Collectors.joining("\n")); + Logger.getLogger(ErrorHandler.class.getName()).log(Level.SEVERE, null, e); + return getFullStackTrace(e); } + public static String getFullStackTrace(Throwable e) { + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + e.printStackTrace(pw); // Capture le même output que printStackTrace() + return sw.toString(); + } + private static String generateRequestId() { return Long.toHexString(System.currentTimeMillis()) + "-" + @@ -323,7 +330,8 @@ private static String escapeJs(String input) { } private static boolean isDevelopmentMode() { - return System.getProperty("app.environment", "development") - .equalsIgnoreCase("development"); + return true; +// return System.getProperty("app.environment", "development") +// .equalsIgnoreCase("development"); } }