From 1bbc45a28bc26542136b45fb0aaa20b70c6b498e Mon Sep 17 00:00:00 2001 From: Guillermo Calvo Date: Mon, 10 Jun 2024 17:56:28 +0200 Subject: [PATCH 01/17] Generate project via start.spring.io https://start.spring.io/#!type=gradle-project&language=java&platformVersion=3.3.0&packaging=jar&jvmVersion=21&groupId=com.leakyabstractions&artifactId=result-example-spring-boot&name=Example&description=Demo%20project%20for%20Spring%20Boot&packageName=com.example&dependencies=web,cloud-feign --- .gitignore | 37 +++ build.gradle | 39 +++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43453 bytes gradle/wrapper/gradle-wrapper.properties | 7 + gradlew | 249 ++++++++++++++++++ gradlew.bat | 92 +++++++ settings.gradle | 1 + .../java/com/example/ExampleApplication.java | 13 + src/main/resources/application.properties | 1 + .../com/example/ExampleApplicationTests.java | 13 + 10 files changed, 452 insertions(+) create mode 100644 .gitignore create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle create mode 100644 src/main/java/com/example/ExampleApplication.java create mode 100644 src/main/resources/application.properties create mode 100644 src/test/java/com/example/ExampleApplicationTests.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c2065bc --- /dev/null +++ b/.gitignore @@ -0,0 +1,37 @@ +HELP.md +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..ccafde1 --- /dev/null +++ b/build.gradle @@ -0,0 +1,39 @@ +plugins { + id 'java' + id 'org.springframework.boot' version '3.3.0' + id 'io.spring.dependency-management' version '1.1.5' +} + +group = 'com.leakyabstractions' +version = '0.0.1-SNAPSHOT' + +java { + toolchain { + languageVersion = JavaLanguageVersion.of(21) + } +} + +repositories { + mavenCentral() +} + +ext { + set('springCloudVersion', "2023.0.2") +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.cloud:spring-cloud-starter-openfeign' + testImplementation 'org.springframework.boot:spring-boot-starter-test' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' +} + +dependencyManagement { + imports { + mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" + } +} + +tasks.named('test') { + useJUnitPlatform() +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..e6441136f3d4ba8a0da8d277868979cfbc8ad796 GIT binary patch literal 43453 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 yu?e%!_ptzGB|8GrCfu%p?(_ zQccdaaVK$5bz;*rnyK{_SQYM>;aES6Qs^lj9lEs6_J+%nIiuQC*fN;z8md>r_~Mfl zU%p5Dt_YT>gQqfr@`cR!$NWr~+`CZb%dn;WtzrAOI>P_JtsB76PYe*<%H(y>qx-`Kq!X_; z<{RpAqYhE=L1r*M)gNF3B8r(<%8mo*SR2hu zccLRZwGARt)Hlo1euqTyM>^!HK*!Q2P;4UYrysje@;(<|$&%vQekbn|0Ruu_Io(w4#%p6ld2Yp7tlA`Y$cciThP zKzNGIMPXX%&Ud0uQh!uQZz|FB`4KGD?3!ND?wQt6!n*f4EmCoJUh&b?;B{|lxs#F- z31~HQ`SF4x$&v00@(P+j1pAaj5!s`)b2RDBp*PB=2IB>oBF!*6vwr7Dp%zpAx*dPr zb@Zjq^XjN?O4QcZ*O+8>)|HlrR>oD*?WQl5ri3R#2?*W6iJ>>kH%KnnME&TT@ZzrHS$Q%LC?n|e>V+D+8D zYc4)QddFz7I8#}y#Wj6>4P%34dZH~OUDb?uP%-E zwjXM(?Sg~1!|wI(RVuxbu)-rH+O=igSho_pDCw(c6b=P zKk4ATlB?bj9+HHlh<_!&z0rx13K3ZrAR8W)!@Y}o`?a*JJsD+twZIv`W)@Y?Amu_u zz``@-e2X}27$i(2=9rvIu5uTUOVhzwu%mNazS|lZb&PT;XE2|B&W1>=B58#*!~D&) zfVmJGg8UdP*fx(>Cj^?yS^zH#o-$Q-*$SnK(ZVFkw+er=>N^7!)FtP3y~Xxnu^nzY zikgB>Nj0%;WOltWIob|}%lo?_C7<``a5hEkx&1ku$|)i>Rh6@3h*`slY=9U}(Ql_< zaNG*J8vb&@zpdhAvv`?{=zDedJ23TD&Zg__snRAH4eh~^oawdYi6A3w8<Ozh@Kw)#bdktM^GVb zrG08?0bG?|NG+w^&JvD*7LAbjED{_Zkc`3H!My>0u5Q}m!+6VokMLXxl`Mkd=g&Xx z-a>m*#G3SLlhbKB!)tnzfWOBV;u;ftU}S!NdD5+YtOjLg?X}dl>7m^gOpihrf1;PY zvll&>dIuUGs{Qnd- zwIR3oIrct8Va^Tm0t#(bJD7c$Z7DO9*7NnRZorrSm`b`cxz>OIC;jSE3DO8`hX955ui`s%||YQtt2 z5DNA&pG-V+4oI2s*x^>-$6J?p=I>C|9wZF8z;VjR??Icg?1w2v5Me+FgAeGGa8(3S z4vg*$>zC-WIVZtJ7}o9{D-7d>zCe|z#<9>CFve-OPAYsneTb^JH!Enaza#j}^mXy1 z+ULn^10+rWLF6j2>Ya@@Kq?26>AqK{A_| zQKb*~F1>sE*=d?A?W7N2j?L09_7n+HGi{VY;MoTGr_)G9)ot$p!-UY5zZ2Xtbm=t z@dpPSGwgH=QtIcEulQNI>S-#ifbnO5EWkI;$A|pxJd885oM+ zGZ0_0gDvG8q2xebj+fbCHYfAXuZStH2j~|d^sBAzo46(K8n59+T6rzBwK)^rfPT+B zyIFw)9YC-V^rhtK`!3jrhmW-sTmM+tPH+;nwjL#-SjQPUZ53L@A>y*rt(#M(qsiB2 zx6B)dI}6Wlsw%bJ8h|(lhkJVogQZA&n{?Vgs6gNSXzuZpEyu*xySy8ro07QZ7Vk1!3tJphN_5V7qOiyK8p z#@jcDD8nmtYi1^l8ml;AF<#IPK?!pqf9D4moYk>d99Im}Jtwj6c#+A;f)CQ*f-hZ< z=p_T86jog%!p)D&5g9taSwYi&eP z#JuEK%+NULWus;0w32-SYFku#i}d~+{Pkho&^{;RxzP&0!RCm3-9K6`>KZpnzS6?L z^H^V*s!8<>x8bomvD%rh>Zp3>Db%kyin;qtl+jAv8Oo~1g~mqGAC&Qi_wy|xEt2iz zWAJEfTV%cl2Cs<1L&DLRVVH05EDq`pH7Oh7sR`NNkL%wi}8n>IXcO40hp+J+sC!W?!krJf!GJNE8uj zg-y~Ns-<~D?yqbzVRB}G>0A^f0!^N7l=$m0OdZuqAOQqLc zX?AEGr1Ht+inZ-Qiwnl@Z0qukd__a!C*CKuGdy5#nD7VUBM^6OCpxCa2A(X;e0&V4 zM&WR8+wErQ7UIc6LY~Q9x%Sn*Tn>>P`^t&idaOEnOd(Ufw#>NoR^1QdhJ8s`h^|R_ zXX`c5*O~Xdvh%q;7L!_!ohf$NfEBmCde|#uVZvEo>OfEq%+Ns7&_f$OR9xsihRpBb z+cjk8LyDm@U{YN>+r46?nn{7Gh(;WhFw6GAxtcKD+YWV?uge>;+q#Xx4!GpRkVZYu zzsF}1)7$?%s9g9CH=Zs+B%M_)+~*j3L0&Q9u7!|+T`^O{xE6qvAP?XWv9_MrZKdo& z%IyU)$Q95AB4!#hT!_dA>4e@zjOBD*Y=XjtMm)V|+IXzjuM;(l+8aA5#Kaz_$rR6! zj>#&^DidYD$nUY(D$mH`9eb|dtV0b{S>H6FBfq>t5`;OxA4Nn{J(+XihF(stSche7$es&~N$epi&PDM_N`As;*9D^L==2Q7Z2zD+CiU(|+-kL*VG+&9!Yb3LgPy?A zm7Z&^qRG_JIxK7-FBzZI3Q<;{`DIxtc48k> zc|0dmX;Z=W$+)qE)~`yn6MdoJ4co;%!`ddy+FV538Y)j(vg}5*k(WK)KWZ3WaOG!8 z!syGn=s{H$odtpqFrT#JGM*utN7B((abXnpDM6w56nhw}OY}0TiTG1#f*VFZr+^-g zbP10`$LPq_;PvrA1XXlyx2uM^mrjTzX}w{yuLo-cOClE8MMk47T25G8M!9Z5ypOSV zAJUBGEg5L2fY)ZGJb^E34R2zJ?}Vf>{~gB!8=5Z) z9y$>5c)=;o0HeHHSuE4U)#vG&KF|I%-cF6f$~pdYJWk_dD}iOA>iA$O$+4%@>JU08 zS`ep)$XLPJ+n0_i@PkF#ri6T8?ZeAot$6JIYHm&P6EB=BiaNY|aA$W0I+nz*zkz_z zkEru!tj!QUffq%)8y0y`T&`fuus-1p>=^hnBiBqD^hXrPs`PY9tU3m0np~rISY09> z`P3s=-kt_cYcxWd{de@}TwSqg*xVhp;E9zCsnXo6z z?f&Sv^U7n4`xr=mXle94HzOdN!2kB~4=%)u&N!+2;z6UYKUDqi-s6AZ!haB;@&B`? z_TRX0%@suz^TRdCb?!vNJYPY8L_}&07uySH9%W^Tc&1pia6y1q#?*Drf}GjGbPjBS zbOPcUY#*$3sL2x4v_i*Y=N7E$mR}J%|GUI(>WEr+28+V z%v5{#e!UF*6~G&%;l*q*$V?&r$Pp^sE^i-0$+RH3ERUUdQ0>rAq2(2QAbG}$y{de( z>{qD~GGuOk559Y@%$?N^1ApVL_a704>8OD%8Y%8B;FCt%AoPu8*D1 zLB5X>b}Syz81pn;xnB}%0FnwazlWfUV)Z-~rZg6~b z6!9J$EcE&sEbzcy?CI~=boWA&eeIa%z(7SE^qgVLz??1Vbc1*aRvc%Mri)AJaAG!p z$X!_9Ds;Zz)f+;%s&dRcJt2==P{^j3bf0M=nJd&xwUGlUFn?H=2W(*2I2Gdu zv!gYCwM10aeus)`RIZSrCK=&oKaO_Ry~D1B5!y0R=%!i2*KfXGYX&gNv_u+n9wiR5 z*e$Zjju&ODRW3phN925%S(jL+bCHv6rZtc?!*`1TyYXT6%Ju=|X;6D@lq$8T zW{Y|e39ioPez(pBH%k)HzFITXHvnD6hw^lIoUMA;qAJ^CU?top1fo@s7xT13Fvn1H z6JWa-6+FJF#x>~+A;D~;VDs26>^oH0EI`IYT2iagy23?nyJ==i{g4%HrAf1-*v zK1)~@&(KkwR7TL}L(A@C_S0G;-GMDy=MJn2$FP5s<%wC)4jC5PXoxrQBFZ_k0P{{s@sz+gX`-!=T8rcB(=7vW}^K6oLWMmp(rwDh}b zwaGGd>yEy6fHv%jM$yJXo5oMAQ>c9j`**}F?MCry;T@47@r?&sKHgVe$MCqk#Z_3S z1GZI~nOEN*P~+UaFGnj{{Jo@16`(qVNtbU>O0Hf57-P>x8Jikp=`s8xWs^dAJ9lCQ z)GFm+=OV%AMVqVATtN@|vp61VVAHRn87}%PC^RAzJ%JngmZTasWBAWsoAqBU+8L8u z4A&Pe?fmTm0?mK-BL9t+{y7o(7jm+RpOhL9KnY#E&qu^}B6=K_dB}*VlSEiC9fn)+V=J;OnN)Ta5v66ic1rG+dGAJ1 z1%Zb_+!$=tQ~lxQrzv3x#CPb?CekEkA}0MYSgx$Jdd}q8+R=ma$|&1a#)TQ=l$1tQ z=tL9&_^vJ)Pk}EDO-va`UCT1m#Uty1{v^A3P~83_#v^ozH}6*9mIjIr;t3Uv%@VeW zGL6(CwCUp)Jq%G0bIG%?{_*Y#5IHf*5M@wPo6A{$Um++Co$wLC=J1aoG93&T7Ho}P z=mGEPP7GbvoG!uD$k(H3A$Z))+i{Hy?QHdk>3xSBXR0j!11O^mEe9RHmw!pvzv?Ua~2_l2Yh~_!s1qS`|0~0)YsbHSz8!mG)WiJE| z2f($6TQtt6L_f~ApQYQKSb=`053LgrQq7G@98#igV>y#i==-nEjQ!XNu9 z~;mE+gtj4IDDNQJ~JVk5Ux6&LCSFL!y=>79kE9=V}J7tD==Ga+IW zX)r7>VZ9dY=V&}DR))xUoV!u(Z|%3ciQi_2jl}3=$Agc(`RPb z8kEBpvY>1FGQ9W$n>Cq=DIpski};nE)`p3IUw1Oz0|wxll^)4dq3;CCY@RyJgFgc# zKouFh!`?Xuo{IMz^xi-h=StCis_M7yq$u) z?XHvw*HP0VgR+KR6wI)jEMX|ssqYvSf*_3W8zVTQzD?3>H!#>InzpSO)@SC8q*ii- z%%h}_#0{4JG;Jm`4zg};BPTGkYamx$Xo#O~lBirRY)q=5M45n{GCfV7h9qwyu1NxOMoP4)jjZMxmT|IQQh0U7C$EbnMN<3)Kk?fFHYq$d|ICu>KbY_hO zTZM+uKHe(cIZfEqyzyYSUBZa8;Fcut-GN!HSA9ius`ltNebF46ZX_BbZNU}}ZOm{M2&nANL9@0qvih15(|`S~z}m&h!u4x~(%MAO$jHRWNfuxWF#B)E&g3ghSQ9|> z(MFaLQj)NE0lowyjvg8z0#m6FIuKE9lDO~Glg}nSb7`~^&#(Lw{}GVOS>U)m8bF}x zVjbXljBm34Cs-yM6TVusr+3kYFjr28STT3g056y3cH5Tmge~ASxBj z%|yb>$eF;WgrcOZf569sDZOVwoo%8>XO>XQOX1OyN9I-SQgrm;U;+#3OI(zrWyow3 zk==|{lt2xrQ%FIXOTejR>;wv(Pb8u8}BUpx?yd(Abh6? zsoO3VYWkeLnF43&@*#MQ9-i-d0t*xN-UEyNKeyNMHw|A(k(_6QKO=nKMCxD(W(Yop zsRQ)QeL4X3Lxp^L%wzi2-WVSsf61dqliPUM7srDB?Wm6Lzn0&{*}|IsKQW;02(Y&| zaTKv|`U(pSzuvR6Rduu$wzK_W-Y-7>7s?G$)U}&uK;<>vU}^^ns@Z!p+9?St1s)dG zK%y6xkPyyS1$~&6v{kl?Md6gwM|>mt6Upm>oa8RLD^8T{0?HC!Z>;(Bob7el(DV6x zi`I)$&E&ngwFS@bi4^xFLAn`=fzTC;aimE^!cMI2n@Vo%Ae-ne`RF((&5y6xsjjAZ zVguVoQ?Z9uk$2ON;ersE%PU*xGO@T*;j1BO5#TuZKEf(mB7|g7pcEA=nYJ{s3vlbg zd4-DUlD{*6o%Gc^N!Nptgay>j6E5;3psI+C3Q!1ZIbeCubW%w4pq9)MSDyB{HLm|k zxv-{$$A*pS@csolri$Ge<4VZ}e~78JOL-EVyrbxKra^d{?|NnPp86!q>t<&IP07?Z z^>~IK^k#OEKgRH+LjllZXk7iA>2cfH6+(e&9ku5poo~6y{GC5>(bRK7hwjiurqAiZ zg*DmtgY}v83IjE&AbiWgMyFbaRUPZ{lYiz$U^&Zt2YjG<%m((&_JUbZcfJ22(>bi5 z!J?<7AySj0JZ&<-qXX;mcV!f~>G=sB0KnjWca4}vrtunD^1TrpfeS^4dvFr!65knK zZh`d;*VOkPs4*-9kL>$GP0`(M!j~B;#x?Ba~&s6CopvO86oM?-? zOw#dIRc;6A6T?B`Qp%^<U5 z19x(ywSH$_N+Io!6;e?`tWaM$`=Db!gzx|lQ${DG!zb1Zl&|{kX0y6xvO1o z220r<-oaS^^R2pEyY;=Qllqpmue|5yI~D|iI!IGt@iod{Opz@*ml^w2bNs)p`M(Io z|E;;m*Xpjd9l)4G#KaWfV(t8YUn@A;nK^#xgv=LtnArX|vWQVuw3}B${h+frU2>9^ z!l6)!Uo4`5k`<<;E(ido7M6lKTgWezNLq>U*=uz&s=cc$1%>VrAeOoUtA|T6gO4>UNqsdK=NF*8|~*sl&wI=x9-EGiq*aqV!(VVXA57 zw9*o6Ir8Lj1npUXvlevtn(_+^X5rzdR>#(}4YcB9O50q97%rW2me5_L=%ffYPUSRc z!vv?Kv>dH994Qi>U(a<0KF6NH5b16enCp+mw^Hb3Xs1^tThFpz!3QuN#}KBbww`(h z7GO)1olDqy6?T$()R7y%NYx*B0k_2IBiZ14&8|JPFxeMF{vSTxF-Vi3+ZOI=Thq2} zyQgjYY1_7^ZQHh{?P))4+qUiQJLi1&{yE>h?~jU%tjdV0h|FENbM3X(KnJdPKc?~k zh=^Ixv*+smUll!DTWH!jrV*wSh*(mx0o6}1@JExzF(#9FXgmTXVoU+>kDe68N)dkQ zH#_98Zv$}lQwjKL@yBd;U(UD0UCl322=pav<=6g>03{O_3oKTq;9bLFX1ia*lw;#K zOiYDcBJf)82->83N_Y(J7Kr_3lE)hAu;)Q(nUVydv+l+nQ$?|%MWTy`t>{havFSQloHwiIkGK9YZ79^9?AZo0ZyQlVR#}lF%dn5n%xYksXf8gnBm=wO7g_^! zauQ-bH1Dc@3ItZ-9D_*pH}p!IG7j8A_o94#~>$LR|TFq zZ-b00*nuw|-5C2lJDCw&8p5N~Z1J&TrcyErds&!l3$eSz%`(*izc;-?HAFD9AHb-| z>)id`QCrzRws^9(#&=pIx9OEf2rmlob8sK&xPCWS+nD~qzU|qG6KwA{zbikcfQrdH z+ zQg>O<`K4L8rN7`GJB0*3<3`z({lWe#K!4AZLsI{%z#ja^OpfjU{!{)x0ZH~RB0W5X zTwN^w=|nA!4PEU2=LR05x~}|B&ZP?#pNgDMwD*ajI6oJqv!L81gu=KpqH22avXf0w zX3HjbCI!n9>l046)5rr5&v5ja!xkKK42zmqHzPx$9Nn_MZk`gLeSLgC=LFf;H1O#B zn=8|^1iRrujHfbgA+8i<9jaXc;CQBAmQvMGQPhFec2H1knCK2x!T`e6soyrqCamX% zTQ4dX_E*8so)E*TB$*io{$c6X)~{aWfaqdTh=xEeGvOAN9H&-t5tEE-qso<+C!2>+ zskX51H-H}#X{A75wqFe-J{?o8Bx|>fTBtl&tcbdR|132Ztqu5X0i-pisB-z8n71%q%>EF}yy5?z=Ve`}hVh{Drv1YWL zW=%ug_&chF11gDv3D6B)Tz5g54H0mDHNjuKZ+)CKFk4Z|$RD zfRuKLW`1B>B?*RUfVd0+u8h3r-{@fZ{k)c!93t1b0+Q9vOaRnEn1*IL>5Z4E4dZ!7 ztp4GP-^1d>8~LMeb}bW!(aAnB1tM_*la=Xx)q(I0Y@__Zd$!KYb8T2VBRw%e$iSdZ zkwdMwd}eV9q*;YvrBFTv1>1+}{H!JK2M*C|TNe$ZSA>UHKk);wz$(F$rXVc|sI^lD zV^?_J!3cLM;GJuBMbftbaRUs$;F}HDEDtIeHQ)^EJJ1F9FKJTGH<(Jj`phE6OuvE) zqK^K`;3S{Y#1M@8yRQwH`?kHMq4tHX#rJ>5lY3DM#o@or4&^_xtBC(|JpGTfrbGkA z2Tu+AyT^pHannww!4^!$5?@5v`LYy~T`qs7SYt$JgrY(w%C+IWA;ZkwEF)u5sDvOK zGk;G>Mh&elvXDcV69J_h02l&O;!{$({fng9Rlc3ID#tmB^FIG^w{HLUpF+iB`|
NnX)EH+Nua)3Y(c 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 '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..25da30d --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,92 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..a001018 --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'result-example-spring-boot' diff --git a/src/main/java/com/example/ExampleApplication.java b/src/main/java/com/example/ExampleApplication.java new file mode 100644 index 0000000..4c67afb --- /dev/null +++ b/src/main/java/com/example/ExampleApplication.java @@ -0,0 +1,13 @@ +package com.example; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ExampleApplication { + + public static void main(String[] args) { + SpringApplication.run(ExampleApplication.class, args); + } + +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..95e7bee --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.application.name=Example diff --git a/src/test/java/com/example/ExampleApplicationTests.java b/src/test/java/com/example/ExampleApplicationTests.java new file mode 100644 index 0000000..d125f4b --- /dev/null +++ b/src/test/java/com/example/ExampleApplicationTests.java @@ -0,0 +1,13 @@ +package com.example; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class ExampleApplicationTests { + + @Test + void contextLoads() { + } + +} From e6604659f06b35a28a193e2cd91b27ecf49fef23 Mon Sep 17 00:00:00 2001 From: Guillermo Calvo Date: Mon, 10 Jun 2024 17:57:25 +0200 Subject: [PATCH 02/17] Add README --- README.md | 124 +++++++++++++++++++++++++++++++++++++++++++++++++ swagger-ui.png | Bin 0 -> 131704 bytes 2 files changed, 124 insertions(+) create mode 100644 README.md create mode 100644 swagger-ui.png diff --git a/README.md b/README.md new file mode 100644 index 0000000..2102797 --- /dev/null +++ b/README.md @@ -0,0 +1,124 @@ + +[![Build Status][BADGE_BUILD_STATUS]][BUILD_STATUS] +[![Gradle][BADGE_GRADLE]][GRADLE] +[![Spring Boot][BADGE_SPRING_BOOT]][SPRING_BOOT] +[![Maven Central][BADGE_RESULT_ARTIFACTS]][RESULT_ARTIFACTS] +[![Benchmark Report][BADGE_BENCHMARK]][BENCHMARK] + + +# Example Spring Boot Application Using Results + +This is a simple implementation of a [Petstore][PET_STORE] server powered by [Spring Boot][SPRING_BOOT]. + +The purpose of this example application is to demonstrate how to make use of [Result][RESULT_LIBRARY] libraries in +projects based on Spring Boot. For the sake of brevity, the Petstore spec is implemented partially. + + +## Getting Started + +Build and run the application. + +```shell +./gradlew bootRun +``` + +This will start a stand-alone server on port 8080. + + +## Testing the Server + +Once started, you can interact with the API. + +```shell +curl -s -H 'x-type: local' http://localhost:8080/pet/0 +``` + +You should see a JSON response like this: + +```json +{"version":"1.0","result":{"success":{"id":0,"name":"Rocky","status":"AVAILABLE"}}} +``` + + +## Using Swagger-UI + +You can navigate to to inspect the API using an interactive UI. + +![Swagger-UI](swagger-ui.png) + + +## Looking for Support? + +We'd love to help. Check out the [support guidelines][SUPPORT]. + + +## Contributions Welcome + +If you'd like to contribute to this project, please [start here][CONTRIBUTING]. + + +## Code of Conduct + +This project is governed by the [Contributor Covenant Code of Conduct][CODE_OF_CONDUCT]. +By participating, you are expected to uphold this code. + + +## Author + +Copyright 2024 [Guillermo Calvo][AUTHOR]. + +[![][GUILLERMO_IMAGE]][GUILLERMO] + + +## License + +This library is licensed under the *Apache License, Version 2.0* (the "License"); +you may not use it except in compliance with the License. + +You may obtain a copy of the License at + +Unless required by applicable law or agreed to in writing, software distributed under the License +is distributed on an "AS IS" BASIS, **WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND**, either express or implied. + +See the License for the specific language governing permissions and limitations under the License. + + +**Permitted:** + +- **Commercial Use**: You may use this library and derivatives for commercial purposes. +- **Modification**: You may modify this library. +- **Distribution**: You may distribute this library. +- **Patent Use**: This license provides an express grant of patent rights from contributors. +- **Private Use**: You may use and modify this library without distributing it. + +**Required:** + +- **License and Copyright Notice**: If you distribute this library you must include a copy of the license and copyright + notice. +- **State Changes**: If you modify and distribute this library you must document changes made to this library. + +**Forbidden:** + +- **Trademark use**: This license does not grant any trademark rights. +- **Liability**: The library author cannot be held liable for damages. +- **Warranty**: This library is provided without any warranty. + + +[AUTHOR]: https://github.com/guillermocalvo/ +[BADGE_BENCHMARK]: https://img.shields.io/endpoint?url=https://dev.leakyabstractions.com/result-benchmark/badge.json&style=flat +[BADGE_BUILD_STATUS]: https://github.com/leakyabstractions/result-example-spring-boot/workflows/Build/badge.svg +[BADGE_GRADLE]: https://img.shields.io/badge/Gradle-1FAEC9?logo=Gradle&logoColor=white +[BADGE_RESULT_ARTIFACTS]: https://img.shields.io/endpoint?url=https://dev.leakyabstractions.com/result/badge.json +[BADGE_SPRING_BOOT]: https://img.shields.io/badge/Spring%20Boot-6DB33F?logo=Spring&logoColor=white +[BENCHMARK]: https://dev.leakyabstractions.com/result-benchmark/ +[BUILD_STATUS]: https://github.com/LeakyAbstractions/result-example-spring-boot/actions?query=workflow%3ABuild +[CODE_OF_CONDUCT]: https://dev.leakyabstractions.com/result/CODE_OF_CONDUCT.html +[CONTRIBUTING]: https://dev.leakyabstractions.com/result/CONTRIBUTING.html +[GRADLE]: https://gradle.org/ +[GUILLERMO]: https://guillermo.dev/ +[GUILLERMO_IMAGE]: https://guillermo.dev/assets/images/thumb.png +[PET_STORE]: https://petstore.swagger.io/ +[RESULT_ARTIFACTS]: https://search.maven.org/artifact/com.leakyabstractions/result/ +[RESULT_LIBRARY]: https://github.com/LeakyAbstractions/result +[SPRING_BOOT]: https://spring.io/projects/spring-boot +[SUPPORT]: https://dev.leakyabstractions.com/result/SUPPORT.html diff --git a/swagger-ui.png b/swagger-ui.png new file mode 100644 index 0000000000000000000000000000000000000000..44fff451f142e121b606d310ed591934d0c29add GIT binary patch literal 131704 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

li8kA2}dUG7vN@+Z=qk=#z#DtTpvbry! zT%`-0As=W6iRs-5Y>z_n5~J~twKdaV%h9<8XO#ld7Tx4FBzbx*Eu_a}Ht1)vI8uUi z=iG?XDy7Hj_TAy*OQUH$_HIOwhNxVZxT(tAlAL#DstxNgmFE^ycQG+8yT^z?=1F!# zieJ(71dgPM;&m}QelZJr4#^&)XCaRFQI$jov_xu6OZwT=eUW29Z6uPlIT0~fW(Vh9>s`Zfr?52?NdXhED}W6NUy9CC}Jc9UDuNhHpM_Er^}aeWK=fpp%xjic3%!40hnLb zj9AZo4hMzM2px$}d0UVg%40+PeomKbf)(@fFG>1CCH+Jh9~Z>R}-%nTAU zy~f9~t{ezV&evbqkYV#W4EIf=Xq%&3&($EQlItWAz_(gy)k5w!GIikNS0F48UWKF^ z4g{@FMxJu;h!GMM;NC^Y-dkJ-9%ghh-hCg^jtGc0y*mn7%ex zI2-N8ufVOePDtQQX4wwdpTlNFw28Y*)t50E!il{Z_0~Hjv3g?=-K+Q`;nAaL31Ak< z#_Xn~ir?l&1k}wh0~(ho7O#TT`RAHD=mc0De1s=M9jD9I7~+HKoSc^?Y_oOJ2vQsa zHVJA^%$M}0y{LU@HJKx3Hk-@&N?><9`>zdVLWHYshwT=NMdGixFv9JMG-w1Vh-MsU zC7Up1F;$?&dwd(%MKlW32?B}Rc&3oQtYxP8!q0{A8MX~ZU2czg>S{~tW;I_@R%e(L z!GK?SaelNAC3V4h9he^OUU_yjD3YP%;*~eiz~8|7;g;=gT(s!?j-uHiVAK^$mZ$Xu zp_-8(ESo#LNVmE$OeYBzs?yYG7wuT9n3+ZhU&!-8_qmt@V!c`sozyqUUpm>q33KU$ zG=!uNC2^~rl~$y>KgP?pTZ&)aYt})9J{>;`$l`?Mt*?)qrHtp_aYo>0H2d#pTUXH` z3b)@SqvCWH$q2dB(&M)Mc+a5e_f92&X+C(ZA6U7gIPquV$S;Np+U&7#)7t44WAX)# zO4qjC))=DgTw*RoDGGaR?E zTZDSP)*Z_Qa_Utxu|3IBJ?iq1`}+iypx*sr{wQpfilLc;dt!UO=4-$q?xC(Bhupeyx>>vw9Du6hHDCOedW5bajiPjQ!va9 zt5+IV-f&7Nn&$0r&~KH*pi^HcO=|NMi{^PUESzd4&WPLCRs$ zbP#CzSdH*9pGq)vMbeK3tn#V(uu`g_z#iCRH2NBTP?s|wv{Hj#ut}fNbldJw5Uoqq zk2}$>d4J{iGg0Riu#7;;=haD~w7e*r%p`$Z5vHY5j|p>1hVAAEo3@EtmCISh!+v8i z!?@Glp5j3Hj@PqDgIMX4chWg7g)tPLmdgCRA8eqI>e{4pVy+@@DI}U7BlO8dATUn{ z19)Gf!SVVx)ee*H=wsML*l%UV^P- zutSA0G5$=9;BBjW($V<|Ja`0AcT$-eM0e842W1b)V7>1}9SohIm6h?0+=1`{G5q4p zXi0#Wms_Sq!IttpMyxlZfSQ#b|ICW&!Sc`22-9w-Nc7~kCp}Jmi}Uo*D9k7BZ*ou< zF8woT{2;ZgJdE+#vQ~uB>V-48Mn!x<)jH8qQ!$OTUY{;{%H@g0fzZI9FcBY*j(byu zT1y136V#KqZV7l@?oz{tI9{gAQ-*J$!kQVIp*D@GD&nNac+D{m5=7{{a(FZBbgzRR zYwgFwwTj5t?NvV^!@vMw8{6DpZhz{)<{MgE;GV0m_^|1#h2eLYT`Y*NbMj5f3Okm?M8$cq71|bc1Oq$sv^LT zUyObct3STCjD(i)QP=^P(`k54wD8N}A-LFRj4uoB_A@L6YVp(j0oLkB!XpLQa{1qZ z#!>%`SnHzuMR&)xgO_wH`G4o&KY#qc@xX@|uv|gqM9hsx6+w1{yZiC*&pIDBOP526 z%KMN$5zxyfln#8vG$QNef!D6p1Raps~P|2_^;CNDDKu$_QooP z_JT@^JxLq^Z1hPPgt2O}tl0PmAnkt`^lurDV%p7us3Inu&)?|G|2FIY_ee09{dOt` zFKJ`QDFbyD!Q`d?w^*)7h6!EGuQ=VS_QTbUGzSaa_O*#3rM zmDRZVup$o+EZZ^uCF({k1fRP{9acrQvc!zee^=eY2yPhshzw{4knD87OtlyD7WW-YJ#?rU=Ic1@vt8WOslQtiJNqv4?Y{27t8z~U^{+^VruAF z?Ym9v^e++r5_NI7lbo1Yn2a~n+UTpl<;BsMwC>>W3B7}{*lT(uQ3A5>u5BSXC4VCj zo*ky1vPj7jr@S$<6d?3`V~PF!^@#q8K(jRa@|jY+9wT~wrIuGm^3?)SR!AH zzu)i{M?6gaiy-O0kX=q>k8<6oLR-TBkD{RekEqxGI3xCNT5{$)F~zhe!IGIWDSI7| z$pYi+*Ff` zcf`dWnE-xfNq>Uvai0GTNND^Ukno#DAmVR8!g3ZR&9_bJwg75aR)Klt$WhW+#C|ZZ zBG$sN_fv23`hG)F;qpOsfTD9DiIpv8HuDq!1X;a#ZH*5!4^lGwzDx36E}k9zDT4c! zS&X2=()sknw1byJUMWc6XZJ30dn5_4+2OiT#o~$z8Ve~S75dwQT2SMrgpg&KgA~g% ztX+APGGJhPsC^vzj2H;5?GKJR-9M`S20>82dl7l>?7CCxBt{tI=1N+olAG`TIda#d7s82>aXK%SBC=tL5c%I@6nL?P=^romXB`XZFI7TP`&ria z8$iY*YsKR_=($7PNuH~DC6~iC3VN(h)Y>U$8qZCzrVBjbQ(DCTh(PY1(-i{xN?wT% z=YUt={4F`0Mfo?14IdX!#dw445MDT;{#RB=t6LSd5)5s(B=!3z78%pD@TukH~QEk>)Hc4vs9?DgwN zj&~xErsIU;^y?RCVyR}`DnILAHwF#^-eR-HftoZf|0JQY9C^bgRI zOqv>JmWf)%u5sM1Bu+0qQzLz;aQ@hizazX-45T0E)v%LkrmOtL8gS?A&A>Z700WSU{k^J(6(R^ z?BYcY%ee28wOU8txejDz7L>f|3>H33E|4g>@?NOsn-F~MORWTpZH~LhdkEWRyAeIS zfQK)8HOr~@P25S_lbs`Xq2VirNp1=B0&2R`{kyTz=`gtQd13g_CYokTv+|y+#cr~C^uWGLG`;4~<-EmYo(zCvCH$}do z;d0;9e?aS}{uB}67jN#fo!KgLHUE{^^_#uvS|1`Q_0weN9zKv*i@S5m(v{+ z6B91C`CJkB3kZh<|Ch^8?aR-rZI*I%DzASj8ak|X|As|LGkSJ^Bnc+C`m(z#F|X>xaS4aaXRNHmdbfO|Bk*s+PT|yS(Ne;6C)5 za84b?Y^^0S;yaF0AJ?#k>|b-+w$8(E@3TF&mc_-iwOrk~YX4>wjPDP8_3`udtNaF% zf=ngJr9{d`7sm}+iXqFQaIQm1J+%<9t&xxTzI`(Nz6bx@mMw>Dg({3ukgQoO~T z;tp-G;_d`Wad($g(ccM?26Ao&8%bG~_H=DhRHoHO(N@%;t2WZ!$Q zZELSgiSRL(>3-W7!OKpg*@~4Uhs#>+=*0%Gx)*} zyK4K$Y}aQ#fpWmtSVjkpU;y$GNwB&aIYKXTi2&a_)4AEeXc=FiQtA;YT<-0|WvLw> zI=oO4!;dj+<77g1_xjZMY^RdB?X@%9lJ7YGi14&V!mAiua|)kC0{nRGDm|}bndDzc zL1rpbRf0+bx=J*!PiAm@se<2J^_bbU@V6l+Lofg|aj^z_BbMxBu@Rg!o80Cz*fNiQ z|2U!XVN)H=)*idBlA+tGR*fNhG*jUNQGvmv(d4v=dWWS_4K)5q#FApmw%jP4p}}+u zj*y5W)aS4cTRlYk%t^AMbA?d9W}ElMs#xb^$T$9X4)oP!#*OPFS5;#~=H+i=Nz`AD zxS86A5lQm#THkDCrt|xPrakDM_$^O$R2SgwXF*FG))1}NAIM|ddE>WuQl5KAt!s&6 zTRhW0AIw&R6s`Gq40bJu)_9G!RGX+rVAiDNB1q8ioNo}vqRD#0%E4kLJK8q6$M=jx zST$yH1L)QE!ya76=c`OMpIg@okJgIqu4p7I!L^|4e@u}oW_H}P_J%_V8IdGf1HkIa zwXY5u7JB!AvSXu&%fV~yNr8O1=7e*uY;DnYmf~2@OUzW}et;pceoC>q{J#-cUsb$+ z4u_WLHN!6YCR{d$JDhj8Fwhje6c=y&hX}A}MX?fXzK9vVeG+8JDo)mx)z%XTQfVL%;E^YM3Z>z*!6S z+2tF0DWj9)@pk;1EvjQLLQu4F9TX~2Z#`M){ye5TpH}NZdFj50-88ECIZZyHdraX2 ze}~d^F1HH_68AFV7)R@DLa&20+@Oa{-XB98VKhj-#kaRv5v>=mIO57@#-*jyCR@;g ztYlAx$|L!oSzW&W8ymE#V84YG?Q^U?c9U5INYUZY25VRM#rh#ShWlAQuDaJ;lB4KlJRRK!4p{d(3tpKJ`9b4j2;N5xeV)F(Ugi zUy?^<7u}q(AwRJO7{DGW=8C0CY;2_Y`55Z9kiMQFvM0E89iWFWzRPskY>Z8254Xor z)%cbAx6V@4=M{gRlW~1q{!dw;-|w2fj}nYpc0cw?ipy3fSEmVq?a5V#j__;xTOj)$ z*{96}dhb!m^bHt)Eg;=0z07A1tHepE2)0Ily>W8`bK(v4{8nt#k54SNfSR)MFz)7%5yZ#* zqw2D((C+Hb>NT0C{>K+4H-X_jD#^(_o=c}`cZ*I8Ipw70uW>1$c8{}WuKbm1XQ`uk zby@BZq%6*sZ09k@$mk=ZJ=e95S(AFOFbwO0UrfpPmwZf?d1$MN(bmFxEXQ$sDz1Q0 zwEH)0SLEmwqdL9$^zNFrov4%57I<;MqCUF#NFUYT7KZxOUeo^NVUP!iN&U zTQpU*p6?b-op1L3(9yZ~Hzw-h<&Lwo4ZVW@N1P8tHEPeFQ?;_G;wf#p_r>)0q={Q9S5jD$J#&HD=GaIv%V;n>tA#OVZvJJ?8;NqQw8xIOc% z`qr0|6tlK}N0V)=t~O!RKfaO#Y^+Cg8->*%6(usB@vXkt$KfdvDR1d5hYfe^*}y91 zX)ovzWVuRuzLG6gRgK1uEv*%F?g`D_;+XjBa=+Z-Omg*aKWJy>axEgucWvay7%XP@ z>K)CbpM}0|LHLu()U_cOz#o-!g?{D)L}r)+2K#7V5h54Zn`@k7BGO+Svh1hAOxU0J zb%xv0NjjHmtu>j8+n5vZ78``k2{=xJ_wvM+MEmp}X}qugWuI)Lg^949d6b^AR95CzG<6V(3?{=-Qj6f{rv{dF{cU)4 zY!V(8660W-z(8kV?l~AUX_Km$s}*LF9WWjy+F-MkXI)JI0v2!x`Kxq=nXE+1G^20N zW!Irir`uvq+yBJmYI6V@TrP9&0V0H*_Yd=&Y5g-$@^=Kup=mXcsq`uywzUKuoxDVO z0(puCQMKaSlUgVd?`0TC>~#|+PWO|ZdDkwn{rb4dDBeL5JC{~eto?9z+k1(MY%evU z_6J4^xcctxZPw$31WiTu1KNc3k77T+Cz7P4&3|G|_mtTgK&Jl9bb(A$zBOJ^*b`*k zEv_@`K&bt+_&l66)Q|s1)|Vc$K$E1LuH)T`FUThtZtxtq#M*p9ukD+}yoYo~$p-oZ z0161zq3Ta>^9hx7nUK;DOk9{5lf+L&AfO-JFoHStY}Ovb}q^OW(z* z5Qa?LezACCfMnR9(QPd5C>N8-rN(Z;VIi*wB9B20`t>5-9gXDXId#6(1n;{kDHN%e z5I;|k9Q~Q|$H8FrdtMbDCkCKRSxeiUVL^$}eg_tbkSI-fyo5$^xk<`X;AH7W+!(Tw z3Ux4|V;&Kqt~UdBas_-D!`-4iT4W@}`FNGgtGJN6@X##(tyY)8LCPg@=+R)H%m?#x zJ1pt*ja-s3xuMTA^npJw`*4eBOc2(ppN`*dum1)I+yuX@-sm@J8>>q`kiIIfa11pW z$DmVg=p>Hsj1InqsP{vTw~G|3T)$c>e`zwe$*HR`^gO-kDYe*=nD6ji2t2)%wHK@* zQ(hwOYkQgv5_^$RB7P<&hcwjnZHaNWho+>t#p0YwzPNB^`b3aU#x+9>roRDXS|jX< zD8{15MOyflnQ{|L&vZgsm1W;51G|en(!*8Ut|01vB!&Kq#dZf{YnB=@$7^%Tn5f(I zoylDZI+uON_WuL%umzs8-+WqM8TNu^B7VQd5BQ#6bAi-0JAYnC`l-OnjuJp$PTBc#b>2Lm&+Zl+N7st z`}Ms2llj5k_eHdKlNr=^1&wwc5MV88Fv7czfBYD#*;tFGB`S+QO>Y5+Y z90DVO{_e_S=vCcy}QKb_$O9y&y5$mn*!rk_z)yN4C5ZmpW-sHmt z36i&<-AaG!2nMvPjq(0iX2!Os3-Jiytcl@Db3f8%@8?lR9pU_gJeIr0UKG$^ixN$u zFA}D)BImNStg+2w#NMY>w@Y#R}|0ytb~}&Ip6p8)=Ak{z5Q`M19B&ch9zy zG%o#S4zsHflo0Q&>+CZ^+42Tv!I}LjQAo^WmX!fHc1Dwv8G2)0+%|j*D}=>P_QC*3BN@6ZV0U{Z`7+MM?w3kVw0ouZ)DOstk z40!faE$-C}_9^w-OV*=tUD&Y4c@$dT3P>3dqT@-}IodZa6F-cuYzxJkW;yy)ue7;c zj#0#AW>1u70IKVJnI5c!-nHnZG4`{OV@r^=B^E)bSGWy)-D6xsLEv-KK&(_Do960s z)?@k=zG%kHrwmB6Wzdm=0~q<*!(XZ?hUG9s^LyP}Ex#?2Unscab`UXvqx$*RP8JL; zauvK3c%@nGT?t$nY%JlB+Op*_cXH3?uEpNrD$Q}~VXih1f(SO)?Y1AxO#YmUG!m?8 z^lKy>a^X;7C{LQp&CvLRB6bC_Ed(6dXLS3cGR8o^eoo>^Pj8h@G^?p8Kq(bA(f%(e zuQ6hOt+#j;KIgf+yPg(r4s1mp0k?#fIDc~G6EDo-W)qG`0iH~@=rCsDln~T_Idf+y zo{>58&&|gnubDTnd)FXu-$4_Ht0$QMXG-W0QyD)#Z4rae!Ti=8%8?sX}@ErOtt>i zqO5ub&SNrB{t(*}_LsNba^M>f59PTB%b<_XJaGC*6;n35Y)$TYAkkpD*d9I9Z+W?# zNRv{@q1(JSxsm!j+8*||CBSd%s&Oc0$t{JVjo(zjZV~utepSMae}(IhYtwxep_qPl}X_o{fUW z|Ecy+uobyRI;`L}9?rZz)Q5zDV9_T=)0Ohc=w}kVWxvP6pT3_c@X$kBjrvdbpLN)P z8p;Se^oaKOZ5J2thr)>Krlh%dD4kf;>e{lLC(y-+wx?NE%E=`M(19TSva}8cq3XO} z)#F&Aphzi&+=Rpu)$4&WGvgh|1osdVMKK=WZIx?CDL>n+KW2|jh7oEjQfqSg?g}*D zQ2K8~-kG*ZAD8hPJ||Zr!g{~#eH+~J@04(S@q6s6e3R>86179h>sU%@+GPZjHbv~; z)PASo*naM2A!1f0kq(X2X^p%d$D&=wo8OIHp_j^te5w}xT|PDW@85iv@9ETCKXMDS zkdb=;bpl=-#0(^VHrIw?8w)y9x4Gp#+VxVtEbH=Bxkp1i}k>tD< zv+5Jmwl*@~?+!3-dMz(ITG*1{nH-Ryo}@`pZ|#KR+PJX&$bK+idXdEExKys%d2hTU ziU9g?ozF4ihR3CTG+;WZ`&IcZm308u|7f?3FeMGl)@VIkNj2-`p-nN5)0Q6?EVyz$ zx2sOl)pw<)WBOL0>l&L^d7+-JPMH;Hp{H;&mzkV39Zy(+yX_n&V3q+dU z8hsC&|BMX0#;^6ez~pGUs322c?IH9+_5EBEA0H|Kdn~)BSWq0l9L%v*^>+3!shGCc zuS;_hS2ePATGzWqMA*-k+Bbh4PzelH53J@$pWo0y1&o!pw;ugSPi5ej=DAh){$M+~ zJR(TZ5avsBSspDH^FSHHht}u@0_Mble3tRef`rv;L9$m(y|4S*b1FlC|lM*Pc zy#AL(ybEIy$2gfgzgWk5`z$a!boJl&+c5VrDaK+A1}##(6e!>F1{Szj64-9F1VdbEM$nnQr&nd?1eb)BF3gEXz{wu#Si|Uzp+i6WXi# z?mZE4z8yZ}>N{iN8(bPm{@$0W{V^uY3Kl(pZgd|&_zU*~&-@-FGT^F>E^)K`p~U48 z-N=0*8{`{i22u98GP%%MhRk#{)L8-6AnjShp!-$CIU$n8792$^ZboFX7HjiO5r z9HccvAgZN359p$*PjE0QO9YrV5|ODfzMt;>IX7RpE1bX^kDiI-`E7vVg)wL+LXvsB zTgn>Fymp=xcYN96O#>)D^}c*CuXaCzsST<|lk-SROG9jK{Cjljvmko<0hSZR+qVDn z0JP6UlnvED6z*=UxY&q>s~- z_V$a9v}L%>d;h+2Y71q8oXm$r+&1BbuAV7#;pIBXLhvzd+U;xWzp^%Cjg_VD5G_Li zudTZX+23FPMP*JNd?&L1l1sYC9#i(m;U=%9@35>#v2=3N>Z6YYa;`7q_;UVXxvkCD zc)qmjf%i&9pDz{1 zcCuLFIoDYE#l?uu5YdWOhN%k9S}PMVyxU*4nUxw^vl%3e7ldn;r}41#1Fele(X#w; ztVd>*f^N%wZTYc&VO7}aow#%R;gBO^-31yi?p~zSWioNT^|%B&32|5EJ7pGqO=0)` zm7}BsqHPnVH@b-@J1G`Rb6tvez2%bB`=VOTO^pHdp|TG9qpHlmW^@Yf_3Jp5*Opr+ zk?*Zj5)u+Ng*-|>Wr~lV?o69*op}A?1i#fTjf$YEty|uei*fFFs-7z|F8N%~08_Ou zXtC}>HIRON0;`sbtSl>s&L_t0W*J&FX6A@!T1wYVRn_|zuhi9JOwa9lw#TM#4XyX? zyR*~uuW^B|`u~C#^`-ypG#&L&ch49b+y%-$*wUAZD<)&r(I5DSK#51Y^!HtokVnI{ z!Au>?Ea0rQ)LUsk!md8KooQd5{%hR-eRl`Q|L2$g<%li@Fzl7T=jaN=33zNnD(7>=!Jxrx;htpsE`cgM8V;1uN$HZzwJ4-=}j zM=?rf96)mbVjgarELGJa;~QyLyF9U`gsrYuGo2dZXQ3|IBgD3enFr4O(F^=z}H z-3dDVB{>51wm>?FYDicNYJOTOEu!w1ifIRmq?ONly!Bwt|8mh2jY3wG?@eo`dhE|l zH9A5;K8U4+sO2LI&tlJmkN5FJI^K37K2Frs)bNf}nqnbOqYG5(sRnijN!N-%rRD}S zIq_r0EVVhMQ+R~ZpXwny#8?SQ-@ zz*f9inm7a4PL&7$v(xdsY=bq=H==?P>f22b#A^I~*w~|a*53ZPXos)GNCGDBwqp{8 zpzhM}`zzZMY0?zSnUR}7)CFilYb`pldx^yLTmmP!T&QU~9lyds)xRWWz~2F!2mr9YID%vlhFDsp)DyEqzzf5#Rtl;E< z$}{hL>u6TA&J*X(8^|-#t3{hg6MHT>bt!OaKlFO}p=WKOe(#)zTvI|FYG686yKeW$ zBGF(WwDznWlcBuEdb+9ioSlVbW;;`_6E4}l3Vo*IXe1#MU22b+lV*xH+qsp5j8tMC zcBiA+_ORxPPpIoEJ9z1b9~0HzAD0=`!%&+;L1GBQ*(&pNWzgB*4KA5*;VDdzYEg`c zu)cF+CvH^Umvn8zT#dXx1ki{=8ubI;cxRq;dj)-R=P5iTu@;{lilG(toH>5n&+n7l z4oAijOBa6aDL?!{H$$%0IWzTadcTL>u=XoG=M}8*b5l~%J^ZSrO2WW8EI;Hk6CRSV z?$>22p}9qX<*t?tWOr9GJ{zhkv!33aQaz5hUCcRJLq%>rosWC2Fn2YdG!ullzKERQ zN9py{+fGw7zXqH+WQcE1B!@8TpQF=WxCNHO(C+FGz0^pb@+k$(y<&ryywJ1qe_ibMSuPu-nn7aj$zYlaHgs<+Lh z*ly1yE8zwxaS;jSIDBuqEGr|$>kw?tH0Rq_cieB*H|<0CQI^qSa@wEQ^d;tCMatkv z#yJET?|ummrzk*eP8>K#j!W>}^Xp;l^%PHMR$KGT>Di>nM2Zu*-*nG`FMQXBUJ@%s7I1y;En9*>96Uvciw!Tl*-+fg z-61FETNJQvy`1YDxUjUo8YqO+JMXPK4*4sset`g%zX1HOTNvDw7Qx4tgj2M0$3%2NQs-Cb!A*|#5E%%W4$=N9)9 zq+U~t1+@S30r#W)lKOK*KuhC*?&an66ytYw@|lJ#jNb0vwp;iOD=32MrjNv!LfmCN zhLV1+XeNx);crW$ceO=s;M3-!4?hicRX=PS4}*LrUIqkQZ-63(7H!M>Lvt0=6`*Hd z6~=06v~XY23z>mjCT{d#YTTM58F1qhB|a|qSsXs=jrtDbZOmdDDU$K(uVa5sI;d=M zJb8kjEnNs~jId1g*dE)j1V=tkKOSnzo&MgGa*XWpbbD(VXeG4W{1nVy1PqupvODr$ z7^{S5dGCm1O7m*2j%O0O$*CRl*}I%{1$pK!%o4?w7uZuk$9!neJ%IEp<@vNlV>`(i zf|=oft#oC;O+_&fLVXTc2i}AIE@aa=$NJ8;RphL*#su;_m`*Q7$0s4U%C6vrBtx0f z)#y`yzthr7kr@9-vz}3v>&y9dweR}L5^+Y6ExeZlwLL>>dH@9j7SpigT*@QYqlr>kDsGI?L@4B4|dx!WuI*y@072vi^1{y zU>VBQ+FM{8Z%qH06HrdUlPy0xG?-kZItB>3ZmviM)!-VJK~@paO#hvHC4;&e4EcO# z7^gOq!F2pU`Rc%n6nsoq$uaMGSo#sEyW8)N*J!#j{fTDOwy`_dX6$oWViU3S>uic= zZ61+L81Xs(75Vqncex{OFq~@#v8kZGIS}kF(ovmenR&8d=4VFn7DSrj<2KZy^(-hy zYO=L8K-|{#vrT&RN;02GkyEaOj4%iL6OQ|nUa7*}d@(iC5D!8v0tS}zpdx!^f}o=F8^ zFsb0ge=3PVjI;->tLWlcbz~Axm5?ZWs2)J9_9}Nq7$N{v(mgP0_4(zUa}kB_v)Ujt|iaryr|I>~3^?7pC4SI#0DA zYqy%*i?ur0pFtc~N;tbC^;~Ke0F*}XnMz+J>!ErLVTceAinaB6Qfs7}xkBZJxltYy z2o+Sv0&=*qKFm6T!cQ*18<->e1S4m7z!?PC=;-aFi?)2cgzsy$Q%Y4asPDhP%KX!& z&VRQtu!|-xsZPa>bg{yO*z<*B59XZFHeIcd2v(7xBqu!C6@e=v_p84LJ-3`!gOurx zS&n86&DU+9z7c!?()IVylV5H~UztEd*ZH4Zy}YLDQrq{~TJ3_lif^K~eWvHSsJhq% z_FZ9PFFD=Nyc^(anCbD9B&w`BW^?faH-%b0AE$|-h^KrH zd*paFulEcFKBRTR^#%5Fi9y#TI#D4_n@5o`m!PRG4LKf3kWQy1fXVha6kif>DT%dvhY&vW|I@DieImmm|PA@NhM(C z!cXD~wW{rKmRe#xMWY<>T=WU?peWtLQ9%$B>;;HZQtd7yac#E~+ z+2(<71Uc$cS*)#00C?xu46#AJeEj%|x~^1Fzn0A;8&g(2xo*DV>mHp&lycRZH zznI>1NGayLu--75B~@!)`<6^d62Kn-+t%hAq809772{UGETY#}M-5{`BdNUxqCFve zxI=1H`=GcNQp{-=Cy9oje897u#N4<+DDs zqNlP6(5N{Bk{>B?j-L+8H-SBd5++NtZMUx^O0?P4DD7dkF9=QSS@wcwljhZ?Fj!EvwXL; zI_DVhDuNF*?gpREKN%5}hk6?iiE3wtQHCxB0Mp7V78+JcXE45B<%Bu8M%%O1Qe!!e zN@;@5b2Se`LP#n39NWHa1wBQcR6z7=?JkeM+~3$AvB)^#@MC%Pxsybla%#MZyr8oQG2!fB=pA}&4sBS~pGsNqWM3>+tJ4XW+^(y=#l z!w|7gPA{_M!3a1jOL*O$#oS9L=gHa)|Tnzug|B# zDpBIi9oOigi0!X_wJ9?r6|b5EtdA60eHLbm;5FfMSdZ<><5otWQ!af%1q8z{qVuGJ zETl4oqJBFpzT7jtsk4_oy>6;JQB|LYJlpgm$3{DEW1X!5QPGVj(@&8qfus?X*bzR% zq@p}{M^faJ`f>;BO%me><9hd-!0#Y4NwEg>C!0FBA7h_-mrFhcscBNoK8sdC(#l-j znj`JmVRm{-u?!vc-v;)ZF9y?&9|e=h9A06cQ@W^POk{?M8L+?3?<$PwLy3JocQuck zm;c-!QN46iX0AYW}c45tu`B^{q7;@5{H5M6m)?4L~>T$kl{a9j3BLI_m{`%+KI3Yu%)uy^X{~E8H*9f%cNI`;ekK> z+4W7(1QE>Rvnbf)3Ay~TtAw;E6)O1w&)ov3MEFbeEettPh*_-BG~#W>5e!^w$P+b> zG9?Q!W_W7>lF7s}sKtJ_VL^TMdOS>PL2k}tW(yuA&gbc)rv8B zG18$H{F)3}JijD+_+J^pyBohR^@%Qjsb^Ht^=)4hd42C*gOS+H#o9xkb2hz}i#$@E zr4&)UyvaZKv~}>gDX>zij*%ai<`ek_Bbxq$IFyDY4kBG5Q+}L8FV)20DvlsVgV{&+ zyRZ%qk5`=}(Mvg(^&!_;y%=VUkfqhgYDx|I=X^N&M3FPk50-eX_Y194IR%kz^rTG| z5uqQS6}<~U|Flk&)KMwFTs~`q+Rb~c>>QQHlkm)*n&o0&)Gs(I_(1EXlQcib^^cEuK!j?oF^k!gs?HmEZ01JJGmk; z(BVw=uZWcMK1R-nSCytS<&0GRZcdN@bA|XP@tBQPB8Lc+t50kGM`XAzeozZA;aQH^ zCQaVeRiAV6OWVn4quW4nhD0LrnQ%vA;lpW^3} z^;okaRYjZ=e2@rQqhmx&$4HPT0QRf=Y$TKGkCPyW4~{8jxRJb~k4=X)jdY@~c6_U` zd5iYnY94g%Q%_rnC|u=Vf`VT_=$cISm4#!(mp{K^4ncDGmBjv2kq3nsqbgWf$FvMo zs3e?GvTGUT(c;pk?}9-Wo*NYd$8qnG)6tAxbZ z%cVEcpgL3UgXZK?Uf$q)7D)tbF`dbqHI8%Tp8?~y-BGaw=jPsqElY9vgh;U^;8lBv z;Se_FFrw@>8MT$cs!^3!SinIk5?a8bl_T{JaU4ct&HvFCex+aim;GW&%p`9-C&uh? zkVD#%^JcZ4Wvj~MPm3)=>Mg}l&ulT0>(zj=@Y=|z8#ABPHTkUx+>84aY32C``n)p; znCeu@0<0tpm!K_nx4EQmbY$N^V6BWZAq<76+hQHcXV*(wBJP2Q!a3#ave;$(|`GO;LuH zE;w6uJkjxznEpu`=;7Bh6ALj~kB3>!|91Itk|>2EFHP5TSSfb72O+*#Aa$ zH{^qsV}B}N7rkC%<*@w}eUE_aOGZ6Ow?LQ>co}lyk*-|=)zt65F#dL-9Q^zQn{=kC zCXX`%DVc+|w31m^>2j42iYwM(HWoi2tm5XiM3>oKw$Rl7@;OTP+)Jo+m}N&WGohuYh0@Nk6?>Lod;xueR; z^yXAHhnuv!=waVP5Tj$11FZg>dosX`J5DYio@kUo<^C~_P}X9 zda3fxmlbw(71=%rC4c)YG*z+dlATVPHC(UBsu3>V5kzKW6Q}6XG{ky1m?wm8`XG6N zy6Ld>G#4Fk+-$ZiF&Y^hYaIdw{L9D}Eb6RP3J{Q|kk(KMAVD9eQ~E5;o`rLfD+Ad2 z2lxJoMZLg{p=G%)hJG?Q?Qg4v`k}h8sgtQEB(D7iOFF0mJQivWB0@bqc4iBsNGYla z^wv;RPmd`L-?pCEW{&8gdQvXYlt-%#Dv{guwYC#^y|WeXPt7YW#O4#+;n#4U?>!?| zXOYmvYwn{d9jH+SiR0W#bm{`f$rG^OWvEp|KCVUCToa$1Mw&p4-!9A`4ao==y_(V+ z&_;uIgRC9T(<+7djBhd!afF#s?2iGqkc0@fY;-7qa^UX<6{9ts~qW zoGYn33S+QSy6huWFoTjqU3yL^YmOSolA3+XI2Pb-QDjhYWy}zWovxuSFK?QI>^g+Gp4x-4$oTi%LzuD8`vm$#bg4 zwMKRkndGOb9hB2fgQp&RBdDzhk|(g6o$%pI>RzxKv87iv3@WBKdp(>wQ+{)_aq0+} zOK~$y3|r8>i4K~tFK)4PNo203)bkj~DzV-Z2Yy<3qU2of3o9G`+Dgtsw4LHP)bmi5 z1ML2HlE0o?4x((9U0#M`AH+If8=1BEhE@r-$ znhj-IOszvrBtE{5*?q=3>$@I?0DLNBq|Gr)MAo74DBX4bI9~N76lUa}EWJAKemP6& zJ>PrL!|5U!XPgk+WWN3b90l5gAEt zA4aUO?7PTh0#v`z^q$tx$06}LAB?oyni%jRt+XVGb27)q zdj=4zwjTQyH;|%Evqjp}@+fI}=_>hV!xp4CxKm6aqs5FugYYwoyjo0`o?t$TtZ zNfiye5ZO)5AN9eEy?ZmyhmSsS^PU~<=DXJ16|<94XWsYCK2a$DM`Uo}Ul-!femC)l z^QY%3XLhL0RM#QI<11A?{i% z1;iGcOz)zJ^qd#Z*XLa=YPR&n@7;51rO9#n>2mY&dtSp6fgKT>RgE(TPKsz+(8*@K zl#6tH$&yv?Zyjv@-VrDV28hB$uPd?LC*L2w%TjH~nWTFQ*WPo%rMYumv3q@oxBUsU z#aD|lBkE7~w7Q}07PzH__$LB$PZ^|HUtas`wHi^8k(ll6?RU$DVZkoV`9ahPEZQ~N z_)b-9S|to(r%|=H1-^DF9}`o<$B)RCq(m(C&|BVTkdsmTm1}R%llA`p1=^Mv?>_#G z`E-de&eknTn^^$$)b~cNz}FCCagJi*H`yk z0&hV>v;P1MM>)1Mh;ntgdddOQcPMi&X-J4nhUjMLawFPB9JrEHq1-J7`0h_p@!FsJrk5_5 z=Wz+_;k#1+?-LdWOv*;hED@GJ`1BVd@=|eG#l;CR1mczvwp~xGq2fU^wg)8`P+NHceky303)nEB}wYREWfx8!Cn1+IeFOdKdj$9wQNZeZ4|=!LY@1 z>3IkzW%?S))Rrl?s=}J*wunKg(U^gQX~_!=cwN2P=SiH2euEajPZWm%|0~xk7$CpG z@1E!JPsLN9^;zbH&6{U7`--XD93PJedVZp!dF99^N6)zHv*+A(+MDsi7q zF5>X;@cQ!jB`evQM{`+O8-8anL04Q_T9xZeMqzI-jr0>)S=qi-R*c$w@5{T1r?m9+ z8@5}4VElaRxdi)pM<#Va{(|7zJ7xNy4Gt ztAFc*{Dng8_d67iWsDdV-^W<)N1Qnn*49O1V`|gFn5XyFgMS}7X-&8Rc<>hIh*aOF zts1%!@yOji>NT+leB}Ds>ECP9e=LlT|L1k`zu_`Ulq$0Jm1=Qu8ML8M*-*)L@v)?W zc!S3h0#dH@7kH7ULsFskB#cG3W!1hOI$vti*D`IyZ)M$QTX1&sDYhfKfp*W06fsHM zawnv0)4jSM1YM@Nxw&RShifv8c69PO8lFSGzJ~*Fbd85+OhwkCj*lY#ZZl1p;*@+| z+dZl3e)G2?SWfBH!q4|sM6Z zpcRmgD<~#UEa%0QS6{$d6~-eI3n+eTe%$QXGFm4e*BA!VLZi%0zTNSMza|lKS^qea zA!bl#Cj>-YPk>Ym3@T(Bw=*zW1tu|e;S8Fy?@eR7!jgzruNc=f?dB`3<13ZS%%<_Z zC;)!G!BeWq>&JWeK^>|ibmb{GVbvGmVJ9ADu>zMKituivj{2ofD+S? zGFQlz$5O%#b1{Wcp&bSaqb}3v-GI)FjK-k#E{7N;DrOmvd5k6 zMLdI9)6Tr{7G2#2zUe`Sp>^myozheRAaQf0%o@@_pg2i@*6}Gotj>2O(wJkm2A$QI zO4peCgs5Wt6gACWOk8z-yI+(SVT6mpb=VCX4%ho)xwyDu8I)`m8k{pky-R~!4OQVG z{Yr!ig++`B5x{@~pW>vjRiQH)%AoG~b#v6hIr>JVqhIXp#bv_uz^$KQdHi?m=jYpF zreitM#l@jhlarcbYDY&$N~!$Bl=N~j!1^?zNsMRaGfErw$8qK4*s;%uIW4w`j1%&% zhaW=9RK}%5tw87Y`od^*KpMpE1ZHa4QhwO(ebPi^s}i;;RB6&pUX7BkovwcC1`kP} zpXv{1A&$ZuLXI?L&M+n$)P4uvIA83)=5o84%*e$`UDR*4*4CSYLLofX8_s)eY;FgG zsHecK##V=&w@1g54{d=x$QM%5rQ)`TeXag5cKrM$jsk9=Xa~p9@tf!;a&zXG6XgQ=lV-7%7zWjJL~$ z!s1+Q6C$Ds3$0hl+*h*4=xLA8c2sB1L|4ER2M6+TH(jd#u$Lu~cc= zv()OlHI%A@0cuve!kQOhY4E}h*@%rHa>_i=uoj^L6HK(;ZCkTmbu*0nG|seHU=Y38 zQAv9xHt#uk`V%LaRy=T5tnM1*J}st+W$Q^MWO5uQw`O!OoA(24a@O1aGj*_wjjl^; zd6WNPw{jAwh881c-@wSBTEmJxh5E(tzj1Za73 z7&br`xNx0&KR8E5CcQORzwTAWh(}FZMqXcE_p%xLS30kEdx;qNm29S)nEe*)JD8G} z-FahtaWxiDzREtw&$jN;3kyDGPg&geoqQW}&KQcNgb51%%kq*=j>E7<$|#X7gS~3h zKAoz_23CM!O=p{T2)G?tPV96H3|F}FHT@#+mI<&wvOAnyB~$#SZr(w}byG2tO6(<@ zuG8)$v-3Aw|91B`I?{2RfvcFjakC{_L$5HIbjE7e#Y(`h1kCmg(ffXZ1ys<6HXUAN zPq&*0fFnufX9k%KZNxMuk*~)0I>6O){{<5IWTM38e*bg>?ZLg6_1_=j^)GX!DF#>g zfQ`6+tF~@Q9hu2ee6mu> z*t`|HNCzpnI4xs9v(wsAY=4>mAhSS$awxFGUm9JG5zD)0gjiE$1_ElT4)r49;$Zi^ zX{;wiQRa;wemt zJFB}r0@@BY=mC?%n!vyjBiCFS)_7Jeu0+L95f)g;810p(9lob&wyV72wUp_A&gs*a zmmigF+f;bRS7^afJS{~?v`DFK6Rh>hf1iAUJJSuVC#hCNm&gR89(DOx6<7Z$03Bo4 zU=u&!W%@}{MJVpK#}Oh^@s-$VW5A6BKQ2dXDHHM9Doq(*B^>+|gWmlZ<2>8D+0Uwn zT(Iwj-zMLAr+iE@Ii9bOo0G$!lHmt$MQn~_O03N_V(vjOUTmHV&a(RYDcgm{0hb#- zyM+rRYA@xU3=nE$4=+ZZlAZcouX`HrA)M0S+!B&nn7nc3b%86YWu9xq5=8?@VT>Zg z93!-4{5lvKD|$IxLEpF1a#5QYxGC1+FkQHnxx=$Q#GE;#SLIwURKMJ4rlT8wenVC4 zHca@+XLn2jc(Y&ICMiA_WoLh@D7l0}vJ%+zXxgoJCyP9nye*enwlWBNy1SK=xi`w2 zVd`47Iu%AU8nPQ1!Ri`lz+nM!0ptmN&aZ3WPbZYqs}wGR0!72IO_Orp%Yl_EAE)5S zhHhQoYy2{B6>6^I72nfy#gQyBpLgLYGN0^x_`uDv-?$o@(()aw~FASMa-P)lxt>Uik7<_ zIGFv(&8_C_@9Yy|mUZg9arahF_)<=;GG^1Fbkl@|FzMkyD!;)OGkGhToX28ZIkb52 z;6-Z~Z!UUfZkqO%2o8pV!p8EQxeUr=$3G4q0e)g4QyL(7x!)Y9-o>6pB0Z-3Xt zofNR|M4c;x&~pkUt$GeUCq=ePhX^u$RI3iQoBv@%sw11<`Pt7MDRW}*&amtio-bp- z^*k+7;^vd#FGzu#m^%X10hY$J;Pr*n`^%mz`FIvS_ua{>vprdv0%$-?`t{|BO48ev zHf-us&&d%9v>&Ga9HC60YTd;vaC4ZO%C2$sQj(x25+6$J5SZa3Xma^$jN0z)44pKG zVV$B;H1#lz``*R5jullvIi?Q9i`O9>V9!4UdlA9CgT5`8W`22%nFYri1FSmb zqV{t&29B+KG^^u`xnpBvYu(|tP;e`qod4D7B?OIxsA8z)3Dq`#d0~;)+v|@S^7F#8 zpH}yPCwmlw9Y#b&E{0U5DbEh_8cwF{+=FJ7V8u%0cb0$5z8j=iM_@# z<4Y(e8FZt9fTMn!VT&Qn;1k}K=5jd6dmRme06*V%Do3aOL5jL&!whel(>7qup#CY~ zNN0tLRGgkNW~Bv)JMO4eWYbgYi@5ejf^kM~H1d3h%1ak&yqzmCWeE6lt<~T3(X944V zO99A(v%MJstIX zYTn9JDK<7&-oR5AmZ+Nb`Fnx$&sYTgO{$-;5}`r+aa`fwixu!9jM=odF1rYO8r9N< zC@TN#>Vy9JK5Jr{DIkU*ElZ)^`vCF3J7pw|m&;wsl( z(E!3#gfnO|+DWMlj_Q!Y=iBPE-l&wD6xbn^wnIy`55Ar@O<0)Y$Jt=QAdFk5Yj;|t zYRtmePx%?U*=*mf=7Ar`j8_+zmd2tX7VV zz2B)ZbQih{OWX1dt#E zBP0|<3q?^xYNTc$k_=5TNDUBb^4-MwX1%iBTHji4&0Fuwe>pej+}v~S+55MDd+)QK z0aF(H_=M$n`++8{6fy!}AnsjKNAtctQOLPsEo(Ui5H9VC%>)TApuNdeMSf>8(rPLIG5#u~w7rm;$2}g=KILglm&Y?}0z>4S2+1d!f<(}30nk(4oYUt>g zJ=qKPeRnxiJZ?g-AhSN~&3-&zDEy58d}>B;H^`fkwtRm(ZTI%n0X#u~vj&%?(6|Q+ z78KSRg|<-TppsEq>a!92txj~F%sF2z*7<&X_+z_zs>67BQb%=rJhO-H$z;cIbD>DATAoFhn22k*NaKPWz$Z>h^fWV#baQRKFTXvGXWgAU1%^tcdf=P%PiM9*OL9b4 zGh;$GGlgvwh*YWumltD2*Mxr(F@RLEWAjIszF^C z7f6X{zqb1Nx01Q7S|7?-txv?pl3N{Rx9t~|)j2XLoRiyBZ!9e%BWzUV@PpTXW*Czp zF5-cGjJ6hSlDY+L#iUI=hqMFgQ!E203Oj3{=WAgZG!A*%#J&vH?mVFD2?swt8}dc* z(c6!MsouMvp$ux7@_0CK!kuq#o!`E_=jm0ZqFcG|wa~4TZQXrT`g&X1KTskFEPT_Ip-%AW?2cd8?u50(@nU zfl`Tgi4JQnH*rp^(H`*5lHvPj zzym(M@No89BxGpq%HS&iwy1jzeJ8d91WUC{a5B-~sqhn(f4kEAKUdU%$`dlG;-)-5 zIN@)m(k(SABejVJJa;F0?76fLbhurK=s&v(T`X_KdPTToy^_c zmr}J-_<&D8kaTD-W5!S0`taehEoY#gg(rtxP_L5)H~5=HyR5iQkN=?E|2wvU{W8Jg z2)kI6$-j`#_x}dY{YwD#M3}AwT=khf)Tz}!Fuy)`B>ZDM8J{RWcplCHzZZQ=6cPu& z1`)@B3*O^TtkI#~K|z^ZIQYN>4bhU5m&cTp*l_mw#moGdg~=aXQSav(eSHoZ6p7fx zxjnYxTu}gFmS4PhF_}q)@u>stuJ~;32Dp@|m2(ucI$~CKpfeuSi^XCI9B1N*9~11h z_{EbC4yP-`ajc`*$0sen8m{)0@fZB*z?Kl;EIyA0Ki3a=eeb{j*Zb4Uq2=wdwtre5 zUa+}6fOqTbAf_Vg*}0)thDjaG=L3l`P=Avl`o?W$xBzQdsW{9|Bk~h`GJrNA!c2@Q z$1aAglf-wsG`Gv6lus}?I4Abw(c{NoC?pa<)_=iux$fU2HQiNe=*vmY&n zYs*LPcELEW`4TuDfGsXiL9%kUj?VLl;nrvu|Bo;t47qlVGv`J3yEm1uFiRI${_n~p zkz$F1zm~W*zcqg%7IYc6G*I#Au#W(IUg%g(Hlq`_bdZlPW+Jt1M1~!B-omLl9MK%U zR?gXD&aIbL0|0q`4`L{{v$P@#mQeLG!YW znf~}rC9%HBc;j(e3yCm2w-|jDs401}VI{Mi`t8j+ldN!aK0F};t*n9uSguB^a0}SU zU_K>s@a$CI;>l>j$xfLsic#IoX$b7A`IPMTBB7AbVqg65m;@NHu%H%j^$j*fl5It# zx9k;#c}aSev?ZK$qlYR>;b}jIckT18Xv#Ik=D?~=4 z*gKf?oYwCqYDhzdC|E)^73+xzXT|^fDg)mO_~gg+&GW_3-%+ z!F@~#&5&!=?2MYTKqV0E<*9+Rz=0UlYe77Fw!fGb!)^wbyib$#D(#T;SRs`l1V8qPz?W~S@nN6ZQB@2k!{JbvU zrocM(Yvg2)-OF3M=oVoE@>(-71m1G1^SHw+qbV;-0T=e^c*zT3BBe1%J*>N~Se|`5 z?uNspR!m_Oif&0Wi#0_GiHdIbYSM(19IgZnmDv=RUdeIiLV#%zi2XXmaGqNKNlX`X z2ud*Sy_2qB#>#_l-#$t{Ps%+MgZ=ETA=~cq+=i)YSK0#hnS8p(2m4u7)6114`HQlL z@xk%DEppFq`89)t2z-uH`FQnXA;t36JHFypmJh%4t zX0A7$l;ON!%eVT?o>*y@K3&>SSUat}N&&o< z9|JhU3gR?3iNN@{G`|}=Y-LXLe@-!*q?j$G3wuWILqErg%# z_P?iCTSo~N^|rQLRx7v5PH`T5FLH%EBl6s769xw*B7l*RW&N$2dI|be}~G zI9ZWZ@jl(GL&dzqfsxc{(_exM2gKs!Hw&{QEnKemU6fKZ>&FV;TRBX~wm@dh(g`nf zRH#i?{0AsC8WI|`9 z``>`cpn(%(XE)+#b-78^r?auP6HSVuLUPq!7Bon395&yz$-TSbh65ntR<=Fx>+@p` z=1i(eO#OS!-3OBa56?1f9VN`Zjf!yV%I*BJbgnsDZ61io9X&(q#-aH zM>?FhmABXh8J%g`tg2PNx1wR4Z7O7c>Cz7zsw5VOOw&mkwa$y7`6_oM+UnrKH4IG> zK@P>1dNedP{0W=Y@hkI4f|U|^M!wCk zgv3Zi^t#>dOnmaavDO$ccl=KY@m*aXhYaCQN;HR3{M8dTGztxEGR@TKo3~$HU>_<5 zM8-}&>2S<))s|-BZRAZys%_mXx@u%7@zfXj%$vJR`tQ1lvKJVRzF_yZ4<4{_+p5aV z5i8_$VroVBoJ_N81fC>b<TL4#YrCPVSbFBRp`Khvx@pQ;326Q0$()3g5RY zvLmB6XvEP9O5oanjAkR-X9+d)gP7hB|1NbPnxQc*!oqdpuGU*=02(Y>w}^=apHm>n=aDhRXN`3_eWG0lBlA4N~d7UPz3VP`LZaz3oOnaqUrSXz6CTM5nqxU(IE|$i{~L?r^{qfHmSoQ#V3Bq+6|U)HYGet) IUAlhn9}_1>F8}}l literal 0 HcmV?d00001 From 6fe608990eca36a9e5506474eeb1f1e305fc906a Mon Sep 17 00:00:00 2001 From: Guillermo Calvo Date: Mon, 10 Jun 2024 17:58:05 +0200 Subject: [PATCH 03/17] Add license files --- LICENSE | 201 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ NOTICE | 13 ++++ 2 files changed, 214 insertions(+) create mode 100644 LICENSE create mode 100644 NOTICE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000..253c019 --- /dev/null +++ b/NOTICE @@ -0,0 +1,13 @@ +Copyright 2024 Guillermo Calvo + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. From 8412ebfa159cfb0bbef2cea838d50392529106d7 Mon Sep 17 00:00:00 2001 From: Guillermo Calvo Date: Mon, 10 Jun 2024 18:02:55 +0200 Subject: [PATCH 04/17] Add dependency springdoc-openapi-starter-webmvc-ui (swagger-ui) --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index ccafde1..fef41d3 100644 --- a/build.gradle +++ b/build.gradle @@ -24,6 +24,7 @@ ext { dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.cloud:spring-cloud-starter-openfeign' + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.5.0' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } From 0e7ec94f9feccd820aa52305f24b08e0d21c5788 Mon Sep 17 00:00:00 2001 From: Guillermo Calvo Date: Mon, 10 Jun 2024 18:04:28 +0200 Subject: [PATCH 05/17] Add dependencies for result libraries --- build.gradle | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build.gradle b/build.gradle index fef41d3..e042f85 100644 --- a/build.gradle +++ b/build.gradle @@ -25,6 +25,10 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.cloud:spring-cloud-starter-openfeign' implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.5.0' + implementation platform('com.leakyabstractions:result-bom:1.0.0.0') + implementation 'com.leakyabstractions:result' + implementation 'com.leakyabstractions:result-jackson' + implementation 'com.leakyabstractions:result-lazy' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } From 6218a24294059107ccb395599f63d000297a6cf6 Mon Sep 17 00:00:00 2001 From: Guillermo Calvo Date: Mon, 10 Jun 2024 18:12:29 +0200 Subject: [PATCH 06/17] Register Jackson datatype module for Result --- .../java/com/example/config/JacksonConfig.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/main/java/com/example/config/JacksonConfig.java diff --git a/src/main/java/com/example/config/JacksonConfig.java b/src/main/java/com/example/config/JacksonConfig.java new file mode 100644 index 0000000..cb62d7f --- /dev/null +++ b/src/main/java/com/example/config/JacksonConfig.java @@ -0,0 +1,18 @@ +package com.example.config; + +import com.fasterxml.jackson.databind.Module; +import com.leakyabstractions.result.jackson.ResultModule; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Registers Jackson datatype module for Result. + */ +@Configuration +public class JacksonConfig { + + @Bean + public Module registerResultModule() { + return new ResultModule(); + } +} From be92a8767bd93561a9fbd5dee3064e7f40c38a73 Mon Sep 17 00:00:00 2001 From: Guillermo Calvo Date: Mon, 10 Jun 2024 18:15:13 +0200 Subject: [PATCH 07/17] Enable OpenFeign clients --- src/main/java/com/example/ExampleApplication.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/example/ExampleApplication.java b/src/main/java/com/example/ExampleApplication.java index 4c67afb..9562457 100644 --- a/src/main/java/com/example/ExampleApplication.java +++ b/src/main/java/com/example/ExampleApplication.java @@ -2,8 +2,10 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.openfeign.EnableFeignClients; @SpringBootApplication +@EnableFeignClients public class ExampleApplication { public static void main(String[] args) { From 11423c02efb2b721b717c51f2657d096f8694606 Mon Sep 17 00:00:00 2001 From: Guillermo Calvo Date: Mon, 10 Jun 2024 18:59:44 +0200 Subject: [PATCH 08/17] Simple pet store implementation --- .../java/com/example/ExampleApplication.java | 32 +++++ src/main/java/com/example/api/ApiError.java | 70 +++++++++++ .../java/com/example/api/ApiErrorCode.java | 16 +++ .../java/com/example/api/ApiResponse.java | 71 +++++++++++ src/main/java/com/example/api/Pet.java | 67 +++++++++++ src/main/java/com/example/api/PetStatus.java | 21 ++++ .../java/com/example/api/RepositoryType.java | 20 ++++ .../java/com/example/client/GithubClient.java | 30 +++++ .../com/example/client/LoopbackClient.java | 30 +++++ .../com/example/client/SwaggerClient.java | 30 +++++ .../com/example/config/PetStoreConfig.java | 51 ++++++++ .../example/controller/IndexController.java | 21 ++++ .../com/example/controller/PetController.java | 113 ++++++++++++++++++ .../example/repository/GithubRepository.java | 61 ++++++++++ .../example/repository/LocalRepository.java | 82 +++++++++++++ .../repository/LoopbackRepository.java | 61 ++++++++++ .../com/example/repository/PetRepository.java | 60 ++++++++++ .../example/repository/RemoteRepository.java | 45 +++++++ .../example/repository/SwaggerRepository.java | 65 ++++++++++ src/main/resources/application.properties | 24 ++++ 20 files changed, 970 insertions(+) create mode 100644 src/main/java/com/example/api/ApiError.java create mode 100644 src/main/java/com/example/api/ApiErrorCode.java create mode 100644 src/main/java/com/example/api/ApiResponse.java create mode 100644 src/main/java/com/example/api/Pet.java create mode 100644 src/main/java/com/example/api/PetStatus.java create mode 100644 src/main/java/com/example/api/RepositoryType.java create mode 100644 src/main/java/com/example/client/GithubClient.java create mode 100644 src/main/java/com/example/client/LoopbackClient.java create mode 100644 src/main/java/com/example/client/SwaggerClient.java create mode 100644 src/main/java/com/example/config/PetStoreConfig.java create mode 100644 src/main/java/com/example/controller/IndexController.java create mode 100644 src/main/java/com/example/controller/PetController.java create mode 100644 src/main/java/com/example/repository/GithubRepository.java create mode 100644 src/main/java/com/example/repository/LocalRepository.java create mode 100644 src/main/java/com/example/repository/LoopbackRepository.java create mode 100644 src/main/java/com/example/repository/PetRepository.java create mode 100644 src/main/java/com/example/repository/RemoteRepository.java create mode 100644 src/main/java/com/example/repository/SwaggerRepository.java diff --git a/src/main/java/com/example/ExampleApplication.java b/src/main/java/com/example/ExampleApplication.java index 9562457..90e62f7 100644 --- a/src/main/java/com/example/ExampleApplication.java +++ b/src/main/java/com/example/ExampleApplication.java @@ -1,9 +1,41 @@ package com.example; +import io.swagger.v3.oas.annotations.*; +import io.swagger.v3.oas.annotations.info.*; +import io.swagger.v3.oas.annotations.servers.Server; +import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.openfeign.EnableFeignClients; +@OpenAPIDefinition( + info = @Info( + title = "Result Petstore", + description = "Example Micronaut application using results", + version = "1.0", + contact = @Contact( + url = "https://guillermo.dev", + name = "Guillermo Calvo", + email = "hello@guillermo.dev" + ), + license = @License( + name = "Apache 2.0", + url = "http://www.apache.org/licenses/LICENSE-2.0.html" + ) + ), + externalDocs = @ExternalDocumentation( + description = "Find out more about Result library for Java", + url = "https://dev.leakyabstractions.com/result/" + ), + tags = @Tag( + name = "pet", + description = "Everything about your Pets" + ), + servers = @Server( + url = "http://localhost:8080", + description = "DEV" + ) +) @SpringBootApplication @EnableFeignClients public class ExampleApplication { diff --git a/src/main/java/com/example/api/ApiError.java b/src/main/java/com/example/api/ApiError.java new file mode 100644 index 0000000..cf38997 --- /dev/null +++ b/src/main/java/com/example/api/ApiError.java @@ -0,0 +1,70 @@ +package com.example.api; + +import com.fasterxml.jackson.annotation.*; +import feign.FeignException; +import io.swagger.v3.oas.annotations.media.Schema; + +import static com.example.api.ApiErrorCode.*; + +/** + * Pet API error. + */ +@Schema(description = "Pet API Error") +public class ApiError { + + @JsonProperty + @Schema(description = "Error code") + public ApiErrorCode code; + + @JsonProperty + @Schema(description = "Error message") + public String message; + + @JsonCreator + public ApiError() { + } + + public ApiError(ApiErrorCode code, String message) { + setCode(code); + setMessage(message); + } + + public static ApiError notFound(Long id) { + return new ApiError(PET_NOT_FOUND, "Pet not found: " + id); + } + + public static ApiError unexpected(Exception ex) { + return new ApiError(UNEXPECTED_ERROR, ex.getMessage()); + } + + public static ApiError remote(Exception ex) { + if (ex instanceof FeignException http && http.status() == 404) { + return new ApiError(REMOTE_PET_NOT_FOUND, "Remote pet not found"); + } + return new ApiError(UNEXPECTED_REMOTE_ERROR, "Remote error: " + ex.getMessage()); + } + + public static ApiError unavailable(RepositoryType type) { + return new ApiError(PET_STORE_UNAVAILABLE, type.toString() + " is unavailable"); + } + + @JsonGetter + public ApiErrorCode getCode() { + return code; + } + + @JsonSetter + public void setCode(ApiErrorCode code) { + this.code = code; + } + + @JsonGetter + public String getMessage() { + return message; + } + + @JsonSetter + public void setMessage(String message) { + this.message = message; + } +} diff --git a/src/main/java/com/example/api/ApiErrorCode.java b/src/main/java/com/example/api/ApiErrorCode.java new file mode 100644 index 0000000..146fc8c --- /dev/null +++ b/src/main/java/com/example/api/ApiErrorCode.java @@ -0,0 +1,16 @@ +package com.example.api; + +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * Pet API error code. + */ +@Schema(description = "Pet API error code", example = "PET_NOT_FOUND") +public enum ApiErrorCode { + + PET_NOT_FOUND, + REMOTE_PET_NOT_FOUND, + PET_STORE_UNAVAILABLE, + UNEXPECTED_ERROR, + UNEXPECTED_REMOTE_ERROR; +} diff --git a/src/main/java/com/example/api/ApiResponse.java b/src/main/java/com/example/api/ApiResponse.java new file mode 100644 index 0000000..9168f8b --- /dev/null +++ b/src/main/java/com/example/api/ApiResponse.java @@ -0,0 +1,71 @@ +package com.example.api; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonGetter; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.leakyabstractions.result.api.Result; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.time.Instant; + +/** + * Pet API response. + * + * @param the type of success + */ +@Schema(description = "Pet API Response") +public class ApiResponse { + + @Schema(description = "API version number", example = "1.0") + @JsonProperty + String version; + + @Schema(description = "Generation date/time", example = "1980-07-07T12:30:00.123Z") + @JsonProperty + Instant generatedOn; + + @Schema(description = "Contains either a success value or a failure value") + @JsonProperty + Result result; + + @JsonCreator + public ApiResponse() { + } + + public ApiResponse(String version, Result result) { + setVersion(version); + setGeneratedOn(Instant.now()); + setResult(result); + } + + @JsonGetter + public String getVersion() { + return version; + } + + @JsonSetter + public void setVersion(String version) { + this.version = version; + } + + @JsonGetter + public Instant getGeneratedOn() { + return generatedOn; + } + + @JsonSetter + public void setGeneratedOn(Instant generatedOn) { + this.generatedOn = generatedOn; + } + + @JsonGetter + public Result getResult() { + return result; + } + + @JsonSetter + public void setResult(Result result) { + this.result = result; + } +} diff --git a/src/main/java/com/example/api/Pet.java b/src/main/java/com/example/api/Pet.java new file mode 100644 index 0000000..2710023 --- /dev/null +++ b/src/main/java/com/example/api/Pet.java @@ -0,0 +1,67 @@ +package com.example.api; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonGetter; +import com.fasterxml.jackson.annotation.JsonSetter; +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * Pet in a store. + */ +@Schema(name = "Pet", description = "Pet in a store") +public class Pet { + + @Schema(description = "Pet identifier", example = "123") + Long id; + + @Schema(description = "Pet name", example = "Doggie") + String name; + + @Schema(description = "Pet status", example = "available") + PetStatus status; + + @JsonCreator + public Pet() { + } + + public Pet(Long id, String name, PetStatus status) { + setId(id); + setName(name); + setStatus(status); + } + + @JsonGetter + public Long getId() { + return id; + } + + @JsonSetter + public void setId(Long id) { + this.id = id; + } + + @JsonGetter + public String getName() { + return name; + } + + @JsonSetter + public void setName(String name) { + this.name = name; + } + + @JsonGetter + public PetStatus getStatus() { + return status; + } + + @JsonSetter + public void setStatus(PetStatus status) { + this.status = status; + } + + @Override + public String toString() { + return "Pet#" + id + "(" + name + "/" + status + ")"; + } +} diff --git a/src/main/java/com/example/api/PetStatus.java b/src/main/java/com/example/api/PetStatus.java new file mode 100644 index 0000000..1272a27 --- /dev/null +++ b/src/main/java/com/example/api/PetStatus.java @@ -0,0 +1,21 @@ +package com.example.api; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * Pet status in a store. + */ +@Schema(description = "Pet status in the store", example = "available") +@SuppressWarnings("unused") +public enum PetStatus { + + @JsonProperty("available") + AVAILABLE, + + @JsonProperty("pending") + PENDING, + + @JsonProperty("sold") + SOLD +} diff --git a/src/main/java/com/example/api/RepositoryType.java b/src/main/java/com/example/api/RepositoryType.java new file mode 100644 index 0000000..b99250b --- /dev/null +++ b/src/main/java/com/example/api/RepositoryType.java @@ -0,0 +1,20 @@ +package com.example.api; + +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * Pet repository type. + */ +@Schema(description = "Type of pet repository", example = "LOCAL") +public enum RepositoryType { + + LOCAL, + + GITHUB, + + LOOPBACK, + + SWAGGER, + + SPECIAL +} diff --git a/src/main/java/com/example/client/GithubClient.java b/src/main/java/com/example/client/GithubClient.java new file mode 100644 index 0000000..7ada1e5 --- /dev/null +++ b/src/main/java/com/example/client/GithubClient.java @@ -0,0 +1,30 @@ +package com.example.client; + +import com.example.api.ApiResponse; +import com.example.api.Pet; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.*; + +import java.util.Collection; + +/** + * Github HTTP client. + */ +@FeignClient(value = "github", path = "/result-example-spring-boot/src/test/resources/static") +public interface GithubClient { + + @GetMapping("/all.json") + ApiResponse> remoteList(); + + @GetMapping("/{id}.json") + ApiResponse remoteFindById(@PathVariable Long id); + + @DeleteMapping("/{id}.json") + ApiResponse remoteDeleteById(@PathVariable Long id); + + @PostMapping + ApiResponse remoteCreate(@RequestBody Pet pet); + + @PutMapping + ApiResponse remoteUpdate(@RequestBody Pet pet); +} diff --git a/src/main/java/com/example/client/LoopbackClient.java b/src/main/java/com/example/client/LoopbackClient.java new file mode 100644 index 0000000..4a453eb --- /dev/null +++ b/src/main/java/com/example/client/LoopbackClient.java @@ -0,0 +1,30 @@ +package com.example.client; + +import com.example.api.ApiResponse; +import com.example.api.Pet; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.*; + +import java.util.Collection; + +/** + * Loopback HTTP client. + */ +@FeignClient(value = "loopback", path = "/pet", primary = false) +public interface LoopbackClient { + + @GetMapping + ApiResponse> remoteList(); + + @GetMapping("/{id}") + ApiResponse remoteFindById(@PathVariable Long id); + + @DeleteMapping("/{id}") + ApiResponse remoteDeleteById(@PathVariable Long id); + + @PostMapping + ApiResponse remoteCreate(@RequestBody Pet pet); + + @PutMapping + ApiResponse remoteUpdate(@RequestBody Pet pet); +} diff --git a/src/main/java/com/example/client/SwaggerClient.java b/src/main/java/com/example/client/SwaggerClient.java new file mode 100644 index 0000000..13e656a --- /dev/null +++ b/src/main/java/com/example/client/SwaggerClient.java @@ -0,0 +1,30 @@ +package com.example.client; + +import com.example.api.Pet; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * Swagger HTTP client. + */ +@FeignClient(value = "swagger", path = "/v2/pet") +public interface SwaggerClient { + + @GetMapping("/findByStatus?status=available,pending,sold") + List remoteList(); + + @GetMapping("/{id}") + Pet remoteFindById(@PathVariable Long id); + + @DeleteMapping("/{id}") + ResponseEntity remoteDeleteById(@PathVariable Long id); + + @PostMapping + Pet remoteCreate(@RequestBody Pet pet); + + @PutMapping + Pet remoteUpdate(@RequestBody Pet pet); +} diff --git a/src/main/java/com/example/config/PetStoreConfig.java b/src/main/java/com/example/config/PetStoreConfig.java new file mode 100644 index 0000000..0e36b7c --- /dev/null +++ b/src/main/java/com/example/config/PetStoreConfig.java @@ -0,0 +1,51 @@ +package com.example.config; + +import com.example.api.Pet; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static java.util.function.Function.identity; + +/** + * Local pet store configuration. + */ +@Configuration +@ConfigurationProperties(prefix = "pet-store") +public class PetStoreConfig { + + String apiVersion; + boolean enabled; + List pets; + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + public String getApiVersion() { + return apiVersion; + } + + public void setApiVersion(String apiVersion) { + this.apiVersion = apiVersion; + } + + public boolean isLocalEnabled() { + return enabled; + } + + public List getPets() { + return pets; + } + + public void setPets(List pets) { + this.pets = pets; + } + + public Map getPetsAsMap() { + return pets.stream().collect(Collectors.toMap(Pet::getId, identity())); + } +} diff --git a/src/main/java/com/example/controller/IndexController.java b/src/main/java/com/example/controller/IndexController.java new file mode 100644 index 0000000..d0fde38 --- /dev/null +++ b/src/main/java/com/example/controller/IndexController.java @@ -0,0 +1,21 @@ +package com.example.controller; + +import io.swagger.v3.oas.annotations.Hidden; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +import java.io.IOException; + +/** + * Redirects to Swagger UI. + */ +@Hidden +@Controller +public class IndexController { + + @GetMapping("/") + public void index(HttpServletResponse response) throws IOException { + response.sendRedirect("/swagger-ui/index.html"); + } +} diff --git a/src/main/java/com/example/controller/PetController.java b/src/main/java/com/example/controller/PetController.java new file mode 100644 index 0000000..cc899fe --- /dev/null +++ b/src/main/java/com/example/controller/PetController.java @@ -0,0 +1,113 @@ +package com.example.controller; + +import com.example.api.ApiError; +import com.example.api.ApiResponse; +import com.example.api.Pet; +import com.example.api.RepositoryType; +import com.example.config.PetStoreConfig; +import com.example.repository.PetRepository; +import com.leakyabstractions.result.api.Result; +import com.leakyabstractions.result.core.Results; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.slf4j.Logger; +import org.springframework.web.bind.annotation.*; + +import java.util.Collection; +import java.util.Optional; + +import static org.slf4j.LoggerFactory.getLogger; + +/** + * Interacts with different pet repositories. + */ +@RestController +@Tag(name = "pet") +public class PetController { + + static final Logger log = getLogger(PetController.class); + + final PetStoreConfig config; + final Collection repositories; + + PetController(PetStoreConfig config, Collection repositories) { + this.config = config; + this.repositories = repositories; + } + + @GetMapping("/pet") + @Operation(summary = "List all pets", description = "Returns all pets in a store") + ApiResponse> list(@RequestHeader("X-Type") RepositoryType type) { + log.info("List all pets in {} pet store", type); + return response(locate(type) + .flatMapSuccess(PetRepository::listPets) + .ifSuccess(x -> log.info("Listed {} pet(s) in {}", x.size(), type)) + .ifFailure(this::logError)); + } + + @PostMapping("/pet") + @Operation(summary = "Add new pet", description = "Adds a new pet to a store") + ApiResponse create( + @RequestHeader("X-Type") RepositoryType type, + @RequestBody @Valid Pet pet) { + log.info("Create new pet: {} in {} pet store", pet, type); + return response(locate(type) + .flatMapSuccess(x -> x.createPet(pet)) + .ifSuccess(x -> log.info("Created pet #{} in {}", x.getId(), type)) + .ifFailure(this::logError)); + } + + @PutMapping("/pet") + @Operation(summary = "Update existing pet", description = "Updates an existing pet in a store") + ApiResponse update( + @RequestHeader("X-Type") RepositoryType type, + @RequestBody @Valid Pet pet) { + log.info("Update pet: {} in {} pet store", pet, type); + return response(locate(type) + .flatMapSuccess(x -> x.updatePet(pet)) + .ifSuccess(x -> log.info("Updated #{} in {}: {}", x.getId(), type, x)) + .ifFailure(this::logError)); + } + + @GetMapping("/pet/{id}") + @Operation(summary = "Find pet", description = "Returns a single pet by ID") + ApiResponse find( + @RequestHeader("X-Type") RepositoryType type, + @PathVariable @Parameter(description = "Pet ID to find") Long id) { + log.info("Find pet by ID: {} in {} pet store", id, type); + return response(locate(type) + .flatMapSuccess(x -> x.findPet(id)) + .ifSuccess(x -> log.info("Found #{} in {}: {}", id, type, x)) + .ifFailure(this::logError)); + } + + @DeleteMapping("/pet/{id}") + @Operation(summary = "Delete pet", description = "Deletes a pet by ID") + ApiResponse delete( + @RequestHeader("X-Type") RepositoryType type, + @PathVariable @Parameter(description = "Pet ID to delete") Long id) { + log.info("Delete pet by ID: {} from {} pet store", id, type); + return response(locate(type) + .flatMapSuccess(x -> x.deletePet(id)) + .ifSuccessOrElse(x -> log.info("Deleted #{} from {}", id, type), this::logError)); + } + + Result locate(RepositoryType type) { + final Optional repository = repositories.stream() + .filter(x -> x.getType() == type) + .findAny(); + return Results.ofOptional(repository, () -> ApiError.unavailable(type)).ifSuccessOrElse( + x -> log.info("{} pet store located", type), + x -> log.warn("Could not locate {} pet store", type)); + } + + private void logError(ApiError error) { + log.error(error.getMessage()); + } + + private ApiResponse response(Result result) { + return new ApiResponse<>(config.getApiVersion(), result); + } +} diff --git a/src/main/java/com/example/repository/GithubRepository.java b/src/main/java/com/example/repository/GithubRepository.java new file mode 100644 index 0000000..8e14498 --- /dev/null +++ b/src/main/java/com/example/repository/GithubRepository.java @@ -0,0 +1,61 @@ +package com.example.repository; + +import com.example.api.ApiError; +import com.example.api.Pet; +import com.example.client.GithubClient; +import com.leakyabstractions.result.api.Result; +import org.slf4j.Logger; +import org.springframework.stereotype.Service; + +import java.util.Collection; + +import static com.example.api.RepositoryType.GITHUB; +import static org.slf4j.LoggerFactory.getLogger; + +/** + * Implements the GitHub pet repository. + * + *

