From 30f456e47a987707bcbef377894cc1c4a7409dd7 Mon Sep 17 00:00:00 2001 From: Geert Bevin Date: Sat, 13 Jul 2024 19:25:44 -0400 Subject: [PATCH] Added support for overriding dependency versions with properties throughout all of dependency resolution. --- .idea/misc.xml | 3 +- lib/bld/bld-wrapper.jar | Bin 29354 -> 29543 bytes lib/bld/bld-wrapper.properties | 2 +- src/main/java/rife/bld/BaseProject.java | 3 +- src/main/java/rife/bld/BuildExecutor.java | 2 +- .../rife/bld/dependencies/Dependency.java | 10 + .../bld/dependencies/DependencyResolver.java | 33 +- .../bld/dependencies/DependencyScopes.java | 44 ++- .../rife/bld/dependencies/DependencySet.java | 23 +- .../bld/dependencies/VersionResolution.java | 115 ++++++ .../rife/bld/dependencies/Xml2MavenPom.java | 52 +-- .../operations/DependencyTreeOperation.java | 40 ++- .../bld/operations/DownloadOperation.java | 42 ++- .../rife/bld/operations/PublishOperation.java | 52 ++- .../rife/bld/operations/PurgeOperation.java | 43 ++- .../rife/bld/operations/UpdatesOperation.java | 33 +- .../java/rife/bld/publish/PomBuilder.java | 4 +- .../rife/bld/publish/PublishProperties.java | 10 +- src/main/java/rife/bld/wrapper/Wrapper.java | 23 +- .../bld/wrapper/WrapperExtensionResolver.java | 32 +- .../rife/bld/dependencies/TestDependency.java | 8 + .../dependencies/TestDependencyResolver.java | 331 ++++++++++++++---- .../bld/dependencies/TestDependencySet.java | 15 +- .../dependencies/TestVersionResolution.java | 49 +++ .../TestDependencyTreeOperation.java | 1 + .../bld/operations/TestPublishOperation.java | 8 +- .../wrapper/TestWrapperExtensionResolver.java | 238 ++++++++++++- 27 files changed, 1002 insertions(+), 214 deletions(-) create mode 100644 src/main/java/rife/bld/dependencies/VersionResolution.java create mode 100644 src/test/java/rife/bld/dependencies/TestVersionResolution.java diff --git a/.idea/misc.xml b/.idea/misc.xml index 065a1fd..542659b 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,8 +1,9 @@ + - + \ No newline at end of file diff --git a/lib/bld/bld-wrapper.jar b/lib/bld/bld-wrapper.jar index e4dd92a02347708f09da0a89fb1cffc5794404e6..6cf86a0bae6abd3d1b6cab117ba32c912fcbebba 100644 GIT binary patch delta 14885 zcmY+LV{qR=x5s1KPTJUwoi=V7+qP}|8arw7k8RtwZ5xek-#*WMap&%v-P!$o=j_bx ztj^ie1MtJY;K=e)kWg4)aBy&73*P6k$i9&O$)djj9q{hT3(wy_GMz5=W#bTy4G=>E zWys31f5V81z+sI0OOnA%b5lS<#iekw87QnjYCabDBUTVDuBs{ogVE`%TQ=OEDz;fv zxHc>{YL>a|J$g)aI33Eeg1@|FbqQ{IO+92jwjXXxr9Abjy=H#R1$oa>(3(5vJIPdg zyQoP3&xJp;i>UEv?P|6(jQ>pKBSlExAdYH~F5}T$A_Oiba+T|nTF1bTCNJTiL{8x5 z7s}|_DkhRixt$;-F`t|vyo_M%Uq-=@n-FJ!am5Fx#2YCv9TfbwTE&QhZi6Q0yl~fG5zenpjHwdT@N`FTb_gy(ki-jN4~6!2 z`8s`=^v#DOI2m!BhZy6F=(bB&IO@uP7$S5^nb%S|{Ehfn0%Gknn603Sye~%G=ue93 zf=0IR`}t`MkZfIX;t9rh${7Z96>RQ0x|V>Ai4CCe^IM@vu{n};ODI7yV-m!gMdo6u zy&A4Km`ODi`GUCuCWq1Fq&z#$(Mc(i%Q6F`bkRL5Uq|qOd5ajMb1)fsa|~*J|Urx~riAus(S;#fx_IwdQO# zEXUdrlX(?jdC-D5C~jgL#EAwm(`<-$CqJb*YQC4i$d12x`ibGriv3A}Za`d1ROW1C ztgyDNv@M4{bbt7cp-s3xP9FhH{)NmNUdM9Q1V=|!Eq~bJ*Y`i|d}vmB0B-*v@nM0< zLhFxwT6bByZ}TM5JGx%(83N|EBuE1)I64yqUdnFzBGq(6mZ<%jyhf*2(7wn6*?E;Y zRcX!@VoS%i0o}9p$Hxfuu=H)M?kimC&g9HqSj=rD1{y{xE+DsOk0U2+xAuWttrjC& zqlw&;luf4f7vu=r!$pWTfCHIqv*jFTL�|(K_6D&_4`0H9olG#i>cs4Uz8t?BBfd zst$o(uDf1{{mHGEVgBtn4W0v%n*-Ta1m`^4D|zA~Xyblzqn!z36HEO(bnbn+Xhxp_ z#yQvIG;ilmmaDLwi2E;M9i7EJgodonD9%AUQw?Fp#o!vr4E_r~U|Sid^@CAkUUsYD z$m`ChI<$`29|vXhYluO{2g7@@Sev_2^lpdF>T-2`YfVdojfabol8lItV?aSiPa9*n z(`DW{BT;!*)(cd}p^gl256q_iP-9O{XpAtDk_{L0RPv(u=@?fjvr5%AK4w+j#HTTn zskq1CL%pEFR8?sQl$BQ6*_M|x*5J;o>uBk$C~xF@NpO(Z|Imj%`_k%Z^sTopll__h z@br!0`+2~$J6(2aX7!PzCqgSkr{ckhd2<;Tjxkf>SKOf}GYJ(&L0N7elvhoa9u`W`S#nZkTiBV7X`9s3>g&;493We5Vwlo1cU+eu=VM zDIeX^$Z=gx{MSyC*IRXwWTyNW`}^LFQ-p5eXF%6H`WeEYKZjK*v5Fwwx%Zq}@*Q0< zXkOv1 zE-~97z$IN9AU*oqQC{|Mva)kfi~g8?67oA`aeBYwJe!ZKHL5!z_FT&Uu6`%+f;m5~ z-#6V>guB@XKL^vw7QoBBNvAuf$M8bWOjA}_3!|;4wKCst(6`0lne~BEhsdkq0-dYy zVA4+JOv!mddM5|^FqsLl&JVe_3Nh_<*UgapB>BM(aFZi zxt}ZgeW{WS7Arb_sys>YgM zrHsk70mw#aI@p!HPgrAti(LuBP|9G($Rn+}1wx%64xYr}1&(u_9rJ0dXZVaimKU|6 znRo_avDRoQ&N3YW0AQGR(%5s`F?A}Eo|i|~ZuJ^sSQ@#>vDLo=Bfw*r8$?rR4#_x(!iCyI9iXcmlJ&-+mJ+%XBlZ|sq{td?#JpO$sghG|1uXc@NWAJQaL#uheqHyui z)%6toyk_Zi@4Iq<3+)p+aYR>6}B@_QAw4&{Rzyd zcx3OX$Uhq9QF4Y&xKP4(r^9Wj~lC7N7#&&!Q0Br1m3@ z<$+F0o3S&PrzSb|PZ`z9$j=iLIY>bL@)R;1=}3LTM`M?u9J%z?Q)->ecE92%ibd~K zRmiAg^m%UGHvDy%N|6=1Dvb7=_CeMn3lnIzs*Q@9;t16ep>%|;xbjE zQ54aT|8rr5b~jH*On*jVvlJP|%`q5)Vn|{tfz~@Php}a7l2wqiu_rOP1A9)5X&5Ue zR6?d^3?n9N2wKMez3stee4NEznQR_C)LD7OB=VNgN_XBBB010XhglJ5G17r*g+!f* z!SyP0F3BvS!!V2XL2DOYRS6JLs^ip*RdsvpZ?x|!VsQBJ21Y=IafV`tR6ANMnOCsg z5kac4J9Kt-SWSox7bKE#?#IN*U+50gOg+T@5Nw#S(PNxWn_1|E*L!<5_xLn`*qu}F z>|$r82D^8aOQ~x}G_NUp&=8TOwQI6?h7Wg|ZNq9&?mmD~<(N6!LbLKx@`Zm?64D?~1dYbQ%z-;( zP4M4~gm9SRxWP3$C1ejX&5-aTIuy&fl!i_-f!hkD+q#S%1Qsx_wI<$UgzjNR+5-bRpf+$pDj#G z#8AkRFuC2rpPMWZ4@W1EtAsZ7vzZ1*GPI zfpYGcD7F;lqVK>n6i0pKA#~B3TKIP`6?!Z+r#5XBXAxjGot4)x7-?}Nai_uaWB%5g zP+ZW>Y+!gp1IekK$sosKQb37Y&2U(B3`cvsqnNZA8I)LVx;Z6d8(gR2>rtAWD+X@w zE@8l+jR)^f&=b`oOl?f(jH8Hma;_VdJjJ}@9H*BF^J0F%aE>wvLF}jg8#K$WmO*)% zLS2iAG6mHB#4X1lH2osibi}`sj0A#t(StXmjKX@QY@eJdsY`VAOKEktExdG;YBa}I zRNK&AX{^SGSq&~7U2QB4E~t>ltzC$tR}aFo;uRt0H%y?M+DA8vBgeQo341V3qnt9e z{c9fD04_1F-L)Ebu07Sh>z*F=m%qPP?fHP<%naD*)zEOvIAcHXl(PM!11~{NV0{@x zUtQ3Sa;>RvV{dS{O19Q&eU9W{nJmzTA8>2u2`2BBW-=USu#$JLl-grpNuJ zi!LQjnI-n{@H<~<$V6jOhLEu(%qKV!1vw?DeIV{|^p@CJ#$FulJDre819%vab!AYPk=b4k(WkJ zWjq2X?c%u#S|>Ort5?DMEO*GIJP;widjM89M?)sJ2Mo_!)%)j~H+>y7{5NYDz9E#C z#@7!PLgG<)ag=VucBwa7iR}`bY4&h z*vV$;*V&UpH@;GWWNxb{L5Oa>_0D9;Ef^v)&*y<$MJ>6UM4G2d8fck+@^2w;PsF9|>-#=odU+4mcvS_hT*- zJwsCorjx!Jv7JqM30825N1;E$JL)?Gl~a&a{5{mXTJIPr{>;PFxE}G8SyyAE2&t2A zs)JwjzAF5^N+W!Bm|tv&og-2FSO((c#>}3sP$Q4_&kBhK4OcXnlmwF;_cQo$Ca_Kq zRapJ{e6w^Ba%W9EJ6lP{Faud@ddC569zmH{94`` zC;@T+ajq#A1c_{=PF->3Z}0C2ccXRVR_MJJ*Ohch;R;j-36YA#$Gy0pe37kE>P3Bq zeU?!A7>NTC0Z9tgxpJt|O165IcJORDX;3k5?TGYqX7;Y1(mYu0xeW*GS293xVYF-X zk@4B>*$-rdawi^;S>3h;q!3`fWF@}gdVPq*WdbT{)J@*TBY@LbwQ|hk12{^d4G;i zPPdXVXvqW|N|R3qfUB(#A8H_iWD~o6?WpzF{WI{$RUxjefDg6 zsGN;2hvsQy2J6L3PR9HYMQ_?zYVU?xE>6+16sEAb*s@Xz2v2Y<@JnUn|9ynaLNKKW zaJyl&jyZw&^5kkBDk}xvRn1n-i4{G_yXGO;gGP1D1R~xOrO4zwjDuic`I5Jr5)ZAH zVOTO6=)R&`DHt`bs$!W_Qp(uy^GkTLGt~C>v!O%SFD*B*l~lf=G%;Q1;@i2hSDhDo zdKu^}D{oIvfExozLq1~UQ0;2enAS{RxkHQ)tKV?|op|LPb;whf3hTsKii33^mhR+87gg)iTV6A|o?17;P>>ZntldHd%kyX!uSx%|o9Ea%r%L>R6XZ%@=&Lv-fLjq^M(gFD{X&^1JQUR_q*p28+?Dto*i+kl6Z5C&Q72 z&V=d-YQryczh;tb8fGZ|uw_tD&unuvH0b;lh!oZ_D>-#xns3w|U#Oh9DI@IZwW!K7 zo}qB5qtsPwx@!yYf-^&xoh?aOp0ZQ_wKXuRquA13Yoj1z({PBAxH{S9BXKh-k?L)A zLPhd?@mENe>7lGGgM9Cvq#~i9v!v6c)QiD|8Pi;pR}FrYk8K#<6J~JStE+%yTJ44a zNLK1uqrAjjPfeg2N1uodXR z%dCohvBC6t1YdQ4Ddb;L0nEinetM>Ru!n8CvDL~dAtp;)O**EmwYZ|9MD7*9*P$$rtf_hS{nQ7#wE$SpikbN~?J6=Y=gBn)LVCZ`^JI zPwAh(%lLm@`rf`HmNC!^dyQI?<~%Ipv&HcFE}rpFr{k$_Y@%y}#Lj^eBdK=@AODJ& zpq1Bo+}?B05Z&?(^q6J$NJ3N*Q(0N1-Jmec4Y;)1Zf*Gkw7l-@y!<6TJH^2w+3)O@ zI44qD!KRTa6ok~r&jZmwwnt>f`v&9$L>I#rjV*dYw(QA_xmd-&K`*1Nmi?WZX{{qC zIodXJ1`Z~3hF!4+UTeUEhtW#wk9au^O#=EPrl59an{r)cr{JyOdd%4{L=AQ4+7Lm( zvXWp>Y(_DZ8ZX>k7YSW)^;X9W`xrm3iE%0l`TF4CNddA9#{_Z|fgeOu=S$?@6VF${ zQeB9<{q9Dpu2{ROO(zi6&OmnwXqzaUq%euR7R|URN#GBMxeK5Iu@!4ek6LW$gp};& zx60jipCXfC)g#)0esz#PKgN3tb93WuU#Cz2JhPVLe3*9#YFL;)rg>y>+}-@h2aU-V zpldDRAAlZuSXYp0v`G7-(-Z#&&pL||ruYr7ZrWaPX5kkd2b3uJ7H>lt_wnho@QJK? zJg(of66b`>xBzUwjs$X>%xoy8(aVqFV78eTPPW*rXJG!lMw4|$E9t&|*MZI|i?K>Z z5kXUFv@1ru<93#mZsH%MMwgj%u@mw&;~o6&G1g|offX`Y(5It4m30522X_vrq5f&j z;0uRaesyuRW4y!bPu{ypPgik;yNMYlGC^;Y?W8k47#Opqh zTsCPuZBILkW8$7bMtmwLXC`2SdpEGnC!^>ynxYb%r7!S~QXlB=Amw1cUmx)5ObrjR z;~-5;0p3oj<&t2S`7|een^vqXT->Ac))h*ch`!MkbqygKtyNi~)ykb`b^cnj^OR}T zYoqWD?sY>Vw~E2TVGo|kt7<#!4u;*%Z*t)YGyb!1+cL;=G2i5{oZ=Syb8o+vZmtQz z#Ga}?D^GNFeQU}1rpA^q>(sG)ay-kL&~2Dp4%mb~w6CscGs5}olrdvoYxl}~q#u>~ z!oQTMa7`>t%`z_xLWQTr_rTRXWZxE_jT}m|mJ)hYY)m1* zzGP9)o9NdLfg1g|LVr`@m$>bR^U@Z3zy+Qn_Y*yzvM6QJ+lNDEN5xsKZr5Q0~{Y(Wai3h*_nQ~UV-(E@MGIZAxpj#PdHKsvUpAP(R6s*bT|BRGwbl})%atPPmL%znLKIDpt+}!&&i5Ha6(jRJSN@fh)OLqK_LNszRz!+Rc2umiW zv+`$RJYm?NTso;Pg)cGf+n`*}P_DEUW!E)EdyS*=2N6LD-TK-BdMW|^{;5L{{9%iI zY4Qoz2lGK@HZeVpCvlE&QVpV5%9cBJWj##*^ItCAkP1odkNy{W1Tg~*4UL>FcSt8H z1FH5~;lDP>dusmSur|zRz!9>ei;Rbeff@TMVgK)~-+n=|Nl#H+HQ&B;qjrt4ZgTqC z5nQSdwhfY!RY3mKDQm&-!chlp2cOy69S?kddh87op3|ZVJjlPr=h=d*e58x@K1G<^ z;d?puLn*&S(Qh_IHrJS`7hVfBUZd`16<#w-y(Ps=4i+La5HyTs0Y={O?S;vmQme1& zgF{5NE-qLIKRs?j+{%|~+X1rv>F@gNf>O^L%EY8kPw9HDNT+7wGJ9o#pPtQ(Y(DY3 zZ3U+Ym9>0xP|lp8NA7g;S*4$G@>w|)19I{o>q;M#QL1|GqtG-!3PV|ydA-m`Em3ss zRs77>pG-&m(NQHqAWKR$oQWscfwkN-W;`Qmd!9VWt_6U0 zkdt{MLW6pHM;hc9U9=wVSZVgbA0Ohis+Py!tAvunKP!?&C{J=gyA^a}F8AD)edwh8 z`*Oy+K(kBh=^X_ZEF<^%mJp-Xxt}8#03!Udw8vnuc*VUiB)x>w%eA_wg zv31n$cI*b8#kZq_GRZa)lQNiFkEl&^CD>+;T9W%7zml4?AtCZ0|6xm@Q6DjQRw%42 zXSpGw~Su4F;`HtJ>+E1*^`t}N;Vx@5yM5_%bz40fF2Yz!r1IhmM)tH`Ekbeb{#1w zYhx5G=I(N5qy(}lH)V+6WA!NJ5~${EYzh78D%1xBeelAZQAL$Jnf`MO7FvX*h(dGr zh9p`g-wb$w?@3zPsd)4h3Tn0`q4iznIGsrCVQq+?O1+vZ1=U1MGJo53b{G+CjjKM; z+bcZxWxAc#69`|X#=kT*=T zsCh|{B)`-g*g8msWeQJ7S*#>ZYlk`#0A`&GP)Lummk`T+wA1qi<(e>w$xMT2JsV|a zUa@F+|0E-#3XOxu6UIwR1o)(Bvts-8!7WGT+T|XQq)I=|61B!8PQM>Ll6eY(J#0$a z-2IWt98uo=W0n%aZ`QWYvqm|!g5n{rAOqa669@ChePYFmWVXpC`6ZrndXW5#%kQBA zB>iF^^*2QvJd-7_fBIv^w9I?711kQ!Qtk62YoMkkQAqHscL(0;r0pL@%$etThg$M( z*)hJ0aTMipsP`*@3DYjfXuWMmtXH!QOn#@dq*IqdN1ZVwF~Wb`{76Xy7Twb=&AA5e z43vpHjZrhiUW+p_b6oC-Yzhv+kDJjctT=8!O4yt($c$b;I0n+ZLRE$=I`}w4#b^pCc8yDxxM`IT^ty zJmzfIl39TcIp>E!)qL)8zWDys?+N#L16bQh(WHA2M68yd$LDThTmk>F4=M33-BA zj~Qv=w!kOXF5YrK8x@R_Kjn9Ivr{=|7MyMaSq#^Wp5U8rsy(eAIruZ(^v5)alA))g=4s_@$g89 zvsz4SO%<~8I41Yew8{!ai?>Y`d2ccjVE)oJII-S&3~0t zG)$AjxD^gHj)V)2DnOdj09$~Wx7@^}eBA{4-_S^};^uCy-gJ!}=BwNNmjh|RqV7v+ zTf>_rSCaOeVco$K?-_Jls~1sfK0H^QVI{7trr~KVtgoBha{3kDgAng{h%T77LwzI* z?yxhET66-{b7X&7VueHW%6*BIFLUw${!MA>Htufo+E~Fc?_HJD8)ms z4fAQlJ%aJbqj4p|1`N~HDWhFEUMAQVlOcotd~v*Tf#`hOep49?6NfHCb1?Onyc!4> znTBGSN*+sHPd;>~bo~TXWBfhh9eweag;|q*3a3gN^!`%l`>T_An03Gcc8BPNL&-|! zt1O!s=t7wNoD5i=yJ|%DS&W&J!&!(P>(l*W#YTGhPR^8PW?ztea-HPO`4OGwiSS#w z5Sq2<`yc!esM_C|j>eOS`SsubXh8a1kxuq|+8|AKr)o$=&S$Q{@|f@(ILy?^i5ip# zc4dL}y%K!+>-p9cTL~63{~~@=MfW_1RV(=sz!)vR70wH|M!%@PCZ1ukWEM4b-tml@ zL2N8_ zTiV+M5?29?9X8O4Ce>nf{y=YJfJ^ZGI`kWx3VG-xx?DR#X(c>Ohf2E8EkFN~yrx65 zh4?*qtkG5vwdAV8PGd}eXJaLpg8Ffn$W^j`;tEE6~!&f)41JY@xQVgknHe!UP* zVdCSeQe5GttuhQneEq*#wd$w2t~+sEP;)L`pEiSl)}etEvP})o5LF?M%&-l0b7hfS z*&?M#vB45J7E{2k}5km8%-ZZxZ+F#!*rpA^LV-Zkih?OS_ z1gRd-r7PM%b*^4)fK+e>Uhyw8PCRw--e$R7M^c!6to;G{FN7mV012*r<6YCU^4Uk^Fu$hh(C!yjdWbbr@oVssfWa1W^28e>HL(95p1}(cUb0uv`G3tdr*{?c1ZKQtpjz@Qa3UyYR@_lRGL?%T2hUXRQr`$t) ztl#rqOxwG*1*Z7nf@>drnZFC#j}PGMpKOIS5f^^2d|DW{msMkb21+tJq=Ntr%0?&Q z^ZT~`E;I-2aoJzmZ)q8YL&wPwkU???NHn{0%a5xbSI_yk`gJ!;7Lm<3^&QdS1NZg> zw)xPzR7aD$Xr06vFm-b-GSv$t_5kRim^~rwlLoTJ z2B(=E@8G^uB5?-MANNNJA8ceOtGDT7!+Pn=Ap<5CeeY!FH`#yP6mI!8EB3!{?fh7U zpI0ZJ8c*sw&Bi|%wlV%Y=Fcn6arwo3gX6xyUP0gdFB#slcqfKv`4QIx`qCvg0cRFk zAAupNMsAE_zaRnqLmx2856Z}+OV zP~Nq1{^@n?^6hoQT zpTr)E+?5WNKIIDUgVB29YK(I*Rtxps?)8vsHpRM;!nPq`C5L#j?3}GDh*a#rL@DPo zTbiPupOQU){Vvq;_j;fsTb1u_*jbS=?z8sK#Kj3@aydg}hgVWMaS>z~7UtW=s?LpQ zC05oYh`NV4=@y7U#TqbCIhQ3+4QcdlfpejR4YyHEuQDavYgCZy)Yjgir`u$1Y{UVd zp>)t_li=(>P;||uRxzeXOI1vLyINsGIg1DHuLu2PKQkH+>XXv4uHIvT;)E^8fW%b3rMS{en6RU-LYFc=fFId~(#7?n{JhFo*T zO$37Xh~(~#;f57o6cgQW^(myQfCyW}1L8`ngl?mjuI^oPd-{$panjP@!31=tM7^3| zykm}5;SWGi>bf$|RWsm`xAiwuFmoF1Xg^YmigQ@SuJHWY>@8wy(8fDQ`)Cu5+8a#G zpq)Y7RzB@6F&zfrKX%KM5cYkV=vsnT;VtN|KNsDASH1jO6i&n=`W^rl_7S)k3e56e zf6*cPfK)r$axQsFu0+e4Mc(bYL%zn>&Yn63zXqUpKbS3=;_u3p?_k;;bSX5E42ON`WKpx%PYDCl$p_uzWS@fbYBC>g`4%}xL5XC~$Xy})vcnw%3nOb?GV-MqmZF(4m3cLnOn!VpX5-y< zPX@BLdC5c31zW+Hh6(0PLbVB~x$v!aNK6%DYh({eKct27FyqEkZ*3(iWwC_J8e4KV z)T<6k71J%Or!l(Z%fGc=nM~K+N#zmRW}@!&If=vR;cGrx=Nnv2x$S3_ZZue*mnO-J zf8Cm93Ir{!JD?FvOIL95y#5|CGxioYfdwq;FzG0Hv*SyK<{*@8-y^HP=Sfs-|E3-g z*Gc_pHO4eeiOFc!8;8|<+nFVP7T1(;23k|UYTDytx-?9o^^2eH>*QaizWf__KU6W` zb<{qotMAL}#cx%CtqUNd zzFzkzUnq2{Bgh_a*;O{~d}Ku{<5t^{9}f z2f*~D*I|AX$Br69XOJDvjyRHJ zP#w;(da!0t(pw;(G>vMu3NM1cKme^msxzD|e=b6@YLu9AVGl~~inXQXMhQH{nQ{)N zA64$&6RfkhMhk4aeObpN z4B;+IFG01Ju$@{%Y{uWea7Ss_W15iOW2-pMTUoOn?X$as9(=QE60$u7ro%DP{(~6H z2q)I8e4xIxU7FkH?dqDG+)h!cYy{Q((kxBWiS;b0MM^LxDNE1c*^oGLa;)0^GjvSt zL<%o%rgS+4ih+}eKa10?3;4~E?F|;v;RU(Pv)u!AW@>;SdwormUa%*5Re1#J+6}wn z$@&-nDZ|YT4MP>ccFQz=oUDnWVvzVTI8&;#%{=*WI9qmy_^kHsyM(Ol@}S455UnlV zQj0C!cjlzuvtDVE$q4^WJ`Hyd|O*6JcX= z&C%KYHuvr3V4C`_p7v8SLY)m$cJOug@(<~Qb|ZJ@m^ott`(N<>$ANFar@MNWpmEaj zPZE@|`#<%_>ds9=IRO5-{Gq0GpW|C;y_Q=or`1pqrIr*n_MEks;_gLmG=?X9qQ6&9>qGs>Z z`)FW58LLZkdF@J?N?*Od@-u21fe9xvI2HQM7!4=4IQhOfC&2FJYN-gN8-UBzC>UfJ85*vqeLiWrr-fs;m2wz2$JYFAt@d$g>{n&Ac8}nq(!t zU3!eR8+nP!#y6@5Wpj7dyH3{V+8ioPAt&^;2zUtv?U-On`n?fj7|#?3VhMrUQSUtqHx#61_wWM)9cGX!Vlz)6#i*w~Ns5(e6 z9xi*f11kLxt8x@>GzpliLTuW=wcW{8hSR$JxRfH=6I4gm%ro9#?nl>-A)cVu_FY@m zHo;lf;Z>Y*I~XntQ4dgdKwDV89x=m-j}Z#)F+E3kD$))cg z=~-G!WC$_tI`5&JV^m@^3}y`K*uxVRFEkT6{kuLA6cvmxUpVB`DoJ6MX%J2kGi7c$ z1J`ef5r+-D^PbbOyk3i5XyI#Y+ERs!TFWua=JB%I0x}{*eI+38mlfMm1SOS}!Hz;r z>)EeL89PL>*Z??JRz(F+EhKusDu37<>`Au%G1U6LAcXUIPeZM7L$}JUW^brq`B3ft z<3ZjG#VJC{riFQ>tQRdfpo+pN7*mKDhr+q9ETl$T#O zUB*J+m(oKbl>V@UbE$ZErr6W;|e=X>OKBMcB(!XcrZBQtfGE^-Ctkuas zPbqYI_ZY33a!a2S9S@59i_1l?@TMN9U*TZ1t-UqCcpLhit}W0`Vd}PeNfWBI4 zSY1`?6^TEY((e=2gC98Ur`3yfigAr>&1BrztOmJhe`G$4x@q%y5MUE*9qbv?6+sU^ zIw!kg%5Zifva;=6xJiB{U;7L<|E{X-c8AiNZ2-Bh<=L*~p-hdFZ3$%pqEfS8amZfx zn*-&d3v{IJC^gpUWM3oc_`Q~nY8NSGdmW-XINS`f8bK>XuKcx98%f1;YXgS)t`|zE z9>+_}4b-2aBKui8d>s;?gRNrGPC2&yEsI9)DNuF#9?!Q~-MFYFrfo`?zSA~~tCx$< z-%DM;mqNNvjkfPex9{PBs~0SHA8!hG$q%Onlq%BmtCyR&X6~xa_?Q5x+l9w3Uh-59 z4Q2C!1ceW(f>lq^J~TtPwq%|!SB>3|p*lnt=?9ubF|1jr%vaaX>)e5=PB}2R(H$jq5JJd}3S5$N_I4=*Xj0 z(5KjLbR#(@s&)_T`)Ssu1ot1(=eN%-=_mpDcF9vmJCV!;H$_?CFc zDm?582a2(yc}CX)TF7oHe?_xzn`^W}BAo91Xv&rpqsn~**;ADVg;0Jy;VH{@gD7v6 z2(mx}xThPhlAH>)&Ub3lUGvxjz18mIm+t$To0`| zSMC$sqEjs8-Y(fO!TV*T7Yg5fr3LcX(oa&n@BalpOHWR!G4D&CDKQIDB^{I{WlSYJ zpCkz0uNs|ndf&qUp};|z-gC3eJC$CC3D9A~FPT(ds&leYI5f|LFT2AP8thim#8dwP zB{DOgRt0?Y|2X>VeUJO@pw;Oq2k>WBZ7z`>9+sir4c$MVWWDUgdfyvpzrV6zn=xUg zqD7$XVW{+^GUiJvBlBp9QVWmbbO-T9B~G*QuN5b@7DrbGlDk0K1oEsvN!YXbz@9uh z@Fry{3*v?Qq&B}sQ4`scMl_%e&@Aak1DfBn7J#Y4`&;ODZ-wtbVHWf0A^pp9s_%#J zcc3JzYjJ9ez|K$L)BJ7ZsqFSX^Yz|sPh{h8YY?c{+Rdw>@o^l*d*SFX@99eJv{ z_7E@R6;Z*{Gd3pBBY^d({{4w6F9i!nxMY)V%MAwB=n4k*|9(NLgMoq7#c=mP{O2zu zD1w_7BUxMWS2NC=;P5fV-odY36tRU!0 zfCyCVfb?H2MZ|EL12`C1z&}0P{|Wz%|AFa{U| cb=gq;2mG%QOGiS8czaNYBQeZ|{eQs!0aF<>F8}}l delta 14745 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 diff --git a/lib/bld/bld-wrapper.properties b/lib/bld/bld-wrapper.properties index 798472e..b03b721 100644 --- a/lib/bld/bld-wrapper.properties +++ b/lib/bld/bld-wrapper.properties @@ -1,6 +1,6 @@ bld.downloadExtensionJavadoc=false bld.downloadExtensionSources=true -bld.downloadLocation= +bld.downloadLocation=file:/Users/gbevin/.m2/repository/com/uwyn/rife2/bld/2.0.0-SNAPSHOT bld.extension-antlr=com.uwyn.rife2:bld-antlr4:1.2.8 bld.extension-archive=com.uwyn.rife2:bld-archive:0.4.8 bld.extension-tests=com.uwyn.rife2:bld-tests-badge:1.4.8 diff --git a/src/main/java/rife/bld/BaseProject.java b/src/main/java/rife/bld/BaseProject.java index e946b21..8f30c9b 100644 --- a/src/main/java/rife/bld/BaseProject.java +++ b/src/main/java/rife/bld/BaseProject.java @@ -1616,6 +1616,7 @@ public class BaseProject extends BuildExecutor { } private String createHash() { + var resolution = new VersionResolution(properties()); var finger_print = new StringBuilder(); for (var repository : repositories()) { finger_print.append(repository.toString()); @@ -1626,7 +1627,7 @@ public class BaseProject extends BuildExecutor { finger_print.append('\n'); if (entry.getValue() != null) { for (var dependency : entry.getValue()) { - finger_print.append(dependency.toString()); + finger_print.append(resolution.overrideDependency(dependency).toString()); finger_print.append('\n'); } } diff --git a/src/main/java/rife/bld/BuildExecutor.java b/src/main/java/rife/bld/BuildExecutor.java index 149208e..8848cc2 100644 --- a/src/main/java/rife/bld/BuildExecutor.java +++ b/src/main/java/rife/bld/BuildExecutor.java @@ -132,7 +132,7 @@ public class BuildExecutor { * * @return {@code true} if JSON output is enabled; * or {@code false} otherwise - * @since 2.0.0 + * @since 2.0 */ public boolean outputJson() { return outputJson_; diff --git a/src/main/java/rife/bld/dependencies/Dependency.java b/src/main/java/rife/bld/dependencies/Dependency.java index f4cda0c..62b1b78 100644 --- a/src/main/java/rife/bld/dependencies/Dependency.java +++ b/src/main/java/rife/bld/dependencies/Dependency.java @@ -139,6 +139,16 @@ public record Dependency(String groupId, String artifactId, VersionNumber versio } + /** + * Returns a string representation of the dependency in the format "groupId:artifactId". + * + * @return the string representation of the dependency + * @since 2.0 + */ + public String toArtifactString() { + return groupId + ':' + artifactId; + } + public String toString() { var result = new StringBuilder(groupId).append(':').append(artifactId); if (!version.equals(VersionNumber.UNKNOWN)) { diff --git a/src/main/java/rife/bld/dependencies/DependencyResolver.java b/src/main/java/rife/bld/dependencies/DependencyResolver.java index 5eccd6e..8cb065d 100644 --- a/src/main/java/rife/bld/dependencies/DependencyResolver.java +++ b/src/main/java/rife/bld/dependencies/DependencyResolver.java @@ -18,6 +18,7 @@ import java.util.stream.Collectors; * @since 1.5 */ public class DependencyResolver { + private final VersionResolution resolution_; private final ArtifactRetriever retriever_; private final List repositories_; private final Dependency dependency_; @@ -30,12 +31,14 @@ public class DependencyResolver { *