Accesses static Github pages.

+ */ +@Service +class GithubRepository extends RemoteRepository { + + static final Logger log = getLogger(GithubRepository.class); + + final GithubClient github; + + GithubRepository(GithubClient github) { + super(GITHUB); + this.github = github; + } + + @Override + public Result, ApiError> listPets() { + log.info("List GitHub pets"); + return evaluate(github::remoteList); + } + + @Override + public Result createPet(Pet pet) { + log.info("Create GitHub pet: {}", pet); + return evaluate(() -> github.remoteCreate(pet)); + } + + @Override + public Result updatePet(Pet pet) { + log.info("Update GitHub pet: {}", pet); + return evaluate(() -> github.remoteUpdate(pet)); + } + + @Override + public Result findPet(Long id) { + log.info("Find GitHub pet by ID: {}", id); + return evaluate(() -> github.remoteFindById(id)); + } + + @Override + public Result deletePet(Long id) { + log.info("Delete GitHub pet by ID: {}", id); + return evaluate(() -> github.remoteDeleteById(id)); + } +} diff --git a/src/main/java/com/example/repository/LocalRepository.java b/src/main/java/com/example/repository/LocalRepository.java new file mode 100644 index 0000000..8840596 --- /dev/null +++ b/src/main/java/com/example/repository/LocalRepository.java @@ -0,0 +1,82 @@ +package com.example.repository; + +import com.example.api.ApiError; +import com.example.api.Pet; +import com.example.api.RepositoryType; +import com.example.config.PetStoreConfig; +import com.leakyabstractions.result.api.Result; +import com.leakyabstractions.result.core.Results; +import org.slf4j.Logger; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.Map; + +import static com.example.api.RepositoryType.LOCAL; +import static java.lang.Boolean.TRUE; +import static org.slf4j.LoggerFactory.getLogger; + +/** + * Implements the local pet repository. + * + *

Maintains an in-memory collection of pets that can be manipulated.

+ */ +@Service +class LocalRepository implements PetRepository { + + static final Logger log = getLogger(LocalRepository.class); + + final Result, ApiError> pets; + + public LocalRepository(PetStoreConfig config) { + pets = Results.success(config) + .filter(PetStoreConfig::isLocalEnabled, x -> ApiError.unavailable(LOCAL)) + .mapSuccess(PetStoreConfig::getPetsAsMap); + } + + @Override + public RepositoryType getType() { + return LOCAL; + } + + @Override + public Result, ApiError> listPets() { + log.info("List Local pets"); + return pets.mapSuccess(Map::values); + } + + @Override + public Result createPet(Pet pet) { + log.info("Create Local pet: {}", pet); + return pets.flatMapSuccess(db -> { + final Long id = db.keySet().stream().mapToLong(Long.class::cast).max().orElse(0L) + 1; + pet.setId(id); + return Results.ofCallable(() -> db.put(id, pet) != null) + .map(x -> pet, ApiError::unexpected); + }); + } + + @Override + public Result updatePet(Pet pet) { + final Long id = pet.getId(); + log.info("Update Local pet #{}: {}", id, pet); + return pets.flatMapSuccess(db -> Results.ofCallable(() -> db.replace(id, pet) != null) + .mapFailure(ApiError::unexpected) + .filter(TRUE::equals, x -> ApiError.notFound(id)) + .mapSuccess(x -> pet)); + } + + @Override + public Result findPet(Long id) { + log.info("Find Local pet by ID: {}", id); + return pets.flatMapSuccess(db -> Results.ofNullable(db.get(id), () -> ApiError.notFound(id))); + } + + @Override + public Result deletePet(Long id) { + log.info("Delete Local pet by ID: {}", id); + return pets.flatMapSuccess(db -> Results.ofCallable(() -> db.remove(id) != null) + .mapFailure(ApiError::unexpected) + .filter(TRUE::equals, x -> ApiError.notFound(id))); + } +} diff --git a/src/main/java/com/example/repository/LoopbackRepository.java b/src/main/java/com/example/repository/LoopbackRepository.java new file mode 100644 index 0000000..9083acb --- /dev/null +++ b/src/main/java/com/example/repository/LoopbackRepository.java @@ -0,0 +1,61 @@ +package com.example.repository; + +import com.example.api.ApiError; +import com.example.api.Pet; +import com.example.client.LoopbackClient; +import com.leakyabstractions.result.api.Result; +import org.slf4j.Logger; +import org.springframework.stereotype.Service; + +import java.util.Collection; + +import static com.example.api.RepositoryType.LOOPBACK; +import static org.slf4j.LoggerFactory.getLogger; + +/** + * Implements the loopback pet repository. + * + *

Interacts with the local pet store via HTTP.

+ */ +@Service +class LoopbackRepository extends RemoteRepository implements PetRepository { + + static final Logger log = getLogger(LoopbackRepository.class); + + final LoopbackClient loopback; + + LoopbackRepository(LoopbackClient loopback) { + super(LOOPBACK); + this.loopback = loopback; + } + + @Override + public Result createPet(Pet pet) { + log.info("Create Loopback pet: {}", pet); + return evaluate(() -> loopback.remoteCreate(pet)); + } + + @Override + public Result, ApiError> listPets() { + log.info("List Loopback pets"); + return evaluate(loopback::remoteList); + } + + @Override + public Result updatePet(Pet pet) { + log.info("Update Loopback pet: {}", pet); + return evaluate(() -> loopback.remoteUpdate(pet)); + } + + @Override + public Result findPet(Long id) { + log.info("Find Loopback pet by ID: {}", id); + return evaluate(() -> loopback.remoteFindById(id)); + } + + @Override + public Result deletePet(Long id) { + log.info("Delete Loopback pet by ID: {}", id); + return evaluate(() -> loopback.remoteDeleteById(id)); + } +} diff --git a/src/main/java/com/example/repository/PetRepository.java b/src/main/java/com/example/repository/PetRepository.java new file mode 100644 index 0000000..e5bfb17 --- /dev/null +++ b/src/main/java/com/example/repository/PetRepository.java @@ -0,0 +1,60 @@ +package com.example.repository; + +import com.example.api.ApiError; +import com.example.api.Pet; +import com.example.api.RepositoryType; +import com.leakyabstractions.result.api.Result; + +import java.util.Collection; + +/** + * Represents a pet repository. + */ +public interface PetRepository { + + /** + * Returns the type of this repository. + * + * @return the type of this repository + */ + RepositoryType getType(); + + /** + * Returns all pets in this repository. + * + * @return all pets in this repository + */ + Result, ApiError> listPets(); + + /** + * Adds a new pet to this repository + * + * @param pet The pet to add + * @return The added pet + */ + Result createPet(Pet pet); + + /** + * Updates an existing pet in this repository. + * + * @param pet The pet to update + * @return The updated pet + */ + Result updatePet(Pet pet); + + /** + * Returns a single pet by ID. + * + * @param id The pet ID to find + * @return A single pet + */ + Result findPet(Long id); + + /** + * Deletes a pet by ID. + * + * @param id The pet ID to delete + * @return `true` if the pet was deleted + */ + Result deletePet(Long id); +} diff --git a/src/main/java/com/example/repository/RemoteRepository.java b/src/main/java/com/example/repository/RemoteRepository.java new file mode 100644 index 0000000..6f5d458 --- /dev/null +++ b/src/main/java/com/example/repository/RemoteRepository.java @@ -0,0 +1,45 @@ +package com.example.repository; + +import com.example.api.ApiError; +import com.example.api.ApiResponse; +import com.example.api.RepositoryType; +import com.leakyabstractions.result.api.Result; +import com.leakyabstractions.result.core.Results; +import com.leakyabstractions.result.lazy.LazyResults; +import org.springframework.stereotype.Service; + +import java.util.Optional; +import java.util.function.Supplier; + +/** + * Base class for all remote pet repositories. + * + *

Interacts with a remote pet store server via HTTP.

+ */ +@Service +abstract class RemoteRepository implements PetRepository { + + final RepositoryType type; + + RemoteRepository(RepositoryType type) { + this.type = type; + } + + @Override + public RepositoryType getType() { + return type; + } + + protected Result evaluate(Supplier> call) { + return LazyResults.ofSupplier( + () -> Results.ofCallable(() -> Optional.ofNullable(call.get()).orElseGet(ApiResponse::new))) + .mapFailure(ApiError::remote) + .flatMapSuccess(ApiResponse::getResult); + } + + protected Result evaluateAny(Supplier call) { + return LazyResults.ofSupplier( + () -> Results.ofCallable(() -> Optional.ofNullable(call.get()).orElseThrow())) + .mapFailure(ApiError::remote); + } +} diff --git a/src/main/java/com/example/repository/SwaggerRepository.java b/src/main/java/com/example/repository/SwaggerRepository.java new file mode 100644 index 0000000..51e7a1d --- /dev/null +++ b/src/main/java/com/example/repository/SwaggerRepository.java @@ -0,0 +1,65 @@ +package com.example.repository; + +import com.example.api.ApiError; +import com.example.api.Pet; +import com.example.client.SwaggerClient; +import com.leakyabstractions.result.api.Result; +import org.slf4j.Logger; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; + +import java.util.Collection; + +import static com.example.api.RepositoryType.SWAGGER; +import static org.slf4j.LoggerFactory.getLogger; + +/** + * Implements the Swagger pet repository. + * + *

Interacts with Swagger's sample pet store server.

+ */ +@Service +class SwaggerRepository extends RemoteRepository implements PetRepository { + + static final Logger log = getLogger(SwaggerRepository.class); + + final SwaggerClient swagger; + + SwaggerRepository(SwaggerClient swagger) { + super(SWAGGER); + this.swagger = swagger; + } + + @Override + public Result, ApiError> listPets() { + log.info("List pets"); + return evaluateAny(swagger::remoteList); + } + + @Override + public Result createPet(Pet pet) { + log.info("Create pet: {}", pet); + return evaluateAny(() -> swagger.remoteCreate(pet)); + } + + @Override + public Result updatePet(Pet pet) { + log.info("Update pet: {}", pet); + return evaluateAny(() -> swagger.remoteUpdate(pet)); + } + + @Override + public Result findPet(Long id) { + log.info("Find pet by ID: {}", id); + return evaluateAny(() -> swagger.remoteFindById(id)); + } + + @Override + public Result deletePet(Long id) { + log.info("Delete pet by ID: {}", id); + return evaluateAny(() -> swagger.remoteDeleteById(id)) + .mapSuccess(ResponseEntity::getStatusCode) + .mapSuccess(HttpStatus.OK::equals); + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 95e7bee..5af1a1c 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,25 @@ spring.application.name=Example + +spring.jackson.default-property-inclusion=non_null + +spring.cloud.openfeign.autoconfiguration.jackson.enabled=true +spring.cloud.openfeign.client.config.loopback.url=http://localhost:${server.port:8080} +spring.cloud.openfeign.client.config.loopback.default-request-headers.x-type=LOCAL +spring.cloud.openfeign.client.config.github.url=https://dev.leakyabstractions.com +spring.cloud.openfeign.client.config.swagger.url=https://petstore.swagger.io +spring.cloud.openfeign.client.config.swagger.default-request-headers.api_key=special-key + +pet-store.api-version=1.0 +pet-store.enabled=true + +pet-store.pets[0].id=0 +pet-store.pets[0].name=Rocky +pet-store.pets[0].status=available + +pet-store.pets[1].id=1 +pet-store.pets[1].name=Garfield +pet-store.pets[1].status=sold + +pet-store.pets[2].id=2 +pet-store.pets[2].name=Rantanplan +pet-store.pets[2].status=pending From 081f6aa3300d1c945ef6a8203dd2121c24347a63 Mon Sep 17 00:00:00 2001 From: Guillermo Calvo Date: Mon, 10 Jun 2024 19:04:10 +0200 Subject: [PATCH 09/17] Add static files to be accessed via GitHub repository --- src/test/resources/static/1.json | 10 ++++++++++ src/test/resources/static/2.json | 10 ++++++++++ src/test/resources/static/3.json | 10 ++++++++++ src/test/resources/static/all.json | 22 ++++++++++++++++++++++ 4 files changed, 52 insertions(+) create mode 100644 src/test/resources/static/1.json create mode 100644 src/test/resources/static/2.json create mode 100644 src/test/resources/static/3.json create mode 100644 src/test/resources/static/all.json diff --git a/src/test/resources/static/1.json b/src/test/resources/static/1.json new file mode 100644 index 0000000..dd14d35 --- /dev/null +++ b/src/test/resources/static/1.json @@ -0,0 +1,10 @@ +{ + "version": 1, + "result": { + "success": { + "id": 1, + "name": "Foo", + "status": "available" + } + } +} diff --git a/src/test/resources/static/2.json b/src/test/resources/static/2.json new file mode 100644 index 0000000..2b87053 --- /dev/null +++ b/src/test/resources/static/2.json @@ -0,0 +1,10 @@ +{ + "version": 1, + "result": { + "success": { + "id": 2, + "name": "Bar", + "status": "sold" + } + } +} diff --git a/src/test/resources/static/3.json b/src/test/resources/static/3.json new file mode 100644 index 0000000..6f1ae34 --- /dev/null +++ b/src/test/resources/static/3.json @@ -0,0 +1,10 @@ +{ + "version": 1, + "result": { + "success": { + "id": 3, + "name": "Foobar", + "status": "pending" + } + } +} diff --git a/src/test/resources/static/all.json b/src/test/resources/static/all.json new file mode 100644 index 0000000..55e0b02 --- /dev/null +++ b/src/test/resources/static/all.json @@ -0,0 +1,22 @@ +{ + "version": 1, + "result": { + "success": [ + { + "id": 1, + "name": "Foo", + "status": "available" + }, + { + "id": 2, + "name": "Bar", + "status": "sold" + }, + { + "id": 3, + "name": "Foobar", + "status": "pending" + } + ] + } +} From c188fc176a06315b4323ac3128ebca859c4e2ecd Mon Sep 17 00:00:00 2001 From: Guillermo Calvo Date: Mon, 10 Jun 2024 19:16:06 +0200 Subject: [PATCH 10/17] Add integration tests --- build.gradle | 2 + .../com/example/ExampleApplicationTests.java | 97 ++++++++++++++++++- 2 files changed, 98 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index e042f85..4a4d400 100644 --- a/build.gradle +++ b/build.gradle @@ -30,6 +30,8 @@ dependencies { implementation 'com.leakyabstractions:result-jackson' implementation 'com.leakyabstractions:result-lazy' testImplementation 'org.springframework.boot:spring-boot-starter-test' + testImplementation 'com.leakyabstractions:result-assertj' + testImplementation 'org.assertj:assertj-core' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } diff --git a/src/test/java/com/example/ExampleApplicationTests.java b/src/test/java/com/example/ExampleApplicationTests.java index d125f4b..0d460f6 100644 --- a/src/test/java/com/example/ExampleApplicationTests.java +++ b/src/test/java/com/example/ExampleApplicationTests.java @@ -1,13 +1,108 @@ package com.example; +import com.example.api.ApiResponse; +import com.example.api.Pet; +import com.example.client.LoopbackClient; import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Primary; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.HttpEntity; -@SpringBootTest +import java.util.Collection; + +import static com.example.api.ApiErrorCode.PET_STORE_UNAVAILABLE; +import static com.example.api.RepositoryType.*; +import static com.leakyabstractions.result.assertj.InstanceOfResultAssertFactories.LIST; +import static com.leakyabstractions.result.assertj.InstanceOfResultAssertFactories.RESULT; +import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; +import static org.springframework.http.RequestEntity.get; + +@SpringBootTest(webEnvironment = RANDOM_PORT) class ExampleApplicationTests { + static final ParameterizedTypeReference> PET = new ParameterizedTypeReference<>() { }; + static final ParameterizedTypeReference>> PETS = new ParameterizedTypeReference<>() { }; + + @Autowired + TestRestTemplate rest; + @Test void contextLoads() { } + @Test + void testIndexController() { + assertThat(rest.getForEntity("/", String.class).getBody()) + .contains("swagger-ui.css"); + } + + @Test + void testPetControllerLocal() { + assertThat(rest.exchange(get("/pet").header("X-Type", LOCAL.name()).build(), PETS)) + .extracting(HttpEntity::getBody) + .extracting(ApiResponse::getResult) + .asInstanceOf(RESULT) + .hasSuccessThat(LIST) + .hasSize(3); + } + + @Test + void testPetControllerLoopback() { + assertThat(rest.exchange(get("/pet/0").header("X-Type", LOOPBACK.name()).build(), PET)) + .extracting(HttpEntity::getBody) + .extracting(ApiResponse::getResult) + .asInstanceOf(RESULT) + .hasSuccessSatisfying(pet -> assertThat(pet).hasFieldOrPropertyWithValue("name", "Rocky")); + } + + @Test + void testPetControllerSpecial() { + assertThat(rest.exchange(get("/pet").header("X-Type", SPECIAL.name()).build(), PETS)) + .extracting(HttpEntity::getBody) + .extracting(ApiResponse::getResult) + .asInstanceOf(RESULT) + .hasFailureSatisfying(error -> assertThat(error).hasFieldOrPropertyWithValue("code", PET_STORE_UNAVAILABLE)); + } + + @TestConfiguration + static class TestConfig { + @Bean + @Primary + LoopbackClient loopbackClient(TestRestTemplate rest) { + return new LoopbackClient() { + @Override + public ApiResponse remoteFindById(Long id) { + return rest + .exchange(get("/pet/" + id).header("X-Type", LOCAL.name()).build(), PET) + .getBody(); + } + + @Override + public ApiResponse> remoteList() { + throw new RuntimeException("Not implemented"); + } + + @Override + public ApiResponse remoteDeleteById(Long id) { + throw new RuntimeException("Not implemented"); + } + + @Override + public ApiResponse remoteCreate(Pet pet) { + throw new RuntimeException("Not implemented"); + } + + @Override + public ApiResponse remoteUpdate(Pet pet) { + throw new RuntimeException("Not implemented"); + } + }; + } + } } From d8c8b6436e994b1c4d07da2111a5aec15c9822fd Mon Sep 17 00:00:00 2001 From: Guillermo Calvo Date: Fri, 14 Jun 2024 13:03:37 +0200 Subject: [PATCH 11/17] Configure Dependabot --- .github/dependabot.yml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..c71a673 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,21 @@ +version: 2 + +updates: + + # ================================ + # UPDATE GRADLE DEPENDENCIES + # ================================ + - package-ecosystem: gradle + directory: / + target-branch: develop + schedule: + interval: weekly + + # ================================ + # UPDATE GITHUB ACTIONS + # ================================ + - package-ecosystem: github-actions + directory: / + target-branch: develop + schedule: + interval: weekly From efa5fbbe3c38c41a78a6ae5987f6396b7c1b8f7f Mon Sep 17 00:00:00 2001 From: Guillermo Calvo Date: Fri, 14 Jun 2024 13:04:07 +0200 Subject: [PATCH 12/17] Discover vulnerabilities with CodeQL --- .github/workflows/codeql.yml | 49 ++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 .github/workflows/codeql.yml diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 0000000..b29f96d --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,49 @@ + +# Discover vulnerabilities with CodeQL +name: CodeQL + +on: + push: + branches: + - main + - develop + pull_request: + branches: + - main + - develop + schedule: + - cron: '0 8 * * 0' + +jobs: + analyze: + + name: Analyze Java + runs-on: ubuntu-latest + timeout-minutes: 360 + permissions: + security-events: write + + steps: + + # ================================ + # SHALLOW CLONE + # ================================ + - name: Shallow clone + uses: actions/checkout@v4 + + # ================================ + # SET UP CODEQL + # ================================ + - name: Set up CodeQL + uses: github/codeql-action/init@v3 + with: + languages: java-kotlin + build-mode: autobuild + + # ================================ + # ANALYZE + # ================================ + - name: Analyze with CodeQL + uses: github/codeql-action/analyze@v3 + with: + category: "/language:java-kotlin" From 24105b31f06506de5e5572c95034a7bf19919f86 Mon Sep 17 00:00:00 2001 From: Guillermo Calvo Date: Fri, 14 Jun 2024 13:04:56 +0200 Subject: [PATCH 13/17] Generate and submit dependency graph --- .github/workflows/dependencies.yml | 41 ++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 .github/workflows/dependencies.yml diff --git a/.github/workflows/dependencies.yml b/.github/workflows/dependencies.yml new file mode 100644 index 0000000..e3cd1b5 --- /dev/null +++ b/.github/workflows/dependencies.yml @@ -0,0 +1,41 @@ + +# Submit dependencies +name: Dependencies + +on: + push: + branches: + - main + +permissions: + contents: write + +jobs: + dependencies: + + name: Submit dependencies + runs-on: ubuntu-latest + + steps: + + # ================================ + # SHALLOW CLONE + # ================================ + - name: Shallow clone + uses: actions/checkout@v4 + + # ================================ + # SET UP JDK + # ================================ + - name: Set up JDK + uses: actions/setup-java@v4 + with: + distribution: 'zulu' + java-package: jdk + java-version: 17 + + # ================================ + # SUBMIT DEPENDENCIES + # ================================ + - name: Generate and submit dependency graph + uses: gradle/actions/dependency-submission@v4 From 02bce1316d893fd4aff66543bf9f57084ebd573c Mon Sep 17 00:00:00 2001 From: Guillermo Calvo Date: Fri, 14 Jun 2024 13:05:26 +0200 Subject: [PATCH 14/17] Schedule Gradle Wrapper updates --- .github/workflows/update-gradle-wrapper.yml | 42 +++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 .github/workflows/update-gradle-wrapper.yml diff --git a/.github/workflows/update-gradle-wrapper.yml b/.github/workflows/update-gradle-wrapper.yml new file mode 100644 index 0000000..dd02cde --- /dev/null +++ b/.github/workflows/update-gradle-wrapper.yml @@ -0,0 +1,42 @@ + +# Schedule Gradle Wrapper updates +name: Update Gradle Wrapper + +on: + schedule: + - cron: "0 8 * * *" + workflow_dispatch: + +jobs: + update-gradle-wrapper: + + name: Update Gradle Wrapper + runs-on: ubuntu-latest + + steps: + + # ================================ + # SHALLOW CLONE + # ================================ + - name: Shallow clone + uses: actions/checkout@v4 + + # ================================ + # SET UP JDK + # ================================ + - name: Set up JDK + uses: actions/setup-java@v4 + with: + distribution: 'zulu' + java-package: jdk + java-version: 17 + + # ================================ + # UPDATE GRADLE WRAPPER + # ================================ + - name: Update Gradle Wrapper + uses: gradle-update/update-gradle-wrapper-action@v1 + with: + release-channel: stable + base-branch: develop + target-branch: develop From f7e6d9994cd0f5e6f752047d9ecca501114aae8c Mon Sep 17 00:00:00 2001 From: Guillermo Calvo Date: Fri, 14 Jun 2024 13:09:12 +0200 Subject: [PATCH 15/17] Add build pipeline --- .github/workflows/build.yml | 59 +++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..6c3fd86 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,59 @@ + +# Continuous Integration +name: Build + +on: + push: + branches: + - '*' + pull_request: + branches: + - main + - develop + +jobs: + build: + + name: Build + runs-on: ubuntu-latest + + steps: + + # ================================ + # SHALLOW CLONE + # ================================ + - name: Shallow clone + uses: actions/checkout@v4 + + # ================================ + # VALIDATE GRADLE WRAPPER + # ================================ + - name: Validate Gradle Wrapper files + uses: gradle/actions/wrapper-validation@v4 + + # ================================ + # SET UP JDK + # ================================ + - name: Set up JDK + uses: actions/setup-java@v4 + with: + distribution: 'zulu' + java-package: jdk + java-version: 17 + + # ================================ + # SET UP GRADLE + # ================================ + - name: Set up Gradle + uses: gradle/actions/setup-gradle@v4 + with: + build-scan-publish: true + build-scan-terms-of-use-url: "https://gradle.com/help/legal-terms-of-use" + build-scan-terms-of-use-agree: "yes" + cache-read-only: ${{ github.ref_name != 'main' && github.ref_name != 'develop' }} + + # ================================ + # BUILD + # ================================ + - name: Build + run: ./gradlew build From 099f90b0fb4db68c9aa1286d730e36b0acb2f522 Mon Sep 17 00:00:00 2001 From: Guillermo Calvo Date: Fri, 16 Aug 2024 12:58:09 +0200 Subject: [PATCH 16/17] Update Gradle Wrapper to version 8.10 --- gradle/wrapper/gradle-wrapper.jar | Bin 43453 -> 43583 bytes gradle/wrapper/gradle-wrapper.properties | 3 +- gradlew | 5 +- gradlew.bat | 186 ++++++++++++----------- 4 files changed, 100 insertions(+), 94 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index e6441136f3d4ba8a0da8d277868979cfbc8ad796..a4b76b9530d66f5e68d973ea569d8e19de379189 100644 GIT binary patch delta 12612 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 HJ4oML2Lo<@i8BwbL^1~GkG`E7C$SEa_ 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a441313..2b18997 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip +distributionSha256Sum=5b9c5eb3f9fc2c94abaea57d90bd78747ca117ddbbf96c859d3741181a12bf2a +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index b740cf1..f5feea6 100755 --- a/gradlew +++ b/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -84,7 +86,8 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum diff --git a/gradlew.bat b/gradlew.bat index 25da30d..9b42019 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,92 +1,94 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%"=="" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%"=="" set DIRNAME=. -@rem This is normally unused -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if %ERRORLEVEL% equ 0 goto execute - -echo. 1>&2 -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. 1>&2 -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega From 29cbd3cc9dbdbb7fc2f23cb5f356c173dc6ba8ad Mon Sep 17 00:00:00 2001 From: Guillermo Calvo Date: Wed, 28 Aug 2024 17:11:19 +0200 Subject: [PATCH 17/17] Bump dependencies - spring-boot to version 3.3.3 - spring-dependency-management to version 1.1.6 - springdoc-openapi-starter-webmvc-ui to version 2.6.0 --- build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 4a4d400..2d14a79 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ plugins { id 'java' - id 'org.springframework.boot' version '3.3.0' - id 'io.spring.dependency-management' version '1.1.5' + id 'org.springframework.boot' version '3.3.3' + id 'io.spring.dependency-management' version '1.1.6' } group = 'com.leakyabstractions' @@ -24,7 +24,7 @@ ext { dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.cloud:spring-cloud-starter-openfeign' - implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.5.0' + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.6.0' implementation platform('com.leakyabstractions:result-bom:1.0.0.0') implementation 'com.leakyabstractions:result' implementation 'com.leakyabstractions:result-jackson'