* The repositories will be checked in the order they're listed. * + * @param resolution the version resolution state that can be cached * @param retriever the retriever to use to get artifacts * @param repositories the repositories to use for the resolution * @param dependency the dependency to resolve - * @since 1.5.18 + * @since 2.0 */ - public DependencyResolver(ArtifactRetriever retriever, List repositories, Dependency dependency) { + public DependencyResolver(VersionResolution resolution, ArtifactRetriever retriever, List repositories, Dependency dependency) { + resolution_ = resolution; retriever_ = retriever; if (repositories == null) { repositories = Collections.emptyList(); @@ -64,7 +67,6 @@ public class DependencyResolver { } } - /** * Resolves the dependency version in the provided repositories. *

@@ -77,7 +79,7 @@ public class DependencyResolver { * @since 1.5 */ public VersionNumber resolveVersion() { - var version = dependency_.version(); + var version = resolution_.overrideVersion(dependency_); if (version.equals(VersionNumber.UNKNOWN)) { return latestVersion(); } @@ -98,7 +100,7 @@ public class DependencyResolver { var pom_dependencies = getMavenPom(dependency_).getDependencies(scopes); var result = new DependencySet(); for (var dependency : pom_dependencies) { - result.add(dependency.convertToDependency()); + result.add(resolution_.overrideDependency(dependency.convertToDependency())); } return result; } @@ -118,11 +120,12 @@ public class DependencyResolver { */ public DependencySet getAllDependencies(Scope... scopes) { var result = new DependencySet(); - result.add(dependency_); + var overridden = resolution_.overrideDependency(dependency_); + result.add(overridden); var dependency_queue = new ArrayList(); - var parent = dependency_; + var parent = overridden; var next_dependencies = getMavenPom(parent).getDependencies(scopes); while (parent != null && next_dependencies != null) { @@ -142,7 +145,7 @@ public class DependencyResolver { // part of the results yet while (!dependency_queue.isEmpty()) { var candidate = dependency_queue.remove(0); - var dependency = candidate.convertToDependency(); + var dependency = resolution_.overrideDependency(candidate.convertToDependency()); if (!result.contains(dependency)) { result.add(dependency); @@ -150,7 +153,7 @@ public class DependencyResolver { // dependencies so that they can be added to the queue after // filtering parent = dependency; - next_dependencies = new DependencyResolver(retriever_, repositories_, dependency).getMavenPom(parent).getDependencies(scopes); + next_dependencies = new DependencyResolver(resolution_, retriever_, repositories_, dependency).getMavenPom(parent).getDependencies(scopes); break; } } @@ -258,6 +261,16 @@ public class DependencyResolver { return dependency_; } + /** + * Returns the version resolution state that can be cached. + * + * @return the version resolution state + * @since 2.0 + */ + public VersionResolution resolution() { + return resolution_; + } + /** * Retrieves all the potential locations for the dependency * within the provided repositories. @@ -435,7 +448,7 @@ public class DependencyResolver { throw new ArtifactNotFoundException(dependency_, location); } - var xml = new Xml2MavenPom(parent, retriever_, repositories_); + var xml = new Xml2MavenPom(parent, resolution_, retriever_, repositories_); if (!xml.processXml(pom)) { throw new DependencyXmlParsingErrorException(dependency_, retrieved_artifact.location(), xml.getErrors()); } diff --git a/src/main/java/rife/bld/dependencies/DependencyScopes.java b/src/main/java/rife/bld/dependencies/DependencyScopes.java index f719792..d261858 100644 --- a/src/main/java/rife/bld/dependencies/DependencyScopes.java +++ b/src/main/java/rife/bld/dependencies/DependencyScopes.java @@ -4,6 +4,8 @@ */ package rife.bld.dependencies; +import rife.ioc.HierarchicalProperties; + import java.util.LinkedHashMap; import java.util.List; @@ -66,13 +68,14 @@ public class DependencyScopes extends LinkedHashMap { /** * Returns the transitive set of dependencies that would be used for the compile scope in a project. * + * @param properties the properties to use to get artifacts * @param retriever the retriever to use to get artifacts * @param repositories the repositories to use for the resolution * @return the compile scope dependency set - * @since 1.6 + * @since 2.0 */ - public DependencySet resolveCompileDependencies(ArtifactRetriever retriever, List repositories) { - return resolveScopedDependencies(retriever, repositories, + public DependencySet resolveCompileDependencies(HierarchicalProperties properties, ArtifactRetriever retriever, List repositories) { + return resolveScopedDependencies(properties, retriever, repositories, new Scope[]{Scope.compile}, new Scope[]{Scope.compile}, null); @@ -81,13 +84,14 @@ public class DependencyScopes extends LinkedHashMap { /** * Returns the transitive set of dependencies that would be used for the provided scope in a project. * + * @param properties the properties to use to get artifacts * @param retriever the retriever to use to get artifacts * @param repositories the repositories to use for the resolution * @return the provided scope dependency set - * @since 1.8 + * @since 2.0 */ - public DependencySet resolveProvidedDependencies(ArtifactRetriever retriever, List repositories) { - return resolveScopedDependencies(retriever, repositories, + public DependencySet resolveProvidedDependencies(HierarchicalProperties properties, ArtifactRetriever retriever, List repositories) { + return resolveScopedDependencies(properties, retriever, repositories, new Scope[]{Scope.provided}, new Scope[]{Scope.compile, Scope.runtime}, null); @@ -96,28 +100,30 @@ public class DependencyScopes extends LinkedHashMap { /** * Returns the transitive set of dependencies that would be used for the runtime scope in a project. * + * @param properties the properties to use to get artifacts * @param retriever the retriever to use to get artifacts * @param repositories the repositories to use for the resolution * @return the runtime scope dependency set - * @since 1.6 + * @since 2.0 */ - public DependencySet resolveRuntimeDependencies(ArtifactRetriever retriever, List repositories) { - return resolveScopedDependencies(retriever, repositories, + public DependencySet resolveRuntimeDependencies(HierarchicalProperties properties, ArtifactRetriever retriever, List repositories) { + return resolveScopedDependencies(properties, retriever, repositories, new Scope[]{Scope.compile, Scope.runtime}, new Scope[]{Scope.compile, Scope.runtime}, - resolveCompileDependencies(retriever, repositories)); + resolveCompileDependencies(properties, retriever, repositories)); } /** * Returns the transitive set of dependencies that would be used for the standalone scope in a project. * + * @param properties the properties to use to get artifacts * @param retriever the retriever to use to get artifacts * @param repositories the repositories to use for the resolution * @return the standalone scope dependency set - * @since 1.6 + * @since 2.0 */ - public DependencySet resolveStandaloneDependencies(ArtifactRetriever retriever, List repositories) { - return resolveScopedDependencies(retriever, repositories, + public DependencySet resolveStandaloneDependencies(HierarchicalProperties properties, ArtifactRetriever retriever, List repositories) { + return resolveScopedDependencies(properties, retriever, repositories, new Scope[]{Scope.standalone}, new Scope[]{Scope.compile, Scope.runtime}, null); @@ -126,25 +132,27 @@ public class DependencyScopes extends LinkedHashMap { /** * Returns the transitive set of dependencies that would be used for the test scope in a project. * + * @param properties the properties to use to get artifacts * @param retriever the retriever to use to get artifacts * @param repositories the repositories to use for the resolution * @return the test scope dependency set - * @since 1.6 + * @since 2.0 */ - public DependencySet resolveTestDependencies(ArtifactRetriever retriever, List repositories) { - return resolveScopedDependencies(retriever, repositories, + public DependencySet resolveTestDependencies(HierarchicalProperties properties, ArtifactRetriever retriever, List repositories) { + return resolveScopedDependencies(properties, retriever, repositories, new Scope[]{Scope.test}, new Scope[]{Scope.compile, Scope.runtime}, null); } - private DependencySet resolveScopedDependencies(ArtifactRetriever retriever, List repositories, Scope[] resolvedScopes, Scope[] transitiveScopes, DependencySet excluded) { + private DependencySet resolveScopedDependencies(HierarchicalProperties properties, ArtifactRetriever retriever, List repositories, Scope[] resolvedScopes, Scope[] transitiveScopes, DependencySet excluded) { + var resolution = new VersionResolution(properties); var dependencies = new DependencySet(); for (var scope : resolvedScopes) { var scoped_dependencies = get(scope); if (scoped_dependencies != null) { for (var dependency : scoped_dependencies) { - dependencies.addAll(new DependencyResolver(retriever, repositories, dependency).getAllDependencies(transitiveScopes)); + dependencies.addAll(new DependencyResolver(resolution, retriever, repositories, dependency).getAllDependencies(transitiveScopes)); } } } diff --git a/src/main/java/rife/bld/dependencies/DependencySet.java b/src/main/java/rife/bld/dependencies/DependencySet.java index 5d5aeb0..6232ba0 100644 --- a/src/main/java/rife/bld/dependencies/DependencySet.java +++ b/src/main/java/rife/bld/dependencies/DependencySet.java @@ -84,15 +84,16 @@ public class DependencySet extends AbstractSet implements Set * The destination directory must exist and be writable. * + * @param resolution the version resolution state that can be cached * @param retriever the retriever to use to get artifacts * @param repositories the repositories to use for the transfer * @param directory the directory to transfer the artifacts into * @return the list of artifacts that were transferred successfully * @throws DependencyTransferException when an error occurred during the transfer - * @since 1.5.10 + * @since 2.0 */ - public List transferIntoDirectory(ArtifactRetriever retriever, List repositories, File directory) { - return transferIntoDirectory(retriever, repositories, directory, (String[]) null); + public List transferIntoDirectory(VersionResolution resolution, ArtifactRetriever retriever, List repositories, File directory) { + return transferIntoDirectory(resolution, retriever, repositories, directory, (String[]) null); } /** @@ -101,18 +102,19 @@ public class DependencySet extends AbstractSet implements Set * The destination directory must exist and be writable. * + * @param resolution the version resolution state that can be cached * @param retriever the retriever to use to get artifacts * @param repositories the repositories to use for the download * @param directory the directory to download the artifacts into * @param classifiers the additional classifiers to transfer * @return the list of artifacts that were transferred successfully * @throws DependencyTransferException when an error occurred during the transfer - * @since 1.5.10 + * @since 2.0 */ - public List transferIntoDirectory(ArtifactRetriever retriever, List repositories, File directory, String... classifiers) { + public List transferIntoDirectory(VersionResolution resolution, ArtifactRetriever retriever, List repositories, File directory, String... classifiers) { var result = new ArrayList(); for (var dependency : this) { - var artifact = new DependencyResolver(retriever, repositories, dependency).transferIntoDirectory(directory); + var artifact = new DependencyResolver(resolution, retriever, repositories, dependency).transferIntoDirectory(directory); if (artifact != null) { result.add(artifact); } @@ -120,7 +122,7 @@ public class DependencySet extends AbstractSet implements Set implements Set repositories, Scope... scopes) { + public String generateTransitiveDependencyTree(VersionResolution resolution, ArtifactRetriever retriever, List repositories, Scope... scopes) { var compile_dependencies = new DependencySet(); for (var dependency : this) { - compile_dependencies.addAll(new DependencyResolver(retriever, repositories, dependency).getAllDependencies(scopes)); + compile_dependencies.addAll(new DependencyResolver(resolution, retriever, repositories, dependency).getAllDependencies(scopes)); } return compile_dependencies.generateDependencyTree(); } diff --git a/src/main/java/rife/bld/dependencies/VersionResolution.java b/src/main/java/rife/bld/dependencies/VersionResolution.java new file mode 100644 index 0000000..37e69a1 --- /dev/null +++ b/src/main/java/rife/bld/dependencies/VersionResolution.java @@ -0,0 +1,115 @@ +/* + * Copyright 2001-2024 Geert Bevin (gbevin[remove] at uwyn dot com) + * Licensed under the Apache License, Version 2.0 (the "License") + */ +package rife.bld.dependencies; + +import rife.ioc.HierarchicalProperties; + +import java.util.HashMap; +import java.util.Map; + +/** + * This class is responsible for managing version overrides for dependencies. + *

+ * It allows users to specify a property keys with the prefix "{@code bld.override}" where the values will be parsed as + * a comma-separated list of dependencies with the versions that should override any other versions that are encountered. + *

+ * For instance: + *

+ * bld.override=com.uwyn.rife2:bld-tests-badge:1.4.7,com.h2database:h2:2.2.222
+ * 
+ *

+ * Multiple override properties can be used by simply adding differentiators behind the "{@code bld.override}" keys. + *

+ * For instance: + *

+ * bld.override-tests=com.uwyn.rife2:bld-tests-badge:1.4.7
+ * bld.override-h2=com.h2database:h2:2.2.222
+ * 
+ * @since 2.0 + */ +public class VersionResolution { + /** + * The prefix for property keys used to override versions of dependencies. + * @since 2.0 + */ + public static final String PROPERTY_OVERRIDE_PREFIX = "bld.override"; + + private final Map versionOverrides_ = new HashMap<>(); + + /** + * Returns a dummy {@code VersionResolution} instance that doesn't override anything. + * + * @return the dummy instance + * @since 2.0 + */ + static VersionResolution dummy() { + return new VersionResolution(null); + } + + /** + * Creates a new instance of the {@code VersionReslution} class from hierarchical properties that + * are passed in. + *

+ * The actual version overrides are determined at instantiation time and any future changes to the + * properties will not influence version resolution. + * + * @param properties the hierarchical properties that will be used to determine the version overrides + * @since 2.0 + */ + public VersionResolution(HierarchicalProperties properties) { + if (properties != null) { + for (var name : properties.getNames()) { + if (name.startsWith(PROPERTY_OVERRIDE_PREFIX)) { + for (var override : properties.get(name).toString().split(",")) { + override = override.trim(); + if (!override.isBlank()) { + var dependency = Dependency.parse(override); + if (dependency != null) { + versionOverrides_.put(dependency.toArtifactString(), dependency.version()); + } + } + } + } + } + } + } + + /** + * Overrides the version of a given dependency with the corresponding overridden version. + * + * @param original the dependency for which the version needs to be overridden + * @return the overridden version if it is available; or the original version otherwise + * @since 2.0 + */ + public VersionNumber overrideVersion(Dependency original) { + var overridden = versionOverrides_.get(original.toArtifactString()); + if (overridden == null) { + return original.version(); + } + return overridden; + } + + /** + * Overrides the version of a given dependency with the corresponding overridden version and + * creates a new dependency object with the overridden version, if needed. + * + * @param original the dependency for which the version needs to be overridden + * @return the dependency with the overridden version if it's available; or the original dependency otherwise + * @since 2.0 + */ + public Dependency overrideDependency(Dependency original) { + var overridden = versionOverrides_.get(original.toArtifactString()); + if (overridden == null) { + return original; + } + return new Dependency(original.groupId(), + original.artifactId(), + overridden, + original.classifier(), + original.type(), + original.exclusions(), + original.parent()); + } +} diff --git a/src/main/java/rife/bld/dependencies/Xml2MavenPom.java b/src/main/java/rife/bld/dependencies/Xml2MavenPom.java index 03d5c82..8d1f5fe 100644 --- a/src/main/java/rife/bld/dependencies/Xml2MavenPom.java +++ b/src/main/java/rife/bld/dependencies/Xml2MavenPom.java @@ -18,13 +18,14 @@ import java.util.regex.Pattern; */ class Xml2MavenPom extends Xml2Data { private final Dependency parent_; + private final VersionResolution resolution_; private final ArtifactRetriever retriever_; private final List repositories_; private Map> resolvedDependencies_ = null; private final Map dependencyManagement_ = new LinkedHashMap<>(); private final Set dependencies_ = new LinkedHashSet<>(); - private final Map properties_ = new HashMap<>(); + private final Map mavenProperties_ = new HashMap<>(); private final Stack elementStack_ = new Stack<>(); private ExclusionSet exclusions_ = null; @@ -45,8 +46,9 @@ class Xml2MavenPom extends Xml2Data { private String lastExclusionGroupId_ = null; private String lastExclusionArtifactId_ = null; - Xml2MavenPom(Dependency parent, ArtifactRetriever retriever, List repositories) { + Xml2MavenPom(Dependency parent, VersionResolution resolution, ArtifactRetriever retriever, List repositories) { parent_ = parent; + resolution_ = resolution; retriever_ = retriever; repositories_ = repositories; } @@ -85,17 +87,17 @@ class Xml2MavenPom extends Xml2Data { if (dep_scope == null) { dep_scope = "compile"; } - optional = resolveProperties(optional); + optional = resolveMavenProperties(optional); if ("true".equals(optional)) { continue; } var resolved_dependency = new PomDependency( - resolveProperties(dependency.groupId()), - resolveProperties(dependency.artifactId()), - resolveProperties(version), - resolveProperties(dependency.classifier()), - resolveProperties(dependency.type()), + resolveMavenProperties(dependency.groupId()), + resolveMavenProperties(dependency.artifactId()), + resolveMavenProperties(version), + resolveMavenProperties(dependency.classifier()), + resolveMavenProperties(dependency.type()), dep_scope, "false", exclusions, @@ -126,13 +128,13 @@ class Xml2MavenPom extends Xml2Data { PomDependency resolveDependency(PomDependency dependency) { return new PomDependency( - resolveProperties(dependency.groupId()), - resolveProperties(dependency.artifactId()), - resolveProperties(dependency.version()), - resolveProperties(dependency.classifier()), - resolveProperties(dependency.type()), + resolveMavenProperties(dependency.groupId()), + resolveMavenProperties(dependency.artifactId()), + resolveMavenProperties(dependency.version()), + resolveMavenProperties(dependency.classifier()), + resolveMavenProperties(dependency.type()), dependency.scope(), - resolveProperties(dependency.optional()), + resolveMavenProperties(dependency.optional()), dependency.exclusions(), dependency.parent()); } @@ -178,11 +180,11 @@ class Xml2MavenPom extends Xml2Data { switch (qName) { case "parent" -> { if (isChildOfProject()) { - var parent_dependency = new Dependency(resolveProperties(lastGroupId_), resolveProperties(lastArtifactId_), VersionNumber.parse(resolveProperties(lastVersion_))); - var parent = new DependencyResolver(retriever_, repositories_, parent_dependency).getMavenPom(parent_); + var parent_dependency = new Dependency(resolveMavenProperties(lastGroupId_), resolveMavenProperties(lastArtifactId_), VersionNumber.parse(resolveMavenProperties(lastVersion_))); + var parent = new DependencyResolver(resolution_, retriever_, repositories_, parent_dependency).getMavenPom(parent_); - parent.properties_.keySet().removeAll(properties_.keySet()); - properties_.putAll(parent.properties_); + parent.mavenProperties_.keySet().removeAll(mavenProperties_.keySet()); + mavenProperties_.putAll(parent.mavenProperties_); parent.dependencyManagement_.keySet().removeAll(dependencyManagement_.keySet()); dependencyManagement_.putAll(parent.dependencyManagement_); @@ -206,8 +208,8 @@ class Xml2MavenPom extends Xml2Data { var dependency = new PomDependency(lastGroupId_, lastArtifactId_, lastVersion_, lastClassifier_, lastType_, lastScope_, lastOptional_, exclusions_, parent_); if (collectDependencyManagement_) { if (dependency.isPomImport()) { - var import_dependency = new Dependency(resolveProperties(lastGroupId_), resolveProperties(lastArtifactId_), VersionNumber.parse(resolveProperties(lastVersion_))); - var imported_pom = new DependencyResolver(retriever_, repositories_, import_dependency).getMavenPom(parent_); + var import_dependency = new Dependency(resolveMavenProperties(lastGroupId_), resolveMavenProperties(lastArtifactId_), VersionNumber.parse(resolveMavenProperties(lastVersion_))); + var imported_pom = new DependencyResolver(resolution_, retriever_, repositories_, import_dependency).getMavenPom(parent_); imported_pom.dependencyManagement_.keySet().removeAll(dependencyManagement_.keySet()); var resolved_dependencies = new LinkedHashSet(); for (var managed_dependency : imported_pom.dependencyManagement_.keySet()) { @@ -278,7 +280,7 @@ class Xml2MavenPom extends Xml2Data { } default -> { if (collectProperties_) { - properties_.put(qName, getCharacterData()); + mavenProperties_.put(qName, getCharacterData()); } } } @@ -303,7 +305,7 @@ class Xml2MavenPom extends Xml2Data { } private void addProjectProperty(String name) { - properties_.put("project." + name, getCharacterData()); + mavenProperties_.put("project." + name, getCharacterData()); } private String getCharacterData() { @@ -320,7 +322,7 @@ class Xml2MavenPom extends Xml2Data { private static final Pattern MAVEN_PROPERTY = Pattern.compile("\\$\\{([^<>{}]+)}"); - private String resolveProperties(String data) { + private String resolveMavenProperties(String data) { if (data == null) { return null; } @@ -335,9 +337,9 @@ class Xml2MavenPom extends Xml2Data { while (matcher.find()) { if (matcher.groupCount() == 1) { var property = matcher.group(1); - if (properties_.containsKey(property)) { + if (mavenProperties_.containsKey(property)) { processed_data.append(data, last_end, matcher.start()); - processed_data.append(properties_.get(property)); + processed_data.append(mavenProperties_.get(property)); last_end = matcher.end(); replaced = true; diff --git a/src/main/java/rife/bld/operations/DependencyTreeOperation.java b/src/main/java/rife/bld/operations/DependencyTreeOperation.java index e11b542..f2e2a40 100644 --- a/src/main/java/rife/bld/operations/DependencyTreeOperation.java +++ b/src/main/java/rife/bld/operations/DependencyTreeOperation.java @@ -8,6 +8,7 @@ import rife.bld.BaseProject; import rife.bld.BldVersion; import rife.bld.dependencies.*; import rife.bld.wrapper.Wrapper; +import rife.ioc.HierarchicalProperties; import java.io.IOException; import java.util.ArrayList; @@ -22,6 +23,7 @@ import static rife.bld.dependencies.Scope.*; * @since 1.5.21 */ public class DependencyTreeOperation extends AbstractOperation { + private HierarchicalProperties properties_ = null; private ArtifactRetriever retriever_ = null; private final List repositories_ = new ArrayList<>(); private final DependencyScopes dependencies_ = new DependencyScopes(); @@ -66,7 +68,7 @@ public class DependencyTreeOperation extends AbstractOperation @@ -310,4 +325,17 @@ public class DependencyTreeOperation extends AbstractOperation { + private HierarchicalProperties properties_ = null; private ArtifactRetriever retriever_ = null; private final List repositories_ = new ArrayList<>(); private final DependencyScopes dependencies_ = new DependencyScopes(); @@ -57,7 +59,7 @@ public class DownloadOperation extends AbstractOperation { * @since 1.5 */ protected void executeDownloadCompileDependencies() { - executeDownloadDependencies(libCompileDirectory(), dependencies().resolveCompileDependencies(artifactRetriever(), repositories())); + executeDownloadDependencies(libCompileDirectory(), dependencies().resolveCompileDependencies(properties(), artifactRetriever(), repositories())); } /** @@ -66,7 +68,7 @@ public class DownloadOperation extends AbstractOperation { * @since 1.8 */ protected void executeDownloadProvidedDependencies() { - executeDownloadDependencies(libProvidedDirectory(), dependencies().resolveProvidedDependencies(artifactRetriever(), repositories())); + executeDownloadDependencies(libProvidedDirectory(), dependencies().resolveProvidedDependencies(properties(), artifactRetriever(), repositories())); } /** @@ -75,7 +77,7 @@ public class DownloadOperation extends AbstractOperation { * @since 1.5 */ protected void executeDownloadRuntimeDependencies() { - executeDownloadDependencies(libRuntimeDirectory(), dependencies().resolveRuntimeDependencies(artifactRetriever(), repositories())); + executeDownloadDependencies(libRuntimeDirectory(), dependencies().resolveRuntimeDependencies(properties(), artifactRetriever(), repositories())); } /** @@ -84,7 +86,7 @@ public class DownloadOperation extends AbstractOperation { * @since 1.5 */ protected void executeDownloadStandaloneDependencies() { - executeDownloadDependencies(libStandaloneDirectory(), dependencies().resolveStandaloneDependencies(artifactRetriever(), repositories())); + executeDownloadDependencies(libStandaloneDirectory(), dependencies().resolveStandaloneDependencies(properties(), artifactRetriever(), repositories())); } /** @@ -93,7 +95,7 @@ public class DownloadOperation extends AbstractOperation { * @since 1.5 */ protected void executeDownloadTestDependencies() { - executeDownloadDependencies(libTestDirectory(), dependencies().resolveTestDependencies(artifactRetriever(), repositories())); + executeDownloadDependencies(libTestDirectory(), dependencies().resolveTestDependencies(properties(), artifactRetriever(), repositories())); } /** @@ -120,7 +122,7 @@ public class DownloadOperation extends AbstractOperation { additional_classifiers = classifiers.toArray(new String[0]); } - dependencies.transferIntoDirectory(artifactRetriever(), repositories(), destinationDirectory, additional_classifiers); + dependencies.transferIntoDirectory(new VersionResolution(properties()), artifactRetriever(), repositories(), destinationDirectory, additional_classifiers); } /** @@ -131,7 +133,8 @@ public class DownloadOperation extends AbstractOperation { * @since 1.5 */ public DownloadOperation fromProject(BaseProject project) { - return artifactRetriever(project.artifactRetriever()) + return properties(project.properties()) + .artifactRetriever(project.artifactRetriever()) .repositories(project.repositories()) .dependencies(project.dependencies()) .libCompileDirectory(project.libCompileDirectory()) @@ -279,6 +282,18 @@ public class DownloadOperation extends AbstractOperation { return this; } + /** + * Provides the hierarchical properties to use. + * + * @param properties the hierarchical properties + * @return this operation instance + * @since 2.0 + */ + public DownloadOperation properties(HierarchicalProperties properties) { + properties_ = properties; + return this; + } + /** * Retrieves the repositories in which the dependencies will be resolved. *

@@ -387,4 +402,17 @@ public class DownloadOperation extends AbstractOperation { } return retriever_; } + + /** + * Returns the hierarchical properties that are used. + * + * @return the hierarchical properties + * @since 2.0 + */ + public HierarchicalProperties properties() { + if (properties_ == null) { + properties_ = new HierarchicalProperties(); + } + return properties_; + } } diff --git a/src/main/java/rife/bld/operations/PublishOperation.java b/src/main/java/rife/bld/operations/PublishOperation.java index 5d65872..8b39df3 100644 --- a/src/main/java/rife/bld/operations/PublishOperation.java +++ b/src/main/java/rife/bld/operations/PublishOperation.java @@ -12,6 +12,7 @@ import rife.bld.operations.exceptions.OperationOptionException; import rife.bld.operations.exceptions.SignException; import rife.bld.operations.exceptions.UploadException; import rife.bld.publish.*; +import rife.ioc.HierarchicalProperties; import rife.tools.FileUtils; import rife.tools.exceptions.FileUtilsErrorException; @@ -38,6 +39,7 @@ import static rife.tools.StringUtils.encodeHexLower; * @since 1.5.7 */ public class PublishOperation extends AbstractOperation { + private HierarchicalProperties properties_ = null; private ArtifactRetriever retriever_ = null; private final HttpClient client_ = HttpClient.newHttpClient(); @@ -45,7 +47,7 @@ public class PublishOperation extends AbstractOperation { private final List repositories_ = new ArrayList<>(); private final DependencyScopes dependencies_ = new DependencyScopes(); private PublishInfo info_ = new PublishInfo(); - private PublishProperties properties_ = new PublishProperties(); + private PublishProperties publishProperties_ = new PublishProperties(); private final List artifacts_ = new ArrayList<>(); /** @@ -121,7 +123,8 @@ public class PublishOperation extends AbstractOperation { // determine which build number to use var snapshot_build_number = 1; try { - var resolver = new DependencyResolver(artifactRetriever(), List.of(repository), new Dependency(info().groupId(), info().artifactId(), info().version())); + var resolution = new VersionResolution(properties()); + var resolver = new DependencyResolver(resolution, artifactRetriever(), List.of(repository), new Dependency(info().groupId(), info().artifactId(), info().version())); var snapshot_meta = resolver.getSnapshotMavenMetadata(); snapshot_build_number = snapshot_meta.getSnapshotBuildNumber() + 1; } catch (DependencyException e) { @@ -191,7 +194,7 @@ public class PublishOperation extends AbstractOperation { // generate and upload pom executePublishStringArtifact( repository, - new PomBuilder().properties(properties()).info(info()).dependencies(dependencies()).build(), + new PomBuilder().properties(publishProperties()).info(info()).dependencies(dependencies()).build(), info().version() + "/" + info().artifactId() + "-" + actualVersion + ".pom", true); } @@ -204,7 +207,8 @@ public class PublishOperation extends AbstractOperation { */ protected void executePublishMetadata(Repository repository, ZonedDateTime moment) { var current_versions = new ArrayList(); - var resolver = new DependencyResolver(artifactRetriever(), List.of(repository), new Dependency(info().groupId(), info().artifactId(), info().version())); + var resolution = new VersionResolution(properties()); + var resolver = new DependencyResolver(resolution, artifactRetriever(), List.of(repository), new Dependency(info().groupId(), info().artifactId(), info().version())); try { current_versions.addAll(resolver.getMavenMetadata().getVersions()); } catch (DependencyException e) { @@ -498,10 +502,11 @@ public class PublishOperation extends AbstractOperation { */ public PublishOperation fromProject(BaseProject project) { if (project.javaRelease() != null) { - properties() + publishProperties() .mavenCompilerSource(project.javaRelease()) .mavenCompilerTarget(project.javaRelease()); } + properties(project.properties()); artifactRetriever(project.artifactRetriever()); dependencies().include(project.dependencies()); artifacts(List.of( @@ -604,10 +609,10 @@ public class PublishOperation extends AbstractOperation { * * @param properties the publication properties * @return this operation instance - * @since 2.0.0 + * @since 2.0 */ - public PublishOperation properties(PublishProperties properties) { - properties_ = properties; + public PublishOperation publishProperties(PublishProperties properties) { + publishProperties_ = properties; return this; } @@ -661,6 +666,18 @@ public class PublishOperation extends AbstractOperation { return this; } + /** + * Provides the hierarchical properties to use. + * + * @param properties the hierarchical properties + * @return this operation instance + * @since 2.0 + */ + public PublishOperation properties(HierarchicalProperties properties) { + properties_ = properties; + return this; + } + /** * Retrieves the repositories to which will be published. *

@@ -691,10 +708,10 @@ public class PublishOperation extends AbstractOperation { * This is a modifiable structure that can be retrieved and changed. * * @return the publication properties - * @since 2.0.0 + * @since 2.0 */ - public PublishProperties properties() { - return properties_; + public PublishProperties publishProperties() { + return publishProperties_; } /** @@ -733,4 +750,17 @@ public class PublishOperation extends AbstractOperation { } return retriever_; } + + /** + * Returns the hierarchical properties that are used. + * + * @return the hierarchical properties + * @since 2.0 + */ + public HierarchicalProperties properties() { + if (properties_ == null) { + properties_ = new HierarchicalProperties(); + } + return properties_; + } } diff --git a/src/main/java/rife/bld/operations/PurgeOperation.java b/src/main/java/rife/bld/operations/PurgeOperation.java index baeb3ee..ae9589c 100644 --- a/src/main/java/rife/bld/operations/PurgeOperation.java +++ b/src/main/java/rife/bld/operations/PurgeOperation.java @@ -6,6 +6,7 @@ package rife.bld.operations; import rife.bld.BaseProject; import rife.bld.dependencies.*; +import rife.ioc.HierarchicalProperties; import java.io.File; import java.util.*; @@ -24,6 +25,7 @@ import static rife.bld.dependencies.Dependency.CLASSIFIER_SOURCES; * @since 1.5 */ public class PurgeOperation extends AbstractOperation { + private HierarchicalProperties properties_ = null; private ArtifactRetriever retriever_ = null; private final List repositories_ = new ArrayList<>(); private final DependencyScopes dependencies_ = new DependencyScopes(); @@ -57,7 +59,7 @@ public class PurgeOperation extends AbstractOperation { * @since 1.5 */ protected void executePurgeCompileDependencies() { - executePurgeDependencies(libCompileDirectory(), dependencies().resolveCompileDependencies(artifactRetriever(), repositories())); + executePurgeDependencies(libCompileDirectory(), dependencies().resolveCompileDependencies(properties(), artifactRetriever(), repositories())); } /** @@ -66,7 +68,7 @@ public class PurgeOperation extends AbstractOperation { * @since 1.8 */ protected void executePurgeProvidedDependencies() { - executePurgeDependencies(libProvidedDirectory(), dependencies().resolveProvidedDependencies(artifactRetriever(), repositories())); + executePurgeDependencies(libProvidedDirectory(), dependencies().resolveProvidedDependencies(properties(), artifactRetriever(), repositories())); } /** @@ -75,7 +77,7 @@ public class PurgeOperation extends AbstractOperation { * @since 1.5 */ protected void executePurgeRuntimeDependencies() { - executePurgeDependencies(libRuntimeDirectory(), dependencies().resolveRuntimeDependencies(artifactRetriever(), repositories())); + executePurgeDependencies(libRuntimeDirectory(), dependencies().resolveRuntimeDependencies(properties(), artifactRetriever(), repositories())); } /** @@ -84,7 +86,7 @@ public class PurgeOperation extends AbstractOperation { * @since 1.5 */ protected void executePurgeStandaloneDependencies() { - executePurgeDependencies(libStandaloneDirectory(), dependencies().resolveStandaloneDependencies(artifactRetriever(), repositories())); + executePurgeDependencies(libStandaloneDirectory(), dependencies().resolveStandaloneDependencies(properties(), artifactRetriever(), repositories())); } /** @@ -93,7 +95,7 @@ public class PurgeOperation extends AbstractOperation { * @since 1.5 */ protected void executePurgeTestDependencies() { - executePurgeDependencies(libTestDirectory(), dependencies().resolveTestDependencies(artifactRetriever(), repositories())); + executePurgeDependencies(libTestDirectory(), dependencies().resolveTestDependencies(properties(), artifactRetriever(), repositories())); } /** @@ -132,7 +134,8 @@ public class PurgeOperation extends AbstractOperation { } private void addTransferLocations(HashSet filenames, Dependency dependency) { - for (var location : new DependencyResolver(artifactRetriever(), repositories(), dependency).getTransferLocations()) { + var resolution = new VersionResolution(properties()); + for (var location : new DependencyResolver(resolution, artifactRetriever(), repositories(), dependency).getTransferLocations()) { filenames.add(location.substring(location.lastIndexOf("/") + 1)); } } @@ -144,7 +147,8 @@ public class PurgeOperation extends AbstractOperation { * @since 1.5 */ public PurgeOperation fromProject(BaseProject project) { - return artifactRetriever(project.artifactRetriever()) + return properties(project.properties()) + .artifactRetriever(project.artifactRetriever()) .repositories(project.repositories()) .dependencies(project.dependencies()) .libCompileDirectory(project.libCompileDirectory()) @@ -292,6 +296,18 @@ public class PurgeOperation extends AbstractOperation { return this; } + /** + * Provides the hierarchical properties to use. + * + * @param properties the hierarchical properties + * @return this operation instance + * @since 2.0 + */ + public PurgeOperation properties(HierarchicalProperties properties) { + properties_ = properties; + return this; + } + /** * Retrieves the repositories in which the dependencies will be resolved. *

@@ -400,4 +416,17 @@ public class PurgeOperation extends AbstractOperation { } return retriever_; } + + /** + * Returns the hierarchical properties that are used. + * + * @return the hierarchical properties + * @since 2.0 + */ + public HierarchicalProperties properties() { + if (properties_ == null) { + properties_ = new HierarchicalProperties(); + } + return properties_; + } } diff --git a/src/main/java/rife/bld/operations/UpdatesOperation.java b/src/main/java/rife/bld/operations/UpdatesOperation.java index c03aa0f..43da649 100644 --- a/src/main/java/rife/bld/operations/UpdatesOperation.java +++ b/src/main/java/rife/bld/operations/UpdatesOperation.java @@ -6,6 +6,7 @@ package rife.bld.operations; import rife.bld.BaseProject; import rife.bld.dependencies.*; +import rife.ioc.HierarchicalProperties; import java.util.ArrayList; import java.util.List; @@ -17,6 +18,7 @@ import java.util.List; * @since 1.5 */ public class UpdatesOperation extends AbstractOperation { + private HierarchicalProperties properties_ = null; private ArtifactRetriever retriever_ = null; private final List repositories_ = new ArrayList<>(); private final DependencyScopes dependencies_ = new DependencyScopes(); @@ -28,11 +30,12 @@ public class UpdatesOperation extends AbstractOperation { * @since 1.5 */ public void execute() { + var resolution = new VersionResolution(properties()); var result = new DependencyScopes(); for (var entry : dependencies_.entrySet()) { var scope = entry.getKey(); for (var dependency : entry.getValue()) { - var latest = new DependencyResolver(artifactRetriever(), repositories(), dependency).latestVersion(); + var latest = new DependencyResolver(resolution, artifactRetriever(), repositories(), dependency).latestVersion(); if (latest.compareTo(dependency.version()) > 0) { var latest_dependency = new Dependency(dependency.groupId(), dependency.artifactId(), latest, dependency.classifier(), dependency.type()); @@ -65,7 +68,8 @@ public class UpdatesOperation extends AbstractOperation { * @since 1.5 */ public UpdatesOperation fromProject(BaseProject project) { - return artifactRetriever(project.artifactRetriever()) + return properties(project.properties()) + .artifactRetriever(project.artifactRetriever()) .repositories(project.repositories()) .dependencies(project.dependencies()); } @@ -120,6 +124,18 @@ public class UpdatesOperation extends AbstractOperation { return this; } + /** + * Provides the hierarchical properties to use. + * + * @param properties the hierarchical properties + * @return this operation instance + * @since 2.0 + */ + public UpdatesOperation properties(HierarchicalProperties properties) { + properties_ = properties; + return this; + } + /** * Retrieves the repositories in which the dependencies will be resolved. *

@@ -166,4 +182,17 @@ public class UpdatesOperation extends AbstractOperation { } return retriever_; } + + /** + * Returns the hierarchical properties that are used. + * + * @return the hierarchical properties + * @since 2.0 + */ + public HierarchicalProperties properties() { + if (properties_ == null) { + properties_ = new HierarchicalProperties(); + } + return properties_; + } } diff --git a/src/main/java/rife/bld/publish/PomBuilder.java b/src/main/java/rife/bld/publish/PomBuilder.java index 1cca52f..a850486 100644 --- a/src/main/java/rife/bld/publish/PomBuilder.java +++ b/src/main/java/rife/bld/publish/PomBuilder.java @@ -52,7 +52,7 @@ public class PomBuilder { * * @param properties the properties to use * @return this {@code PomBuilder} instance - * @since 2.0.0 + * @since 2.0 */ public PomBuilder properties(PublishProperties properties) { properties_ = properties; @@ -63,7 +63,7 @@ public class PomBuilder { * Retrieves the properties to build the POM with. * * @return the properties to use - * @since 2.0.0 + * @since 2.0 */ public PublishProperties properties() { return properties_; diff --git a/src/main/java/rife/bld/publish/PublishProperties.java b/src/main/java/rife/bld/publish/PublishProperties.java index a97f404..d7736ff 100644 --- a/src/main/java/rife/bld/publish/PublishProperties.java +++ b/src/main/java/rife/bld/publish/PublishProperties.java @@ -10,7 +10,7 @@ import java.util.*; * Provides the properties information for publication. * * @author Geert Bevin (gbevin[remove] at uwyn dot com) - * @since 2.0.0 + * @since 2.0 */ public class PublishProperties extends LinkedHashMap { private static final String MAVEN_COMPILER_SOURCE = "maven.compiler.source"; @@ -21,7 +21,7 @@ public class PublishProperties extends LinkedHashMap { * * @param value the value to be set for the 'maven.compiler.source' property * @return this {@code PomProperties} instance - * @since 2.0.0 + * @since 2.0 */ public PublishProperties mavenCompilerSource(Integer value) { if (value == null) { @@ -37,7 +37,7 @@ public class PublishProperties extends LinkedHashMap { * Retrieves the value of the 'maven.compiler.source' property. * * @return the value of the 'maven.compiler.source' property - * @since 2.0.0 + * @since 2.0 */ public Integer mavenCompilerSource() { var value = get(MAVEN_COMPILER_SOURCE); @@ -52,7 +52,7 @@ public class PublishProperties extends LinkedHashMap { * * @param value the value to be set for the 'maven.compiler.target' property * @return this {@code PomProperties} instance - * @since 2.0.0 + * @since 2.0 */ public PublishProperties mavenCompilerTarget(Integer value) { if (value == null) { @@ -68,7 +68,7 @@ public class PublishProperties extends LinkedHashMap { * Retrieves the value of the 'maven.compiler.target' property. * * @return the value of the 'maven.compiler.target' property - * @since 2.0.0 + * @since 2.0 */ public Integer mavenCompilerTarget() { var value = get(MAVEN_COMPILER_TARGET); diff --git a/src/main/java/rife/bld/wrapper/Wrapper.java b/src/main/java/rife/bld/wrapper/Wrapper.java index 929f278..594d5b4 100644 --- a/src/main/java/rife/bld/wrapper/Wrapper.java +++ b/src/main/java/rife/bld/wrapper/Wrapper.java @@ -69,6 +69,7 @@ public class Wrapper { static final Pattern META_DATA_LOCAL_COPY = Pattern.compile("\\s*true\\s*", Pattern.DOTALL | Pattern.CASE_INSENSITIVE); static final Pattern META_DATA_SNAPSHOT_VERSION = Pattern.compile(".*?([^<]+)", Pattern.DOTALL | Pattern.CASE_INSENSITIVE); static final Pattern OPTIONS_PATTERN = Pattern.compile("\"[^\"]+\"|\\S+"); + static final Pattern JVM_PROPERTY_PATTERN = Pattern.compile("-D(.+?)=(.*)"); private static final Pattern JAR_EXCLUDE_SOURCES_PATTERN = Pattern.compile("^.*-sources\\.jar$", Pattern.CASE_INSENSITIVE); private static final Pattern JAR_EXCLUDE_JAVADOC_PATTERN = Pattern.compile("^.*-javadoc\\.jar$", Pattern.CASE_INSENSITIVE); @@ -78,6 +79,7 @@ public class Wrapper { private File currentDir_ = new File(System.getProperty("user.dir")); private LaunchMode launchMode_ = LaunchMode.Cli; + private final Properties jvmProperties_ = new Properties(); private final Properties wrapperProperties_ = new Properties(); private File wrapperPropertiesFile_ = null; private final Set repositories_ = new LinkedHashSet<>(); @@ -376,6 +378,7 @@ public class Wrapper { } try { + extractJvmProperties(arguments); initWrapperProperties(getVersion()); File distribution; try { @@ -389,6 +392,15 @@ public class Wrapper { } } + private void extractJvmProperties(List arguments) { + for (var arg : arguments) { + var matcher = JVM_PROPERTY_PATTERN.matcher(arg); + if (matcher.matches()) { + jvmProperties_.put(matcher.group(1), matcher.group(2)); + } + } + } + private File buildBldDirectory() { return Path.of(currentDir_.getAbsolutePath(), "build", "bld").toFile(); } @@ -587,9 +599,10 @@ public class Wrapper { try { var resolver_class = classloader_.loadClass("rife.bld.wrapper.WrapperExtensionResolver"); - var constructor = resolver_class.getConstructor(File.class, File.class, File.class, Collection.class, Collection.class, boolean.class, boolean.class); + var constructor = resolver_class.getConstructor(File.class, File.class, File.class, Properties.class, Properties.class, Collection.class, Collection.class, boolean.class, boolean.class); var update_method = resolver_class.getMethod("updateExtensions"); var resolver = constructor.newInstance(currentDir_, new File(wrapperPropertiesFile_.getAbsolutePath() + ".hash"), libBldDirectory(), + jvmProperties_, wrapperProperties_, repositories_, extensions_, downloadExtensionSources_, downloadExtensionJavadoc_); update_method.invoke(resolver); @@ -612,7 +625,7 @@ public class Wrapper { throws IOException, InterruptedException { var args = new ArrayList(); args.add("java"); - includeJvmParameters(arguments, args); + includeJvmProperties(arguments, args); args.add("-cp"); args.add(jarFile.getAbsolutePath()); @@ -665,7 +678,7 @@ public class Wrapper { var java_args = new ArrayList(); java_args.add("java"); - includeJvmParameters(arguments, java_args); + includeJvmProperties(arguments, java_args); java_args.add("-cp"); java_args.add(classpath); @@ -681,11 +694,11 @@ public class Wrapper { return process.waitFor(); } - private static void includeJvmParameters(List arguments, List javaArgs) { + private static void includeJvmProperties(List arguments, List javaArgs) { var i = arguments.iterator(); while (i.hasNext()) { var arg = i.next(); - if (arg.matches("-D(.+?)=(.*)")) { + if (JVM_PROPERTY_PATTERN.matcher(arg).matches()) { javaArgs.add(arg); i.remove(); } diff --git a/src/main/java/rife/bld/wrapper/WrapperExtensionResolver.java b/src/main/java/rife/bld/wrapper/WrapperExtensionResolver.java index 1239a0c..5abe885 100644 --- a/src/main/java/rife/bld/wrapper/WrapperExtensionResolver.java +++ b/src/main/java/rife/bld/wrapper/WrapperExtensionResolver.java @@ -6,6 +6,7 @@ package rife.bld.wrapper; import rife.bld.BuildExecutor; import rife.bld.dependencies.*; +import rife.ioc.HierarchicalProperties; import rife.tools.FileUtils; import rife.tools.StringUtils; import rife.tools.exceptions.FileUtilsErrorException; @@ -28,7 +29,9 @@ import static rife.bld.dependencies.Dependency.CLASSIFIER_SOURCES; * @since 1.5.8 */ public class WrapperExtensionResolver { - private final ArtifactRetriever retriever_ = ArtifactRetriever.cachingInstance(); + private final HierarchicalProperties properties_; + private final VersionResolution resolution_; + private final ArtifactRetriever retriever_; private final File hashFile_; private final String fingerPrintHash_; private final File destinationDirectory_; @@ -41,20 +44,35 @@ public class WrapperExtensionResolver { private boolean headerPrinted_ = false; public WrapperExtensionResolver(File currentDir, File hashFile, File destinationDirectory, + Properties jvmProperties, Properties wrapperProperties, Collection repositories, Collection extensions, boolean downloadSources, boolean downloadJavadoc) { var properties = BuildExecutor.setupProperties(currentDir); - Repository.resolveMavenLocal(properties); + properties.getRoot().putAll(jvmProperties); + properties_ = new HierarchicalProperties().parent(properties); + properties_.putAll(wrapperProperties); + + resolution_ = new VersionResolution(properties_); + + retriever_ = ArtifactRetriever.cachingInstance(); + Repository.resolveMavenLocal(properties_); hashFile_ = hashFile; + destinationDirectory_ = destinationDirectory; + for (var repository : repositories) { - repositories_.add(Repository.resolveRepository(properties, repository)); + repositories_.add(Repository.resolveRepository(properties_, repository)); } - dependencies_.addAll(extensions.stream().map(Dependency::parse).toList()); + + dependencies_.addAll(extensions.stream().map(d -> resolution_.overrideDependency(Dependency.parse(d))).toList()); + downloadSources_ = downloadSources; downloadJavadoc_ = downloadJavadoc; - fingerPrintHash_ = createHash(repositories_.stream().map(Objects::toString).toList(), extensions, downloadSources, downloadJavadoc); + fingerPrintHash_ = createHash( + repositories_.stream().map(Objects::toString).toList(), + dependencies_.stream().map(Objects::toString).toList(), + downloadSources, downloadJavadoc); } private String createHash(Collection repositories, Collection extensions, boolean downloadSources, boolean downloadJavadoc) { @@ -149,7 +167,7 @@ public class WrapperExtensionResolver { var dependencies = new DependencySet(); for (var d : dependencies_) { if (d != null) { - dependencies.addAll(new DependencyResolver(retriever_, repositories_, d).getAllDependencies(Scope.compile, Scope.runtime)); + dependencies.addAll(new DependencyResolver(resolution_, retriever_, repositories_, d).getAllDependencies(Scope.compile, Scope.runtime)); } } if (!dependencies.isEmpty()) { @@ -166,7 +184,7 @@ public class WrapperExtensionResolver { additional_classifiers = classifiers.toArray(new String[0]); } - var artifacts = dependencies.transferIntoDirectory(retriever_, repositories_, destinationDirectory_, additional_classifiers); + var artifacts = dependencies.transferIntoDirectory(resolution_, retriever_, repositories_, destinationDirectory_, additional_classifiers); for (var artifact : artifacts) { var location = artifact.location(); diff --git a/src/test/java/rife/bld/dependencies/TestDependency.java b/src/test/java/rife/bld/dependencies/TestDependency.java index 7de746c..f91cc15 100644 --- a/src/test/java/rife/bld/dependencies/TestDependency.java +++ b/src/test/java/rife/bld/dependencies/TestDependency.java @@ -82,6 +82,14 @@ public class TestDependency { assertEquals("com.uwyn.rife2:rife2:1.4.0:bld@zip", new Dependency("com.uwyn.rife2", "rife2", new VersionNumber(1, 4, 0), "bld", "zip").toString()); } + @Test + void testToArtifactString() { + assertEquals("com.uwyn.rife2:rife2", new Dependency("com.uwyn.rife2", "rife2").toArtifactString()); + assertEquals("com.uwyn.rife2:rife2", new Dependency("com.uwyn.rife2", "rife2", new VersionNumber(1, 4, 0)).toArtifactString()); + assertEquals("com.uwyn.rife2:rife2", new Dependency("com.uwyn.rife2", "rife2", new VersionNumber(1, 4, 0), "agent").toArtifactString()); + assertEquals("com.uwyn.rife2:rife2", new Dependency("com.uwyn.rife2", "rife2", new VersionNumber(1, 4, 0), "bld", "zip").toArtifactString()); + } + @Test void testToFileName() { assertEquals("rife2-0.0.0.jar", new Dependency("com.uwyn.rife2", "rife2").toFileName()); diff --git a/src/test/java/rife/bld/dependencies/TestDependencyResolver.java b/src/test/java/rife/bld/dependencies/TestDependencyResolver.java index 3ac86c4..a2fc8ea 100644 --- a/src/test/java/rife/bld/dependencies/TestDependencyResolver.java +++ b/src/test/java/rife/bld/dependencies/TestDependencyResolver.java @@ -5,6 +5,7 @@ package rife.bld.dependencies; import org.junit.jupiter.api.Test; +import rife.ioc.HierarchicalProperties; import rife.tools.FileUtils; import rife.tools.StringUtils; @@ -16,6 +17,7 @@ import java.util.*; import static org.junit.jupiter.api.Assertions.*; import static rife.bld.dependencies.Dependency.CLASSIFIER_JAVADOC; import static rife.bld.dependencies.Dependency.CLASSIFIER_SOURCES; +import static rife.bld.dependencies.VersionResolution.PROPERTY_OVERRIDE_PREFIX; import static rife.bld.dependencies.Repository.*; import static rife.bld.dependencies.Scope.compile; import static rife.bld.dependencies.Scope.runtime; @@ -23,8 +25,10 @@ import static rife.bld.dependencies.Scope.runtime; public class TestDependencyResolver { @Test void testInstantiation() { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.uwyn.rife2", "rife2", new VersionNumber(1, 4, 0))); + var resolver = new DependencyResolver(new VersionResolution(new HierarchicalProperties().put(PROPERTY_OVERRIDE_PREFIX, "com.uwyn.rife2:rife2:1.8.0")), + ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.uwyn.rife2", "rife2", new VersionNumber(1, 4, 0))); assertNotNull(resolver); + assertEquals(new VersionNumber(1,8,0), resolver.resolution().overrideVersion(new Dependency("com.uwyn.rife2", "rife2"))); assertTrue(resolver.repositories().contains(MAVEN_CENTRAL)); assertTrue(resolver.repositories().contains(SONATYPE_SNAPSHOTS)); assertEquals(new Dependency("com.uwyn.rife2", "rife2", new VersionNumber(1, 4, 0)), resolver.dependency()); @@ -32,31 +36,38 @@ public class TestDependencyResolver { @Test void testNotFound() { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.org.unknown", "voidthing")); + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.org.unknown", "voidthing")); assertFalse(resolver.exists()); } @Test void testCheckExistence() { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.uwyn.rife2", "rife2")); + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.uwyn.rife2", "rife2")); assertTrue(resolver.exists()); } @Test void testCheckExistenceVersion() { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.uwyn.rife2", "rife2", new VersionNumber(1, 4, 0))); + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.uwyn.rife2", "rife2", new VersionNumber(1, 4, 0))); assertTrue(resolver.exists()); } @Test void testCheckExistenceMissingVersion() { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.uwyn.rife2", "rife2", new VersionNumber(1, 3, 9))); + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.uwyn.rife2", "rife2", new VersionNumber(1, 3, 9))); assertFalse(resolver.exists()); } + @Test + void testCheckVersionOverride() { + var resolver = new DependencyResolver(new VersionResolution(new HierarchicalProperties().put(PROPERTY_OVERRIDE_PREFIX, "com.uwyn.rife2:rife2:1.8.0")), + ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.uwyn.rife2", "rife2", new VersionNumber(1, 3, 9))); + assertEquals(new VersionNumber(1, 8, 0), resolver.resolveVersion()); + } + @Test void testListVersions() { - var resolver1 = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.uwyn.rife2", "rife2")); + var resolver1 = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.uwyn.rife2", "rife2")); var versions1 = resolver1.listVersions(); assertNotNull(versions1); assertFalse(versions1.isEmpty()); @@ -64,7 +75,7 @@ public class TestDependencyResolver { assertTrue(versions1.contains(new VersionNumber(1, 0, 0))); assertTrue(versions1.contains(new VersionNumber(1, 2, 1))); - var resolver2 = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.eclipse.jetty", "jetty-server")); + var resolver2 = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.eclipse.jetty", "jetty-server")); var versions2 = resolver2.listVersions(); assertNotNull(versions2); assertFalse(versions2.isEmpty()); @@ -75,7 +86,7 @@ public class TestDependencyResolver { @Test void testGetLatestVersion() { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.uwyn.rife2", "rife2")); + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.uwyn.rife2", "rife2")); var version = resolver.latestVersion(); assertNotNull(version); assertTrue(version.compareTo(new VersionNumber(1, 4)) >= 0); @@ -83,7 +94,7 @@ public class TestDependencyResolver { @Test void testGetReleaseVersion() { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.uwyn.rife2", "rife2")); + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.uwyn.rife2", "rife2")); var version = resolver.releaseVersion(); assertNotNull(version); assertTrue(version.compareTo(new VersionNumber(1, 4)) >= 0); @@ -91,7 +102,7 @@ public class TestDependencyResolver { @Test void testMetadata() { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.uwyn.rife2", "rife2", new VersionNumber(1, 4, 0))); + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.uwyn.rife2", "rife2", new VersionNumber(1, 4, 0))); var metadata = resolver.getMavenMetadata(); assertNotNull(metadata); assertTrue(metadata.getLatest().compareTo(resolver.dependency().version()) > 0); @@ -100,7 +111,7 @@ public class TestDependencyResolver { @Test void testSnapshotMetadata() { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.uwyn.rife2", "rife2", new VersionNumber(1, 4, 0, "SNAPSHOT"))); + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.uwyn.rife2", "rife2", new VersionNumber(1, 4, 0, "SNAPSHOT"))); var metadata = resolver.getSnapshotMavenMetadata(); assertNotNull(metadata); assertEquals("20230303.130437", metadata.getSnapshotTimestamp()); @@ -109,7 +120,7 @@ public class TestDependencyResolver { @Test void testGetCompileDependenciesRIFE2() { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.uwyn.rife2", "rife2")); + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.uwyn.rife2", "rife2")); var dependencies = resolver.getDirectDependencies(compile); assertNotNull(dependencies); assertEquals(0, dependencies.size()); @@ -117,7 +128,7 @@ public class TestDependencyResolver { @Test void testGetCompileDependenciesRIFE2Snapshot() { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.uwyn.rife2", "rife2", new VersionNumber(1, 4, 0, "SNAPSHOT"))); + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.uwyn.rife2", "rife2", new VersionNumber(1, 4, 0, "SNAPSHOT"))); var dependencies = resolver.getDirectDependencies(compile); assertNotNull(dependencies); assertEquals(0, dependencies.size()); @@ -125,7 +136,7 @@ public class TestDependencyResolver { @Test void testGetCompileDependenciesJetty() { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.eclipse.jetty", "jetty-server", new VersionNumber(11, 0, 14))); + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.eclipse.jetty", "jetty-server", new VersionNumber(11, 0, 14))); var dependencies = resolver.getDirectDependencies(compile); assertNotNull(dependencies); assertEquals(4, dependencies.size()); @@ -136,9 +147,37 @@ public class TestDependencyResolver { org.slf4j:slf4j-api:2.0.5""", StringUtils.join(dependencies, "\n")); } + @Test + void testGetCompileDependenciesJettyOverride1() { + var resolver = new DependencyResolver(new VersionResolution(new HierarchicalProperties().put(PROPERTY_OVERRIDE_PREFIX, "org.slf4j:slf4j-api:2.0.13")), + ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.eclipse.jetty", "jetty-server", new VersionNumber(11, 0, 14))); + var dependencies = resolver.getDirectDependencies(compile); + assertNotNull(dependencies); + assertEquals(4, dependencies.size()); + assertEquals(""" + org.eclipse.jetty.toolchain:jetty-jakarta-servlet-api:5.0.2 + org.eclipse.jetty:jetty-http:11.0.14 + org.eclipse.jetty:jetty-io:11.0.14 + org.slf4j:slf4j-api:2.0.13""", StringUtils.join(dependencies, "\n")); + } + + @Test + void testGetCompileDependenciesJettyOverride2() { + var resolver = new DependencyResolver(new VersionResolution(new HierarchicalProperties().put(PROPERTY_OVERRIDE_PREFIX, "org.slf4j:slf4j-api:2.0.11,org.eclipse.jetty:jetty-io:11.0.13,org.eclipse.jetty:jetty-server:11.0.15")), + ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.eclipse.jetty", "jetty-server", new VersionNumber(11, 0, 14))); + var dependencies = resolver.getDirectDependencies(compile); + assertNotNull(dependencies); + assertEquals(4, dependencies.size()); + assertEquals(""" + org.eclipse.jetty.toolchain:jetty-jakarta-servlet-api:5.0.2 + org.eclipse.jetty:jetty-http:11.0.15 + org.eclipse.jetty:jetty-io:11.0.13 + org.slf4j:slf4j-api:2.0.11""", StringUtils.join(dependencies, "\n")); + } + @Test void testGetCompileRuntimeDependenciesJunit() { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.junit.jupiter", "junit-jupiter", new VersionNumber(5, 9, 2))); + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.junit.jupiter", "junit-jupiter", new VersionNumber(5, 9, 2))); var dependencies_compile = resolver.getDirectDependencies(compile, runtime); assertNotNull(dependencies_compile); assertEquals(3, dependencies_compile.size()); @@ -150,7 +189,7 @@ public class TestDependencyResolver { @Test void testGetCompileDependenciesSpringBoot() { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.springframework.boot", "spring-boot-starter", new VersionNumber(3, 0, 4))); + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.springframework.boot", "spring-boot-starter", new VersionNumber(3, 0, 4))); var dependencies = resolver.getDirectDependencies(compile); assertNotNull(dependencies); assertEquals(6, dependencies.size()); @@ -165,7 +204,7 @@ public class TestDependencyResolver { @Test void testGetCompileDependenciesMaven() { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.apache.maven", "maven-core", new VersionNumber(3, 9, 0))); + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.apache.maven", "maven-core", new VersionNumber(3, 9, 0))); var dependencies = resolver.getDirectDependencies(compile); assertNotNull(dependencies); assertEquals(26, dependencies.size()); @@ -200,7 +239,7 @@ public class TestDependencyResolver { @Test void testGetCompileDependenciesPlay() { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.typesafe.play", "play_2.13", new VersionNumber(2, 8, 19))); + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.typesafe.play", "play_2.13", new VersionNumber(2, 8, 19))); var dependencies = resolver.getDirectDependencies(compile); assertNotNull(dependencies); assertEquals(25, dependencies.size()); @@ -234,7 +273,7 @@ public class TestDependencyResolver { @Test void testGetCompileDependenciesVaadin() { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.vaadin", "vaadin", new VersionNumber(23, 3, 7))); + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.vaadin", "vaadin", new VersionNumber(23, 3, 7))); var dependencies = resolver.getDirectDependencies(compile); assertNotNull(dependencies); assertEquals(9, dependencies.size()); @@ -252,7 +291,7 @@ public class TestDependencyResolver { @Test void testGetCompileRuntimeDependenciesBitly() { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS_LEGACY), new Dependency("net.thauvin.erik", "bitly-shorten", new VersionNumber(0, 9, 4, "SNAPSHOT"))); + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS_LEGACY), new Dependency("net.thauvin.erik", "bitly-shorten", new VersionNumber(0, 9, 4, "SNAPSHOT"))); var dependencies = resolver.getDirectDependencies(compile, runtime); assertNotNull(dependencies); assertEquals(4, dependencies.size()); @@ -265,7 +304,7 @@ public class TestDependencyResolver { @Test void testGetCompileTransitiveDependenciesRIFE2() { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.uwyn.rife2", "rife2")); + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.uwyn.rife2", "rife2")); var dependencies = resolver.getAllDependencies(compile); assertNotNull(dependencies); assertEquals(1, dependencies.size()); @@ -275,7 +314,7 @@ public class TestDependencyResolver { @Test void testGetCompileTransitiveDependenciesRIFE2Snapshot() { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.uwyn.rife2", "rife2", new VersionNumber(1, 4, 0, "SNAPSHOT"))); + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.uwyn.rife2", "rife2", new VersionNumber(1, 4, 0, "SNAPSHOT"))); var dependencies = resolver.getAllDependencies(compile); assertNotNull(dependencies); assertEquals(1, dependencies.size()); @@ -285,7 +324,7 @@ public class TestDependencyResolver { @Test void testGetCompileTransitiveDependenciesJetty() { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.eclipse.jetty", "jetty-server", new VersionNumber(11, 0, 14))); + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.eclipse.jetty", "jetty-server", new VersionNumber(11, 0, 14))); var dependencies = resolver.getAllDependencies(compile); assertNotNull(dependencies); assertEquals(6, dependencies.size()); @@ -300,7 +339,7 @@ public class TestDependencyResolver { @Test void testGetCompileTransitiveDependenciesJettyExclusion() { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.eclipse.jetty", "jetty-server", new VersionNumber(11, 0, 14)) .exclude("org.slf4j", "slf4j-api")); var dependencies = resolver.getAllDependencies(compile); @@ -316,7 +355,7 @@ public class TestDependencyResolver { @Test void testGetCompileTransitiveDependenciesJettyFullGroupExclusion() { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.eclipse.jetty", "jetty-server", new VersionNumber(11, 0, 14)) .exclude("org.eclipse.jetty", "*")); var dependencies = resolver.getAllDependencies(compile); @@ -330,7 +369,7 @@ public class TestDependencyResolver { @Test void testGetCompileTransitiveDependenciesJettyFullArtifactExclusion() { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.eclipse.jetty", "jetty-server", new VersionNumber(11, 0, 14)) .exclude("*", "jetty-http") .exclude("*", "slf4j-api")); @@ -346,7 +385,7 @@ public class TestDependencyResolver { @Test void testGetCompileTransitiveDependenciesJettyFullExclusion() { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.eclipse.jetty", "jetty-server", new VersionNumber(11, 0, 14)) .exclude("*", "*")); var dependencies = resolver.getAllDependencies(compile); @@ -358,8 +397,8 @@ public class TestDependencyResolver { @Test void testGetCompileTransitiveDependenciesJettyAndSlfj() { - var dependencies = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.eclipse.jetty", "jetty-server", new VersionNumber(11, 0, 14))).getAllDependencies(compile); - var dependencies2 = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.slf4j", "slf4j-simple", new VersionNumber(2, 0, 6))).getAllDependencies(compile, runtime); + var dependencies = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.eclipse.jetty", "jetty-server", new VersionNumber(11, 0, 14))).getAllDependencies(compile); + var dependencies2 = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.slf4j", "slf4j-simple", new VersionNumber(2, 0, 6))).getAllDependencies(compile, runtime); assertNotNull(dependencies); assertNotNull(dependencies2); assertEquals(6, dependencies.size()); @@ -378,7 +417,7 @@ public class TestDependencyResolver { @Test void testGetCompileRuntimeTransitiveDependenciesJunit() { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.junit.jupiter", "junit-jupiter", new VersionNumber(5, 9, 2))); + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.junit.jupiter", "junit-jupiter", new VersionNumber(5, 9, 2))); var dependencies_compile = resolver.getAllDependencies(compile, runtime); assertNotNull(dependencies_compile); assertEquals(8, dependencies_compile.size()); @@ -401,7 +440,7 @@ public class TestDependencyResolver { @Test void testGetCompileTransitiveDependenciesSpringBoot() { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.springframework.boot", "spring-boot-starter", new VersionNumber(3, 0, 4))); + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.springframework.boot", "spring-boot-starter", new VersionNumber(3, 0, 4))); var dependencies = resolver.getAllDependencies(compile); assertNotNull(dependencies); assertEquals(18, dependencies.size()); @@ -428,7 +467,7 @@ public class TestDependencyResolver { @Test void testGetCompileTransitiveDependenciesMaven() { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.apache.maven", "maven-core", new VersionNumber(3, 9, 0))); + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.apache.maven", "maven-core", new VersionNumber(3, 9, 0))); var dependencies = resolver.getAllDependencies(compile); assertNotNull(dependencies); assertEquals(32, dependencies.size()); @@ -469,7 +508,7 @@ public class TestDependencyResolver { @Test void testGetCompileTransitiveDependenciesPlay() { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.typesafe.play", "play_2.13", new VersionNumber(2, 8, 19))); + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.typesafe.play", "play_2.13", new VersionNumber(2, 8, 19))); var dependencies = resolver.getAllDependencies(compile); assertNotNull(dependencies); assertEquals(48, dependencies.size()); @@ -526,7 +565,7 @@ public class TestDependencyResolver { @Test void testGetCompileTransitiveDependenciesVaadin() { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.vaadin", "vaadin", new VersionNumber(23, 3, 7))); + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.vaadin", "vaadin", new VersionNumber(23, 3, 7))); var dependencies = resolver.getAllDependencies(compile); assertNotNull(dependencies); assertEquals(88, dependencies.size()); @@ -623,7 +662,7 @@ public class TestDependencyResolver { @Test void testGetCompileRuntimeTransitiveDependenciesBitly() { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS_LEGACY), new Dependency("net.thauvin.erik", "bitly-shorten", new VersionNumber(0, 9, 4, "SNAPSHOT"))); + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS_LEGACY), new Dependency("net.thauvin.erik", "bitly-shorten", new VersionNumber(0, 9, 4, "SNAPSHOT"))); var dependencies = resolver.getAllDependencies(compile, runtime); assertNotNull(dependencies); assertEquals(11, dependencies.size()); @@ -643,7 +682,7 @@ public class TestDependencyResolver { @Test void testGetCompileRuntimeTransitiveDependenciesMariaDb() { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.mariadb.jdbc", "mariadb-java-client", new VersionNumber(3, 1, 3))); + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.mariadb.jdbc", "mariadb-java-client", new VersionNumber(3, 1, 3))); var dependencies_compile = resolver.getAllDependencies(compile, runtime); assertNotNull(dependencies_compile); assertEquals(9, dependencies_compile.size()); @@ -667,10 +706,10 @@ public class TestDependencyResolver { @Test void testTransferDependency() throws Exception { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.uwyn.rife2", "rife2")); + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.uwyn.rife2", "rife2")); var tmp = Files.createTempDirectory("transfers").toFile(); try { - var result = resolver.getAllDependencies(compile).transferIntoDirectory(ArtifactRetriever.instance(), resolver.repositories(), tmp); + var result = resolver.getAllDependencies(compile).transferIntoDirectory(VersionResolution.dummy(), ArtifactRetriever.instance(), resolver.repositories(), tmp); assertTrue(StringUtils.join(result, "\n").matches(""" https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/com/uwyn/rife2/rife2/.*/rife2-.*.jar""")); @@ -685,10 +724,10 @@ public class TestDependencyResolver { @Test void testTransferDependencySources() throws Exception { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.uwyn.rife2", "rife2")); + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.uwyn.rife2", "rife2")); var tmp = Files.createTempDirectory("transfers").toFile(); try { - var result = resolver.getAllDependencies(compile).transferIntoDirectory(ArtifactRetriever.instance(), resolver.repositories(), tmp, CLASSIFIER_SOURCES); + var result = resolver.getAllDependencies(compile).transferIntoDirectory(VersionResolution.dummy(), ArtifactRetriever.instance(), resolver.repositories(), tmp, CLASSIFIER_SOURCES); assertTrue(StringUtils.join(result, "\n").matches(""" https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/com/uwyn/rife2/rife2/.*/rife2-.*.jar https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/com/uwyn/rife2/rife2/.*/rife2-.*-sources.jar""")); @@ -704,10 +743,10 @@ public class TestDependencyResolver { @Test void testTransferDependencySourcesJavadoc() throws Exception { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.uwyn.rife2", "rife2")); + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.uwyn.rife2", "rife2")); var tmp = Files.createTempDirectory("transfers").toFile(); try { - var result = resolver.getAllDependencies(compile).transferIntoDirectory(ArtifactRetriever.instance(), resolver.repositories(), tmp, CLASSIFIER_SOURCES, CLASSIFIER_JAVADOC); + var result = resolver.getAllDependencies(compile).transferIntoDirectory(VersionResolution.dummy(), ArtifactRetriever.instance(), resolver.repositories(), tmp, CLASSIFIER_SOURCES, CLASSIFIER_JAVADOC); assertTrue(StringUtils.join(result, "\n").matches(""" https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/com/uwyn/rife2/rife2/.*/rife2-.*.jar https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/com/uwyn/rife2/rife2/.*/rife2-.*-sources.jar @@ -724,10 +763,10 @@ public class TestDependencyResolver { @Test void testTransferDependencySnapshot() throws Exception { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.uwyn.rife2", "rife2", new VersionNumber(1, 4, 0, "SNAPSHOT"))); + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.uwyn.rife2", "rife2", new VersionNumber(1, 4, 0, "SNAPSHOT"))); var tmp = Files.createTempDirectory("transfers").toFile(); try { - var result = resolver.getAllDependencies(compile).transferIntoDirectory(ArtifactRetriever.instance(), resolver.repositories(), tmp); + var result = resolver.getAllDependencies(compile).transferIntoDirectory(VersionResolution.dummy(), ArtifactRetriever.instance(), resolver.repositories(), tmp); assertEquals(""" https://s01.oss.sonatype.org/content/repositories/snapshots/:https://s01.oss.sonatype.org/content/repositories/snapshots/com/uwyn/rife2/rife2/1.4.0-SNAPSHOT/rife2-1.4.0-20230303.130437-4.jar""", StringUtils.join(result, "\n")); @@ -742,10 +781,10 @@ public class TestDependencyResolver { @Test void testTransferDependencySnapshotSources() throws Exception { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.uwyn.rife2", "rife2", new VersionNumber(1, 4, 0, "SNAPSHOT"))); + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.uwyn.rife2", "rife2", new VersionNumber(1, 4, 0, "SNAPSHOT"))); var tmp = Files.createTempDirectory("transfers").toFile(); try { - var result = resolver.getAllDependencies(compile).transferIntoDirectory(ArtifactRetriever.instance(), resolver.repositories(), tmp, CLASSIFIER_SOURCES); + var result = resolver.getAllDependencies(compile).transferIntoDirectory(VersionResolution.dummy(), ArtifactRetriever.instance(), resolver.repositories(), tmp, CLASSIFIER_SOURCES); assertEquals(""" https://s01.oss.sonatype.org/content/repositories/snapshots/:https://s01.oss.sonatype.org/content/repositories/snapshots/com/uwyn/rife2/rife2/1.4.0-SNAPSHOT/rife2-1.4.0-20230303.130437-4.jar https://s01.oss.sonatype.org/content/repositories/snapshots/:https://s01.oss.sonatype.org/content/repositories/snapshots/com/uwyn/rife2/rife2/1.4.0-SNAPSHOT/rife2-1.4.0-20230303.130437-4-sources.jar""", StringUtils.join(result, "\n")); @@ -762,10 +801,10 @@ public class TestDependencyResolver { @Test void testTransferDependencySnapshotSourcesJavadoc() throws Exception { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.uwyn.rife2", "rife2", new VersionNumber(1, 4, 0, "SNAPSHOT"))); + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.uwyn.rife2", "rife2", new VersionNumber(1, 4, 0, "SNAPSHOT"))); var tmp = Files.createTempDirectory("transfers").toFile(); try { - var result = resolver.getAllDependencies(compile).transferIntoDirectory(ArtifactRetriever.instance(), resolver.repositories(), tmp, CLASSIFIER_SOURCES, CLASSIFIER_JAVADOC); + var result = resolver.getAllDependencies(compile).transferIntoDirectory(VersionResolution.dummy(), ArtifactRetriever.instance(), resolver.repositories(), tmp, CLASSIFIER_SOURCES, CLASSIFIER_JAVADOC); assertEquals(""" https://s01.oss.sonatype.org/content/repositories/snapshots/:https://s01.oss.sonatype.org/content/repositories/snapshots/com/uwyn/rife2/rife2/1.4.0-SNAPSHOT/rife2-1.4.0-20230303.130437-4.jar https://s01.oss.sonatype.org/content/repositories/snapshots/:https://s01.oss.sonatype.org/content/repositories/snapshots/com/uwyn/rife2/rife2/1.4.0-SNAPSHOT/rife2-1.4.0-20230303.130437-4-sources.jar @@ -784,10 +823,10 @@ public class TestDependencyResolver { @Test void testTransferDependencyJetty() throws Exception { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.eclipse.jetty", "jetty-server", new VersionNumber(11, 0, 14))); + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.eclipse.jetty", "jetty-server", new VersionNumber(11, 0, 14))); var tmp = Files.createTempDirectory("transfers").toFile(); try { - var result = resolver.getAllDependencies(compile).transferIntoDirectory(ArtifactRetriever.instance(), resolver.repositories(), tmp); + var result = resolver.getAllDependencies(compile).transferIntoDirectory(VersionResolution.dummy(), ArtifactRetriever.instance(), resolver.repositories(), tmp); assertEquals(""" https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/org/eclipse/jetty/jetty-server/11.0.14/jetty-server-11.0.14.jar https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/org/eclipse/jetty/toolchain/jetty-jakarta-servlet-api/5.0.2/jetty-jakarta-servlet-api-5.0.2.jar @@ -812,12 +851,46 @@ public class TestDependencyResolver { } @Test - void testTransferDependencyJettySources() + void testTransferDependencyJettyOverriddenVersions() throws Exception { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.eclipse.jetty", "jetty-server", new VersionNumber(11, 0, 14))); + var resolution = new VersionResolution(new HierarchicalProperties() + .put(PROPERTY_OVERRIDE_PREFIX, "org.slf4j:slf4j-api:2.0.11") + .put(PROPERTY_OVERRIDE_PREFIX + "1", "org.eclipse.jetty:jetty-io:11.0.13") + .put(PROPERTY_OVERRIDE_PREFIX + "2", "org.eclipse.jetty:jetty-server:11.0.15")); + var resolver = new DependencyResolver(resolution, ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.eclipse.jetty", "jetty-server", new VersionNumber(11, 0, 14))); var tmp = Files.createTempDirectory("transfers").toFile(); try { - var result = resolver.getAllDependencies(compile).transferIntoDirectory(ArtifactRetriever.instance(), resolver.repositories(), tmp, CLASSIFIER_SOURCES); + var result = resolver.getAllDependencies(compile).transferIntoDirectory(resolution, ArtifactRetriever.instance(), resolver.repositories(), tmp); + assertEquals(""" + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/org/eclipse/jetty/jetty-server/11.0.15/jetty-server-11.0.15.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/org/eclipse/jetty/toolchain/jetty-jakarta-servlet-api/5.0.2/jetty-jakarta-servlet-api-5.0.2.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/org/eclipse/jetty/jetty-http/11.0.15/jetty-http-11.0.15.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/org/eclipse/jetty/jetty-io/11.0.13/jetty-io-11.0.13.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/org/slf4j/slf4j-api/2.0.11/slf4j-api-2.0.11.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/org/eclipse/jetty/jetty-util/11.0.15/jetty-util-11.0.15.jar""", StringUtils.join(result, "\n")); + + var files = FileUtils.getFileList(tmp); + assertEquals(6, files.size()); + Collections.sort(files); + assertEquals(""" + jetty-http-11.0.15.jar + jetty-io-11.0.13.jar + jetty-jakarta-servlet-api-5.0.2.jar + jetty-server-11.0.15.jar + jetty-util-11.0.15.jar + slf4j-api-2.0.11.jar""", StringUtils.join(files, "\n")); + } finally { + FileUtils.deleteDirectory(tmp); + } + } + + @Test + void testTransferDependencyJettySources() + throws Exception { + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.eclipse.jetty", "jetty-server", new VersionNumber(11, 0, 14))); + var tmp = Files.createTempDirectory("transfers").toFile(); + try { + var result = resolver.getAllDependencies(compile).transferIntoDirectory(VersionResolution.dummy(), ArtifactRetriever.instance(), resolver.repositories(), tmp, CLASSIFIER_SOURCES); assertEquals(""" https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/org/eclipse/jetty/jetty-server/11.0.14/jetty-server-11.0.14.jar https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/org/eclipse/jetty/jetty-server/11.0.14/jetty-server-11.0.14-sources.jar @@ -856,10 +929,10 @@ public class TestDependencyResolver { @Test void testTransferDependencyJettySourcesJavadoc() throws Exception { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.eclipse.jetty", "jetty-server", new VersionNumber(11, 0, 14))); + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.eclipse.jetty", "jetty-server", new VersionNumber(11, 0, 14))); var tmp = Files.createTempDirectory("transfers").toFile(); try { - var result = resolver.getAllDependencies(compile).transferIntoDirectory(ArtifactRetriever.instance(), resolver.repositories(), tmp, CLASSIFIER_SOURCES, CLASSIFIER_JAVADOC); + var result = resolver.getAllDependencies(compile).transferIntoDirectory(VersionResolution.dummy(), ArtifactRetriever.instance(), resolver.repositories(), tmp, CLASSIFIER_SOURCES, CLASSIFIER_JAVADOC); assertEquals(""" https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/org/eclipse/jetty/jetty-server/11.0.14/jetty-server-11.0.14.jar https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/org/eclipse/jetty/jetty-server/11.0.14/jetty-server-11.0.14-sources.jar @@ -910,10 +983,10 @@ public class TestDependencyResolver { @Test void testTransferDependenciesJunit() throws Exception { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.junit.jupiter", "junit-jupiter", new VersionNumber(5, 9, 2))); + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.junit.jupiter", "junit-jupiter", new VersionNumber(5, 9, 2))); var tmp = Files.createTempDirectory("transfers").toFile(); try { - var result = resolver.getAllDependencies(compile, runtime).transferIntoDirectory(ArtifactRetriever.instance(), resolver.repositories(), tmp); + var result = resolver.getAllDependencies(compile, runtime).transferIntoDirectory(VersionResolution.dummy(), ArtifactRetriever.instance(), resolver.repositories(), tmp); assertEquals(""" https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter/5.9.2/junit-jupiter-5.9.2.jar https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-api/5.9.2/junit-jupiter-api-5.9.2.jar @@ -944,10 +1017,10 @@ public class TestDependencyResolver { @Test void testTransferDependencySpringBoot() throws Exception { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.springframework.boot", "spring-boot-starter", new VersionNumber(3, 0, 4))); + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.springframework.boot", "spring-boot-starter", new VersionNumber(3, 0, 4))); var tmp = Files.createTempDirectory("transfers").toFile(); try { - var result = resolver.getAllDependencies(compile).transferIntoDirectory(ArtifactRetriever.instance(), resolver.repositories(), tmp); + var result = resolver.getAllDependencies(compile).transferIntoDirectory(VersionResolution.dummy(), ArtifactRetriever.instance(), resolver.repositories(), tmp); assertEquals(""" https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/org/springframework/boot/spring-boot-starter/3.0.4/spring-boot-starter-3.0.4.jar https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/org/springframework/boot/spring-boot/3.0.4/spring-boot-3.0.4.jar @@ -998,10 +1071,10 @@ public class TestDependencyResolver { @Test void testTransferDependencyMaven() throws Exception { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.apache.maven", "maven-core", new VersionNumber(3, 9, 0))); + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.apache.maven", "maven-core", new VersionNumber(3, 9, 0))); var tmp = Files.createTempDirectory("transfers").toFile(); try { - var result = resolver.getAllDependencies(compile).transferIntoDirectory(ArtifactRetriever.instance(), resolver.repositories(), tmp); + var result = resolver.getAllDependencies(compile).transferIntoDirectory(VersionResolution.dummy(), ArtifactRetriever.instance(), resolver.repositories(), tmp); assertEquals(""" https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/org/apache/maven/maven-core/3.9.0/maven-core-3.9.0.jar https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/org/apache/maven/maven-model/3.9.0/maven-model-3.9.0.jar @@ -1080,10 +1153,10 @@ public class TestDependencyResolver { @Test void testTransferDependencyPlay() throws Exception { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.typesafe.play", "play_2.13", new VersionNumber(2, 8, 19))); + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.typesafe.play", "play_2.13", new VersionNumber(2, 8, 19))); var tmp = Files.createTempDirectory("transfers").toFile(); try { - var result = resolver.getAllDependencies(compile).transferIntoDirectory(ArtifactRetriever.instance(), resolver.repositories(), tmp); + var result = resolver.getAllDependencies(compile).transferIntoDirectory(VersionResolution.dummy(), ArtifactRetriever.instance(), resolver.repositories(), tmp); assertEquals(""" https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/com/typesafe/play/play_2.13/2.8.19/play_2.13-2.8.19.jar https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.10/scala-library-2.13.10.jar @@ -1192,12 +1265,128 @@ public class TestDependencyResolver { } @Test - void testTransferDependencyVaadin() + void testTransferDependencyPlayOverriddenVersions() throws Exception { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.vaadin", "vaadin", new VersionNumber(23, 3, 7))); + var resolution = new VersionResolution(new HierarchicalProperties() + .put(PROPERTY_OVERRIDE_PREFIX, "org.scala-lang:scala-library:2.13.12,org.slf4j:slf4j-api:2.0.11,com.google.guava:guava:31.1-jre")); + var resolver = new DependencyResolver(resolution, ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.typesafe.play", "play_2.13", new VersionNumber(2, 8, 19))); var tmp = Files.createTempDirectory("transfers").toFile(); try { - var result = resolver.getAllDependencies(compile).transferIntoDirectory(ArtifactRetriever.instance(), resolver.repositories(), tmp); + var result = resolver.getAllDependencies(compile).transferIntoDirectory(resolution, ArtifactRetriever.instance(), resolver.repositories(), tmp); + assertEquals(""" + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/com/typesafe/play/play_2.13/2.8.19/play_2.13-2.8.19.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/com/typesafe/play/build-link/2.8.19/build-link-2.8.19.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/com/typesafe/play/play-streams_2.13/2.8.19/play-streams_2.13-2.8.19.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/com/typesafe/play/twirl-api_2.13/1.5.1/twirl-api_2.13-1.5.1.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/org/slf4j/slf4j-api/2.0.11/slf4j-api-2.0.11.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/org/slf4j/jul-to-slf4j/1.7.36/jul-to-slf4j-1.7.36.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/org/slf4j/jcl-over-slf4j/1.7.36/jcl-over-slf4j-1.7.36.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/com/typesafe/akka/akka-actor_2.13/2.6.20/akka-actor_2.13-2.6.20.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/com/typesafe/akka/akka-actor-typed_2.13/2.6.20/akka-actor-typed_2.13-2.6.20.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/com/typesafe/akka/akka-slf4j_2.13/2.6.20/akka-slf4j_2.13-2.6.20.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/com/typesafe/akka/akka-serialization-jackson_2.13/2.6.20/akka-serialization-jackson_2.13-2.6.20.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.11.4/jackson-core-2.11.4.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.11.4/jackson-annotations-2.11.4.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.11.4/jackson-datatype-jdk8-2.11.4.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.11.4/jackson-datatype-jsr310-2.11.4.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.11.4/jackson-databind-2.11.4.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/com/typesafe/play/play-json_2.13/2.8.2/play-json_2.13-2.8.2.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/com/google/guava/guava/31.1-jre/guava-31.1-jre.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/io/jsonwebtoken/jjwt/0.9.1/jjwt-0.9.1.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/jakarta/xml/bind/jakarta.xml.bind-api/2.3.3/jakarta.xml.bind-api-2.3.3.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/jakarta/transaction/jakarta.transaction-api/1.3.3/jakarta.transaction-api-1.3.3.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/javax/inject/javax.inject/1/javax.inject-1.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/org/scala-lang/modules/scala-java8-compat_2.13/1.0.2/scala-java8-compat_2.13-1.0.2.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/com/typesafe/ssl-config-core_2.13/0.4.3/ssl-config-core_2.13-0.4.3.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/org/scala-lang/modules/scala-parser-combinators_2.13/1.1.2/scala-parser-combinators_2.13-1.1.2.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/com/typesafe/play/play-exceptions/2.8.19/play-exceptions-2.8.19.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/com/typesafe/akka/akka-stream_2.13/2.6.20/akka-stream_2.13-2.6.20.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.13/1.2.0/scala-xml_2.13-1.2.0.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/com/typesafe/config/1.4.2/config-1.4.2.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/com/fasterxml/jackson/module/jackson-module-parameter-names/2.11.4/jackson-module-parameter-names-2.11.4.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/com/fasterxml/jackson/dataformat/jackson-dataformat-cbor/2.11.4/jackson-dataformat-cbor-2.11.4.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/com/fasterxml/jackson/module/jackson-module-scala_2.13/2.11.4/jackson-module-scala_2.13-2.11.4.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/org/lz4/lz4-java/1.8.0/lz4-java-1.8.0.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/com/typesafe/play/play-functional_2.13/2.8.2/play-functional_2.13-2.8.2.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/org/scala-lang/scala-reflect/2.13.1/scala-reflect-2.13.1.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/joda-time/joda-time/2.10.5/joda-time-2.10.5.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/org/checkerframework/checker-qual/3.12.0/checker-qual-3.12.0.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.11.0/error_prone_annotations-2.11.0.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/jakarta/activation/jakarta.activation-api/1.2.2/jakarta.activation-api-1.2.2.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/com/typesafe/akka/akka-protobuf-v3_2.13/2.6.20/akka-protobuf-v3_2.13-2.6.20.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/com/fasterxml/jackson/module/jackson-module-paranamer/2.11.4/jackson-module-paranamer-2.11.4.jar + https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/com/thoughtworks/paranamer/paranamer/2.8/paranamer-2.8.jar""", StringUtils.join(result, "\n")); + + var files = FileUtils.getFileList(tmp); + assertEquals(48, files.size()); + Collections.sort(files); + assertEquals(""" + akka-actor-typed_2.13-2.6.20.jar + akka-actor_2.13-2.6.20.jar + akka-protobuf-v3_2.13-2.6.20.jar + akka-serialization-jackson_2.13-2.6.20.jar + akka-slf4j_2.13-2.6.20.jar + akka-stream_2.13-2.6.20.jar + build-link-2.8.19.jar + checker-qual-3.12.0.jar + config-1.4.2.jar + error_prone_annotations-2.11.0.jar + failureaccess-1.0.1.jar + guava-31.1-jre.jar + j2objc-annotations-1.3.jar + jackson-annotations-2.11.4.jar + jackson-core-2.11.4.jar + jackson-databind-2.11.4.jar + jackson-dataformat-cbor-2.11.4.jar + jackson-datatype-jdk8-2.11.4.jar + jackson-datatype-jsr310-2.11.4.jar + jackson-module-parameter-names-2.11.4.jar + jackson-module-paranamer-2.11.4.jar + jackson-module-scala_2.13-2.11.4.jar + jakarta.activation-api-1.2.2.jar + jakarta.transaction-api-1.3.3.jar + jakarta.xml.bind-api-2.3.3.jar + javax.inject-1.jar + jcl-over-slf4j-1.7.36.jar + jjwt-0.9.1.jar + joda-time-2.10.5.jar + jsr305-3.0.2.jar + jul-to-slf4j-1.7.36.jar + listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar + lz4-java-1.8.0.jar + paranamer-2.8.jar + play-exceptions-2.8.19.jar + play-functional_2.13-2.8.2.jar + play-json_2.13-2.8.2.jar + play-streams_2.13-2.8.19.jar + play_2.13-2.8.19.jar + reactive-streams-1.0.3.jar + scala-java8-compat_2.13-1.0.2.jar + scala-library-2.13.12.jar + scala-parser-combinators_2.13-1.1.2.jar + scala-reflect-2.13.1.jar + scala-xml_2.13-1.2.0.jar + slf4j-api-2.0.11.jar + ssl-config-core_2.13-0.4.3.jar + twirl-api_2.13-1.5.1.jar""", StringUtils.join(files, "\n")); + } finally { + FileUtils.deleteDirectory(tmp); + } + } + + @Test + void testTransferDependencyVaadin() + throws Exception { + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("com.vaadin", "vaadin", new VersionNumber(23, 3, 7))); + var tmp = Files.createTempDirectory("transfers").toFile(); + try { + var result = resolver.getAllDependencies(compile).transferIntoDirectory(VersionResolution.dummy(), ArtifactRetriever.instance(), resolver.repositories(), tmp); assertEquals(""" https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/com/vaadin/vaadin/23.3.7/vaadin-23.3.7.jar https://repo1.maven.org/maven2/:https://repo1.maven.org/maven2/com/vaadin/vaadin-core/23.3.7/vaadin-core-23.3.7.jar @@ -1388,10 +1577,10 @@ public class TestDependencyResolver { @Test void testTransferCheckExisting() throws Exception { - var resolver = new DependencyResolver(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.eclipse.jetty", "jetty-server", new VersionNumber(11, 0, 14))); + var resolver = new DependencyResolver(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS), new Dependency("org.eclipse.jetty", "jetty-server", new VersionNumber(11, 0, 14))); var tmp = Files.createTempDirectory("transfers").toFile(); try { - resolver.getAllDependencies(compile).transferIntoDirectory(ArtifactRetriever.instance(), resolver.repositories(), tmp); + resolver.getAllDependencies(compile).transferIntoDirectory(VersionResolution.dummy(), ArtifactRetriever.instance(), resolver.repositories(), tmp); var modification_map = new HashMap(); Files.walk(Path.of(tmp.getAbsolutePath())) @@ -1400,7 +1589,7 @@ public class TestDependencyResolver { .forEach(it -> modification_map.put(it, new File(it).lastModified())); // re-transfer and check the modification time didn't change - resolver.getAllDependencies(compile).transferIntoDirectory(ArtifactRetriever.instance(), resolver.repositories(), tmp); + resolver.getAllDependencies(compile).transferIntoDirectory(VersionResolution.dummy(), ArtifactRetriever.instance(), resolver.repositories(), tmp); Files.walk(Path.of(tmp.getAbsolutePath())) .map(path -> path.toAbsolutePath().toString()) .filter(s -> !s.equals(tmp.getAbsolutePath())) @@ -1410,7 +1599,7 @@ public class TestDependencyResolver { var first = modification_map.keySet().stream().findFirst().get(); var first_file = new File(first); first_file.delete(); - resolver.getAllDependencies(compile).transferIntoDirectory(ArtifactRetriever.instance(), resolver.repositories(), tmp); + resolver.getAllDependencies(compile).transferIntoDirectory(VersionResolution.dummy(), ArtifactRetriever.instance(), resolver.repositories(), tmp); assertNotEquals(first_file.lastModified(), modification_map.get(first)); modification_map.put(first, first_file.lastModified()); Files.walk(Path.of(tmp.getAbsolutePath())) @@ -1421,7 +1610,7 @@ public class TestDependencyResolver { // change one file and check that this is transfered again FileUtils.writeString("stuff", first_file); var before_transfer_modified = first_file.lastModified(); - resolver.getAllDependencies(compile).transferIntoDirectory(ArtifactRetriever.instance(), resolver.repositories(), tmp); + resolver.getAllDependencies(compile).transferIntoDirectory(VersionResolution.dummy(), ArtifactRetriever.instance(), resolver.repositories(), tmp); assertNotEquals(first_file.lastModified(), before_transfer_modified); modification_map.put(first, first_file.lastModified()); Files.walk(Path.of(tmp.getAbsolutePath())) diff --git a/src/test/java/rife/bld/dependencies/TestDependencySet.java b/src/test/java/rife/bld/dependencies/TestDependencySet.java index e21341f..daaf88b 100644 --- a/src/test/java/rife/bld/dependencies/TestDependencySet.java +++ b/src/test/java/rife/bld/dependencies/TestDependencySet.java @@ -5,6 +5,7 @@ package rife.bld.dependencies; import org.junit.jupiter.api.Test; +import rife.ioc.HierarchicalProperties; import rife.tools.StringUtils; import java.util.List; @@ -91,7 +92,7 @@ public class TestDependencySet { │ └─ org.eclipse.jetty:jetty-io:11.0.14 └─ org.slf4j:slf4j-simple:2.0.6 └─ org.slf4j:slf4j-api:2.0.6 - """), dependencies.generateTransitiveDependencyTree(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL), compile)); + """), dependencies.generateTransitiveDependencyTree(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL), compile)); } @Test @@ -117,7 +118,7 @@ public class TestDependencySet { ├─ org.springframework:spring-core:6.0.6 │ └─ org.springframework:spring-jcl:6.0.6 └─ org.yaml:snakeyaml:1.33 - """), dependencies.generateTransitiveDependencyTree(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL), compile)); + """), dependencies.generateTransitiveDependencyTree(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL), compile)); } @Test @@ -157,7 +158,7 @@ public class TestDependencySet { ├─ org.codehaus.plexus:plexus-component-annotations:2.1.0 ├─ org.apache.commons:commons-lang3:3.8.1 └─ org.slf4j:slf4j-api:1.7.36 - """), dependencies.generateTransitiveDependencyTree(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL), compile)); + """), dependencies.generateTransitiveDependencyTree(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL), compile)); } @Test @@ -213,7 +214,7 @@ public class TestDependencySet { ├─ org.scala-lang.modules:scala-java8-compat_2.13:1.0.2 ├─ com.typesafe:ssl-config-core_2.13:0.4.3 └─ org.scala-lang.modules:scala-parser-combinators_2.13:1.1.2 - """), dependencies.generateTransitiveDependencyTree(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL), compile)); + """), dependencies.generateTransitiveDependencyTree(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL), compile)); } @Test @@ -309,7 +310,7 @@ public class TestDependencySet { │ ├─ net.java.dev.jna:jna:5.11.0 │ └─ net.java.dev.jna:jna-platform:5.11.0 └─ com.auth0:java-jwt:3.19.2 - """), dependencies.generateTransitiveDependencyTree(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL), compile)); + """), dependencies.generateTransitiveDependencyTree(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL), compile)); } @Test @@ -352,7 +353,7 @@ public class TestDependencySet { └─ com.google.zxing:javase:3.5.1 ├─ com.google.zxing:core:3.5.1 └─ com.beust:jcommander:1.82 - """), dependencies.generateTransitiveDependencyTree(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL), compile)); + """), dependencies.generateTransitiveDependencyTree(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL), compile)); } @Test @@ -371,6 +372,6 @@ public class TestDependencySet { │ └─ com.squareup.okio:okio-jvm:3.2.0 ├─ com.squareup.okhttp3:logging-interceptor:4.11.0 └─ org.json:json:20230618 - """), dependencies.generateTransitiveDependencyTree(ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS_LEGACY), compile, runtime)); + """), dependencies.generateTransitiveDependencyTree(VersionResolution.dummy(), ArtifactRetriever.instance(), List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS_LEGACY), compile, runtime)); } } diff --git a/src/test/java/rife/bld/dependencies/TestVersionResolution.java b/src/test/java/rife/bld/dependencies/TestVersionResolution.java new file mode 100644 index 0000000..0964b35 --- /dev/null +++ b/src/test/java/rife/bld/dependencies/TestVersionResolution.java @@ -0,0 +1,49 @@ +/* + * Copyright 2001-2024 Geert Bevin (gbevin[remove] at uwyn dot com) + * Licensed under the Apache License, Version 2.0 (the "License") + */ +package rife.bld.dependencies; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import rife.ioc.HierarchicalProperties; + +public class TestVersionResolution { + @Test + public void testVersionResolutionConstructor() { + var properties = new HierarchicalProperties(); + properties.put("bld.override", "com.bookstore:book-api:2.0.0"); + + var versionResolution = new VersionResolution(properties); + Assertions.assertNotNull(versionResolution); + + versionResolution = new VersionResolution(null); + Assertions.assertNotNull(versionResolution); + } + + @Test + public void testOverrideVersion() { + var properties = new HierarchicalProperties(); + properties.put("bld.override", "com.bookstore:book-api:2.0.0"); + + var versionResolution = new VersionResolution(properties); + + var originalDependency = new Dependency("com.bookstore", "book-api", new VersionNumber(1,0,0)); + var overriddenVersion = versionResolution.overrideVersion(originalDependency); + + Assertions.assertEquals(new VersionNumber(2,0,0), overriddenVersion); + } + + @Test + public void testOverrideDependency() { + var properties = new HierarchicalProperties(); + properties.put("bld.override", "com.bookstore:book-api:2.0.0"); + + var versionResolution = new VersionResolution(properties); + + var originalDependency = new Dependency("com.bookstore", "book-api",new VersionNumber(1,0,0)); + var overriddenDependency = versionResolution.overrideDependency(originalDependency); + + Assertions.assertEquals(new VersionNumber(2,0,0), overriddenDependency.version()); + } +} \ No newline at end of file diff --git a/src/test/java/rife/bld/operations/TestDependencyTreeOperation.java b/src/test/java/rife/bld/operations/TestDependencyTreeOperation.java index 265c05a..35327da 100644 --- a/src/test/java/rife/bld/operations/TestDependencyTreeOperation.java +++ b/src/test/java/rife/bld/operations/TestDependencyTreeOperation.java @@ -22,6 +22,7 @@ public class TestDependencyTreeOperation { @Test void testInstantiation() { var operation = new DependencyTreeOperation(); + assertEquals(operation.properties().size(), 0); assertTrue(operation.dependencies().isEmpty()); assertTrue(operation.repositories().isEmpty()); } diff --git a/src/test/java/rife/bld/operations/TestPublishOperation.java b/src/test/java/rife/bld/operations/TestPublishOperation.java index 205b0d2..55def0d 100644 --- a/src/test/java/rife/bld/operations/TestPublishOperation.java +++ b/src/test/java/rife/bld/operations/TestPublishOperation.java @@ -63,7 +63,7 @@ public class TestPublishOperation { assertTrue(operation.repositories().isEmpty()); assertNull(operation.moment()); assertTrue(operation.dependencies().isEmpty()); - assertTrue(operation.properties().isEmpty()); + assertTrue(operation.publishProperties().isEmpty()); assertNotNull(operation.info()); assertNull(operation.info().groupId()); assertNull(operation.info().artifactId()); @@ -113,14 +113,14 @@ public class TestPublishOperation { .repository(repository2) .moment(moment) .artifacts(List.of(artifact1, artifact2)); - operation3.properties().mavenCompilerSource(17).mavenCompilerTarget(19); + operation3.publishProperties().mavenCompilerSource(17).mavenCompilerTarget(19); assertTrue(operation3.repositories().contains(repository1)); assertTrue(operation3.repositories().contains(repository2)); assertEquals(moment, operation3.moment()); assertTrue(operation3.artifacts().contains(artifact1)); assertTrue(operation3.artifacts().contains(artifact2)); - assertEquals(17, operation3.properties().mavenCompilerSource()); - assertEquals(19, operation3.properties().mavenCompilerTarget()); + assertEquals(17, operation3.publishProperties().mavenCompilerSource()); + assertEquals(19, operation3.publishProperties().mavenCompilerTarget()); } @Test diff --git a/src/test/java/rife/bld/wrapper/TestWrapperExtensionResolver.java b/src/test/java/rife/bld/wrapper/TestWrapperExtensionResolver.java index 68ba4bf..acb56e3 100644 --- a/src/test/java/rife/bld/wrapper/TestWrapperExtensionResolver.java +++ b/src/test/java/rife/bld/wrapper/TestWrapperExtensionResolver.java @@ -6,6 +6,7 @@ package rife.bld.wrapper; import org.junit.jupiter.api.Test; import rife.bld.BldVersion; +import rife.bld.dependencies.VersionResolution; import rife.tools.FileUtils; import java.io.File; @@ -33,7 +34,7 @@ public class TestWrapperExtensionResolver { bld-wrapper.jar bld-wrapper.properties""", String.join("\n", files1)); - var resolver = new WrapperExtensionResolver(tmp1, hash_file, tmp2, Collections.emptySet(), Collections.emptySet(), false, false); + var resolver = new WrapperExtensionResolver(tmp1, hash_file, tmp2, new Properties(), new Properties(), Collections.emptySet(), Collections.emptySet(), false, false); resolver.updateExtensions(); assertTrue(hash_file.exists()); @@ -66,7 +67,9 @@ public class TestWrapperExtensionResolver { bld-wrapper.jar bld-wrapper.properties""", String.join("\n", files1)); - var resolver = new WrapperExtensionResolver(tmp1, hash_file, tmp2, List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), false, false); + var resolver = new WrapperExtensionResolver(tmp1, hash_file, tmp2, + new Properties(), new Properties(), + List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), false, false); resolver.updateExtensions(); assertTrue(hash_file.exists()); @@ -89,6 +92,95 @@ public class TestWrapperExtensionResolver { } } + @Test + void testUpdateExtensionsOverride1() + throws Exception { + var tmp1 = Files.createTempDirectory("test1").toFile(); + var tmp2 = Files.createTempDirectory("test2").toFile(); + try { + new Wrapper().createWrapperFiles(tmp2, BldVersion.getVersion()); + + var hash_file = new File(tmp1, "wrapper.hash"); + assertFalse(hash_file.exists()); + var files1 = FileUtils.getFileList(tmp2); + assertEquals(2, files1.size()); + Collections.sort(files1); + assertEquals(""" + bld-wrapper.jar + bld-wrapper.properties""", String.join("\n", files1)); + + var properties = new Properties(); + properties.put(VersionResolution.PROPERTY_OVERRIDE_PREFIX, "org.antlr:antlr4:4.11.0"); + var resolver = new WrapperExtensionResolver(tmp1, hash_file, tmp2, + properties, new Properties(), + List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), false, false); + resolver.updateExtensions(); + + assertTrue(hash_file.exists()); + var files2 = FileUtils.getFileList(tmp2); + assertEquals(9, files2.size()); + Collections.sort(files2); + assertEquals(""" + ST4-4.3.4.jar + antlr-runtime-3.5.3.jar + antlr4-4.11.0.jar + antlr4-runtime-4.11.0.jar + bld-wrapper.jar + bld-wrapper.properties + icu4j-71.1.jar + javax.json-1.1.4.jar + org.abego.treelayout.core-1.0.3.jar""", String.join("\n", files2)); + } finally { + tmp2.delete(); + tmp1.delete(); + } + } + + @Test + void testUpdateExtensionsOverride2() + throws Exception { + var tmp1 = Files.createTempDirectory("test1").toFile(); + var tmp2 = Files.createTempDirectory("test2").toFile(); + try { + new Wrapper().createWrapperFiles(tmp2, BldVersion.getVersion()); + + var hash_file = new File(tmp1, "wrapper.hash"); + assertFalse(hash_file.exists()); + var files1 = FileUtils.getFileList(tmp2); + assertEquals(2, files1.size()); + Collections.sort(files1); + assertEquals(""" + bld-wrapper.jar + bld-wrapper.properties""", String.join("\n", files1)); + + var properties = new Properties(); + properties.put(VersionResolution.PROPERTY_OVERRIDE_PREFIX, "org.glassfish:javax.json:1.1.3"); + var resolver = new WrapperExtensionResolver(tmp1, hash_file, tmp2, + properties, new Properties(), + List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), false, false); + resolver.updateExtensions(); + + assertTrue(hash_file.exists()); + var files2 = FileUtils.getFileList(tmp2); + assertEquals(10, files2.size()); + Collections.sort(files2); + assertEquals(""" + ST4-4.3.4.jar + antlr-runtime-3.5.3.jar + antlr4-4.11.1.jar + antlr4-runtime-4.11.1.jar + bld-wrapper.jar + bld-wrapper.properties + icu4j-71.1.jar + javax.json-1.1.3.jar + javax.json-api-1.1.3.jar + org.abego.treelayout.core-1.0.3.jar""", String.join("\n", files2)); + } finally { + tmp2.delete(); + tmp1.delete(); + } + } + @Test void testUpdateExtensionsSources() throws Exception { @@ -106,7 +198,7 @@ public class TestWrapperExtensionResolver { bld-wrapper.jar bld-wrapper.properties""", String.join("\n", files1)); - var resolver = new WrapperExtensionResolver(tmp1, hash_file, tmp2, List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), true, false); + var resolver = new WrapperExtensionResolver(tmp1, hash_file, tmp2, new Properties(), new Properties(), List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), true, false); resolver.updateExtensions(); assertTrue(hash_file.exists()); @@ -153,7 +245,7 @@ public class TestWrapperExtensionResolver { bld-wrapper.jar bld-wrapper.properties""", String.join("\n", files1)); - var resolver = new WrapperExtensionResolver(tmp1, hash_file, tmp2, List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), false, true); + var resolver = new WrapperExtensionResolver(tmp1, hash_file, tmp2, new Properties(), new Properties(), List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), false, true); resolver.updateExtensions(); assertTrue(hash_file.exists()); @@ -200,7 +292,7 @@ public class TestWrapperExtensionResolver { bld-wrapper.jar bld-wrapper.properties""", String.join("\n", files1)); - var resolver = new WrapperExtensionResolver(tmp1, hash_file, tmp2, List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), true, true); + var resolver = new WrapperExtensionResolver(tmp1, hash_file, tmp2, new Properties(), new Properties(), List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), true, true); resolver.updateExtensions(); assertTrue(hash_file.exists()); @@ -237,6 +329,64 @@ public class TestWrapperExtensionResolver { } } + @Test + void testUpdateExtensionsBothOverride() + throws Exception { + var tmp1 = Files.createTempDirectory("test1").toFile(); + var tmp2 = Files.createTempDirectory("test2").toFile(); + try { + new Wrapper().createWrapperFiles(tmp2, BldVersion.getVersion()); + + var hash_file = new File(tmp1, "wrapper.hash"); + assertFalse(hash_file.exists()); + var files1 = FileUtils.getFileList(tmp2); + assertEquals(2, files1.size()); + Collections.sort(files1); + assertEquals(""" + bld-wrapper.jar + bld-wrapper.properties""", String.join("\n", files1)); + + var properties = new Properties(); + properties.put(VersionResolution.PROPERTY_OVERRIDE_PREFIX, "org.antlr:antlr4:4.11.0"); + var resolver = new WrapperExtensionResolver(tmp1, hash_file, tmp2, + properties, new Properties(), + List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), true, true); + resolver.updateExtensions(); + + assertTrue(hash_file.exists()); + var files2 = FileUtils.getFileList(tmp2); + assertEquals(23, files2.size()); + Collections.sort(files2); + assertEquals(""" + ST4-4.3.4-javadoc.jar + ST4-4.3.4-sources.jar + ST4-4.3.4.jar + antlr-runtime-3.5.3-javadoc.jar + antlr-runtime-3.5.3-sources.jar + antlr-runtime-3.5.3.jar + antlr4-4.11.0-javadoc.jar + antlr4-4.11.0-sources.jar + antlr4-4.11.0.jar + antlr4-runtime-4.11.0-javadoc.jar + antlr4-runtime-4.11.0-sources.jar + antlr4-runtime-4.11.0.jar + bld-wrapper.jar + bld-wrapper.properties + icu4j-71.1-javadoc.jar + icu4j-71.1-sources.jar + icu4j-71.1.jar + javax.json-1.1.4-javadoc.jar + javax.json-1.1.4-sources.jar + javax.json-1.1.4.jar + org.abego.treelayout.core-1.0.3-javadoc.jar + org.abego.treelayout.core-1.0.3-sources.jar + org.abego.treelayout.core-1.0.3.jar""", String.join("\n", files2)); + } finally { + tmp2.delete(); + tmp1.delete(); + } + } + @Test void testResolvedRepository() throws Exception { @@ -257,7 +407,7 @@ public class TestWrapperExtensionResolver { var properties = new File(tmp1, "local.properties"); FileUtils.writeString("bld.repo.testrepo=" + MAVEN_CENTRAL, properties); - var resolver = new WrapperExtensionResolver(tmp1, hash_file, tmp2, List.of("testrepo"), List.of("org.antlr:antlr4:4.11.1"), false, false); + var resolver = new WrapperExtensionResolver(tmp1, hash_file, tmp2, new Properties(), new Properties(), List.of("testrepo"), List.of("org.antlr:antlr4:4.11.1"), false, false); resolver.updateExtensions(); assertTrue(hash_file.exists()); @@ -297,7 +447,7 @@ public class TestWrapperExtensionResolver { bld-wrapper.jar bld-wrapper.properties""", String.join("\n", files1)); - var resolver = new WrapperExtensionResolver(tmp1, hash_file, tmp2, List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), false, false); + var resolver = new WrapperExtensionResolver(tmp1, hash_file, tmp2, new Properties(), new Properties(), List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), false, false); resolver.updateExtensions(); assertTrue(hash_file.exists()); @@ -345,7 +495,7 @@ public class TestWrapperExtensionResolver { bld-wrapper.jar bld-wrapper.properties""", String.join("\n", files1)); - var resolver = new WrapperExtensionResolver(tmp1, hash_file, tmp2, List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), false, false); + var resolver = new WrapperExtensionResolver(tmp1, hash_file, tmp2, new Properties(), new Properties(), List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), false, false); resolver.updateExtensions(); assertTrue(hash_file.exists()); @@ -409,7 +559,7 @@ public class TestWrapperExtensionResolver { bld-wrapper.jar bld-wrapper.properties""", String.join("\n", files1)); - var resolver = new WrapperExtensionResolver(tmp1, hash_file, tmp2, List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), false, false); + var resolver = new WrapperExtensionResolver(tmp1, hash_file, tmp2, new Properties(), new Properties(), List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), false, false); resolver.updateExtensions(); assertTrue(hash_file.exists()); @@ -473,7 +623,7 @@ public class TestWrapperExtensionResolver { bld-wrapper.jar bld-wrapper.properties""", String.join("\n", files1)); - var resolver1 = new WrapperExtensionResolver(tmp1, hash_file, tmp2, List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), false, false); + var resolver1 = new WrapperExtensionResolver(tmp1, hash_file, tmp2, new Properties(), new Properties(), List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), false, false); resolver1.updateExtensions(); assertTrue(hash_file.exists()); @@ -491,7 +641,7 @@ public class TestWrapperExtensionResolver { javax.json-1.1.4.jar org.abego.treelayout.core-1.0.3.jar""", String.join("\n", files2)); - var resolver2 = new WrapperExtensionResolver(tmp1, hash_file, tmp2, List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1", "org.jsoup:jsoup:1.15.4"), false, false); + var resolver2 = new WrapperExtensionResolver(tmp1, hash_file, tmp2, new Properties(), new Properties(), List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1", "org.jsoup:jsoup:1.15.4"), false, false); resolver2.updateExtensions(); var files3 = FileUtils.getFileList(tmp2); assertEquals(10, files3.size()); @@ -530,7 +680,7 @@ public class TestWrapperExtensionResolver { bld-wrapper.jar bld-wrapper.properties""", String.join("\n", files1)); - var resolver1 = new WrapperExtensionResolver(tmp1, hash_file, tmp2, List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1", "org.jsoup:jsoup:1.15.4"), false, false); + var resolver1 = new WrapperExtensionResolver(tmp1, hash_file, tmp2, new Properties(), new Properties(), List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1", "org.jsoup:jsoup:1.15.4"), false, false); resolver1.updateExtensions(); assertTrue(hash_file.exists()); @@ -549,7 +699,7 @@ public class TestWrapperExtensionResolver { jsoup-1.15.4.jar org.abego.treelayout.core-1.0.3.jar""", String.join("\n", files2)); - var resolver2 = new WrapperExtensionResolver(tmp1, hash_file, tmp2, List.of(MAVEN_CENTRAL), List.of("org.jsoup:jsoup:1.15.4"), false, false); + var resolver2 = new WrapperExtensionResolver(tmp1, hash_file, tmp2, new Properties(), new Properties(), List.of(MAVEN_CENTRAL), List.of("org.jsoup:jsoup:1.15.4"), false, false); resolver2.updateExtensions(); var files3 = FileUtils.getFileList(tmp2); assertEquals(3, files3.size()); @@ -563,4 +713,66 @@ public class TestWrapperExtensionResolver { tmp1.delete(); } } + + @Test + void testOverrideExtension() + throws Exception { + var tmp1 = Files.createTempDirectory("test1").toFile(); + var tmp2 = Files.createTempDirectory("test2").toFile(); + try { + new Wrapper().createWrapperFiles(tmp2, BldVersion.getVersion()); + + var hash_file = new File(tmp1, "wrapper.hash"); + assertFalse(hash_file.exists()); + var files1 = FileUtils.getFileList(tmp2); + assertEquals(2, files1.size()); + Collections.sort(files1); + assertEquals(""" + bld-wrapper.jar + bld-wrapper.properties""", String.join("\n", files1)); + + var resolver1 = new WrapperExtensionResolver(tmp1, hash_file, tmp2, + new Properties(), new Properties(), + List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), false, false); + resolver1.updateExtensions(); + + assertTrue(hash_file.exists()); + var files2 = FileUtils.getFileList(tmp2); + assertEquals(9, files2.size()); + Collections.sort(files2); + assertEquals(""" + ST4-4.3.4.jar + antlr-runtime-3.5.3.jar + antlr4-4.11.1.jar + antlr4-runtime-4.11.1.jar + bld-wrapper.jar + bld-wrapper.properties + icu4j-71.1.jar + javax.json-1.1.4.jar + org.abego.treelayout.core-1.0.3.jar""", String.join("\n", files2)); + + var properties = new Properties(); + properties.put(VersionResolution.PROPERTY_OVERRIDE_PREFIX, "org.antlr:antlr4:4.11.0"); + var resolver2 = new WrapperExtensionResolver(tmp1, hash_file, tmp2, + properties, new Properties(), + List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), false, false); + resolver2.updateExtensions(); + var files3 = FileUtils.getFileList(tmp2); + assertEquals(9, files3.size()); + Collections.sort(files3); + assertEquals(""" + ST4-4.3.4.jar + antlr-runtime-3.5.3.jar + antlr4-4.11.0.jar + antlr4-runtime-4.11.0.jar + bld-wrapper.jar + bld-wrapper.properties + icu4j-71.1.jar + javax.json-1.1.4.jar + org.abego.treelayout.core-1.0.3.jar""", String.join("\n", files3)); + } finally { + tmp2.delete(); + tmp1.delete(); + } + } }