From 7a7ba871dc1250765b1e1804d9abf642497ee6b6 Mon Sep 17 00:00:00 2001 From: Dheeraj Mummareddy Date: Thu, 8 Feb 2018 12:03:00 -0500 Subject: [PATCH 01/30] serveless implementation using aws compute engine and serverless framework --- pom.xml | 4 + serverless/README.md | 122 +++++++++++++ serverless/etc/aws-black.png | Bin 0 -> 9262 bytes serverless/etc/azure-black.png | Bin 0 -> 4707 bytes serverless/etc/gcf-black.png | Bin 0 -> 7651 bytes serverless/etc/kubeless-logos-black.png | Bin 0 -> 8939 bytes serverless/etc/openwhisk-black.png | Bin 0 -> 5722 bytes serverless/etc/spotinst-logos-black-small.png | Bin 0 -> 5412 bytes serverless/etc/webtask-small-grayscale.png | Bin 0 -> 8420 bytes serverless/pom.xml | 113 ++++++++++++ serverless/serverless.yml | 49 ++++++ .../serverless/ApiGatewayResponse.java | 166 ++++++++++++++++++ .../com/iluwatar/serverless/LambdaInfo.java | 140 +++++++++++++++ .../serverless/api/LambdaInfoApiHandler.java | 83 +++++++++ .../src/main/resources/log4j.properties | 29 +++ .../api/LambdaInfoApiHandlerTest.java | 49 ++++++ 16 files changed, 755 insertions(+) create mode 100644 serverless/README.md create mode 100644 serverless/etc/aws-black.png create mode 100644 serverless/etc/azure-black.png create mode 100644 serverless/etc/gcf-black.png create mode 100644 serverless/etc/kubeless-logos-black.png create mode 100644 serverless/etc/openwhisk-black.png create mode 100644 serverless/etc/spotinst-logos-black-small.png create mode 100644 serverless/etc/webtask-small-grayscale.png create mode 100644 serverless/pom.xml create mode 100644 serverless/serverless.yml create mode 100644 serverless/src/main/java/com/iluwatar/serverless/ApiGatewayResponse.java create mode 100644 serverless/src/main/java/com/iluwatar/serverless/LambdaInfo.java create mode 100644 serverless/src/main/java/com/iluwatar/serverless/api/LambdaInfoApiHandler.java create mode 100644 serverless/src/main/resources/log4j.properties create mode 100644 serverless/src/test/java/com/iluwatar/serverless/api/LambdaInfoApiHandlerTest.java diff --git a/pom.xml b/pom.xml index 66c5fa850..3d1c5a18f 100644 --- a/pom.xml +++ b/pom.xml @@ -48,6 +48,9 @@ 3.3.0 1.7.21 1.1.7 + 1.1.0 + 1.0.0 + 2.8.5 abstract-factory @@ -154,6 +157,7 @@ eip-splitter eip-aggregator retry + serverless diff --git a/serverless/README.md b/serverless/README.md new file mode 100644 index 000000000..75fc40ac0 --- /dev/null +++ b/serverless/README.md @@ -0,0 +1,122 @@ +--- +layout: pattern +title: serverless +folder: serverless +permalink: /patterns/serverless/ +categories: Architectural +tags: + - Java + - Difficulty-Intermittent +--- + +## Serverless + +Serverless eliminates the need to plan for infrastructure and let's you focus on your +application. + +## Intent + +Whether to reduce your infrastructure costs, shrink the time you spend on ops tasks, +simplify your deployment processes, reach infinite scalability, serverless cuts time +to market in half. + +## Explanation + +Serverless computing is a cloud computing execution model in which the cloud provider +dynamically manages the allocation of machine resources. Pricing is based on the +actual amount of resources consumed by an application, rather than on pre-purchased +units of capacity. + +## Serverless framework + +[Serverless](https://serverless.com/) is a toolkit for deploying and operating serverless architectures. + +## (Function as a Service or "FaaS") + +The term ‘Serverless’ is confusing since with such applications there are both server +hardware and server processes running somewhere, but the difference to normal +approaches is that the organization building and supporting a ‘Serverless’ application + is not looking after the hardware or the processes - they are outsourcing this to a vendor. + +Some of the Serverless Cloud Providers are + +![https://serverless.com/framework/docs/providers/aws/](./etc/aws-black.png "aws") +![https://serverless.com/framework/docs/providers/azure/](./etc/azure-black.png "azure") +![https://serverless.com/framework/docs/providers/openwhisk/](./etc/openwhisk-black.png "openwhisk") +![https://serverless.com/framework/docs/providers/google/](./etc/gcf-black.png "google") +![https://serverless.com/framework/docs/providers/kubeless/](./etc/kubeless-logos-black.png "kubeless") +![https://serverless.com/framework/docs/providers/spotinst/](./etc/spotinst-logos-black-small.png "spotinst") +![https://serverless.com/framework/docs/providers/webtasks/](./etc/webtask-small-grayscale.png "webtask") +... + +Anything that triggers an Lambda Function to execute is regarded by the Framework as +an Event. Most of the Serverless Cloud Providers support following Events +- Http +- PubSub Events +- scheduled + +AWS supports processing event generated from AWS Services (S3/Cloudwatch/etc) and +using aws as a compute engine is our first choice. + +## AWS lambda function implementation + +AWS lambda SDK provides pre-defined interface `com.amazonaws.services.lambda.runtime +.RequestHandler` to implement our lambda function. + +```java +public class LambdaInfoApiHandler implements RequestHandler, ApiGatewayResponse> { + + private static final Logger LOG = Logger.getLogger(LambdaInfoApiHandler.class); + private static final Integer SUCCESS_STATUS_CODE = 200; + + + @Override + public ApiGatewayResponse handleRequest(Map input, Context context) { + + } +} +``` +handleRequest method is where the function code is implemented. Context provides +useful information about Lambda execution environment. AWS Lambda function needs a +deployment package. This package is either a .zip or .jar file that contains all the +dependencies of the function. + +`serverless.yml` contains configuration to manage deployments for your functions. + +## Run example in local + +# Pre-requisites +* Node.js v6.5.0 or later. +* Serverless CLI v1.9.0 or later. You can run npm install -g serverless to install it. +* An AWS account. If you don't already have one, you can sign up for a free trial that includes 1 million free Lambda requests per month. +* [Set-up](https://serverless.com/framework/docs/providers/aws/guide/credentials/) your Provider Credentials. Watch the video on setting up credentials + +# build and deploy + +* `cd serverless` +* `mvn clean package` +* `serverless deploy --stage=dev --verbose` + +Based on the configuration in `serverless.yml` serverless framework creates a +cloud formation stack for S3 (ServerlessDeploymentBucket), IAM Role +(IamRoleLambdaExecution), cloud watch (log groups), API Gateway (ApiGatewayRestApi) +and the Lambda function. + +The command will print out Stack Outputs which looks something like this + +```yaml +endpoints: + GET - https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/info +``` + +```yaml +CurrentTimeLambdaFunctionQualifiedArn: arn:aws:lambda:us-east-1:xxxxxxxxxxx:function:lambda-info-http-endpoint-dev-currentTime:4 +ServiceEndpoint: https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev +ServerlessDeploymentBucketName: lambda-info-http-endpoin-serverlessdeploymentbuck-2u8uz2i7cap2 +``` +access the endpoint to invoke the function. + +## Credits + +* [serverless docs](https://serverless.com/framework/docs/) +* [Serverless Architectures](https://martinfowler.com/articles/serverless.html) \ No newline at end of file diff --git a/serverless/etc/aws-black.png b/serverless/etc/aws-black.png new file mode 100644 index 0000000000000000000000000000000000000000..7b5ba317856f8f1b05fb7c02c0b24f4bb955cd42 GIT binary patch literal 9262 zcmbVSXE>Z)ws|9t;-Nw)W1FOb2aUObqr`l1zqz8Xyf>j|$+5^hqBuYo?dyId$z+S8$<1N7B0=MPm6BQNxgTc?weXqgo?(6IU z_2G7QXZ{C4-rC&~Ztv=0@8Znx2N7!F;^`sDbRX%zQgCwB(D*m7v-{tLx-S{857d>H zj|ar-wo;( z-~0WSt)SxnYAYrOw}yJS!1Y{Q9RFc}ww;TIi@TkRD}$V_AcF?f(%$*c_|NkED_ePM zxV@LPl_K25iQ%vMirN1M{~*!-EAM~VTK#`&#(N(O?;mpf53>9-b>hFEQ7p}0b?mVM1Mk5%%r#rNip3xgwF(j3-I2D+U$#- zFJ3ht)O|bOOCFTGd6gsRe=z5-rLUop$WDr<5cn(ukSSZF-K%pyVtE=VTNF{E%}%Nc z!TVcGuOY>YeAA2jzM`UHVo4vRtftl7=iV^SF(Z_iF4gniGjVfjGWK9Rk>jN3 zU}_OVVEUM(Rwk|&DMu+y)R2ZN1FsbLSrHlSo6)J)tcV};m{0QF1ZTywLtDNwATXFH zsfX|oQEE2wa2w#lla<_;N^m%k7qhyF6XBLhqsLUI#}4IyPBSBZ0){A4)$voJ)TENu zOO>${>lET(La}enfZr64g1*2slh=2Z8@D>R?i0u(hI+=W52e2)&T2`0q~nWCLd}`RZm!t zP@Wg7o)kc+0ZAO7h5q)y{Euy%={213HJxxf{z64K7wxtX6{~AmAKPgb1#v;Y(>pA6 z2|JTw<{dh5GyFlp##k#o;9ZL2tX$$f5pZG0z^BY8W?wPHfqzV&IhTW0n&cK=gs07e zCDIteB2w(h5rJopGyA{^V14X8OIRvL6KWiDln6MSlWsT>cblR!L^H`Oi@QrGj{@rY zlVj3BPACT_q6QqqM(HOHPd~lGVD@D}sO@}E4O8U!fGa)6ml;)}?Rci$tD0mzvxK8y zmveL>%QR{DBG_eI>-9Y|f&JfRmQeU2ovEF&k+Qh&t81z=2f3gee->H3Pv@Sx=`~-d zP%z&B%fLvyNPs~gA8y7yZCNV)ar4Vc-K{d?wg0Qmh4;lalYJCF7^ z4{Am8IP`aCRi4{HAoCGv@@Oi9`-7)lI5@nT{wIYpLRhyW_>`}YcjKv-TH3kh<^^zeU5n4$Z^;t zr@=MV=$DyK`xeZIV7AC*RTr63y=$@h2@T8$tJ#!?Cs}>z0ivr46yHu)JdCj3FV01V zObEP$W!>+ZjLe$xOU6_2Wv_cPZO zelxi0EfEh974%_W6s1%g6CKn;p3PBBg$N7I7p@;@{CtL?&kl7ui@+4v{j5w!kS)oW zLpgL`JHp(7sq2y{=c=v^AR#^UEcUWHE|I%zI&p^Qopx`9c&~$+(plVtSWDbM38{Dd zI2&lu?$pEPP?;EMg*wPYRcQd@=)}b%&Y%UewvhW6`El^A!)tkdxGLFVyFp)^8Uj+V zKJVc=P*iJUTp*l_`{*v3tV$0Lo}B*no9miWl$!Z?5ZElXurGi`S{ zb~&}j96z4%*CQoM$(-I{(q4#<8%}!&Z1Yl}fh^}E>k{oAb^;8z-&R2Q^z`-h*;H)E zhD|dlLesQVSYH#%L$S>)QX|vK6QSkj_Jo6%ol^}p^KJno+`nR)2;88ja1UM6htv~vgM>CD*>CT0|1W02cAS-ZrCvGkh5zy zpa7GvF@O9ggDsd5_^M59rKEgm>v$cun{UUs+mGtWYR+BS!TfPRj{D(~Tk0GOCAz7~ zs)$4jKVL!Qq&R$X*Rm16s)0n5JldV9(R8=dIHV}~iU`ig2}(6)Sph{*4OO!XaD?Vu zIsm2J?My~z?Z$J+SwxW8r1BZ-oe9hHS!yE3XoI;z&axb;n+GUtu~C>ySNBqvB$ldL`-SCiw+T67w?*Bd-{U$ zjj_Xb4lAG;GeG(7^=}C0T5WOX9ik+27>SUq9E7*jV^!K*@W*ow>L5U`SQhQul%z;d zENj8B^I+7jn6qK-q>9+SYk>=BNeLlHcsv^8+&2dKEb!rt4NC5uiHK}|gQwtF?l>QD z6o4G(MTLJbkwosT0Zg}WSSlxoXM8a|riKtE`j&^grdDtU-%*pjR7KMRAqas;4%9I#VpFPrv2VCo)#5 zFGq{=BDeSa9&b%ls)W%2e}r;W^Rb=;%tjwU!U*_a$3BM{k#iOYQLKK|iSVpc=M z(0noQ;M$-3?JWJ~uOczelq<$~6^K2uNhp*V9DDGV#?`?b91x~ym+gGRLNePbH12z@ z;$}jm{~`TctRZA;Vc31|Sn|petu<`y&P0@tpV9Spg^rsr4Ucz{=5~s)P+K

0AXR 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 LOQT8y&)EM0Zf;=R literal 0 HcmV?d00001 diff --git a/serverless/etc/gcf-black.png b/serverless/etc/gcf-black.png new file mode 100644 index 0000000000000000000000000000000000000000..b4e22982c8e25e4b7cac03e82909b8047a7910ec GIT binary patch literal 7651 zcmbVRby!qgw+HE#5J?%y0f8BY?gr^r5Qzb1C}$W3hAv^~5G14oK`B8Rlu%&k5KvM; zI#iIBlDOmhz3+GLAK!ED^W5{tIcuNuTe;WX&pvC#8XIcUP_j`H5D?Jl+|@88ARrXR z(@1hs{QY^hXfgi5>aA(%ZRP>@_JyKh1gcIR4lsZY0_qGig+ZPCJ^Nt_1O!BIS942m zO9Op5M-PN3^bbbV4}rpS6A&mU`=OwY?l5nF1I*bKsmQ(4(#8#NbyDQMFKGZaK&iuA zT<->;VP*k_=8ggGj@IyR8ddc}Ia{nb)4p0Ai4dMp;1@U%Q zK%3JHh2lHMIWLg&!$$yLfw}(5A~)XBf4P7_85sOqFw*PqK;c6M@`Iv4VxnLW z0`bSMztCRZrm+7u<3FOk%>7X?kSWZ|1A}(N&j+06A7*^){&z)xfOu==yk>G{hL?j zf8~`^N5i1r9%yq9k4OJxfU%2*w}+RD2MVBWCJ8WrI=UkNjQ>o}zr59epj*FlYGK> zm@&>2$VB-Ui7he)GU;04(J90RskWA8W@bYH4g0IqMm~p5ngg}V_v(k6i$#}$^Y)z* zd_*)IH8ZAeN`JI}{vZHdB;Xuadygk*Au!-@3QFJqK#VG?L`=;S+5%k&y5DM}OHd9(5jq}E~g(bB0LFJ4{| zlyj%Q(_&_Q!Q_Isb86-SkAvBDKA@VhXmBtvBK=-%3}hpN+WhD*wwT|}jdk$&8A7QE z1^zP4tjs&~H69i=iVCO|>S@ZYj0%Q914L&V^-AaIky~@?Odl>i_=ZQyt*noe+q^zh z!SKT49x*a&*SC;6+Sdl$waZsCu>ls1T@V=My*!H?cHPYu_^mbu-S`!7(vrC-H?r#_ zbvd&B@U6mwrwC+KZPH$^15=Z=<1{m7xjI&Il>gyQm4bg~s!sa2M?q1x;X9e)#y2sJ zY);ePZC?|ID99|lJk;5nel*JnLoW79n>S;FI8qj_9dCax9qQ$1Rr6VJ*A-vez?$AIBj2RfCOTI#S-&e3%>1dY>*8uTCM>Y{n{|b2 zi20)8&XLnsEv4dn$E$jK`qmkXc?bpBfmG{KCFd*gJcZ5vpLraKa$gpUoG%n)qiUaT z=O}kY`=KiYzLr0)o;+IhB8v!25nz9*pUPACbmU`N+FAAPaECg4zqa>#m=$RhGF)XcLROwt-FUQ0Mn)9y+PLYriNEwS z`@(5L%u;gfF=yJT6(N6T_T*F^&jwwbr;S%8e|qvn0~2>1q|wP3+t`m8@LZbPn8a%LK;a#CB`xvqef5qjRZ(vj3Ac{|4O4$d6eb?)eabMwb{EU;z}jnK$8IaE1agspW@m0b zIJp7H1aKsJ4b$zK?Q2I%1M?R9OWtwy5+3zfUesn&xQj~+X`NhMQjqO(77j%N19OUO zd4EWU&tYW`<6Q2u-hxO!S+66kj~~AMndEAq>I^V``*qS(bWnpwzZWOtVE1jaAIE0i z)LG}s$7OJOEGAn(Su3r#t0DN7-9ogCFIqR>js=RjCL2AG5)tB2Di`GcLvwOz?Cfdgmx-#3 z#9v$&N_J5(@KHCbmJ>mZke)XArEI-x1tlH2;E&9nbfPhZitYwI-ZC3Rt zcN-vd61kkK$H6dpbkeTRh-F(J+7Xm6b1Zsj4S+U;GdB^mB|a(LXqeEo6o{m5e;K&~ zG8_-I%WaD)8fNC^dZ~nP@UGxoVlmVOgJL_@g@%@z!vc<~%};>QV0R&FXpg}Fay8o^CFc9nujAa@emxuG*={HT{}wl}6lFZw z8|32XSS)|ZL)~vSJeElh2}w_69FGj93k=7GBzRsrC0pC+W++0HRR=~KREjl2y-^fW z{z{BQr}Z(L%4Avkb+4Ls7lt|y8f#~`sm=OE4knnop!x~vqwP3wfA(#6(MlWD5PoWQ zOsTU{Uw_1#U5?|YZI+kLCnj{)T%Uwh4fF)LMD*lh8g|-+Tq@VI+6KHXc|YCLsW#1= z$N0~02Fd&or+bFQ&_`BfJJ+o|6q`MU_xYbUwCX+-2dFBN;+`GaguCZ=AMOcIRIU|? zA-bo;5#b*sOQGQJMgS<0t&yMQ<276E`QNi()@(ctNG-8t9KDxv5y~;OWj1Y+w}%=)Zd}2 z4z5_Z6s}LCj%gS=2}lo@*cdZeMbq{zbOm$v>m@lkR-(<3f#H8;Je|zL9sUC#ihdzVk??u?s47d-efGgJrXgt7d2WuHT@_ki4lxtB% zEC*J@0mA~J>n0(mJ0<6J*qj$TeeKKEL_a#F4BMkUe=6*RRs%O}3TjL=*ss{J-j-o> zgG0?9M9&5qZ^Qci; zN1(J6Jk0oNp%|xr<4EXQep_;w{i}YTJRY+1enO0V7F&-@jom7Ja-T}_^w>T5oG%Kp z>XUKkmAsJ0{8MB*$IRCws9C|qj)ByqtPvQZnD`4#o;OcM*wxglQ^6rr&s02InnsMF zo|c_&4*b7=UIHIv*{@w&dwbwwjo0mix>bP{DIlC!UZ`~0Y+9bH0j>nOu}q?f*Los; z@(d~RXDz&>*?jRhn@@K({t1)a+lbQ5$u#*0dF$4EFQ9aK3U7as-w0+x%~Gdt?ZzHV z+D?qt5v)fstPg%+2Yh;MCi-c&|F7#wi~aZ=i;6NYe8)XSlf$2tbD}3{wS*=1X=EDv zLf1FVy$pko#Ze|R(N<0@d{3*D7+0Gk0rNFt%DE+`D3(YKz0BzS2a_+9!oOV6UxJ=I zVaOheWXiSGBAtO`9V9HiT}c{?4LsB ztHdWla^6ypx^3+yR>MRd4JVfD7V#Tt=?@$hF7_SCjc>#g;IflcFBsPh4-Vv8tXu>e z^@ms7sc;^SL759wqgYUwPeU$SC7+XspUGV-uE-OHSu-Sg+kHv%P1OxQ-ukQ*LS%fkQh(GYPX0jnWZW;)DZn;_S@b{_IQ;jz|z zV76M_s?@s5bfR&uhrQeT*o}tgi|pY*IC1?|F*xUKM^l|xaURK1RMu;4TvOYv`H$ke z`EMe8>=LAEq@BOh*3NS{dT`fQMY`N?L^J#4?)vk|eH}3<6Pq?Wnk6Zn@=RTLW81~g zmbrThPid3!w-$P2Wtw^ZSctB?gMzEL3Bf&s48g8gn!pYF0v26np2w3VbFuW>C9(@j zhlz=X+&$?|h$o?_nq@M)-xEDa?P@CVrn<%xtS@m?qM*|8ML?99>y?h+e01Tp(N_r( z&NTZsUrctR!lFX1L*_m-;O4%(9@@DRZ+Z7JNm?GN7Uqlm!nV$lnmM$MYNNHXxO$q6 z4ds>|c1nGcYY@(N!--*-d413`Y34^4Vt7tf!=E~$T_6*P^O3?fK=n-*lQ3KhKd*N)UJ}2uU(D4zzt>{9NkpU z6wX2y_({^fdQUqN z1n=?}Fh(+)BX164n^QhNX1F&=Ue3C<-JYYRPg|Ck_VLY+qP9dyToLWSxwFRXJhucm zutr9pQr=eIyjs~)J$ECn+RqfKG{DA)Hl#V-bI-lwMpZmn(6&3{Bc2Q^g-vouLxXD%`h*Lg##R;5&_7W7f`$fP-{~IhAb$ zRhB+a8B;4HRy}&K#jF3MTnZu@qh=MR521M)&YnAOsJ2qK#J_UFutg#B9Cw8xU;ikFrdvXp|1{mIKY;kqrmT$PaF(AWdi)o&HZ z+myBmMMepa!aeKU&TRfFueIHbE7R?J4)>|1NUlU~&Vo9leZ1DNKlY#`G}ZO!7O+>b zb67>*P5v+TLbfdGX>@m}AwECr$#Fk)Xq+YPW9xs5rYXBf*$sn^cCr%bhu{<@8&}<* z8<9N9zYg8U!N)8h`WD^mW7hN|-5S4)yFB@~8q%s?KdGKEsV()i&Pe83M?K2w*PVnh z#=U)Sq2&Jz{Wg9?+mcHq!jkW+;xSsR(`*ZVx7TrC!W;`arfd(`=J$k%k+ z9qT(6`2Te;)E4Jxr61vPm7wmTs(SZTaJbqSPh@ZKGT`=M?u(?f$*e!YCO0qYIslrAnH{k$ugS3>@D={uBjK_&Soi*8<{ zHAOi+BXhx6%ON|aB&y}sGqrU}Wit@EZZS}wFlk+eU&`H`EXIAm8;T)l+Dqze)jW&M zToV_AF?Kg0`W6&VW0U0uek(e1rk-|_YAQG@yRjHashvy*L_L(g>yk)D%CV!`)S^ZP zZ5?%RPp_`!E1HRf0nN831qWHRei0Ti_Swam>OLe(EM^WZxwr<3)~SEpzA2No%>VE{ zPknwF3u@3Ytz+j>w;n36Ic@49O?;Jf=aB%M?j=0s3v1i;2ji9D3aobO5%D+>SOhT? zk=iE7PZVz4M_p3b1-t>RNj}U5yXPKPPhU^PSAn*4Udt4E^+yeY#W|230JTHR=-! z2Pon_dGwoU%rZJ@=X>`^*7l`*D@Y_plRupbs2o_P&Q-*&pb|G3ZLQ;dpB**@Qq^XY zitln3bbAxa9%JS*qNrz7%X7FsfvmAEeg*&?i5L8ZwArfox+X)#0A0Z$dt75g)v|Y{ z@`~OZ{8a46FIQ(4QjDQxoB)rf5UJ&lL0PSlaaAigA2-pYO02d4GwV{*9|A43U!4CuA_tf!cJEB>%l{U~O2E zZo!Rt!;qw^cU(E})n3U&My}Ul<6tL8)=T)tA=5b`2l1XL&ovvc4_^gY1c<#dd}}r3 zwKXO^jyjK2ZH$s(Nl;C}C=iU* z@eQTbTk?}yFa!~DpH?SdM!Od$w^av_NR+j72ij}PYtJ53tkHw5N{lUs|5Fn6>fJ-qFpQ`tXOY|RXp_x$@ebF7c zsXKn07Ouh>L{zVr_0@Ws(}FsqP5aVI1>~P?q~;j#$$ghLE#QZ)h*MA~#k)h!hAqn> zO_kFWbMvZMJc|PO`hTKvr^D{@xZ2wyP$Wn68HQ(p{<)Tnumk2Nf^wpot#^3?cv$#o z%{?^he6g=4X<+M3r%D0V0$*ZhNvE$}{)VW7O{F9a1gS-bsZo^IlE)v!T%{4>AcIj( z^TiUlI-6{Phj=`pp)UokVQbS6W|7#Be=@F9q*)G_DsCQBfv@TV#dDYmITU2-5@yo- zTl>H8GC$1$MV3L8EI$EUih~4QVh>hSrdowHvyY-6`lwz9F(aSp~w7 z7wMYKWL1MJSskG!7uPlp?Aa>yjcKbCS8W{NuFvjE_}~VF+#v5qP4G<<;e$V2l>bjd mrQlC*%rh=fR)0tB$6jMx~m4_5ySe4aVqDR0(VGcj74O1Rim*hol7xGKu>I!H*!TnHJ8iH>;B zdB;e=`^*@)OON=X95eMJ!jE_R+)0ACkpsE4Sp1mj=4q6qoVXCAm{3C2N2@n+J z*4%CFMRnvA|F(rVl3;Z7^mG&D<@NFL;qejRadmg#;U@g$Nn1uaz4wKMx3PN&VenCNgeg%*$SYAO!ULGh92Fb`O$jJSJRe^eVT0w2>{;>-|*!>$T z`@dpE<=pM8JYC)OTwR_2sQ@iUS5H?DM^`t1oURZ+!^#E%{d4>$J^xy*yq!D5+s;M%M*+xR5r&f`d(eqtAFvs%M?^}?>BA9~*VQHZ@vgd8` zV8_0SRrtv0vZ1}7R2i@mM;#mSl61+s3_GMuzsnp|K|6z^Ngo?KIyUd&06>6gsw`_D z`*7L$HpVj2<0y4GnfkPILSUlxlFP$>XSCxiNMJ26P0z&S=Q9#)1sCa5q72!5t!^E5 z5^NT(2-$piu@*atsuA|zVtNe;Lc~(b*JA%m{7akN3W1IIAHcsj{sa6M$A5tT;`k5n zFOI(~mJ-8f>m4R05e>PZrmA|Xs;b)IfAQ1r_VW1h&8M4-{iwvdwLF>d$xaMB8q5_- zGc%gD%u5n7vdHnbw-{TwYA28K%d6P=s8*cajM)Li^Pj9~Ix>%KUMvUVZ#jRfvHCF> zprfNBJ5Sjh#5OZ@Y0|PixGzp#73hZ_9v^;uhI01Fbxm>&Y|`MU%|Q2bhryr*Cw!Wq z7Iz#zG}gvsl)k`bI0jIXTW8~qXVt$T!nFjgY#`2Y)Ew9 zP$@1pc6hBGvE<2mp|G1MS`;>x9Jnlf)O+&bBr7+rZY06M6tHA?z+<#c$!}9^g+u96 ztMtsmNhfi%R1@X8ST|mUq_tNy8KKKZUyfN#ND-N=kPBl4VZ*bpb zM{S+J;%{~_)$&Yqe*P?)mHUImUStx-nmt?tlrzkpCz2&M9eojFZ(Rv}yl8m$r+Tze zzNe_4hTb%zh8&BM?DdO@g}1P7<h+-Rg-hB=0^uJh@UpJcF6UxrM0aWBG&&a}~PNXi}sww7P@S%sRt$ve+-!wKz zeEluXZbfTd@G?SCR>vs*S3RmzZ$iqaS}jtDEdQNWs*=76+v1DLGRPrRE*(s{p+;y? zIo_d9j4tZu+e1*xD5E7M6aD2u9NUWZfj)D6S_z-VLav7nzJ;6oBrZH-$E{3}f+j4P z^6w9rROJ)(u{$et>PTm z?#_GP8J@js8`%~xd)Tb6lZAna3}j@G=Y<iLIPSz6G>%-DXOm1_R9*)tH~kv zY37{DZind|?{}$%LDP??iAM@L7g@0bZCXG%1(PQ6}8LT&}dExVlG^q)}VQXZ1y z&l9$7OTQ7+=(^sJlFv$y51?Obbea$6p(Hf(7+6r4E>{GMAHhBhic~@X2m%VaD9dxMcHW&x-W4j101GfSBdw z<;i>I_eU%30f=_s{G5@NwiR?X2Ew?Qz6uFC+ZiJVnDZLQZkHXGZVv@dq=|!ESIuNh zw)|2x_vb1HHZJw+7#Q&ucsV)xE+z z>T0(rB-@!+?oJL3$p8AhZ4uF+GUY5YNQ|H9k2{}dPzQgmwd#qa*7hz2CjLHL3g9+v z!jag`ERmc2ffun0cgrzs!TX3UM;Y5DZ{!%CiKc(Vs__oajD@8vxZTMz$m1yyU2`SA zwIM+(=8bcY|Ae}6zfMm02B3mBK@%l@-ZK%>*S=dq)#5Ob8-6<5>apuIbw%f+Y|k*f zVUp}#M$??XPqdR&WN19kug}s<(VtRIdY5>@j-u<@qk0+JlU@^g))R9QOsXIZ2k0vr zXo``Mm0@^O8?|_XaZichA$|31_BTF9%f<}m%&X_;=Up0E!uMGM4-HS|*^775vboBP zNI~7}j|>c4A2;V6BckAtk)m>1tYQ}t=e$xe_-t(xIWxye$}GUoAh}A}zy*;!6s$8L zGd05F)zr*P5bDcyvTJdck3V%TtP?;f{eH^t^clFkneTXL>a-ebphO0hnIESp_6M>E zMi0s`ARJ%6%}h@xhPQ!Gh-BY6iZ384!H|TMv@&HnUcc~T9CHB+KunCBSBML5t?U(O zY1o@Ny$Vc|Uz!E?0;|`i_qSV3RdTN=QNM0RQHGFFnJCFn^=VO7kB^O+JHKa0X?Quy zab6)uq%u`xNR)DQcxlkb%q=c;PF#ih`uevedZj)M<;R?7(Sa*T{bw{FTQ^W0=GFKI zMnNCtgS^W&X84-MX#I8q{%%1n?x2z~D8bS3O@62i;o6q(@$6L)XZL3t_76)iiik&~X+3uAS<4%qtT;DW!E41_e+H@gMDf$X z;K4J)I&op>G6mIy$Mle*U!0|$VuT88{5||?H$N~qBQx_dH-T;Oc+B%x)@0T5qPMW+ zD5tF_bew{4oiO;XQNgw|MPJsz`2Ny#57?*n=N+S#G0&F|6Ht|aZF2o;q;tWB->;Rf z#$0E{*p94qBXM)?e5Bt*i+hMH1gRRmc3$Q*tiln?Q>(LnK8!DHKl-MIh=hd;uV}bm zo7is?C!NwZ1a*&|XCPgARKVTc9eT;c`cA;8y&g3*T^N}B8@Oyzvlpui%*1 ztMJ&^&qI%Z6Xgp^t5|K$dCKXZp*}cWo%35hy3hQCUw(DO`*~-!gzQcl#l7?O>(|}n zT`1!Ob6HtD_3j*lWcklMGhs#j)qWSfy?}PF{ojNS3wGjW z(5+^loWmGLZOypf@0dA>I5UwOAu~G+%0~DqK*hGTl@7l%p=2_(yXd#*jWOs&kNO0? z%7KMAOex>q_TanuJqb<%zRc--L|qQyr8=evNF-`7$A|{D;rIo8xsJr&x+yHStJ!@> z`bod(PrGZ;C9tAF*(^`nvKGJ8E4VZ?u6}Ur!!dnjxO=OPj=X})IO4%vqR?_oY8HaL z2VPn>#qT{~FKUXrGOV&GmOs>AzApO`kD}?5+K7F9OEHn+Y*DaiyjrtA9}*wD%x+c- zjh5ixl`-KV@EadElY>DMsX<~CW?8SCcsEwIM|QOElAc-hVREX{huobIX6|qq*D(tQ z3n8*H=}z}KK*iRqTLAHEK*hrK8}69L#BMI~@@V>EfBq5p{OHpjflqQ@2<|3I;0LGV zlGM<9HT>+Af<$RkGSlixDs<>a<7%rQAi^*aJvyHZ_kn8cD zEJqcLwtrMLicqA34#n*6KN}o2{_Q4&R>Vz>yRR+?cUa~Z(fh5RoLBcu;aVlyeSRHP zhHUzbx~NjVs*`Kpbrib9I(E64`_!#k-^pal^bU0(Q)9JKZ;sy9yUnp;UmCTL62F*! zPb1t;7798E!P|V7;Pb8Pu>?HPwWCt2Y%Cl+p3PVl*Zam&c-osy3|9o5-KTiRh*B2) z)5-o|PY&av6}WlusNXqv@1Vm!M!>`L0Z-fEv-H(mBITw((X_8%qMC~zbqkF5^tk6Z zdd3dQ`lta}xH2#is0$d~>x0$`I>0iUo15_RyU1GehkZ!5s)nY6bX4Yfq^T;soE8XF z8=lcW09}r5#@J7MJ#O9&Jm#=pIUlyqQ0oj|`NeKEtB|L2o+MpLTvu0@VejA&vdv~U z^&&l0@s+ZPicC(}YgSvEo{JFd_ZH6I%?~?Ai4$=liwuSGHg{jz#;{VW(8vO$u4tLM z=ykQUzC7!;mZXQQukc@hCtAe?QlAT_7~%~(XvcvbMfMd7$8g4Ffpp956dTxtXd1v( zxwoUSd1w`|!NK}zHWu+hNuGX@)~&Cz%4=ER;P08xlCRI zXG+@lG3Tn)qgm|wZxvY|ytN8N)M{rm(dDW9Yu1o1>6rYGd*8;_Ne#yxv!<5kJTvUTslKsxz6{X1PT?&a*8ftfgc52;kJ7A|lY@@BR(9#=mPrmI* z94ox4lm>9<2(IN^Td#u{W&2lEEHwts!Q74x@$pD*MV6BCUvQW8AI}0dmPzygi}tT? zaK5mLL(qzNiLdh$GW8ox@~zw|o{f}Ro4GT&eEebg7*1iy?bX|#EGP>nJ$z!%1asR{ zrS_w;y|9npQ!b-$(eb!F#DTaVBjd{5*i#j3YdC)tL}?|uBwK$3U5&|j<3&D_?*fbU zY&AUCttyRmWqvJY=jKXw*o|ZyZw5gaB@CxpGH8)=ALj_jM>46a4{FM}2ew)SRj|~o zoQ@v~3JRR&t1UmjIeLw_?CUR-Imgh(B}=$xD@_I+EVp{p-HK}<5e<@YQt4NkS)UGP z)EITYj7ERWc=Y^2TZCGlfszIkJEZz89U`#XT3!-)LlED-7dxKg4?(>5m zi!GoozO~!T4SBaM5J!PA=BFH*-d1)x?PlT`-C%4J9ybat6XAY?aUyM4}7=c zR?eb7JbS!&TXLX^;%dpu+bHXk%_R6uE17E&9j9PYZsAZI?WgNjJCaS8* z46T3sN(eRvw+@%vyQ?D8}haSxKt8(YaBo+LiT95$UK;o?8q z(uD{A2s_lBK>>DZAX7d4osYdy9?^)~Pi0=`5@Sq6^0GHwJg1h}|5?k(sxIZ&lEBl5 z!oAWfsK;7xdUb_#w%0AL{`|1vcF{yJyswQT!y2}H=z@L+4d4H;e!mNlaM&<&{RqTH z{*G-{=rS+Ta9>v+!^~Yp@!|t(Bre6JDJvheit^AkS4um+K0*{n97Hm&>9X2!jZ{6l zXo1CPGPO)5I**O+!tuvz`8>k-^Sf^oHD$A4!N8*sJb94L5&aA1TG2|P{$9MENZd1YJQ|AG^PjKKo_5sQ z3`F+(w#?vNTsd;Etu*O5&=t6-r`OPYyj%i6&J|ZjFw|svlL}r1L(whnf4eu(;n*(Y zn#uJd)m2rr7!&bWdQ(}PFW=`}Len8#7h{fQ`kQG!*1Y-#%?&Fr>nTX_75gVvi(U&C&$fNKu+i%-$|5$1F$xE@K z87u~@a=g)p;lpz44+ih~4fIqB?7dez-w$25;e zvv~(8*xNA`z9K%{$x}!h$+uS+K=pRjl0n?%)0oVJib@PDxuNJ1OX;RSd)G3eNP>8q zuh+ss@;-V_*;$RnYU9CRTrAR*m@>TiWRz6K&R$HFY5Q^h;}7ym#bow+xYI{Y>wV|3 z#0b5@*!nsXe-c5CL={*iAPJ}RAaLF#@xn_<@L(6QN2ZEA^bMhDx_F3EONcHGK3r%{ zJnD*Z+RfT8yz$GOrVW-_*M~+{aZaBree}K(vb7oo4--2ryM-W6-)6XcA4L(Pqj_J9 zn;IRNIyOk5cNONCNAE}4T$n^ z=v^u)i`?@R@m2tPEPzZujM8-E;-DqFYKhx{OO05%uufqkLY^VML4#?0;Y0 zp?>g*Gj+@s7 zvUqQOQaY(*jc(9p38a54<8ZGSC8GLlNWLsZFmMYq$D6E@r<1CYoQpRsQ189P9KPh0 zmEC%$VDfba)2}u#6Y*F6JV|ZQ_x{l57Ld0IX-8jQMz$?p}JXqaKj>o zXFV^ipK;|}e9FX?+=B+_#lJ7YY@@NNKKMYUotmee2fo07N8N2QY^Z{oWre^`iq1(h zeWHOQ$gQ~%PMj6#!yO)ObeZ($*E=F5uoM;(Ka6&A9u_KV_yDxTvW~-@nZ0Wj&Eo(&$t`m?Vc5qMldD9gz~M8P;Ewj(j%I1E zU_rX(=?{mWwgSrLU1*KkXQB*vCSkX&VXOAjvO#h3?nOz8XLXcGI3jdK_#s)Y(DXR} zkV4Bf$Y$}&Y;0>eQha8tEE$@C-d}hb-a<@cyGj2nRw&5?|@@w z=#ycog=)O$x+Ph*z^e(*7H<_=bq#e081x+uVQJ z?Q4yA7(Qg$483S_T^om0zd}rDc;3-%N37w+$_t@ws8^3Z_s@@R=EK=Y-$gqfRA}2N zlmRA^cdm1HTrJ-^Ryc?W7^VEG)W!{Q(R=Hbmq3DX@SMqbD9r9dp~!k*Qb8V`)(bI} z5zaFOp|z)d>MCRd24L< z{q9`u>{)U15~CT^@SGCzr!-fWX{Yg&NNe*wl+u++r)EPMXyAt?=!$5y$L=^oLC-yn zQa;ASRszP8{(9oiduXAo#HQ+cLyAH*FBw(5DqY?%t}PoCd_35DORvhOSSC}{SkW%#m+%p_Q6~|-Vmd<;-*;)EDXL3hbQ6m0bj`dc5V>K*cJCl=@ z;?F(B?23%fdvq`<+652xtqkh#JZ>Uph*P}3ppfQC5dA(1A=P>F5f-Q2O{q};!Myr{ z4SH|T7Y`c5?lB>#$}3%5$nZmPA6a1hMK>h8;p+;4aKD|w0ucW-s)nY4K{%jhj0^c4 zDHNEO`psI_t2gMX433POhWnDaPmAVJyJsl>yGN4Bh+Z`r!_*uxtIoFJSIMvFm%x1n zVaudQ(6{q~sJ5=pT`&roRyAniU$ZJss?mH`K=f7if|2D4Z%@FE9M$?bx7m1&;>TFT zFqQOUgWN3)Kw-_0ND+-!D|l+k>pOrR9z8&dFj}6Q<6r z?+qzXY>(s5l&s~ISmosLMKK`jc{u_8J=TQ`4O1t5hVGwPZN*D%QisE}&+juP%y=^h zdkWR0b;23+r#v^GR^nkRSZ}#43VopHy&z#OretAZu^H=L0mzngj-|CY0FSs;1x<+~ zWH*wEOm;3!5wqR@HkbYXIu!oPxEJ{&?-wLhf+Q{N0n3L!e?L)C(3G!|eevr50Q0tl A_5c6? literal 0 HcmV?d00001 diff --git a/serverless/etc/openwhisk-black.png b/serverless/etc/openwhisk-black.png new file mode 100644 index 0000000000000000000000000000000000000000..e70139088b7d1175a01efbddc0942b2fa71e74d3 GIT binary patch literal 5722 zcmcIoc{r49+gFi6NJYppMwZ4lV_(KLV@)!aL1e6h2{V?#40@C;Yf{hfq>Kn9YsgO7 zLyV=GlzkV*_SnUzXM5j2-sAm_<2#P;{^P!{>pp+y?_93)`sWviyl%+O%FoKcz`$;7 zq-Vjva6P}JOT0TF*x4V$pzDTr!2peYoINlW7-u(=FmX@XYj-hzNwH%*X@ zk}1U07lHA_8in{{EJLnaxrTVTs=0x*wSX|9`Z0kIhTse&`gr34)QOs)KX}!T*FS&D zfq;KN2ws|?Ka;XGMFJ6ce+*Db79!&cQHB7Op|Vf~MHLklX`nm=3Xy}z%R%L3pepJL z^6C%>@UI7S9L?X&UEM;@;ICN6J57)$f#9nyCl?$XEE}vKi}&}CgQ}^i{p66BmpMkr z1dwn9XQB))K=f}0JxqYBKh~Fk#p8fK8J%75fdoy^ai)Kk;Nxp*`VTQK;IBp?;SAg~<8%{H*H_bO6Bu^RG1iBRar}+0RP^Ql_BF-@5S($Yn7`v< zkK_L3i}Ii>~GXd{!g~xmUJpo8hJOLlziT4E}ER}$!&aPP8&;8Hi`LkL*j6XIA z<7VKG_W}OVUv=z%h!0Ww-|GI;*X{q(Gr8krRvc`&%+ z8{>a`HNJ)$lNlJ!#T)DCS`oi4WibDWYUAthScsK;&srAGgfu^U1+1LI$K57rj&Ny> z7dUT%>~m_8jeRX(y5y1wWmP__r)YHEJRW2!=E9_J&b1IIvaPZIc8FB2uss^w-CTS$ zrZzTodu2ppWwb`&Xm|F>I%}oRw>*GI4hX5!1d2kI0z{%B^Z{8;TyOwW!dbYaZPZy- z9+Cf7LsPtnEfW)yM%QNM#83exaH}xc!(M*pzJ}(L?rgZxR@CN8JMWLVCUuT!{5mFlAXdlCs3M94O!LI(QU%DMZyUa`;W?@i%)jY{J! z>o3CJb6mFd(fk%0ul1=M%(9Xz=7Mt020f2fg6+dZ`_pG{pm=29;54Ts1@N94%gPKn zHex*q{CIX%gFK>mkIl9MkPnLpOwWB7K071}U74DOF<~IRp;DqvdjsWr( wu%>e> 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 + + + 4.0.0 + serverless + + com.iluwatar + java-design-patterns + 1.19.0-SNAPSHOT + + + + + com.amazonaws + aws-lambda-java-core + ${aws-lambda-core.version} + + + com.amazonaws + aws-lambda-java-log4j + ${aws-lambda-log4j.version} + + + com.fasterxml.jackson.core + jackson-core + ${jackson.version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + com.fasterxml.jackson.core + jackson-annotations + ${jackson.version} + + + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine + test + + + org.mockito + mockito-core + test + + + junit + junit + test + + + + + + + + org.apache.maven.plugins + maven-shade-plugin + 2.3 + + false + + + + package + + shade + + + ${project.artifactId} + + + + + + + + \ No newline at end of file diff --git a/serverless/serverless.yml b/serverless/serverless.yml new file mode 100644 index 000000000..8f2199d26 --- /dev/null +++ b/serverless/serverless.yml @@ -0,0 +1,49 @@ +# +# The MIT License +# Copyright (c) 2014 Ilkka Seppälä +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# + +service: lambda-info-http-endpoint + +frameworkVersion: ">=1.2.0 <2.0.0" + +provider: + name: aws + runtime: java8 + usagePlan: + quota: + limit: 500 + offset: 2 + period: MONTH + throttle: + burstLimit: 20 + rateLimit: 10 + +package: + artifact: target/serverless.jar + +functions: + currentTime: + handler: com.iluwatar.serverless.api.LambdaInfoApiHandler + events: + - http: + path: info + method: get diff --git a/serverless/src/main/java/com/iluwatar/serverless/ApiGatewayResponse.java b/serverless/src/main/java/com/iluwatar/serverless/ApiGatewayResponse.java new file mode 100644 index 000000000..f20cc13c8 --- /dev/null +++ b/serverless/src/main/java/com/iluwatar/serverless/ApiGatewayResponse.java @@ -0,0 +1,166 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.serverless; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.io.Serializable; +import java.util.Map; + +/** + * Api gateway response + * + * @param serializable object + */ +public class ApiGatewayResponse implements Serializable { + + private static final long serialVersionUID = 1181159426782844892L; + + private final Integer statusCode; + private final String body; + private final Map headers; + private final Boolean isBase64Encoded; + + /** + * api gateway response + * + * @param statusCode - http status code + * @param body - response body + * @param headers - response headers + * @param isBase64Encoded - base64Encoded flag + */ + public ApiGatewayResponse(Integer statusCode, String body, Map headers, + Boolean isBase64Encoded) { + this.statusCode = statusCode; + this.body = body; + this.headers = headers; + this.isBase64Encoded = isBase64Encoded; + } + + /** + * http status code + * + * @return statusCode - http status code + */ + public Integer getStatusCode() { + return statusCode; + } + + /** + * response body + * + * @return string body + */ + public String getBody() { + return body; + } + + /** + * response headers + * + * @return response headers + */ + public Map getHeaders() { + return headers; + } + + /** + * base64Encoded flag, API Gateway expects the property to be called "isBase64Encoded" + * + * @return base64Encoded flag + */ + public Boolean isBase64Encoded() { + return isBase64Encoded; + } + + /** + * ApiGatewayResponse Builder class + * @param Serializable object + */ + public static class ApiGatewayResponseBuilder { + private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + private Integer statusCode; + private T body; + private Map headers; + private Boolean isBase64Encoded; + + /** + * http status code + * @param statusCode - http status code + * @return ApiGatewayResponseBuilder + */ + public ApiGatewayResponseBuilder statusCode(Integer statusCode) { + this.statusCode = statusCode; + return this; + } + + /** + * Serializable body + * @param body - Serializable object + * @return ApiGatewayResponseBuilder + */ + public ApiGatewayResponseBuilder body(T body) { + this.body = body; + return this; + } + + /** + * response headers + * @param headers - response headers + * @return ApiGatewayResponseBuilder + */ + public ApiGatewayResponseBuilder headers(Map headers) { + this.headers = headers; + return this; + } + + /** + * base64Encoded glag + * @param isBase64Encoded - base64Encoded flag + * @return ApiGatewayResponseBuilder + */ + public ApiGatewayResponseBuilder base64Encoded(Boolean isBase64Encoded) { + this.isBase64Encoded = isBase64Encoded; + return this; + } + + /** + * build ApiGatewayResponse + * + * @return ApiGatewayResponse + */ + public ApiGatewayResponse build() { + String strBody = null; + if (this.body != null) { + try { + strBody = OBJECT_MAPPER.writeValueAsString(body); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + + return new ApiGatewayResponse(this.statusCode, strBody, this.headers, this.isBase64Encoded); + } + } +} diff --git a/serverless/src/main/java/com/iluwatar/serverless/LambdaInfo.java b/serverless/src/main/java/com/iluwatar/serverless/LambdaInfo.java new file mode 100644 index 000000000..aedb6f72f --- /dev/null +++ b/serverless/src/main/java/com/iluwatar/serverless/LambdaInfo.java @@ -0,0 +1,140 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.serverless; + +import java.io.Serializable; + +/** + * Lambda context information + */ +public class LambdaInfo implements Serializable { + + private static final long serialVersionUID = 3936130599040848923L; + + private String awsRequestId; + private String logGroupName; + private String logStreamName; + private String functionName; + private String functionVersion; + private Integer memoryLimitInMb; + + public String getAwsRequestId() { + return awsRequestId; + } + + public void setAwsRequestId(String awsRequestId) { + this.awsRequestId = awsRequestId; + } + + public String getLogGroupName() { + return logGroupName; + } + + public void setLogGroupName(String logGroupName) { + this.logGroupName = logGroupName; + } + + public String getLogStreamName() { + return logStreamName; + } + + public void setLogStreamName(String logStreamName) { + this.logStreamName = logStreamName; + } + + public String getFunctionName() { + return functionName; + } + + public void setFunctionName(String functionName) { + this.functionName = functionName; + } + + public String getFunctionVersion() { + return functionVersion; + } + + public void setFunctionVersion(String functionVersion) { + this.functionVersion = functionVersion; + } + + public Integer getMemoryLimitInMb() { + return memoryLimitInMb; + } + + public void setMemoryLimitInMb(Integer memoryLimitInMb) { + this.memoryLimitInMb = memoryLimitInMb; + } + + @Override + public String toString() { + return "LambdaInfo{" + + "awsRequestId='" + awsRequestId + '\'' + + ", logGroupName='" + logGroupName + '\'' + + ", logStreamName='" + logStreamName + '\'' + + ", functionName='" + functionName + '\'' + + ", functionVersion='" + functionVersion + '\'' + + ", memoryLimitInMb=" + memoryLimitInMb + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + LambdaInfo that = (LambdaInfo) o; + + if (awsRequestId != null ? !awsRequestId.equals(that.awsRequestId) : that.awsRequestId != null) { + return false; + } + if (logGroupName != null ? !logGroupName.equals(that.logGroupName) : that.logGroupName != null) { + return false; + } + if (logStreamName != null ? !logStreamName.equals(that.logStreamName) : that.logStreamName != null) { + return false; + } + if (functionName != null ? !functionName.equals(that.functionName) : that.functionName != null) { + return false; + } + if (functionVersion != null ? !functionVersion.equals(that.functionVersion) : that.functionVersion != null) { + return false; + } + return memoryLimitInMb != null ? memoryLimitInMb.equals(that.memoryLimitInMb) : that.memoryLimitInMb == null; + } + + @Override + public int hashCode() { + int result = awsRequestId != null ? awsRequestId.hashCode() : 0; + result = 31 * result + (logGroupName != null ? logGroupName.hashCode() : 0); + result = 31 * result + (logStreamName != null ? logStreamName.hashCode() : 0); + result = 31 * result + (functionName != null ? functionName.hashCode() : 0); + result = 31 * result + (functionVersion != null ? functionVersion.hashCode() : 0); + result = 31 * result + (memoryLimitInMb != null ? memoryLimitInMb.hashCode() : 0); + return result; + } +} diff --git a/serverless/src/main/java/com/iluwatar/serverless/api/LambdaInfoApiHandler.java b/serverless/src/main/java/com/iluwatar/serverless/api/LambdaInfoApiHandler.java new file mode 100644 index 000000000..669601a23 --- /dev/null +++ b/serverless/src/main/java/com/iluwatar/serverless/api/LambdaInfoApiHandler.java @@ -0,0 +1,83 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.serverless.api; + +import com.iluwatar.serverless.ApiGatewayResponse; + +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestHandler; +import com.iluwatar.serverless.LambdaInfo; +import org.apache.log4j.BasicConfigurator; +import org.apache.log4j.Logger; + +import java.util.HashMap; +import java.util.Map; + +/** + * LambdaInfoApiHandler - simple api to get lambda context + * Created by dheeraj.mummar on 2/5/18. + */ +public class LambdaInfoApiHandler implements RequestHandler, ApiGatewayResponse> { + + private static final Logger LOG = Logger.getLogger(LambdaInfoApiHandler.class); + private static final Integer SUCCESS_STATUS_CODE = 200; + + + @Override + public ApiGatewayResponse handleRequest(Map input, Context context) { + BasicConfigurator.configure(); + LOG.info("received: " + input); + + return new ApiGatewayResponse + .ApiGatewayResponseBuilder() + .headers(headers()) + .statusCode(SUCCESS_STATUS_CODE) + .body(lambdaInfo(context)) + .build(); + + } + + /** + * lambdaInfo + * @param context - Lambda context + * @return LambdaInfo + */ + private LambdaInfo lambdaInfo(Context context) { + LambdaInfo lambdaInfo = new LambdaInfo(); + lambdaInfo.setAwsRequestId(context.getAwsRequestId()); + lambdaInfo.setFunctionName(context.getFunctionName()); + lambdaInfo.setFunctionVersion(context.getFunctionVersion()); + lambdaInfo.setLogGroupName(context.getLogGroupName()); + lambdaInfo.setLogStreamName(context.getLogStreamName()); + lambdaInfo.setMemoryLimitInMb(context.getMemoryLimitInMB()); + + return lambdaInfo; + } + + private Map headers() { + Map headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + + return headers; + } +} diff --git a/serverless/src/main/resources/log4j.properties b/serverless/src/main/resources/log4j.properties new file mode 100644 index 000000000..15a25e61b --- /dev/null +++ b/serverless/src/main/resources/log4j.properties @@ -0,0 +1,29 @@ +# +# The MIT License +# Copyright (c) 2014 Ilkka Seppälä +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# + +log = . +log4j.rootLogger = DEBUG, LAMBDA + +log4j.appender.LAMBDA=com.amazonaws.services.lambda.runtime.log4j.LambdaAppender +log4j.appender.LAMBDA.layout=org.apache.log4j.PatternLayout +log4j.appender.LAMBDA.layout.conversionPattern=%d{yyyy-MM-dd HH:mm:ss} <%X{AWSRequestId}> %-5p %c:%L - %m%n diff --git a/serverless/src/test/java/com/iluwatar/serverless/api/LambdaInfoApiHandlerTest.java b/serverless/src/test/java/com/iluwatar/serverless/api/LambdaInfoApiHandlerTest.java new file mode 100644 index 000000000..6c7a03386 --- /dev/null +++ b/serverless/src/test/java/com/iluwatar/serverless/api/LambdaInfoApiHandlerTest.java @@ -0,0 +1,49 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + *

+ * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + *

+ * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + *

+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.serverless.api; + +import com.amazonaws.services.lambda.runtime.Context; +import org.junit.jupiter.api.Test; +import org.junit.runner.RunWith; +import org.mockito.runners.MockitoJUnitRunner; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.IsNull.notNullValue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +/** + * LambdaInfoApiHandlerTest + */ +@RunWith(MockitoJUnitRunner.class) +public class LambdaInfoApiHandlerTest { + + @Test + public void handleRequestWithMockContext() { + LambdaInfoApiHandler lambdaInfoApiHandler = new LambdaInfoApiHandler(); + Context context = mock(Context.class); + when(context.getAwsRequestId()).thenReturn("mock aws request id"); + + assertThat(lambdaInfoApiHandler.handleRequest(null, context), notNullValue()); + } +} \ No newline at end of file From 991ba320a6b2cde1b892e87ebca77be249884560 Mon Sep 17 00:00:00 2001 From: baislsl Date: Mon, 19 Feb 2018 22:01:14 +0800 Subject: [PATCH 02/30] Improve Javadoc --- .../main/java/com/iluwatar/caching/App.java | 6 +-- .../com/iluwatar/dao/InMemoryCustomerDao.java | 2 +- .../main/java/com/iluwatar/databus/App.java | 3 +- .../src/main/java/com/iluwatar/eda/App.java | 2 +- .../java/com/iluwatar/factorykit/App.java | 2 +- .../java/com/iluwatar/featuretoggle/App.java | 2 +- .../featuretoggle/pattern/Service.java | 2 +- .../PropertiesFeatureToggleVersion.java | 2 +- .../TieredFeatureToggleVersion.java | 2 +- .../guarded/suspension/GuardedQueue.java | 2 +- .../com/iluwatar/halfsynchalfasync/App.java | 14 +++---- .../main/java/com/iluwatar/hexagonal/App.java | 10 ++--- .../domainapp/webapp/SimpleApplication.java | 18 ++++----- .../iluwatar/observer/generic/Observable.java | 2 +- .../java/com/iluwatar/reactor/app/App.java | 37 +++++++++++-------- .../com/iluwatar/reactor/app/AppClient.java | 2 +- .../reactor/framework/AbstractNioChannel.java | 2 +- .../reactor/framework/Dispatcher.java | 2 +- .../framework/SameThreadDispatcher.java | 2 +- .../framework/ThreadPoolDispatcher.java | 2 +- .../reader/writer/lock/ReaderWriterLock.java | 4 +- .../acquisition/is/initialization/App.java | 4 +- .../com/iluwatar/servicelocator/Service.java | 2 +- .../main/java/com/iluwatar/singleton/App.java | 12 +++--- .../ThreadSafeDoubleCheckLocking.java | 4 +- .../java/com/iluwatar/stepbuilder/App.java | 12 +++--- .../java/com/iluwatar/threadpool/Worker.java | 2 +- .../java/com/iluwatar/throttling/App.java | 1 - .../com/iluwatar/value/object/HeroStat.java | 4 +- .../iluwatar/value/object/HeroStatTest.java | 7 +++- 30 files changed, 88 insertions(+), 80 deletions(-) diff --git a/caching/src/main/java/com/iluwatar/caching/App.java b/caching/src/main/java/com/iluwatar/caching/App.java index 589b26245..fced38b59 100644 --- a/caching/src/main/java/com/iluwatar/caching/App.java +++ b/caching/src/main/java/com/iluwatar/caching/App.java @@ -52,12 +52,12 @@ import org.slf4j.LoggerFactory; * whether the data is coming from the cache or the DB (i.e. separation of concern). The AppManager * ({@link AppManager}) handles the transaction of data to-and-from the underlying data store * (depending on the preferred caching policy/strategy). - * - * App --> AppManager --> CacheStore/LRUCache/CachingPolicy --> DBManager + *

+ * {@literal App --> AppManager --> CacheStore/LRUCache/CachingPolicy --> DBManager} *

* * @see CacheStore - * @See LRUCache + * @see LruCache * @see CachingPolicy * */ diff --git a/dao/src/main/java/com/iluwatar/dao/InMemoryCustomerDao.java b/dao/src/main/java/com/iluwatar/dao/InMemoryCustomerDao.java index 38acca60f..947da23ca 100644 --- a/dao/src/main/java/com/iluwatar/dao/InMemoryCustomerDao.java +++ b/dao/src/main/java/com/iluwatar/dao/InMemoryCustomerDao.java @@ -31,7 +31,7 @@ import java.util.stream.Stream; /** * An in memory implementation of {@link CustomerDao}, which stores the customers in JVM memory * and data is lost when the application exits. - *
+ *
* This implementation is useful as temporary database or for testing. */ public class InMemoryCustomerDao implements CustomerDao { diff --git a/data-bus/src/main/java/com/iluwatar/databus/App.java b/data-bus/src/main/java/com/iluwatar/databus/App.java index 748bb6af0..b599bdc57 100644 --- a/data-bus/src/main/java/com/iluwatar/databus/App.java +++ b/data-bus/src/main/java/com/iluwatar/databus/App.java @@ -34,8 +34,7 @@ import java.time.LocalDateTime; /** * The Data Bus pattern *

- *

{@see http://wiki.c2.com/?DataBusPattern}

- *

+ * @see http://wiki.c2.com/?DataBusPattern *

The Data-Bus pattern provides a method where different parts of an application may * pass messages between each other without needing to be aware of the other's existence.

*

Similar to the {@code ObserverPattern}, members register themselves with the {@link DataBus} diff --git a/event-driven-architecture/src/main/java/com/iluwatar/eda/App.java b/event-driven-architecture/src/main/java/com/iluwatar/eda/App.java index 5ed2b2ad8..c41b0ed5a 100644 --- a/event-driven-architecture/src/main/java/com/iluwatar/eda/App.java +++ b/event-driven-architecture/src/main/java/com/iluwatar/eda/App.java @@ -33,7 +33,7 @@ import com.iluwatar.eda.model.User; /** * An event-driven architecture (EDA) is a framework that orchestrates behavior around the * production, detection and consumption of events as well as the responses they evoke. An event is - * any identifiable occurrence that has significance for system hardware or software.

The + * any identifiable occurrence that has significance for system hardware or software.

The * example below uses an {@link EventDispatcher} to link/register {@link Event} objects to their * respective handlers once an {@link Event} is dispatched, it's respective handler is invoked and * the {@link Event} is handled accordingly. diff --git a/factory-kit/src/main/java/com/iluwatar/factorykit/App.java b/factory-kit/src/main/java/com/iluwatar/factorykit/App.java index 03a4ece83..766370111 100644 --- a/factory-kit/src/main/java/com/iluwatar/factorykit/App.java +++ b/factory-kit/src/main/java/com/iluwatar/factorykit/App.java @@ -45,7 +45,7 @@ public class App { /** * Program entry point. * - * @param args @param args command line args + * @param args command line args */ public static void main(String[] args) { WeaponFactory factory = WeaponFactory.factory(builder -> { diff --git a/feature-toggle/src/main/java/com/iluwatar/featuretoggle/App.java b/feature-toggle/src/main/java/com/iluwatar/featuretoggle/App.java index 97c184fec..351936b2c 100644 --- a/feature-toggle/src/main/java/com/iluwatar/featuretoggle/App.java +++ b/feature-toggle/src/main/java/com/iluwatar/featuretoggle/App.java @@ -67,7 +67,7 @@ public class App { * @see UserGroup * @see Service * @see PropertiesFeatureToggleVersion - * @see com.iluwatar.featuretoggle.pattern.tieredversion.TieredFeatureToggleVersion; + * @see com.iluwatar.featuretoggle.pattern.tieredversion.TieredFeatureToggleVersion */ public static void main(String[] args) { diff --git a/feature-toggle/src/main/java/com/iluwatar/featuretoggle/pattern/Service.java b/feature-toggle/src/main/java/com/iluwatar/featuretoggle/pattern/Service.java index 9650b9f67..284ccf2ab 100644 --- a/feature-toggle/src/main/java/com/iluwatar/featuretoggle/pattern/Service.java +++ b/feature-toggle/src/main/java/com/iluwatar/featuretoggle/pattern/Service.java @@ -47,7 +47,7 @@ public interface Service { /** * Returns if the welcome message to be displayed will be the enhanced version. * - * @return Boolean {@value true} if enhanced. + * @return Boolean {@code true} if enhanced. */ boolean isEnhanced(); diff --git a/feature-toggle/src/main/java/com/iluwatar/featuretoggle/pattern/propertiesversion/PropertiesFeatureToggleVersion.java b/feature-toggle/src/main/java/com/iluwatar/featuretoggle/pattern/propertiesversion/PropertiesFeatureToggleVersion.java index a474423db..1ded334ec 100644 --- a/feature-toggle/src/main/java/com/iluwatar/featuretoggle/pattern/propertiesversion/PropertiesFeatureToggleVersion.java +++ b/feature-toggle/src/main/java/com/iluwatar/featuretoggle/pattern/propertiesversion/PropertiesFeatureToggleVersion.java @@ -91,7 +91,7 @@ public class PropertiesFeatureToggleVersion implements Service { * see the value of the boolean that was set in the constructor * {@link PropertiesFeatureToggleVersion#PropertiesFeatureToggleVersion(Properties)} * - * @return Boolean value {@value true} if enhanced. + * @return Boolean value {@code true} if enhanced. */ @Override public boolean isEnhanced() { diff --git a/feature-toggle/src/main/java/com/iluwatar/featuretoggle/pattern/tieredversion/TieredFeatureToggleVersion.java b/feature-toggle/src/main/java/com/iluwatar/featuretoggle/pattern/tieredversion/TieredFeatureToggleVersion.java index 42b7412c0..887c9f663 100644 --- a/feature-toggle/src/main/java/com/iluwatar/featuretoggle/pattern/tieredversion/TieredFeatureToggleVersion.java +++ b/feature-toggle/src/main/java/com/iluwatar/featuretoggle/pattern/tieredversion/TieredFeatureToggleVersion.java @@ -65,7 +65,7 @@ public class TieredFeatureToggleVersion implements Service { * is driven by the user group. This method is a little redundant. However can be used to show that there is an * enhanced version available. * - * @return Boolean value {@value true} if enhanced. + * @return Boolean value {@code true} if enhanced. */ @Override public boolean isEnhanced() { diff --git a/guarded-suspension/src/main/java/com/iluwatar/guarded/suspension/GuardedQueue.java b/guarded-suspension/src/main/java/com/iluwatar/guarded/suspension/GuardedQueue.java index bf6142dd9..e75fc6c49 100644 --- a/guarded-suspension/src/main/java/com/iluwatar/guarded/suspension/GuardedQueue.java +++ b/guarded-suspension/src/main/java/com/iluwatar/guarded/suspension/GuardedQueue.java @@ -32,7 +32,7 @@ import java.util.Queue; * Guarded Queue is an implementation for Guarded Suspension Pattern * Guarded suspension pattern is used to handle a situation when you want to execute a method * on an object which is not in a proper state. - * @see http://java-design-patterns.com/patterns/guarded-suspension/ + * @see http://java-design-patterns.com/patterns/guarded-suspension/ */ public class GuardedQueue { private static final Logger LOGGER = LoggerFactory.getLogger(GuardedQueue.class); diff --git a/half-sync-half-async/src/main/java/com/iluwatar/halfsynchalfasync/App.java b/half-sync-half-async/src/main/java/com/iluwatar/halfsynchalfasync/App.java index bf35416ca..90cb5ecbf 100644 --- a/half-sync-half-async/src/main/java/com/iluwatar/halfsynchalfasync/App.java +++ b/half-sync-half-async/src/main/java/com/iluwatar/halfsynchalfasync/App.java @@ -33,31 +33,31 @@ import java.util.concurrent.LinkedBlockingQueue; * {@link AsyncTask} and {@link AsynchronousService}. * *

- * PROBLEM
+ * PROBLEM
* A concurrent system have a mixture of short duration, mid duration and long duration tasks. Mid * or long duration tasks should be performed asynchronously to meet quality of service * requirements. * *

- * INTENT
+ * INTENT
* The intent of this pattern is to separate the the synchronous and asynchronous processing in the * concurrent application by introducing two intercommunicating layers - one for sync and one for * async. This simplifies the programming without unduly affecting the performance. * *

- * APPLICABILITY
+ * APPLICABILITY
* UNIX network subsystems - In operating systems network operations are carried out - * asynchronously with help of hardware level interrupts.
+ * asynchronously with help of hardware level interrupts.
* CORBA - At the asynchronous layer one thread is associated with each socket that is connected * to the client. Thread blocks waiting for CORBA requests from the client. On receiving request it * is inserted in the queuing layer which is then picked up by synchronous layer which processes the - * request and sends response back to the client.
+ * request and sends response back to the client.
* Android AsyncTask framework - Framework provides a way to execute long running blocking * calls, such as downloading a file, in background threads so that the UI thread remains free to - * respond to user inputs.
+ * respond to user inputs.
* *

- * IMPLEMENTATION
+ * IMPLEMENTATION
* The main method creates an asynchronous service which does not block the main thread while the * task is being performed. The main thread continues its work which is similar to Async Method * Invocation pattern. The difference between them is that there is a queuing layer between diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/App.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/App.java index 651498607..6e226a1e1 100644 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/App.java +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/App.java @@ -50,13 +50,13 @@ import com.iluwatar.hexagonal.sampledata.SampleData; * from the services it uses.

* * The primary ports for the application are console interfaces - * {@link ConsoleAdministration} through which the lottery round is - * initiated and run and {@link ConsoleLottery} that allows players to + * {@link com.iluwatar.hexagonal.administration.ConsoleAdministration} through which the lottery round is + * initiated and run and {@link com.iluwatar.hexagonal.service.ConsoleLottery} that allows players to * submit lottery tickets for the draw.

* - * The secondary ports that application core uses are {@link WireTransfers} - * which is a banking service, {@link LotteryEventLog} that delivers - * eventlog as lottery events occur and {@link LotteryTicketRepository} + * The secondary ports that application core uses are {@link com.iluwatar.hexagonal.banking.WireTransfers} + * which is a banking service, {@link com.iluwatar.hexagonal.eventlog.LotteryEventLog} that delivers + * eventlog as lottery events occur and {@link com.iluwatar.hexagonal.database.LotteryTicketRepository} * that is the storage for the lottery tickets. * */ diff --git a/naked-objects/webapp/src/main/java/domainapp/webapp/SimpleApplication.java b/naked-objects/webapp/src/main/java/domainapp/webapp/SimpleApplication.java index 89d316d20..459e4b7de 100644 --- a/naked-objects/webapp/src/main/java/domainapp/webapp/SimpleApplication.java +++ b/naked-objects/webapp/src/main/java/domainapp/webapp/SimpleApplication.java @@ -51,14 +51,14 @@ import de.agilecoders.wicket.themes.markup.html.bootswatch.BootswatchThemeProvid * See: * *

- * <filter>
- *   <filter-name>wicket</filter-name>
- *    <filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>
- *    <init-param>
- *      <param-name>applicationClassName</param-name>
- *      <param-value>webapp.SimpleApplication</param-value>
- *    </init-param>
- * </filter>
+ * <filter>
+ *   <filter-name>wicket</filter-name>
+ *    <filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>
+ *    <init-param>
+ *      <param-name>applicationClassName</param-name>
+ *      <param-value>webapp.SimpleApplication</param-value>
+ *    </init-param>
+ * </filter>
  * 
* */ @@ -69,7 +69,7 @@ public class SimpleApplication extends IsisWicketApplication { /** * uncomment for a (slightly hacky) way of allowing logins using query args, eg: * - * ?user=sven&pass=pass + * {@code ?user=sven&pass=pass} * *

* for demos only, obvious. diff --git a/observer/src/main/java/com/iluwatar/observer/generic/Observable.java b/observer/src/main/java/com/iluwatar/observer/generic/Observable.java index ff204437d..6c14eabec 100644 --- a/observer/src/main/java/com/iluwatar/observer/generic/Observable.java +++ b/observer/src/main/java/com/iluwatar/observer/generic/Observable.java @@ -26,7 +26,7 @@ import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; /** - * Generic observer inspired by Java Generics and Collection by Naftalin & Wadler + * Generic observer inspired by Java Generics and Collection by {@literal Naftalin & Wadler} * * @param Subject * @param Observer diff --git a/reactor/src/main/java/com/iluwatar/reactor/app/App.java b/reactor/src/main/java/com/iluwatar/reactor/app/App.java index 5208dea02..991f14e1f 100644 --- a/reactor/src/main/java/com/iluwatar/reactor/app/App.java +++ b/reactor/src/main/java/com/iluwatar/reactor/app/App.java @@ -39,13 +39,13 @@ import com.iluwatar.reactor.framework.ThreadPoolDispatcher; * Service where it listens on multiple TCP or UDP sockets for incoming log requests. * *

- * INTENT
+ * INTENT
* The Reactor design pattern handles service requests that are delivered concurrently to an * application by one or more clients. The application can register specific handlers for processing * which are called by reactor on specific events. * *

- * PROBLEM
+ * PROBLEM
* Server applications in a distributed system must handle multiple clients that send them service * requests. Following forces need to be resolved: *

    @@ -56,31 +56,36 @@ import com.iluwatar.reactor.framework.ThreadPoolDispatcher; *
* *

- * PARTICIPANTS
+ * PARTICIPANTS
*

    - *
  • Synchronous Event De-multiplexer
  • {@link NioReactor} plays the role of synchronous event - * de-multiplexer. It waits for events on multiple channels registered to it in an event loop. - * + *
  • Synchronous Event De-multiplexer *

    - *

  • Initiation Dispatcher
  • {@link NioReactor} plays this role as the application specific - * {@link ChannelHandler}s are registered to the reactor. - * + * {@link NioReactor} plays the role of synchronous event de-multiplexer. + * It waits for events on multiple channels registered to it in an event loop. + *

    + * + *
  • Initiation Dispatcher *

    - *

  • Handle
  • {@link AbstractNioChannel} acts as a handle that is registered to the reactor. + * {@link NioReactor} plays this role as the application specific {@link ChannelHandler}s are registered to the reactor. + *

    + * + *
  • Handle + *

    + * {@link AbstractNioChannel} acts as a handle that is registered to the reactor. * When any events occur on a handle, reactor calls the appropriate handler. - * + *

    + *
  • + *
  • Event Handler *

    - *

  • Event Handler
  • {@link ChannelHandler} acts as an event handler, which is bound to a + * {@link ChannelHandler} acts as an event handler, which is bound to a * channel and is called back when any event occurs on any of its associated handles. Application * logic resides in event handlers. + *

    + * *
- * - *

* The application utilizes single thread to listen for requests on all ports. It does not create a * separate thread for each client, which provides better scalability under load (number of clients * increase). - * - *

* The example uses Java NIO framework to implement the Reactor. * */ diff --git a/reactor/src/main/java/com/iluwatar/reactor/app/AppClient.java b/reactor/src/main/java/com/iluwatar/reactor/app/AppClient.java index 446628769..1ffa9325b 100644 --- a/reactor/src/main/java/com/iluwatar/reactor/app/AppClient.java +++ b/reactor/src/main/java/com/iluwatar/reactor/app/AppClient.java @@ -108,7 +108,7 @@ public class AppClient { * Creates a new TCP logging client. * * @param clientName the name of the client to be sent in logging requests. - * @param port the port on which client will send logging requests. + * @param serverPort the port on which client will send logging requests. */ public TcpLoggingClient(String clientName, int serverPort) { this.clientName = clientName; diff --git a/reactor/src/main/java/com/iluwatar/reactor/framework/AbstractNioChannel.java b/reactor/src/main/java/com/iluwatar/reactor/framework/AbstractNioChannel.java index aa7d703ce..5cfab9a95 100644 --- a/reactor/src/main/java/com/iluwatar/reactor/framework/AbstractNioChannel.java +++ b/reactor/src/main/java/com/iluwatar/reactor/framework/AbstractNioChannel.java @@ -141,7 +141,7 @@ public abstract class AbstractNioChannel { * when this method returns. It will be written when the channel is flushed. * *

- * This method is used by the {@link ChannelHandler} to send reply back to the client.
+ * This method is used by the {@link ChannelHandler} to send reply back to the client.
* Example: * *

diff --git a/reactor/src/main/java/com/iluwatar/reactor/framework/Dispatcher.java b/reactor/src/main/java/com/iluwatar/reactor/framework/Dispatcher.java
index a3fe187a3..1cb50a197 100644
--- a/reactor/src/main/java/com/iluwatar/reactor/framework/Dispatcher.java
+++ b/reactor/src/main/java/com/iluwatar/reactor/framework/Dispatcher.java
@@ -28,7 +28,7 @@ import java.nio.channels.SelectionKey;
  * Represents the event dispatching strategy. When {@link NioReactor} senses any event on the
  * registered {@link AbstractNioChannel}s then it de-multiplexes the event type, read or write or
  * connect, and then calls the {@link Dispatcher} to dispatch the read events. This decouples the
- * I/O processing from application specific processing. 
+ * I/O processing from application specific processing.
* Dispatcher should call the {@link ChannelHandler} associated with the channel on which event * occurred. * diff --git a/reactor/src/main/java/com/iluwatar/reactor/framework/SameThreadDispatcher.java b/reactor/src/main/java/com/iluwatar/reactor/framework/SameThreadDispatcher.java index 3db4f1e9a..41dd0f684 100644 --- a/reactor/src/main/java/com/iluwatar/reactor/framework/SameThreadDispatcher.java +++ b/reactor/src/main/java/com/iluwatar/reactor/framework/SameThreadDispatcher.java @@ -37,7 +37,7 @@ import java.nio.channels.SelectionKey; public class SameThreadDispatcher implements Dispatcher { /** - * Dispatches the read event in the context of caller thread.
+ * Dispatches the read event in the context of caller thread.
* Note this is a blocking call. It returns only after the associated handler has handled the read * event. */ diff --git a/reactor/src/main/java/com/iluwatar/reactor/framework/ThreadPoolDispatcher.java b/reactor/src/main/java/com/iluwatar/reactor/framework/ThreadPoolDispatcher.java index a43a974c9..82fca0206 100644 --- a/reactor/src/main/java/com/iluwatar/reactor/framework/ThreadPoolDispatcher.java +++ b/reactor/src/main/java/com/iluwatar/reactor/framework/ThreadPoolDispatcher.java @@ -47,7 +47,7 @@ public class ThreadPoolDispatcher implements Dispatcher { /** * Submits the work of dispatching the read event to worker pool, where it gets picked up by - * worker threads.
+ * worker threads.
* Note that this is a non-blocking call and returns immediately. It is not guaranteed that the * event has been handled by associated handler. */ diff --git a/reader-writer-lock/src/main/java/com/iluwatar/reader/writer/lock/ReaderWriterLock.java b/reader-writer-lock/src/main/java/com/iluwatar/reader/writer/lock/ReaderWriterLock.java index b377b2273..f0f5a0090 100644 --- a/reader-writer-lock/src/main/java/com/iluwatar/reader/writer/lock/ReaderWriterLock.java +++ b/reader-writer-lock/src/main/java/com/iluwatar/reader/writer/lock/ReaderWriterLock.java @@ -50,9 +50,9 @@ public class ReaderWriterLock implements ReadWriteLock { /** * Global mutex is used to indicate that whether reader or writer gets the lock in the moment. *

- * 1. When it contains the reference of {@link readerLock}, it means that the lock is acquired by the reader, another + * 1. When it contains the reference of {@link #readerLock}, it means that the lock is acquired by the reader, another * reader can also do the read operation concurrently.
- * 2. When it contains the reference of reference of {@link writerLock}, it means that the lock is acquired by the + * 2. When it contains the reference of reference of {@link #writerLock}, it means that the lock is acquired by the * writer exclusively, no more reader or writer can get the lock. *

* This is the most important field in this class to control the access for reader/writer. diff --git a/resource-acquisition-is-initialization/src/main/java/com/iluwatar/resource/acquisition/is/initialization/App.java b/resource-acquisition-is-initialization/src/main/java/com/iluwatar/resource/acquisition/is/initialization/App.java index 75d5dff27..9817fea44 100644 --- a/resource-acquisition-is-initialization/src/main/java/com/iluwatar/resource/acquisition/is/initialization/App.java +++ b/resource-acquisition-is-initialization/src/main/java/com/iluwatar/resource/acquisition/is/initialization/App.java @@ -33,13 +33,13 @@ import org.slf4j.LoggerFactory; * In RAII resource is tied to object lifetime: resource allocation is done during object creation * while resource deallocation is done during object destruction. *

- * In Java RAII is achieved with try-with-resources statement and interfaces {@link Closeable} and + * In Java RAII is achieved with try-with-resources statement and interfaces {@link java.io.Closeable} and * {@link AutoCloseable}. The try-with-resources statement ensures that each resource is closed at * the end of the statement. Any object that implements {@link java.lang.AutoCloseable}, which * includes all objects which implement {@link java.io.Closeable}, can be used as a resource. * * In this example, {@link SlidingDoor} implements {@link AutoCloseable} and {@link TreasureChest} - * implements {@link Closeable}. Running the example, we can observe that both resources are + * implements {@link java.io.Closeable}. Running the example, we can observe that both resources are * automatically closed. *

* http://docs.oracle.com/javase/7/docs/technotes/guides/language/try-with-resources.html diff --git a/service-locator/src/main/java/com/iluwatar/servicelocator/Service.java b/service-locator/src/main/java/com/iluwatar/servicelocator/Service.java index 006d98ba8..e46e3976a 100644 --- a/service-locator/src/main/java/com/iluwatar/servicelocator/Service.java +++ b/service-locator/src/main/java/com/iluwatar/servicelocator/Service.java @@ -24,7 +24,7 @@ package com.iluwatar.servicelocator; /** * This is going to be the parent service interface which we will use to create our services. All - * services will have a

  • service name
  • unique id
  • execution work flow
  • + * services will have a
    • service name
    • unique id
    • execution work flow
    * * @author saifasif * diff --git a/singleton/src/main/java/com/iluwatar/singleton/App.java b/singleton/src/main/java/com/iluwatar/singleton/App.java index 377c56cca..aa40ee300 100644 --- a/singleton/src/main/java/com/iluwatar/singleton/App.java +++ b/singleton/src/main/java/com/iluwatar/singleton/App.java @@ -28,18 +28,18 @@ import org.slf4j.LoggerFactory; /** * Singleton pattern ensures that the class can have only one existing instance per Java classloader * instance and provides global access to it. - *

    + *

    * One of the risks of this pattern is that bugs resulting from setting a singleton up in a * distributed environment can be tricky to debug, since it will work fine if you debug with a * single classloader. Additionally, these problems can crop up a while after the implementation of * a singleton, since they may start out synchronous and only become async with time, so you it may * not be clear why you are seeing certain changes in behaviour. - *

    + *

    * There are many ways to implement the Singleton. The first one is the eagerly initialized instance * in {@link IvoryTower}. Eager initialization implies that the implementation is thread safe. If * you can afford giving up control of the instantiation moment, then this implementation will suit * you fine. - *

    + *

    * The other option to implement eagerly initialized Singleton is enum based Singleton. The example * is found in {@link EnumIvoryTower}. At first glance the code looks short and simple. However, you * should be aware of the downsides including committing to implementation strategy, extending the @@ -47,16 +47,16 @@ import org.slf4j.LoggerFactory; * Overflow: * http://programmers.stackexchange.com/questions/179386/what-are-the-downsides-of-implementing * -a-singleton-with-javas-enum - *

    + *

    * {@link ThreadSafeLazyLoadedIvoryTower} is a Singleton implementation that is initialized on * demand. The downside is that it is very slow to access since the whole access method is * synchronized. - *

    + *

    * Another Singleton implementation that is initialized on demand is found in * {@link ThreadSafeDoubleCheckLocking}. It is somewhat faster than * {@link ThreadSafeLazyLoadedIvoryTower} since it doesn't synchronize the whole access method but * only the method internals on specific conditions. - *

    + *

    * Yet another way to implement thread safe lazily initialized Singleton can be found in * {@link InitializingOnDemandHolderIdiom}. However, this implementation requires at least Java 8 * API level to work. diff --git a/singleton/src/main/java/com/iluwatar/singleton/ThreadSafeDoubleCheckLocking.java b/singleton/src/main/java/com/iluwatar/singleton/ThreadSafeDoubleCheckLocking.java index 5cfcc1bdc..a7557fda3 100644 --- a/singleton/src/main/java/com/iluwatar/singleton/ThreadSafeDoubleCheckLocking.java +++ b/singleton/src/main/java/com/iluwatar/singleton/ThreadSafeDoubleCheckLocking.java @@ -24,9 +24,9 @@ package com.iluwatar.singleton; /** * Double check locking - *

    + *

    * http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html - *

    + *

    * Broken under Java 1.4. * * @author mortezaadi@gmail.com diff --git a/step-builder/src/main/java/com/iluwatar/stepbuilder/App.java b/step-builder/src/main/java/com/iluwatar/stepbuilder/App.java index b5354e04a..309833e37 100644 --- a/step-builder/src/main/java/com/iluwatar/stepbuilder/App.java +++ b/step-builder/src/main/java/com/iluwatar/stepbuilder/App.java @@ -29,16 +29,16 @@ import org.slf4j.LoggerFactory; * Step Builder Pattern * *

    - * Intent
    + * Intent
    * An extension of the Builder pattern that fully guides the user through the creation of the object - * with no chances of confusion.
    + * with no chances of confusion.
    * The user experience will be much more improved by the fact that he will only see the next step * methods available, NO build method until is the right time to build the object. * *

    - * Implementation - *

      + * Implementation
      * The concept is simple: + *
        * *
      • Write creational steps inner classes or interfaces where each method knows what can be * displayed next.
      • @@ -49,13 +49,13 @@ import org.slf4j.LoggerFactory; *
      * *

      - * Applicability
      + * Applicability
      * Use the Step Builder pattern when the algorithm for creating a complex object should be * independent of the parts that make up the object and how they're assembled the construction * process must allow different representations for the object that's constructed when in the * process of constructing the order is important. *

      - * http://rdafbn.blogspot.co.uk/2012/07/step-builder-pattern_28.html + * @see http://rdafbn.blogspot.co.uk/2012/07/step-builder-pattern_28.html */ public class App { diff --git a/thread-pool/src/main/java/com/iluwatar/threadpool/Worker.java b/thread-pool/src/main/java/com/iluwatar/threadpool/Worker.java index 578800108..9f67a82c9 100644 --- a/thread-pool/src/main/java/com/iluwatar/threadpool/Worker.java +++ b/thread-pool/src/main/java/com/iluwatar/threadpool/Worker.java @@ -27,7 +27,7 @@ import org.slf4j.LoggerFactory; /** * - * Worker implements {@link Runnable} and thus can be executed by {@link ExecutorService} + * Worker implements {@link Runnable} and thus can be executed by {@link java.util.concurrent.ExecutorService} * */ public class Worker implements Runnable { diff --git a/throttling/src/main/java/com/iluwatar/throttling/App.java b/throttling/src/main/java/com/iluwatar/throttling/App.java index 2dce68ab9..d6c619359 100644 --- a/throttling/src/main/java/com/iluwatar/throttling/App.java +++ b/throttling/src/main/java/com/iluwatar/throttling/App.java @@ -72,7 +72,6 @@ public class App { /** * Make calls to the B2BService dummy API - * @param service an instance of B2BService */ private static void makeServiceCalls(Tenant tenant) { Throttler timer = new ThrottleTimerImpl(10); diff --git a/value-object/src/main/java/com/iluwatar/value/object/HeroStat.java b/value-object/src/main/java/com/iluwatar/value/object/HeroStat.java index 0274bc47f..b65fb000e 100644 --- a/value-object/src/main/java/com/iluwatar/value/object/HeroStat.java +++ b/value-object/src/main/java/com/iluwatar/value/object/HeroStat.java @@ -25,7 +25,9 @@ package com.iluwatar.value.object; /** * HeroStat is a value object * - * {@link http://docs.oracle.com/javase/8/docs/api/java/lang/doc-files/ValueBased.html} + * @see + * http://docs.oracle.com/javase/8/docs/api/java/lang/doc-files/ValueBased.html + * */ public class HeroStat { diff --git a/value-object/src/test/java/com/iluwatar/value/object/HeroStatTest.java b/value-object/src/test/java/com/iluwatar/value/object/HeroStatTest.java index f19382d4e..9bfe2d396 100644 --- a/value-object/src/test/java/com/iluwatar/value/object/HeroStatTest.java +++ b/value-object/src/test/java/com/iluwatar/value/object/HeroStatTest.java @@ -37,8 +37,11 @@ public class HeroStatTest { /** * Tester for equals() and hashCode() methods of a class. Using guava's EqualsTester. * - * @see http://static.javadoc.io/com.google.guava/guava-testlib/19.0/com/google/common/testing/ - * EqualsTester.html + * @see + * http://static.javadoc.io/com.google.guava/guava-testlib/19.0/com/google/common/testing/EqualsTester.html + * + * + * */ @Test public void testEquals() { From 49f84349117f1370be4a63800f5ca4f3dab07ebc Mon Sep 17 00:00:00 2001 From: Dheeraj Mummareddy Date: Sun, 4 Mar 2018 17:33:27 -0500 Subject: [PATCH 03/30] Merge branch 'master' of github.com:iluwatar/java-design-patterns --- pom.xml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/pom.xml b/pom.xml index 3d1c5a18f..66c5fa850 100644 --- a/pom.xml +++ b/pom.xml @@ -48,9 +48,6 @@ 3.3.0 1.7.21 1.1.7 - 1.1.0 - 1.0.0 - 2.8.5 abstract-factory @@ -157,7 +154,6 @@ eip-splitter eip-aggregator retry - serverless From af6973884f643712a445bcafd0aaee5c8bf2bb2f Mon Sep 17 00:00:00 2001 From: Dheeraj Mummareddy Date: Sun, 4 Mar 2018 17:46:29 -0500 Subject: [PATCH 04/30] merge from upstream and fixing conflicts --- pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pom.xml b/pom.xml index 7e669d396..f65bd1e6b 100644 --- a/pom.xml +++ b/pom.xml @@ -48,6 +48,9 @@ 3.3.0 1.7.21 1.1.7 + 1.1.0 + 1.0.0 + 2.8.5 abstract-factory @@ -154,6 +157,7 @@ eip-aggregator retry trampoline + serverless From b2dd36f607fa0faa69acf6351067077506553a68 Mon Sep 17 00:00:00 2001 From: Dheeraj Mummareddy Date: Mon, 5 Mar 2018 20:51:32 -0500 Subject: [PATCH 05/30] adding backend as a service with lambda + api gateway + dynamodb --- pom.xml | 2 + serverless/pom.xml | 20 +++ serverless/serverless.yml | 59 ++++++++- .../baas/api/AbstractDynamoDbHandler.java | 79 ++++++++++++ .../baas/api/FindPersonApiHandler.java | 29 +++++ .../baas/api/SavePersonApiHandler.java | 39 ++++++ .../serverless/baas/model/Address.java | 119 ++++++++++++++++++ .../serverless/baas/model/Person.java | 102 +++++++++++++++ .../{ => faas}/ApiGatewayResponse.java | 2 +- .../serverless/{ => faas}/LambdaInfo.java | 2 +- .../{ => faas}/api/LambdaInfoApiHandler.java | 6 +- .../baas/api/FindPersonApiHandlerTest.java | 49 ++++++++ .../baas/api/SavePersonApiHandlerTest.java | 78 ++++++++++++ .../api/LambdaInfoApiHandlerTest.java | 2 +- 14 files changed, 579 insertions(+), 9 deletions(-) create mode 100644 serverless/src/main/java/com/iluwatar/serverless/baas/api/AbstractDynamoDbHandler.java create mode 100644 serverless/src/main/java/com/iluwatar/serverless/baas/api/FindPersonApiHandler.java create mode 100644 serverless/src/main/java/com/iluwatar/serverless/baas/api/SavePersonApiHandler.java create mode 100644 serverless/src/main/java/com/iluwatar/serverless/baas/model/Address.java create mode 100644 serverless/src/main/java/com/iluwatar/serverless/baas/model/Person.java rename serverless/src/main/java/com/iluwatar/serverless/{ => faas}/ApiGatewayResponse.java (99%) rename serverless/src/main/java/com/iluwatar/serverless/{ => faas}/LambdaInfo.java (99%) rename serverless/src/main/java/com/iluwatar/serverless/{ => faas}/api/LambdaInfoApiHandler.java (95%) create mode 100644 serverless/src/test/java/com/illuwatar/serverless/baas/api/FindPersonApiHandlerTest.java create mode 100644 serverless/src/test/java/com/illuwatar/serverless/baas/api/SavePersonApiHandlerTest.java rename serverless/src/test/java/com/iluwatar/serverless/{ => faas}/api/LambdaInfoApiHandlerTest.java (97%) diff --git a/pom.xml b/pom.xml index f65bd1e6b..512b978ef 100644 --- a/pom.xml +++ b/pom.xml @@ -49,7 +49,9 @@ 1.7.21 1.1.7 1.1.0 + 1.11.289 1.0.0 + 2.0.1 2.8.5 diff --git a/serverless/pom.xml b/serverless/pom.xml index 491946e71..85adbc859 100644 --- a/serverless/pom.xml +++ b/serverless/pom.xml @@ -35,6 +35,26 @@ aws-lambda-java-core ${aws-lambda-core.version} + + com.amazonaws + aws-java-sdk-dynamodb + ${aws-java-sdk-dynamodb.version} + + + com.amazonaws + aws-java-sdk-s3 + + + com.amazonaws + aws-java-sdk-kms + + + + + com.amazonaws + aws-lambda-java-events + ${aws-lambda-java-events.version} + com.amazonaws aws-lambda-java-log4j diff --git a/serverless/serverless.yml b/serverless/serverless.yml index 8f2199d26..4affb57a8 100644 --- a/serverless/serverless.yml +++ b/serverless/serverless.yml @@ -21,7 +21,7 @@ # THE SOFTWARE. # -service: lambda-info-http-endpoint +service: serverless-services frameworkVersion: ">=1.2.0 <2.0.0" @@ -41,9 +41,62 @@ package: artifact: target/serverless.jar functions: - currentTime: - handler: com.iluwatar.serverless.api.LambdaInfoApiHandler + lambdaInfoApi: + handler: com.iluwatar.serverless.faas.api.LambdaInfoApiHandler events: - http: path: info method: get + + savePerson: + handler: com.iluwatar.serverless.baas.api.SavePersonApiHandler + events: + - http: + path: api/person + method: post + cors: true + integration: lambda-proxy + + getPerson: + handler: com.iluwatar.serverless.baas.api.FindPersonApiHandlerr + events: + - http: + path: api/person/{id} + method: get + cors: true + integration: lambda-proxy + +resources: + Resources: + DynamoDbTable: + Type: AWS::DynamoDB::Table + Properties: + TableName: persons + AttributeDefinitions: + - AttributeName: id + AttributeType: S + KeySchema: + - AttributeName: id + KeyType: HASH + ProvisionedThroughput: + ReadCapacityUnits: 1 + WriteCapacityUnits: 1 + DynamoDBIamPolicy: + Type: AWS::IAM::Policy + DependsOn: DynamoDbTable + Properties: + PolicyName: lambda-dynamodb + PolicyDocument: + Version: '2012-10-17' + Statement: + - Effect: Allow + Action: + - dynamodb:GetItem + - dynamodb:PutItem + - dynamodb:UpdateItem + - dynamodb:DeleteItem + - dynamodb:Query + - dynamodb:Scan + Resource: arn:aws:dynamodb:*:*:table/persons + Roles: + - Ref: IamRoleLambdaExecution \ No newline at end of file diff --git a/serverless/src/main/java/com/iluwatar/serverless/baas/api/AbstractDynamoDbHandler.java b/serverless/src/main/java/com/iluwatar/serverless/baas/api/AbstractDynamoDbHandler.java new file mode 100644 index 000000000..2ff4ad961 --- /dev/null +++ b/serverless/src/main/java/com/iluwatar/serverless/baas/api/AbstractDynamoDbHandler.java @@ -0,0 +1,79 @@ +package com.iluwatar.serverless.baas.api; + +import com.amazonaws.regions.Regions; +import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; +import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; +import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper; +import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +/** + * abstract dynamodb handler + * @param - serializable collection + */ +public abstract class AbstractDynamoDbHandler { + private DynamoDBMapper dynamoDbMapper; + + private ObjectMapper objectMapper; + + public AbstractDynamoDbHandler() { + this.initAmazonDynamoDb(); + this.objectMapper = new ObjectMapper(); + } + + private void initAmazonDynamoDb() { + AmazonDynamoDB amazonDynamoDb = AmazonDynamoDBClientBuilder + .standard() + .withRegion(Regions.US_EAST_1) + .build(); + + this.dynamoDbMapper = new DynamoDBMapper(amazonDynamoDb); + } + + protected DynamoDBMapper getDynamoDbMapper() { + return this.dynamoDbMapper; + } + + protected ObjectMapper getObjectMapper() { + return objectMapper; + } + + public void setDynamoDbMapper(DynamoDBMapper dynamoDbMapper) { + this.dynamoDbMapper = dynamoDbMapper; + } + + protected Map headers() { + Map headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + + return headers; + } + + /** + * API Gateway response + * + * @param statusCode - status code + * @param body - Object body + * @return - api gateway proxy response + */ + protected APIGatewayProxyResponseEvent apiGatewayProxyResponseEvent(Integer statusCode, T body) { + APIGatewayProxyResponseEvent apiGatewayProxyResponseEvent = + new APIGatewayProxyResponseEvent().withHeaders(headers()); + try { + apiGatewayProxyResponseEvent + .withStatusCode(statusCode) + .withBody(getObjectMapper() + .writeValueAsString(body)); + + } catch (JsonProcessingException jsonProcessingException) { + throw new RuntimeException(jsonProcessingException); + } + + return apiGatewayProxyResponseEvent; + } +} diff --git a/serverless/src/main/java/com/iluwatar/serverless/baas/api/FindPersonApiHandler.java b/serverless/src/main/java/com/iluwatar/serverless/baas/api/FindPersonApiHandler.java new file mode 100644 index 000000000..ef7dd3fec --- /dev/null +++ b/serverless/src/main/java/com/iluwatar/serverless/baas/api/FindPersonApiHandler.java @@ -0,0 +1,29 @@ +package com.iluwatar.serverless.baas.api; + +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestHandler; +import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent; +import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent; +import com.iluwatar.serverless.baas.model.Person; +import org.apache.log4j.Logger; + +/** + * find person from persons collection + * Created by dheeraj.mummar on 3/5/18. + */ +public class FindPersonApiHandler extends AbstractDynamoDbHandler + implements RequestHandler { + + private static final Logger LOG = Logger.getLogger(FindPersonApiHandler.class); + private static final Integer SUCCESS_STATUS_CODE = 200; + + @Override + public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent apiGatewayProxyRequestEvent, + Context context) { + LOG.info(apiGatewayProxyRequestEvent.getPathParameters()); + Person person = this.getDynamoDbMapper().load(Person.class, apiGatewayProxyRequestEvent + .getPathParameters().get("id")); + + return apiGatewayProxyResponseEvent(SUCCESS_STATUS_CODE, person); + } +} diff --git a/serverless/src/main/java/com/iluwatar/serverless/baas/api/SavePersonApiHandler.java b/serverless/src/main/java/com/iluwatar/serverless/baas/api/SavePersonApiHandler.java new file mode 100644 index 000000000..8817f1e48 --- /dev/null +++ b/serverless/src/main/java/com/iluwatar/serverless/baas/api/SavePersonApiHandler.java @@ -0,0 +1,39 @@ +package com.iluwatar.serverless.baas.api; + +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestHandler; +import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent; +import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent; +import com.iluwatar.serverless.baas.model.Person; +import org.apache.log4j.Logger; + +import java.io.IOException; + +/** + * save person into persons collection + * Created by dheeraj.mummar on 3/4/18. + */ +public class SavePersonApiHandler extends AbstractDynamoDbHandler + implements RequestHandler { + + private static final Logger LOG = Logger.getLogger(SavePersonApiHandler.class); + private static final Integer CREATED_STATUS_CODE = 201; + private static final Integer BAD_REQUEST_STATUS_CODE = 400; + + @Override + public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent + apiGatewayProxyRequestEvent, Context context) { + APIGatewayProxyResponseEvent apiGatewayProxyResponseEvent; + Person person; + try { + person = getObjectMapper().readValue(apiGatewayProxyRequestEvent.getBody(), Person.class); + getDynamoDbMapper().save(person); + apiGatewayProxyResponseEvent = apiGatewayProxyResponseEvent(CREATED_STATUS_CODE, person); + } catch (IOException ioException) { + LOG.error("unable to parse body", ioException); + apiGatewayProxyResponseEvent = apiGatewayProxyResponseEvent(BAD_REQUEST_STATUS_CODE, null); + } + + return apiGatewayProxyResponseEvent; + } +} diff --git a/serverless/src/main/java/com/iluwatar/serverless/baas/model/Address.java b/serverless/src/main/java/com/iluwatar/serverless/baas/model/Address.java new file mode 100644 index 000000000..382309823 --- /dev/null +++ b/serverless/src/main/java/com/iluwatar/serverless/baas/model/Address.java @@ -0,0 +1,119 @@ +package com.iluwatar.serverless.baas.model; + +import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute; +import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBDocument; + +import java.io.Serializable; + +/** + * Address Object + * Created by dheeraj.mummarareddy on 3/4/18. + */ +@DynamoDBDocument +public class Address implements Serializable { + + private static final long serialVersionUID = 6760844284799736970L; + + private String addressLineOne; + private String addressLineTwo; + private String city; + private String state; + private String zipCode; + + @DynamoDBAttribute(attributeName = "addressLineOne") + public String getAddressLineOne() { + return addressLineOne; + } + + public void setAddressLineOne(String addressLineOne) { + this.addressLineOne = addressLineOne; + } + + @DynamoDBAttribute(attributeName = "addressLineTwo") + public String getAddressLineTwo() { + return addressLineTwo; + } + + public void setAddressLineTwo(String addressLineTwo) { + this.addressLineTwo = addressLineTwo; + } + + @DynamoDBAttribute(attributeName = "city") + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + @DynamoDBAttribute(attributeName = "state") + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + @DynamoDBAttribute(attributeName = "zipCode") + public String getZipCode() { + return zipCode; + } + + public void setZipCode(String zipCode) { + this.zipCode = zipCode; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (o == null || getClass() != o.getClass()) { + return false; + } + + Address address = (Address) o; + + if (addressLineOne != null ? !addressLineOne.equals(address.addressLineOne) : + address.addressLineOne != null) { + return false; + } + + if (addressLineTwo != null ? !addressLineTwo.equals(address.addressLineTwo) : + address.addressLineTwo != null) { + return false; + } + + if (city != null ? !city.equals(address.city) : address.city != null) { + return false; + } + if (state != null ? !state.equals(address.state) : address.state != null) { + return false; + } + return zipCode != null ? zipCode.equals(address.zipCode) : address.zipCode == null; + } + + @Override + public int hashCode() { + int result = addressLineOne != null ? addressLineOne.hashCode() : 0; + result = 31 * result + (addressLineTwo != null ? addressLineTwo.hashCode() : 0); + result = 31 * result + (city != null ? city.hashCode() : 0); + result = 31 * result + (state != null ? state.hashCode() : 0); + result = 31 * result + (zipCode != null ? zipCode.hashCode() : 0); + return result; + } + + @Override + public String toString() { + return "Address{" + + "addressLineOne='" + addressLineOne + '\'' + + ", addressLineTwo='" + addressLineTwo + '\'' + + ", city='" + city + '\'' + + ", state='" + state + '\'' + + ", zipCode='" + zipCode + '\'' + + '}'; + } +} diff --git a/serverless/src/main/java/com/iluwatar/serverless/baas/model/Person.java b/serverless/src/main/java/com/iluwatar/serverless/baas/model/Person.java new file mode 100644 index 000000000..0c68f3cbe --- /dev/null +++ b/serverless/src/main/java/com/iluwatar/serverless/baas/model/Person.java @@ -0,0 +1,102 @@ +package com.iluwatar.serverless.baas.model; + +import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute; +import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAutoGeneratedKey; +import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey; +import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.io.Serializable; + +/** + * Person Request + * Created by dheeraj.mummarareddy on 3/4/18. + */ +@DynamoDBTable(tableName = "persons") +public class Person implements Serializable { + + private static final long serialVersionUID = -3413087924608627075L; + + private String id; + private String firstName; + private String lastName; + private Address address; + + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + @DynamoDBHashKey(attributeName = "id") + @DynamoDBAutoGeneratedKey + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + @DynamoDBAttribute(attributeName = "firstName") + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + @DynamoDBAttribute(attributeName = "lastName") + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + @DynamoDBAttribute(attributeName = "address") + public Address getAddress() { + return address; + } + + public void setAddress(Address address) { + this.address = address; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + Person person = (Person) o; + + if (firstName != null ? !firstName.equals(person.firstName) : person.firstName != null) { + return false; + } + + if (lastName != null ? !lastName.equals(person.lastName) : person.lastName != null) { + return false; + } + + return address != null ? address.equals(person.address) : person.address == null; + } + + @Override + public int hashCode() { + int result = firstName != null ? firstName.hashCode() : 0; + result = 31 * result + (lastName != null ? lastName.hashCode() : 0); + result = 31 * result + (address != null ? address.hashCode() : 0); + return result; + } + + @Override + public String toString() { + return "Person{" + + "id='" + id + '\'' + + ", firstName='" + firstName + '\'' + + ", lastName='" + lastName + '\'' + + ", address=" + address + + '}'; + } +} diff --git a/serverless/src/main/java/com/iluwatar/serverless/ApiGatewayResponse.java b/serverless/src/main/java/com/iluwatar/serverless/faas/ApiGatewayResponse.java similarity index 99% rename from serverless/src/main/java/com/iluwatar/serverless/ApiGatewayResponse.java rename to serverless/src/main/java/com/iluwatar/serverless/faas/ApiGatewayResponse.java index f20cc13c8..98e2de64f 100644 --- a/serverless/src/main/java/com/iluwatar/serverless/ApiGatewayResponse.java +++ b/serverless/src/main/java/com/iluwatar/serverless/faas/ApiGatewayResponse.java @@ -20,7 +20,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.iluwatar.serverless; +package com.iluwatar.serverless.faas; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/serverless/src/main/java/com/iluwatar/serverless/LambdaInfo.java b/serverless/src/main/java/com/iluwatar/serverless/faas/LambdaInfo.java similarity index 99% rename from serverless/src/main/java/com/iluwatar/serverless/LambdaInfo.java rename to serverless/src/main/java/com/iluwatar/serverless/faas/LambdaInfo.java index aedb6f72f..03932a9f0 100644 --- a/serverless/src/main/java/com/iluwatar/serverless/LambdaInfo.java +++ b/serverless/src/main/java/com/iluwatar/serverless/faas/LambdaInfo.java @@ -20,7 +20,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.iluwatar.serverless; +package com.iluwatar.serverless.faas; import java.io.Serializable; diff --git a/serverless/src/main/java/com/iluwatar/serverless/api/LambdaInfoApiHandler.java b/serverless/src/main/java/com/iluwatar/serverless/faas/api/LambdaInfoApiHandler.java similarity index 95% rename from serverless/src/main/java/com/iluwatar/serverless/api/LambdaInfoApiHandler.java rename to serverless/src/main/java/com/iluwatar/serverless/faas/api/LambdaInfoApiHandler.java index 669601a23..67e1835f9 100644 --- a/serverless/src/main/java/com/iluwatar/serverless/api/LambdaInfoApiHandler.java +++ b/serverless/src/main/java/com/iluwatar/serverless/faas/api/LambdaInfoApiHandler.java @@ -20,13 +20,13 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.iluwatar.serverless.api; +package com.iluwatar.serverless.faas.api; -import com.iluwatar.serverless.ApiGatewayResponse; +import com.iluwatar.serverless.faas.ApiGatewayResponse; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; -import com.iluwatar.serverless.LambdaInfo; +import com.iluwatar.serverless.faas.LambdaInfo; import org.apache.log4j.BasicConfigurator; import org.apache.log4j.Logger; diff --git a/serverless/src/test/java/com/illuwatar/serverless/baas/api/FindPersonApiHandlerTest.java b/serverless/src/test/java/com/illuwatar/serverless/baas/api/FindPersonApiHandlerTest.java new file mode 100644 index 000000000..6d8343db1 --- /dev/null +++ b/serverless/src/test/java/com/illuwatar/serverless/baas/api/FindPersonApiHandlerTest.java @@ -0,0 +1,49 @@ +package com.illuwatar.serverless.baas.api; + +import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent; +import com.iluwatar.serverless.baas.api.FindPersonApiHandler; +import com.iluwatar.serverless.baas.api.SavePersonApiHandler; +import com.iluwatar.serverless.baas.model.Person; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; + +import java.util.Collections; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +/** + * Created by dheeraj.mummar on 3/5/18. + */ +@RunWith(MockitoJUnitRunner.class) +public class FindPersonApiHandlerTest { + + private FindPersonApiHandler findPersonApiHandler; + + @Mock + private DynamoDBMapper dynamoDbMapper; + + @Before + public void setUp() { + this.findPersonApiHandler = new FindPersonApiHandler(); + this.findPersonApiHandler.setDynamoDbMapper(dynamoDbMapper); + } + + @Test + public void handleRequest() { + findPersonApiHandler.handleRequest(apiGatewayProxyRequestEvent(), mock(Context.class)); + verify(dynamoDbMapper, times(1)).load(Person.class, "37e7a1fe-3544-473d-b764-18128f02d72d"); + } + + private APIGatewayProxyRequestEvent apiGatewayProxyRequestEvent() { + return new APIGatewayProxyRequestEvent() + .withPathParamters(Collections + .singletonMap("id", "37e7a1fe-3544-473d-b764-18128f02d72d")); + } +} diff --git a/serverless/src/test/java/com/illuwatar/serverless/baas/api/SavePersonApiHandlerTest.java b/serverless/src/test/java/com/illuwatar/serverless/baas/api/SavePersonApiHandlerTest.java new file mode 100644 index 000000000..43bda53dc --- /dev/null +++ b/serverless/src/test/java/com/illuwatar/serverless/baas/api/SavePersonApiHandlerTest.java @@ -0,0 +1,78 @@ +package com.illuwatar.serverless.baas.api; + +import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent; +import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.iluwatar.serverless.baas.api.SavePersonApiHandler; +import com.iluwatar.serverless.baas.model.Address; +import com.iluwatar.serverless.baas.model.Person; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; + +import static org.mockito.Mockito.*; + +/** + * Created by dheeraj.mummar on 3/4/18. + */ +@RunWith(MockitoJUnitRunner.class) +public class SavePersonApiHandlerTest { + + private SavePersonApiHandler savePersonApiHandler; + + @Mock + private DynamoDBMapper dynamoDbMapper; + + private ObjectMapper objectMapper = new ObjectMapper(); + + @Before + public void setUp() { + this.savePersonApiHandler = new SavePersonApiHandler(); + this.savePersonApiHandler.setDynamoDbMapper(dynamoDbMapper); + } + + @Test + public void handleRequestSavePersonSuccessful() throws JsonProcessingException { + Person person = newPerson(); + APIGatewayProxyResponseEvent apiGatewayProxyResponseEvent = + this.savePersonApiHandler + .handleRequest(apiGatewayProxyRequestEvent(objectMapper.writeValueAsString(person)), mock(Context.class)); + verify(dynamoDbMapper, times(1)).save(person); + Assert.assertNotNull(apiGatewayProxyResponseEvent); + Assert.assertEquals(new Integer(201), apiGatewayProxyResponseEvent.getStatusCode()); + } + + @Test + public void handleRequestSavePersonException() { + APIGatewayProxyResponseEvent apiGatewayProxyResponseEvent = + this.savePersonApiHandler + .handleRequest(apiGatewayProxyRequestEvent("invalid sample request"), mock(Context.class)); + Assert.assertNotNull(apiGatewayProxyResponseEvent); + Assert.assertEquals(new Integer(400), apiGatewayProxyResponseEvent.getStatusCode()); + } + + private APIGatewayProxyRequestEvent apiGatewayProxyRequestEvent(String body) { + APIGatewayProxyRequestEvent apiGatewayProxyRequestEvent = new APIGatewayProxyRequestEvent(); + return apiGatewayProxyRequestEvent.withBody(body); + } + + private Person newPerson() { + Person person = new Person(); + person.setFirstName("Thor"); + person.setLastName("Odinson"); + Address address = new Address(); + address.setAddressLineOne("1 Odin ln"); + address.setCity("Asgard"); + address.setState("country of the Gods"); + address.setZipCode("00001"); + person.setAddress(address); + + return person; + } +} diff --git a/serverless/src/test/java/com/iluwatar/serverless/api/LambdaInfoApiHandlerTest.java b/serverless/src/test/java/com/iluwatar/serverless/faas/api/LambdaInfoApiHandlerTest.java similarity index 97% rename from serverless/src/test/java/com/iluwatar/serverless/api/LambdaInfoApiHandlerTest.java rename to serverless/src/test/java/com/iluwatar/serverless/faas/api/LambdaInfoApiHandlerTest.java index 6c7a03386..ddf186a25 100644 --- a/serverless/src/test/java/com/iluwatar/serverless/api/LambdaInfoApiHandlerTest.java +++ b/serverless/src/test/java/com/iluwatar/serverless/faas/api/LambdaInfoApiHandlerTest.java @@ -20,7 +20,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.iluwatar.serverless.api; +package com.iluwatar.serverless.faas.api; import com.amazonaws.services.lambda.runtime.Context; import org.junit.jupiter.api.Test; From b2607010b4adacb47496fe1981e875fef24d044d Mon Sep 17 00:00:00 2001 From: Dheeraj Mummareddy Date: Mon, 5 Mar 2018 21:23:42 -0500 Subject: [PATCH 06/30] update readme and ready for review --- serverless/README.md | 71 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 67 insertions(+), 4 deletions(-) diff --git a/serverless/README.md b/serverless/README.md index 75fc40ac0..506f766fe 100644 --- a/serverless/README.md +++ b/serverless/README.md @@ -14,6 +14,26 @@ tags: Serverless eliminates the need to plan for infrastructure and let's you focus on your application. +Following are optimization katas you should be aware of while building a serverless +applications + +* The Lean function + * Concise logic + * Efficient/single purpose code + * ephemeral environment +* Eventful Invocations + * Succinct payloads + * resilient routing + * concurrent execution +* Coordinated calls + * Decoupled via APIs + * scale-matched downstream + * secured +* Serviceful operations + * Automated operations + * monitored applications + * Innovation mindset + ## Intent Whether to reduce your infrastructure costs, shrink the time you spend on ops tasks, @@ -58,6 +78,10 @@ an Event. Most of the Serverless Cloud Providers support following Events AWS supports processing event generated from AWS Services (S3/Cloudwatch/etc) and using aws as a compute engine is our first choice. +## (Backend as a Service or "BaaS") +This example creates a backend for ‘persons’ collection which uses DynamoDB NoSQL +database service also provided by Amazon. + ## AWS lambda function implementation AWS lambda SDK provides pre-defined interface `com.amazonaws.services.lambda.runtime @@ -97,16 +121,23 @@ dependencies of the function. * `mvn clean package` * `serverless deploy --stage=dev --verbose` -Based on the configuration in `serverless.yml` serverless framework creates a -cloud formation stack for S3 (ServerlessDeploymentBucket), IAM Role -(IamRoleLambdaExecution), cloud watch (log groups), API Gateway (ApiGatewayRestApi) -and the Lambda function. +Based on the configuration in `serverless.yml` serverless framework creates following +resources +* cloud formation stack for S3 (ServerlessDeploymentBucket) +* IAM Role (IamRoleLambdaExecution) +* cloud watch (log groups) +* API Gateway (ApiGatewayRestApi) +* Lambda function +* DynamoDB collection The command will print out Stack Outputs which looks something like this ```yaml endpoints: GET - https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/info + POST - https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/api/person + GET - https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/api/person/{id} + ``` ```yaml @@ -116,6 +147,38 @@ ServerlessDeploymentBucketName: lambda-info-http-endpoin-serverlessdeploymentbuc ``` access the endpoint to invoke the function. +Use the following cURL commands to test the endpoints + +```cURL +curl -X GET \ + https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/info \ + -H 'cache-control: no-cache' +``` + +```cURL +curl -X POST \ + https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/api/person \ + -H 'cache-control: no-cache' \ + -H 'content-type: application/json' \ + -d '{ + "firstName": "Thor", + "lastName": "Odinson", + "address": { + "addressLineOne": "1 Odin ln", + "addressLineTwo": "100", + "city": "Asgard", + "state": "country of the Gods", + "zipCode": "00001" + } +}' +``` + +```cURL +curl -X GET \ + https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/api/person/{id} \ + -H 'cache-control: no-cache' +``` + ## Credits * [serverless docs](https://serverless.com/framework/docs/) From 678fa93838dd149eac61a71f1a5dee58ddce0584 Mon Sep 17 00:00:00 2001 From: Dheeraj Mummareddy Date: Mon, 5 Mar 2018 21:25:08 -0500 Subject: [PATCH 07/30] update readme and thanks to Amazon Web Services & cloud guru --- serverless/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/serverless/README.md b/serverless/README.md index 506f766fe..9c3825369 100644 --- a/serverless/README.md +++ b/serverless/README.md @@ -182,4 +182,5 @@ curl -X GET \ ## Credits * [serverless docs](https://serverless.com/framework/docs/) -* [Serverless Architectures](https://martinfowler.com/articles/serverless.html) \ No newline at end of file +* [Serverless Architectures](https://martinfowler.com/articles/serverless.html) +* [Serverless Black Belt](https://youtu.be/oQFORsso2go) \ No newline at end of file From 143213483c6e1ba13fa8c1bb2cc5008b7414960e Mon Sep 17 00:00:00 2001 From: Dheeraj Mummareddy Date: Mon, 5 Mar 2018 21:41:24 -0500 Subject: [PATCH 08/30] fixing typo --- serverless/serverless.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/serverless/serverless.yml b/serverless/serverless.yml index 4affb57a8..c463395df 100644 --- a/serverless/serverless.yml +++ b/serverless/serverless.yml @@ -58,7 +58,7 @@ functions: integration: lambda-proxy getPerson: - handler: com.iluwatar.serverless.baas.api.FindPersonApiHandlerr + handler: com.iluwatar.serverless.baas.api.FindPersonApiHandler events: - http: path: api/person/{id} From e0b8f6f85059779f80f166305574759cb28488ab Mon Sep 17 00:00:00 2001 From: baislsl Date: Tue, 6 Mar 2018 16:09:22 +0800 Subject: [PATCH 09/30] fix checkstyle --- .../src/test/java/com/iluwatar/mediator/PartyMemberTest.java | 2 +- reactor/src/main/java/com/iluwatar/reactor/app/App.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/mediator/src/test/java/com/iluwatar/mediator/PartyMemberTest.java b/mediator/src/test/java/com/iluwatar/mediator/PartyMemberTest.java index 61f926c31..03db825e9 100644 --- a/mediator/src/test/java/com/iluwatar/mediator/PartyMemberTest.java +++ b/mediator/src/test/java/com/iluwatar/mediator/PartyMemberTest.java @@ -110,7 +110,7 @@ public class PartyMemberTest { } /** - * Verify if {@link PartyMember#toString()} generate the expected output + * Verify if {@link PartyMemberBase#toString()} generate the expected output */ @ParameterizedTest @MethodSource("dataProvider") diff --git a/reactor/src/main/java/com/iluwatar/reactor/app/App.java b/reactor/src/main/java/com/iluwatar/reactor/app/App.java index 991f14e1f..03b4a747f 100644 --- a/reactor/src/main/java/com/iluwatar/reactor/app/App.java +++ b/reactor/src/main/java/com/iluwatar/reactor/app/App.java @@ -66,7 +66,8 @@ import com.iluwatar.reactor.framework.ThreadPoolDispatcher; * *

    • Initiation Dispatcher *

      - * {@link NioReactor} plays this role as the application specific {@link ChannelHandler}s are registered to the reactor. + * {@link NioReactor} plays this role as the application specific {@link ChannelHandler}s + * are registered to the reactor. *

      *
    • *
    • Handle From 696ed86affe8e04a681d05077877f3f5b8191f09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Manuel=20Su=C3=A1rez?= Date: Wed, 7 Mar 2018 00:19:33 -0300 Subject: [PATCH 10/30] Captain is implementing RowingBoat - Adapter pattern Captain and RowingBoat aren't interchangable. Captain, as a client, may have a method to use the boat, but it isn't needed that they share the same interface, as it makes the code more confusing. --- adapter/src/main/java/com/iluwatar/adapter/Captain.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adapter/src/main/java/com/iluwatar/adapter/Captain.java b/adapter/src/main/java/com/iluwatar/adapter/Captain.java index 369016980..29140cfdc 100644 --- a/adapter/src/main/java/com/iluwatar/adapter/Captain.java +++ b/adapter/src/main/java/com/iluwatar/adapter/Captain.java @@ -26,7 +26,7 @@ package com.iluwatar.adapter; * The Captain uses {@link RowingBoat} to sail.
      * This is the client in the pattern. */ -public class Captain implements RowingBoat { +public class Captain { private RowingBoat rowingBoat; From 915a1f3eb0d251cfa9c432cd0a582278f698cd84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Manuel=20Su=C3=A1rez?= Date: Wed, 7 Mar 2018 17:26:39 -0300 Subject: [PATCH 11/30] Forgot to delete row's @Override My bad, sorry. It should compile now. --- adapter/src/main/java/com/iluwatar/adapter/Captain.java | 1 - 1 file changed, 1 deletion(-) diff --git a/adapter/src/main/java/com/iluwatar/adapter/Captain.java b/adapter/src/main/java/com/iluwatar/adapter/Captain.java index 29140cfdc..8593ca321 100644 --- a/adapter/src/main/java/com/iluwatar/adapter/Captain.java +++ b/adapter/src/main/java/com/iluwatar/adapter/Captain.java @@ -40,7 +40,6 @@ public class Captain { this.rowingBoat = rowingBoat; } - @Override public void row() { rowingBoat.row(); } From 87cb33f69b0d612e029ee454253f3a7cbce05fb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Manuel=20Su=C3=A1rez?= Date: Wed, 7 Mar 2018 17:43:03 -0300 Subject: [PATCH 12/30] Fixed tests --- .../src/test/java/com/iluwatar/adapter/AdapterPatternTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adapter/src/test/java/com/iluwatar/adapter/AdapterPatternTest.java b/adapter/src/test/java/com/iluwatar/adapter/AdapterPatternTest.java index 033440b81..82a951e30 100644 --- a/adapter/src/test/java/com/iluwatar/adapter/AdapterPatternTest.java +++ b/adapter/src/test/java/com/iluwatar/adapter/AdapterPatternTest.java @@ -66,7 +66,7 @@ public class AdapterPatternTest { */ @Test public void testAdapter() { - RowingBoat captain = (RowingBoat) beans.get(ROWING_BEAN); + Captain captain = (Captain) beans.get(ROWING_BEAN); // when captain moves captain.row(); From 960d2ea6f70d1f38e269e711aff3877c4bb5430c Mon Sep 17 00:00:00 2001 From: anthonycampbell Date: Thu, 8 Mar 2018 15:52:35 -0800 Subject: [PATCH 13/30] solution to issue #602. Implemented multiton with enum, added example to app.java, a test for the enum, and commented my code --- .../com/iluwatar/multiton/NazgulEnum.java | 33 ++++++++++++ .../com/iluwatar/multiton/NazgulEnumTest.java | 50 +++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 multiton/src/main/java/com/iluwatar/multiton/NazgulEnum.java create mode 100644 multiton/src/test/java/com/iluwatar/multiton/NazgulEnumTest.java diff --git a/multiton/src/main/java/com/iluwatar/multiton/NazgulEnum.java b/multiton/src/main/java/com/iluwatar/multiton/NazgulEnum.java new file mode 100644 index 000000000..375176c4f --- /dev/null +++ b/multiton/src/main/java/com/iluwatar/multiton/NazgulEnum.java @@ -0,0 +1,33 @@ +/** + * The MIT License + * Copyright (c) 2014-2016 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.multiton; + +/** + * enum based multiton implementation + * + */ +public enum NazgulEnum { + + KHAMUL, MURAZOR, DWAR, JI_INDUR, AKHORAHIL, HOARMURATH, ADUNAPHEL, REN, UVATHA; + +} diff --git a/multiton/src/test/java/com/iluwatar/multiton/NazgulEnumTest.java b/multiton/src/test/java/com/iluwatar/multiton/NazgulEnumTest.java new file mode 100644 index 000000000..b718b9c68 --- /dev/null +++ b/multiton/src/test/java/com/iluwatar/multiton/NazgulEnumTest.java @@ -0,0 +1,50 @@ +/** + * The MIT License + * Copyright (c) 2014-2016 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.multiton; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +/** + * @author anthony + * + */ +class NazgulEnumTest { + + /** + * Check that multiple calls to any one of the instances in the multiton returns + * only that one particular instance, and do that for all instances in multiton + */ + @Test + public void testTheSameObjectIsReturnedWithMultipleCalls() { + for (int i = 0; i < NazgulEnum.values().length; i++) { + NazgulEnum instance1 = NazgulEnum.values()[i]; + NazgulEnum instance2 = NazgulEnum.values()[i]; + NazgulEnum instance3 = NazgulEnum.values()[i]; + assertSame(instance1, instance2); + assertSame(instance1, instance3); + assertSame(instance2, instance3); + } + } +} From ac57d67f45c1017b24117ec0dc491787df936a42 Mon Sep 17 00:00:00 2001 From: anthonycampbell Date: Thu, 8 Mar 2018 16:08:09 -0800 Subject: [PATCH 14/30] solution to issue #602. Implemented multiton with enum, added example to app.java, a test for the enum, and commented my code --- .../main/java/com/iluwatar/multiton/App.java | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/multiton/src/main/java/com/iluwatar/multiton/App.java b/multiton/src/main/java/com/iluwatar/multiton/App.java index 28b89e6ab..18821af66 100644 --- a/multiton/src/main/java/com/iluwatar/multiton/App.java +++ b/multiton/src/main/java/com/iluwatar/multiton/App.java @@ -31,9 +31,12 @@ import org.slf4j.LoggerFactory; * pattern defines many globally accessible objects. The client asks for the correct instance from * the Multiton by passing an enumeration as parameter. *

      - * In this example {@link Nazgul} is the Multiton and we can ask single {@link Nazgul} from it using - * {@link NazgulName}. The {@link Nazgul}s are statically initialized and stored in concurrent hash - * map. + * There is more than one way to implement the multiton design pattern. In the first example + * {@link Nazgul} is the Multiton and we can ask single {@link Nazgul} from it using {@link NazgulName}. + * The {@link Nazgul}s are statically initialized and stored in concurrent hash map. + *

      + * In the enum implementation {@link NazgulEnum} is the multiton. It is static and mutable because + * of the way java supports enums. * */ public class App { @@ -46,6 +49,7 @@ public class App { * @param args command line args */ public static void main(String[] args) { + // eagerly initialized multiton LOGGER.info("KHAMUL={}", Nazgul.getInstance(NazgulName.KHAMUL)); LOGGER.info("MURAZOR={}", Nazgul.getInstance(NazgulName.MURAZOR)); LOGGER.info("DWAR={}", Nazgul.getInstance(NazgulName.DWAR)); @@ -55,5 +59,16 @@ public class App { LOGGER.info("ADUNAPHEL={}", Nazgul.getInstance(NazgulName.ADUNAPHEL)); LOGGER.info("REN={}", Nazgul.getInstance(NazgulName.REN)); LOGGER.info("UVATHA={}", Nazgul.getInstance(NazgulName.UVATHA)); + + // enum multiton + LOGGER.info("KHAMUL={}", NazgulEnum.KHAMUL); + LOGGER.info("MURAZOR={}", NazgulEnum.MURAZOR); + LOGGER.info("DWAR={}", NazgulEnum.DWAR); + LOGGER.info("JI_INDUR={}", NazgulEnum.JI_INDUR); + LOGGER.info("AKHORAHIL={}", NazgulEnum.AKHORAHIL); + LOGGER.info("HOARMURATH={}", NazgulEnum.HOARMURATH); + LOGGER.info("ADUNAPHEL={}", NazgulEnum.ADUNAPHEL); + LOGGER.info("REN={}", NazgulEnum.REN); + LOGGER.info("UVATHA={}", NazgulEnum.UVATHA); } } From 3f9a5a254ec40b1073f48711f798df5eae3ec45c Mon Sep 17 00:00:00 2001 From: Dheeraj Mummareddy Date: Tue, 13 Mar 2018 12:03:23 -0400 Subject: [PATCH 15/30] code review comments --- serverless/README.md | 43 ++++++++++++------- .../serverless/baas/model/Address.java | 2 +- .../serverless/baas/model/Person.java | 2 +- .../baas/api/FindPersonApiHandlerTest.java | 1 + .../baas/api/SavePersonApiHandlerTest.java | 1 + .../faas/api/LambdaInfoApiHandlerTest.java | 2 +- 6 files changed, 33 insertions(+), 18 deletions(-) diff --git a/serverless/README.md b/serverless/README.md index 9c3825369..14f833317 100644 --- a/serverless/README.md +++ b/serverless/README.md @@ -18,21 +18,33 @@ Following are optimization katas you should be aware of while building a serverl applications * The Lean function - * Concise logic - * Efficient/single purpose code - * ephemeral environment + * Concise logic - Use functions to transform, not transport (utilize some of the + integration available from the provider to transport), and make sure you read only + what you need + * Efficient/single purpose code - avoid conditional/routing logic and break down + into individual functions, avoid "fat"/monolithic functions and control the + dependencies in the function deployment package to reduce the load time for your + function + * ephemeral environment - Utilize container start for expensive initializations * Eventful Invocations - * Succinct payloads - * resilient routing - * concurrent execution + * Succinct payloads - Scrutinize the event as much as possible, and watch for + payload constraints (async - 128K) + * resilient routing - Understand retry policies and leverage dead letter queues + (SQS or SNS for replays) and remember retries count as invocations + * concurrent execution - lambda thinks of it's scale in terms of concurrency and + its not request based/duration based. Lambda will spin up the number of instances + based on the request. * Coordinated calls - * Decoupled via APIs - * scale-matched downstream - * secured + * Decoupled via APIs - best practice to setup your application is to have API's as + contracts that ensures separation of concerns + * scale-matched downstream - make sure when Lambda is calling downstream + components, you are matching scale configuration to it (by specifying max + concurrency based on downstream services) + * secured - Always ask a question, do I need a VPC? * Serviceful operations - * Automated operations - * monitored applications - * Innovation mindset + * Automated - use automated tools to manage and maintain the stack + * monitored applications - use monitoring services to get holistic view of your + serverless applications ## Intent @@ -84,7 +96,8 @@ database service also provided by Amazon. ## AWS lambda function implementation -AWS lambda SDK provides pre-defined interface `com.amazonaws.services.lambda.runtime +[https://aws.amazon.com/sdk-for-java/](AWS Lambda SDK) provides pre-defined interface +`com.amazonaws.services.lambda.runtime .RequestHandler` to implement our lambda function. ```java @@ -123,9 +136,9 @@ dependencies of the function. Based on the configuration in `serverless.yml` serverless framework creates following resources -* cloud formation stack for S3 (ServerlessDeploymentBucket) +* CloudFormation stack for S3 (ServerlessDeploymentBucket) * IAM Role (IamRoleLambdaExecution) -* cloud watch (log groups) +* CloudWatch (log groups) * API Gateway (ApiGatewayRestApi) * Lambda function * DynamoDB collection diff --git a/serverless/src/main/java/com/iluwatar/serverless/baas/model/Address.java b/serverless/src/main/java/com/iluwatar/serverless/baas/model/Address.java index 382309823..6d6503df5 100644 --- a/serverless/src/main/java/com/iluwatar/serverless/baas/model/Address.java +++ b/serverless/src/main/java/com/iluwatar/serverless/baas/model/Address.java @@ -6,7 +6,7 @@ import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBDocument; import java.io.Serializable; /** - * Address Object + * Address class * Created by dheeraj.mummarareddy on 3/4/18. */ @DynamoDBDocument diff --git a/serverless/src/main/java/com/iluwatar/serverless/baas/model/Person.java b/serverless/src/main/java/com/iluwatar/serverless/baas/model/Person.java index 0c68f3cbe..82a1c96b1 100644 --- a/serverless/src/main/java/com/iluwatar/serverless/baas/model/Person.java +++ b/serverless/src/main/java/com/iluwatar/serverless/baas/model/Person.java @@ -9,7 +9,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import java.io.Serializable; /** - * Person Request + * Person class * Created by dheeraj.mummarareddy on 3/4/18. */ @DynamoDBTable(tableName = "persons") diff --git a/serverless/src/test/java/com/illuwatar/serverless/baas/api/FindPersonApiHandlerTest.java b/serverless/src/test/java/com/illuwatar/serverless/baas/api/FindPersonApiHandlerTest.java index 6d8343db1..fbc1e75c9 100644 --- a/serverless/src/test/java/com/illuwatar/serverless/baas/api/FindPersonApiHandlerTest.java +++ b/serverless/src/test/java/com/illuwatar/serverless/baas/api/FindPersonApiHandlerTest.java @@ -19,6 +19,7 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; /** + * Unit tests for FindPersonApiHandler * Created by dheeraj.mummar on 3/5/18. */ @RunWith(MockitoJUnitRunner.class) diff --git a/serverless/src/test/java/com/illuwatar/serverless/baas/api/SavePersonApiHandlerTest.java b/serverless/src/test/java/com/illuwatar/serverless/baas/api/SavePersonApiHandlerTest.java index 43bda53dc..02b2b729d 100644 --- a/serverless/src/test/java/com/illuwatar/serverless/baas/api/SavePersonApiHandlerTest.java +++ b/serverless/src/test/java/com/illuwatar/serverless/baas/api/SavePersonApiHandlerTest.java @@ -19,6 +19,7 @@ import org.mockito.runners.MockitoJUnitRunner; import static org.mockito.Mockito.*; /** + * Unit tests for SavePersonApiHandler * Created by dheeraj.mummar on 3/4/18. */ @RunWith(MockitoJUnitRunner.class) diff --git a/serverless/src/test/java/com/iluwatar/serverless/faas/api/LambdaInfoApiHandlerTest.java b/serverless/src/test/java/com/iluwatar/serverless/faas/api/LambdaInfoApiHandlerTest.java index ddf186a25..876489ed2 100644 --- a/serverless/src/test/java/com/iluwatar/serverless/faas/api/LambdaInfoApiHandlerTest.java +++ b/serverless/src/test/java/com/iluwatar/serverless/faas/api/LambdaInfoApiHandlerTest.java @@ -33,7 +33,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; /** - * LambdaInfoApiHandlerTest + * Unit tests for LambdaInfoApiHandler */ @RunWith(MockitoJUnitRunner.class) public class LambdaInfoApiHandlerTest { From 69be74c016e0eff325b848fe6912d133e208d769 Mon Sep 17 00:00:00 2001 From: valery1707 Date: Wed, 14 Mar 2018 20:20:15 +0300 Subject: [PATCH 16/30] Update SonarCloud badge Update link into badge URL as described in https://about.sonarcloud.io/news/2018/02/05/new-project-badges.html --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 03aea2bf6..4ec0f33bd 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ [![Build status](https://travis-ci.org/iluwatar/java-design-patterns.svg?branch=master)](https://travis-ci.org/iluwatar/java-design-patterns) [![License MIT](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/iluwatar/java-design-patterns/master/LICENSE.md) [![Join the chat at https://gitter.im/iluwatar/java-design-patterns](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/iluwatar/java-design-patterns?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -[![Quality Gate](https://sonarcloud.io/api/badges/gate?key=com.iluwatar%3Ajava-design-patterns)](https://sonarcloud.io/dashboard/index/com.iluwatar%3Ajava-design-patterns) +[![Quality Gate](https://sonarcloud.io/api/project_badges/measure?project=com.iluwatar%3Ajava-design-patterns&metric=alert_status)](https://sonarcloud.io/dashboard/index/com.iluwatar%3Ajava-design-patterns) [![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/1503/badge)](https://bestpractices.coreinfrastructure.org/projects/1503) # Introduction From c3b102e547535a5410250b264f35020c176d6e1b Mon Sep 17 00:00:00 2001 From: Dheeraj Mummareddy Date: Wed, 14 Mar 2018 19:22:39 -0400 Subject: [PATCH 17/30] fixing the link --- serverless/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/serverless/README.md b/serverless/README.md index 14f833317..55391f3ec 100644 --- a/serverless/README.md +++ b/serverless/README.md @@ -96,7 +96,7 @@ database service also provided by Amazon. ## AWS lambda function implementation -[https://aws.amazon.com/sdk-for-java/](AWS Lambda SDK) provides pre-defined interface +[AWS Lambda SDK](https://aws.amazon.com/sdk-for-java/) provides pre-defined interface `com.amazonaws.services.lambda.runtime .RequestHandler` to implement our lambda function. From ecad8647035c39dfc068c79c3d026b5fd8c7a50c Mon Sep 17 00:00:00 2001 From: S177LM Date: Tue, 20 Mar 2018 19:51:04 +0100 Subject: [PATCH 18/30] Fixed typo Just fixed a little repetition in the javadoc comment. --- monad/src/main/java/com/iluwatar/monad/App.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monad/src/main/java/com/iluwatar/monad/App.java b/monad/src/main/java/com/iluwatar/monad/App.java index 9b1ed5096..29dd1d31f 100644 --- a/monad/src/main/java/com/iluwatar/monad/App.java +++ b/monad/src/main/java/com/iluwatar/monad/App.java @@ -50,7 +50,7 @@ public class App { /** * Program entry point. * - * @param args @param args command line args + * @param args command line args */ public static void main(String[] args) { User user = new User("user", 24, Sex.FEMALE, "foobar.com"); From 86ee59c23202692a3d4814e1a7df119c8a1ce430 Mon Sep 17 00:00:00 2001 From: Wes Gilleland Date: Wed, 28 Mar 2018 01:35:43 -0400 Subject: [PATCH 19/30] Add Java annotation to code blocks in README files --- abstract-factory/README.md | 8 ++++---- adapter/README.md | 8 ++++---- bridge/README.md | 6 +++--- builder/README.md | 8 ++++---- chain/README.md | 20 ++++++++++++-------- composite/README.md | 6 +++--- decorator/README.md | 6 +++--- facade/README.md | 6 +++--- factory-method/README.md | 4 ++-- flyweight/README.md | 6 +++--- prototype/README.md | 4 ++-- proxy/README.md | 8 ++++---- singleton/README.md | 4 ++-- 13 files changed, 49 insertions(+), 45 deletions(-) diff --git a/abstract-factory/README.md b/abstract-factory/README.md index 423988b58..0bf86dfa6 100644 --- a/abstract-factory/README.md +++ b/abstract-factory/README.md @@ -34,7 +34,7 @@ Wikipedia says Translating the kingdom example above. First of all we have some interfaces and implementation for the objects in the kingdom -``` +```java public interface Castle { String getDescription(); } @@ -74,7 +74,7 @@ public class ElfArmy implements Army { Then we have the abstraction and implementations for the kingdom factory -``` +```java public interface KingdomFactory { Castle createCastle(); King createKing(); @@ -108,7 +108,7 @@ public class OrcKingdomFactory implements KingdomFactory { Now we have our abstract factory that lets us make family of related objects i.e. Elven kingdom factory creates Elven castle, king and army etc. -``` +```java KingdomFactory factory = new ElfKingdomFactory(); Castle castle = factory.createCastle(); King king = factory.createKing(); @@ -123,7 +123,7 @@ Now, we can design a factory for our different kingdom factories. In this exampl The client can use FactoryMaker to create the desired concrete factory which, in turn, will produce different concrete objects (Army, King, Castle). In this example, we also used an enum to parameterize which type of kingdom factory the client will ask for. -``` +```java public static class FactoryMaker { public enum KingdomType { diff --git a/adapter/README.md b/adapter/README.md index 3344490ff..e943baba5 100644 --- a/adapter/README.md +++ b/adapter/README.md @@ -40,7 +40,7 @@ Consider a captain that can only use rowing boats and cannot sail at all. First we have interfaces `RowingBoat` and `FishingBoat` -``` +```java public interface RowingBoat { void row(); } @@ -55,7 +55,7 @@ public class FishingBoat { And captain expects an implementation of `RowingBoat` interface to be able to move -``` +```java public class Captain implements RowingBoat { private RowingBoat rowingBoat; @@ -73,7 +73,7 @@ public class Captain implements RowingBoat { Now let's say the pirates are coming and our captain needs to escape but there is only fishing boat available. We need to create an adapter that allows the captain to operate the fishing boat with his rowing boat skills. -``` +```java public class FishingBoatAdapter implements RowingBoat { private static final Logger LOGGER = LoggerFactory.getLogger(FishingBoatAdapter.class); @@ -93,7 +93,7 @@ public class FishingBoatAdapter implements RowingBoat { And now the `Captain` can use the `FishingBoat` to escape the pirates. -``` +```java Captain captain = new Captain(new FishingBoatAdapter()); captain.row(); ``` diff --git a/bridge/README.md b/bridge/README.md index bce723971..cfbbcf0d9 100644 --- a/bridge/README.md +++ b/bridge/README.md @@ -34,7 +34,7 @@ Wikipedia says Translating our weapon example from above. Here we have the `Weapon` hierarchy -``` +```java public interface Weapon { void wield(); void swing(); @@ -109,7 +109,7 @@ public class Hammer implements Weapon { And the separate enchantment hierarchy -``` +```java public interface Enchantment { void onActivate(); void apply(); @@ -155,7 +155,7 @@ public class SoulEatingEnchantment implements Enchantment { And both the hierarchies in action -``` +```java Sword enchantedSword = new Sword(new SoulEatingEnchantment()); enchantedSword.wield(); enchantedSword.swing(); diff --git a/builder/README.md b/builder/README.md index 51495619b..b775f1064 100644 --- a/builder/README.md +++ b/builder/README.md @@ -31,7 +31,7 @@ Wikipedia says Having said that let me add a bit about what telescoping constructor anti-pattern is. At one point or the other we have all seen a constructor like below: -``` +```java public Hero(Profession profession, String name, HairType hairType, HairColor hairColor, Armor armor, Weapon weapon) { } ``` @@ -42,7 +42,7 @@ As you can see the number of constructor parameters can quickly get out of hand The sane alternative is to use the Builder pattern. First of all we have our hero that we want to create -``` +```java public final class Hero { private final Profession profession; private final String name; @@ -64,7 +64,7 @@ public final class Hero { And then we have the builder -``` +```java public static class Builder { private final Profession profession; private final String name; @@ -109,7 +109,7 @@ And then we have the builder And then it can be used as: -``` +```java Hero mage = new Hero.Builder(Profession.MAGE, "Riobard").withHairColor(HairColor.BLACK).withWeapon(Weapon.DAGGER).build(); ``` diff --git a/chain/README.md b/chain/README.md index 6bca81610..ff08acdf7 100644 --- a/chain/README.md +++ b/chain/README.md @@ -33,7 +33,7 @@ Wikipedia says Translating our example with orcs from above. First we have the request class -``` +```java public class Request { private final RequestType requestType; @@ -64,7 +64,7 @@ public enum RequestType { Then the request handler hierarchy -``` +```java public abstract class RequestHandler { private static final Logger LOGGER = LoggerFactory.getLogger(RequestHandler.class); private RequestHandler next; @@ -114,7 +114,7 @@ public class OrcCommander extends RequestHandler { Then we have the Orc King who gives the orders and forms the chain -``` +```java public class OrcKing { RequestHandler chain; @@ -134,11 +134,15 @@ public class OrcKing { Then it is used as follows -``` -OrcKing king = new OrcKing(); -king.makeRequest(new Request(RequestType.DEFEND_CASTLE, "defend castle")); // Orc commander handling request "defend castle" -king.makeRequest(new Request(RequestType.TORTURE_PRISONER, "torture prisoner")); // Orc officer handling request "torture prisoner" -king.makeRequest(new Request(RequestType.COLLECT_TAX, "collect tax")); // Orc soldier handling request "collect tax" +```java +public class Main() { + public static void main(String[] args) { + OrcKing king = new OrcKing(); + king.makeRequest(new Request(RequestType.DEFEND_CASTLE, "defend castle")); // Orc commander handling request "defend castle" + king.makeRequest(new Request(RequestType.TORTURE_PRISONER, "torture prisoner")); // Orc officer handling request "torture prisoner" + king.makeRequest(new Request(RequestType.COLLECT_TAX, "collect tax")); // Orc soldier handling request "collect tax" + } +} ``` ## Applicability diff --git a/composite/README.md b/composite/README.md index e4f45ddd0..05ee70cbb 100644 --- a/composite/README.md +++ b/composite/README.md @@ -33,7 +33,7 @@ Wikipedia says Taking our sentence example from above. Here we have the base class and different printable types -``` +```java public abstract class LetterComposite { private List children = new ArrayList<>(); public void add(LetterComposite letter) { @@ -91,7 +91,7 @@ public class Sentence extends LetterComposite { Then we have a messenger to carry messages -``` +```java public class Messenger { LetterComposite messageFromOrcs() { List words = new ArrayList<>(); @@ -122,7 +122,7 @@ public class Messenger { And then it can be used as -``` +```java LetterComposite orcMessage = new Messenger().messageFromOrcs(); orcMessage.print(); // Where there is a whip there is a way. LetterComposite elfMessage = new Messenger().messageFromElves(); diff --git a/decorator/README.md b/decorator/README.md index dcf49dbf5..9998b9938 100644 --- a/decorator/README.md +++ b/decorator/README.md @@ -36,7 +36,7 @@ Wikipedia says Let's take the troll example. First of all we have a simple troll implementing the troll interface -``` +```java public interface Troll { void attack(); int getAttackPower(); @@ -66,7 +66,7 @@ public class SimpleTroll implements Troll { Next we want to add club for the troll. We can do it dynamically by using a decorator -``` +```java public class ClubbedTroll implements Troll { private static final Logger LOGGER = LoggerFactory.getLogger(ClubbedTroll.class); @@ -97,7 +97,7 @@ public class ClubbedTroll implements Troll { Here's the troll in action -``` +```java // simple troll Troll troll = new SimpleTroll(); troll.attack(); // The troll tries to grab you! diff --git a/facade/README.md b/facade/README.md index 7caa89d94..505ceee39 100644 --- a/facade/README.md +++ b/facade/README.md @@ -32,7 +32,7 @@ Wikipedia says Taking our goldmine example from above. Here we have the dwarven mine worker hierarchy -``` +```java public abstract class DwarvenMineWorker { private static final Logger LOGGER = LoggerFactory.getLogger(DwarvenMineWorker.class); @@ -140,7 +140,7 @@ public class DwarvenCartOperator extends DwarvenMineWorker { To operate all these goldmine workers we have the facade -``` +```java public class DwarvenGoldmineFacade { private final List workers; @@ -175,7 +175,7 @@ public class DwarvenGoldmineFacade { Now to use the facade -``` +```java DwarvenGoldmineFacade facade = new DwarvenGoldmineFacade(); facade.startNewDay(); // Dwarf gold digger wakes up. diff --git a/factory-method/README.md b/factory-method/README.md index ab3739ac3..087221fb9 100644 --- a/factory-method/README.md +++ b/factory-method/README.md @@ -35,7 +35,7 @@ Wikipedia says Taking our blacksmith example above. First of all we have a blacksmith interface and some implementations for it -``` +```java public interface Blacksmith { Weapon manufactureWeapon(WeaponType weaponType); } @@ -55,7 +55,7 @@ public class OrcBlacksmith implements Blacksmith { Now as the customers come the correct type of blacksmith is summoned and requested weapons are manufactured -``` +```java Blacksmith blacksmith = new ElfBlacksmith(); blacksmith.manufactureWeapon(WeaponType.SPEAR); blacksmith.manufactureWeapon(WeaponType.AXE); diff --git a/flyweight/README.md b/flyweight/README.md index d65995755..e008fc346 100644 --- a/flyweight/README.md +++ b/flyweight/README.md @@ -32,7 +32,7 @@ Wikipedia says Translating our alchemist shop example from above. First of all we have different potion types -``` +```java public interface Potion { void drink(); } @@ -64,7 +64,7 @@ public class InvisibilityPotion implements Potion { Then the actual Flyweight object which is the factory for creating potions -``` +```java public class PotionFactory { private final Map potions; @@ -100,7 +100,7 @@ public class PotionFactory { And it can be used as below -``` +```java PotionFactory factory = new PotionFactory(); factory.createPotion(PotionType.INVISIBILITY).drink(); // You become invisible. (Potion=6566818) factory.createPotion(PotionType.HEALING).drink(); // You feel healed. (Potion=648129364) diff --git a/prototype/README.md b/prototype/README.md index 4bfeebe19..483a5e469 100644 --- a/prototype/README.md +++ b/prototype/README.md @@ -33,7 +33,7 @@ In short, it allows you to create a copy of an existing object and modify it to In Java, it can be easily done by implementing `Cloneable` and overriding `clone` from `Object` -``` +```java class Sheep implements Cloneable { private String name; public Sheep(String name) { this.name = name; } @@ -48,7 +48,7 @@ class Sheep implements Cloneable { Then it can be cloned like below -``` +```java Sheep original = new Sheep("Jolly"); System.out.println(original.getName()); // Jolly diff --git a/proxy/README.md b/proxy/README.md index 80593c75e..e0628344a 100644 --- a/proxy/README.md +++ b/proxy/README.md @@ -34,7 +34,7 @@ Wikipedia says Taking our wizard tower example from above. Firstly we have the wizard tower interface and the ivory tower class -``` +```java public interface WizardTower { void enter(Wizard wizard); @@ -53,7 +53,7 @@ public class IvoryTower implements WizardTower { Then a simple wizard class -``` +```java public class Wizard { private final String name; @@ -71,7 +71,7 @@ public class Wizard { Then we have the proxy to add access control to wizard tower -``` +```java public class WizardTowerProxy implements WizardTower { private static final Logger LOGGER = LoggerFactory.getLogger(WizardTowerProxy.class); @@ -100,7 +100,7 @@ public class WizardTowerProxy implements WizardTower { And here is tower entering scenario -``` +```java WizardTowerProxy proxy = new WizardTowerProxy(new IvoryTower()); proxy.enter(new Wizard("Red wizard")); // Red wizard enters the tower. proxy.enter(new Wizard("White wizard")); // White wizard enters the tower. diff --git a/singleton/README.md b/singleton/README.md index 90a845846..52aca8e16 100644 --- a/singleton/README.md +++ b/singleton/README.md @@ -34,7 +34,7 @@ Joshua Bloch, Effective Java 2nd Edition p.18 > A single-element enum type is the best way to implement a singleton -``` +```java public enum EnumIvoryTower { INSTANCE; } @@ -42,7 +42,7 @@ public enum EnumIvoryTower { Then in order to use -``` +```java EnumIvoryTower enumIvoryTower1 = EnumIvoryTower.INSTANCE; EnumIvoryTower enumIvoryTower2 = EnumIvoryTower.INSTANCE; assertEquals(enumIvoryTower1, enumIvoryTower2); // true From 8b06ea52ab2915725635a5fb34c1468f9787d422 Mon Sep 17 00:00:00 2001 From: Wes Gilleland Date: Wed, 28 Mar 2018 01:41:43 -0400 Subject: [PATCH 20/30] Removed unnecessary changes outside of scope of the task --- chain/README.md | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/chain/README.md b/chain/README.md index ff08acdf7..eb434aea8 100644 --- a/chain/README.md +++ b/chain/README.md @@ -135,14 +135,10 @@ public class OrcKing { Then it is used as follows ```java -public class Main() { - public static void main(String[] args) { - OrcKing king = new OrcKing(); - king.makeRequest(new Request(RequestType.DEFEND_CASTLE, "defend castle")); // Orc commander handling request "defend castle" - king.makeRequest(new Request(RequestType.TORTURE_PRISONER, "torture prisoner")); // Orc officer handling request "torture prisoner" - king.makeRequest(new Request(RequestType.COLLECT_TAX, "collect tax")); // Orc soldier handling request "collect tax" - } -} +OrcKing king = new OrcKing(); +king.makeRequest(new Request(RequestType.DEFEND_CASTLE, "defend castle")); // Orc commander handling request "defend castle" +king.makeRequest(new Request(RequestType.TORTURE_PRISONER, "torture prisoner")); // Orc officer handling request "torture prisoner" +king.makeRequest(new Request(RequestType.COLLECT_TAX, "collect tax")); // Orc soldier handling request "collect tax" ``` ## Applicability From 17ea0b17f68e6d20917dfd2937db28de83d9bf27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sat, 31 Mar 2018 10:16:56 +0300 Subject: [PATCH 21/30] Disable flaky tests mentioned in issue #643 and #699 --- .../test/java/com/iluwatar/balking/WashingMachineTest.java | 2 ++ .../src/test/java/com/iluwatar/throttling/B2BServiceTest.java | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/balking/src/test/java/com/iluwatar/balking/WashingMachineTest.java b/balking/src/test/java/com/iluwatar/balking/WashingMachineTest.java index 47957835d..9a13b8b2d 100644 --- a/balking/src/test/java/com/iluwatar/balking/WashingMachineTest.java +++ b/balking/src/test/java/com/iluwatar/balking/WashingMachineTest.java @@ -22,6 +22,7 @@ */ package com.iluwatar.balking; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import java.util.concurrent.ExecutorService; @@ -37,6 +38,7 @@ public class WashingMachineTest { private volatile WashingMachineState machineStateGlobal; + @Disabled @Test public void wash() throws Exception { WashingMachine washingMachine = new WashingMachine(); diff --git a/throttling/src/test/java/com/iluwatar/throttling/B2BServiceTest.java b/throttling/src/test/java/com/iluwatar/throttling/B2BServiceTest.java index 0c15bac6e..18dee50a0 100644 --- a/throttling/src/test/java/com/iluwatar/throttling/B2BServiceTest.java +++ b/throttling/src/test/java/com/iluwatar/throttling/B2BServiceTest.java @@ -24,6 +24,7 @@ package com.iluwatar.throttling; import com.iluwatar.throttling.timer.ThrottleTimerImpl; import com.iluwatar.throttling.timer.Throttler; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -32,7 +33,8 @@ import static org.junit.jupiter.api.Assertions.assertTrue; * B2BServiceTest class to test the B2BService */ public class B2BServiceTest { - + + @Disabled @Test public void dummyCustomerApiTest() { Tenant tenant = new Tenant("testTenant", 2); From 474c218f85e034271b728272e5f33cbcd981389f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sat, 31 Mar 2018 10:25:58 +0300 Subject: [PATCH 22/30] Update license headers --- .../com/iluwatar/trampoline/Trampoline.java | 22 +++++++++++++++++++ .../trampoline/TrampolineAppTest.java | 22 +++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/trampoline/src/main/java/com/iluwatar/trampoline/Trampoline.java b/trampoline/src/main/java/com/iluwatar/trampoline/Trampoline.java index 277ae9ffb..b4b7c2b2f 100644 --- a/trampoline/src/main/java/com/iluwatar/trampoline/Trampoline.java +++ b/trampoline/src/main/java/com/iluwatar/trampoline/Trampoline.java @@ -1,3 +1,25 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ package com.iluwatar.trampoline; import java.util.stream.Stream; diff --git a/trampoline/src/test/java/com/iluwatar/trampoline/TrampolineAppTest.java b/trampoline/src/test/java/com/iluwatar/trampoline/TrampolineAppTest.java index 553e583e1..3680be72e 100644 --- a/trampoline/src/test/java/com/iluwatar/trampoline/TrampolineAppTest.java +++ b/trampoline/src/test/java/com/iluwatar/trampoline/TrampolineAppTest.java @@ -1,3 +1,25 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ package com.iluwatar.trampoline; import org.junit.Test; From 34073926644e25342c162ffa674b8787e378c78d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sat, 31 Mar 2018 10:34:25 +0300 Subject: [PATCH 23/30] Reach milestone 1.19.0 --- abstract-document/pom.xml | 2 +- abstract-factory/pom.xml | 2 +- adapter/pom.xml | 2 +- aggregator-microservices/aggregator-service/pom.xml | 2 +- aggregator-microservices/information-microservice/pom.xml | 2 +- aggregator-microservices/inventory-microservice/pom.xml | 2 +- aggregator-microservices/pom.xml | 2 +- api-gateway/api-gateway-service/pom.xml | 2 +- api-gateway/image-microservice/pom.xml | 2 +- api-gateway/pom.xml | 2 +- api-gateway/price-microservice/pom.xml | 2 +- async-method-invocation/pom.xml | 2 +- balking/pom.xml | 2 +- bridge/pom.xml | 2 +- builder/pom.xml | 2 +- business-delegate/pom.xml | 2 +- caching/pom.xml | 2 +- callback/pom.xml | 2 +- chain/pom.xml | 2 +- command/pom.xml | 2 +- composite/pom.xml | 2 +- converter/pom.xml | 2 +- cqrs/pom.xml | 2 +- dao/pom.xml | 2 +- data-bus/pom.xml | 2 +- data-mapper/pom.xml | 2 +- data-transfer-object/pom.xml | 2 +- decorator/pom.xml | 2 +- delegation/pom.xml | 2 +- dependency-injection/pom.xml | 2 +- double-checked-locking/pom.xml | 2 +- double-dispatch/pom.xml | 2 +- eip-aggregator/pom.xml | 2 +- eip-splitter/pom.xml | 2 +- eip-wire-tap/pom.xml | 2 +- event-aggregator/pom.xml | 2 +- event-asynchronous/pom.xml | 2 +- event-driven-architecture/pom.xml | 2 +- event-queue/pom.xml | 2 +- event-sourcing/pom.xml | 2 +- execute-around/pom.xml | 2 +- extension-objects/pom.xml | 2 +- facade/pom.xml | 2 +- factory-kit/pom.xml | 2 +- factory-method/pom.xml | 2 +- feature-toggle/pom.xml | 2 +- fluentinterface/pom.xml | 2 +- flux/pom.xml | 2 +- flyweight/pom.xml | 2 +- front-controller/pom.xml | 2 +- guarded-suspension/pom.xml | 2 +- half-sync-half-async/pom.xml | 2 +- hexagonal/pom.xml | 2 +- intercepting-filter/pom.xml | 2 +- interpreter/pom.xml | 2 +- iterator/pom.xml | 2 +- layers/pom.xml | 2 +- lazy-loading/pom.xml | 2 +- marker/pom.xml | 2 +- mediator/pom.xml | 2 +- memento/pom.xml | 2 +- message-channel/pom.xml | 2 +- model-view-controller/pom.xml | 2 +- model-view-presenter/pom.xml | 2 +- module/pom.xml | 2 +- monad/pom.xml | 2 +- monostate/pom.xml | 2 +- multiton/pom.xml | 2 +- mute-idiom/pom.xml | 2 +- mutex/pom.xml | 2 +- naked-objects/dom/pom.xml | 2 +- naked-objects/fixture/pom.xml | 2 +- naked-objects/integtests/pom.xml | 2 +- naked-objects/pom.xml | 8 ++++---- naked-objects/webapp/pom.xml | 2 +- null-object/pom.xml | 2 +- object-mother/pom.xml | 2 +- object-pool/pom.xml | 2 +- observer/pom.xml | 2 +- page-object/pom.xml | 2 +- partial-response/pom.xml | 2 +- poison-pill/pom.xml | 2 +- pom.xml | 2 +- private-class-data/pom.xml | 2 +- producer-consumer/pom.xml | 2 +- promise/pom.xml | 2 +- property/pom.xml | 2 +- prototype/pom.xml | 2 +- proxy/pom.xml | 2 +- publish-subscribe/pom.xml | 2 +- queue-load-leveling/pom.xml | 2 +- reactor/pom.xml | 2 +- reader-writer-lock/pom.xml | 2 +- repository/pom.xml | 2 +- resource-acquisition-is-initialization/pom.xml | 2 +- retry/pom.xml | 2 +- semaphore/pom.xml | 2 +- servant/pom.xml | 2 +- service-layer/pom.xml | 2 +- service-locator/pom.xml | 2 +- singleton/pom.xml | 2 +- specification/pom.xml | 2 +- state/pom.xml | 2 +- step-builder/pom.xml | 2 +- strategy/pom.xml | 2 +- template-method/pom.xml | 2 +- thread-pool/pom.xml | 2 +- throttling/pom.xml | 2 +- tls/pom.xml | 2 +- tolerant-reader/pom.xml | 2 +- trampoline/pom.xml | 2 +- twin/pom.xml | 2 +- unit-of-work/pom.xml | 2 +- value-object/pom.xml | 2 +- visitor/pom.xml | 2 +- 115 files changed, 118 insertions(+), 118 deletions(-) diff --git a/abstract-document/pom.xml b/abstract-document/pom.xml index a249f0d07..072ff5432 100644 --- a/abstract-document/pom.xml +++ b/abstract-document/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.19.0-SNAPSHOT + 1.19.0 abstract-document diff --git a/abstract-factory/pom.xml b/abstract-factory/pom.xml index 073879acc..13ec80067 100644 --- a/abstract-factory/pom.xml +++ b/abstract-factory/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 abstract-factory diff --git a/adapter/pom.xml b/adapter/pom.xml index 95b9a3e99..32260ba3e 100644 --- a/adapter/pom.xml +++ b/adapter/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 adapter diff --git a/aggregator-microservices/aggregator-service/pom.xml b/aggregator-microservices/aggregator-service/pom.xml index d338f47b9..a5192047b 100644 --- a/aggregator-microservices/aggregator-service/pom.xml +++ b/aggregator-microservices/aggregator-service/pom.xml @@ -29,7 +29,7 @@ aggregator-microservices com.iluwatar - 1.19.0-SNAPSHOT + 1.19.0 4.0.0 diff --git a/aggregator-microservices/information-microservice/pom.xml b/aggregator-microservices/information-microservice/pom.xml index 3879681b7..a3ddb763c 100644 --- a/aggregator-microservices/information-microservice/pom.xml +++ b/aggregator-microservices/information-microservice/pom.xml @@ -29,7 +29,7 @@ aggregator-microservices com.iluwatar - 1.19.0-SNAPSHOT + 1.19.0 4.0.0 diff --git a/aggregator-microservices/inventory-microservice/pom.xml b/aggregator-microservices/inventory-microservice/pom.xml index 3f212e2e9..e7b4000ab 100644 --- a/aggregator-microservices/inventory-microservice/pom.xml +++ b/aggregator-microservices/inventory-microservice/pom.xml @@ -29,7 +29,7 @@ aggregator-microservices com.iluwatar - 1.19.0-SNAPSHOT + 1.19.0 4.0.0 diff --git a/aggregator-microservices/pom.xml b/aggregator-microservices/pom.xml index 364b02566..ffa80e442 100644 --- a/aggregator-microservices/pom.xml +++ b/aggregator-microservices/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.19.0-SNAPSHOT + 1.19.0 4.0.0 aggregator-microservices diff --git a/api-gateway/api-gateway-service/pom.xml b/api-gateway/api-gateway-service/pom.xml index a035f11a2..d54bdb90c 100644 --- a/api-gateway/api-gateway-service/pom.xml +++ b/api-gateway/api-gateway-service/pom.xml @@ -29,7 +29,7 @@ api-gateway com.iluwatar - 1.19.0-SNAPSHOT + 1.19.0 4.0.0 api-gateway-service diff --git a/api-gateway/image-microservice/pom.xml b/api-gateway/image-microservice/pom.xml index ad248943d..2feab1060 100644 --- a/api-gateway/image-microservice/pom.xml +++ b/api-gateway/image-microservice/pom.xml @@ -29,7 +29,7 @@ api-gateway com.iluwatar - 1.19.0-SNAPSHOT + 1.19.0 4.0.0 diff --git a/api-gateway/pom.xml b/api-gateway/pom.xml index c151d59a1..e83504d7e 100644 --- a/api-gateway/pom.xml +++ b/api-gateway/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.19.0-SNAPSHOT + 1.19.0 4.0.0 api-gateway diff --git a/api-gateway/price-microservice/pom.xml b/api-gateway/price-microservice/pom.xml index cdd8b4c3c..4dc770340 100644 --- a/api-gateway/price-microservice/pom.xml +++ b/api-gateway/price-microservice/pom.xml @@ -29,7 +29,7 @@ api-gateway com.iluwatar - 1.19.0-SNAPSHOT + 1.19.0 4.0.0 diff --git a/async-method-invocation/pom.xml b/async-method-invocation/pom.xml index a686e3e68..5dc30bfce 100644 --- a/async-method-invocation/pom.xml +++ b/async-method-invocation/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 async-method-invocation diff --git a/balking/pom.xml b/balking/pom.xml index 276dc397d..05eac928d 100644 --- a/balking/pom.xml +++ b/balking/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.19.0-SNAPSHOT + 1.19.0 4.0.0 diff --git a/bridge/pom.xml b/bridge/pom.xml index 0cef80258..0c1908ba2 100644 --- a/bridge/pom.xml +++ b/bridge/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 bridge diff --git a/builder/pom.xml b/builder/pom.xml index a7d5c9d70..578a9f649 100644 --- a/builder/pom.xml +++ b/builder/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 builder diff --git a/business-delegate/pom.xml b/business-delegate/pom.xml index 0bc02827b..78c64f472 100644 --- a/business-delegate/pom.xml +++ b/business-delegate/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 business-delegate diff --git a/caching/pom.xml b/caching/pom.xml index f76778840..6452f7c76 100644 --- a/caching/pom.xml +++ b/caching/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 caching diff --git a/callback/pom.xml b/callback/pom.xml index aa1039789..f35ad9bf5 100644 --- a/callback/pom.xml +++ b/callback/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 callback diff --git a/chain/pom.xml b/chain/pom.xml index 51c83f1ae..45f46636e 100644 --- a/chain/pom.xml +++ b/chain/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 chain diff --git a/command/pom.xml b/command/pom.xml index 9a819bb6c..ab0eba18c 100644 --- a/command/pom.xml +++ b/command/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 command diff --git a/composite/pom.xml b/composite/pom.xml index eb3b5d7b4..b72522109 100644 --- a/composite/pom.xml +++ b/composite/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 composite diff --git a/converter/pom.xml b/converter/pom.xml index 69005d7d6..eff4eab5a 100644 --- a/converter/pom.xml +++ b/converter/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.19.0-SNAPSHOT + 1.19.0 4.0.0 diff --git a/cqrs/pom.xml b/cqrs/pom.xml index 2ed0809f6..b69fa04b3 100644 --- a/cqrs/pom.xml +++ b/cqrs/pom.xml @@ -21,7 +21,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 cqrs diff --git a/dao/pom.xml b/dao/pom.xml index 621af6baf..5d353e039 100644 --- a/dao/pom.xml +++ b/dao/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 dao diff --git a/data-bus/pom.xml b/data-bus/pom.xml index 11d945268..72f99168a 100644 --- a/data-bus/pom.xml +++ b/data-bus/pom.xml @@ -33,7 +33,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 data-bus diff --git a/data-mapper/pom.xml b/data-mapper/pom.xml index ac0d78c33..07bbb6f8f 100644 --- a/data-mapper/pom.xml +++ b/data-mapper/pom.xml @@ -28,7 +28,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 data-mapper diff --git a/data-transfer-object/pom.xml b/data-transfer-object/pom.xml index 8a484e919..fd414e596 100644 --- a/data-transfer-object/pom.xml +++ b/data-transfer-object/pom.xml @@ -28,7 +28,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 data-transfer-object diff --git a/decorator/pom.xml b/decorator/pom.xml index 687de3ad8..2e1125506 100644 --- a/decorator/pom.xml +++ b/decorator/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 decorator diff --git a/delegation/pom.xml b/delegation/pom.xml index 118f9f75b..0d99d8a2c 100644 --- a/delegation/pom.xml +++ b/delegation/pom.xml @@ -30,7 +30,7 @@ java-design-patterns com.iluwatar - 1.19.0-SNAPSHOT + 1.19.0 4.0.0 diff --git a/dependency-injection/pom.xml b/dependency-injection/pom.xml index 127a9b2b8..767b4066d 100644 --- a/dependency-injection/pom.xml +++ b/dependency-injection/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 dependency-injection diff --git a/double-checked-locking/pom.xml b/double-checked-locking/pom.xml index d7e8414c0..b467cf36a 100644 --- a/double-checked-locking/pom.xml +++ b/double-checked-locking/pom.xml @@ -27,7 +27,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 double-checked-locking diff --git a/double-dispatch/pom.xml b/double-dispatch/pom.xml index 85a85d831..7db852d6b 100644 --- a/double-dispatch/pom.xml +++ b/double-dispatch/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 double-dispatch diff --git a/eip-aggregator/pom.xml b/eip-aggregator/pom.xml index 8a51b8218..56e3d326d 100644 --- a/eip-aggregator/pom.xml +++ b/eip-aggregator/pom.xml @@ -26,7 +26,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 diff --git a/eip-splitter/pom.xml b/eip-splitter/pom.xml index 54661f946..f2ccd8172 100644 --- a/eip-splitter/pom.xml +++ b/eip-splitter/pom.xml @@ -26,7 +26,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 diff --git a/eip-wire-tap/pom.xml b/eip-wire-tap/pom.xml index 688f4ad6d..9edc9d1a2 100644 --- a/eip-wire-tap/pom.xml +++ b/eip-wire-tap/pom.xml @@ -26,7 +26,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 diff --git a/event-aggregator/pom.xml b/event-aggregator/pom.xml index c28fded6f..d061e37a5 100644 --- a/event-aggregator/pom.xml +++ b/event-aggregator/pom.xml @@ -28,7 +28,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 event-aggregator diff --git a/event-asynchronous/pom.xml b/event-asynchronous/pom.xml index 3c07f47bc..2c24f64e7 100644 --- a/event-asynchronous/pom.xml +++ b/event-asynchronous/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 event-asynchronous diff --git a/event-driven-architecture/pom.xml b/event-driven-architecture/pom.xml index 4eb2a6946..fcd9a5e93 100644 --- a/event-driven-architecture/pom.xml +++ b/event-driven-architecture/pom.xml @@ -31,7 +31,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 event-driven-architecture diff --git a/event-queue/pom.xml b/event-queue/pom.xml index 1ef8e28af..647801947 100644 --- a/event-queue/pom.xml +++ b/event-queue/pom.xml @@ -30,7 +30,7 @@ java-design-patterns com.iluwatar - 1.19.0-SNAPSHOT + 1.19.0 event-queue diff --git a/event-sourcing/pom.xml b/event-sourcing/pom.xml index a17d02379..0b3aad20e 100644 --- a/event-sourcing/pom.xml +++ b/event-sourcing/pom.xml @@ -30,7 +30,7 @@ java-design-patterns com.iluwatar - 1.19.0-SNAPSHOT + 1.19.0 event-sourcing diff --git a/execute-around/pom.xml b/execute-around/pom.xml index 2e43c3e4b..65c6c2cb8 100644 --- a/execute-around/pom.xml +++ b/execute-around/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 execute-around diff --git a/extension-objects/pom.xml b/extension-objects/pom.xml index bd68a2758..f142b1130 100644 --- a/extension-objects/pom.xml +++ b/extension-objects/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.19.0-SNAPSHOT + 1.19.0 4.0.0 diff --git a/facade/pom.xml b/facade/pom.xml index deb56a382..fcfd4fc6a 100644 --- a/facade/pom.xml +++ b/facade/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 facade diff --git a/factory-kit/pom.xml b/factory-kit/pom.xml index 71973928f..bdbbabba2 100644 --- a/factory-kit/pom.xml +++ b/factory-kit/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 factory-kit diff --git a/factory-method/pom.xml b/factory-method/pom.xml index 4cad86fdd..cb5e1687d 100644 --- a/factory-method/pom.xml +++ b/factory-method/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 factory-method diff --git a/feature-toggle/pom.xml b/feature-toggle/pom.xml index 665847e5e..43a9b45a9 100644 --- a/feature-toggle/pom.xml +++ b/feature-toggle/pom.xml @@ -30,7 +30,7 @@ java-design-patterns com.iluwatar - 1.19.0-SNAPSHOT + 1.19.0 4.0.0 diff --git a/fluentinterface/pom.xml b/fluentinterface/pom.xml index 234504396..a52a3d1c7 100644 --- a/fluentinterface/pom.xml +++ b/fluentinterface/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.19.0-SNAPSHOT + 1.19.0 4.0.0 diff --git a/flux/pom.xml b/flux/pom.xml index 6b9b968c8..098e816a1 100644 --- a/flux/pom.xml +++ b/flux/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 flux diff --git a/flyweight/pom.xml b/flyweight/pom.xml index 58bbd95a8..22721ae05 100644 --- a/flyweight/pom.xml +++ b/flyweight/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 flyweight diff --git a/front-controller/pom.xml b/front-controller/pom.xml index 966e5becc..e45e17b94 100644 --- a/front-controller/pom.xml +++ b/front-controller/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 front-controller diff --git a/guarded-suspension/pom.xml b/guarded-suspension/pom.xml index 5ac0a6e32..de8e29804 100644 --- a/guarded-suspension/pom.xml +++ b/guarded-suspension/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 jar guarded-suspension diff --git a/half-sync-half-async/pom.xml b/half-sync-half-async/pom.xml index 3ed2da411..777e8e80b 100644 --- a/half-sync-half-async/pom.xml +++ b/half-sync-half-async/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 half-sync-half-async diff --git a/hexagonal/pom.xml b/hexagonal/pom.xml index 6907ca10c..294c150ef 100644 --- a/hexagonal/pom.xml +++ b/hexagonal/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 hexagonal diff --git a/intercepting-filter/pom.xml b/intercepting-filter/pom.xml index dc4d6a923..267c5c3cb 100644 --- a/intercepting-filter/pom.xml +++ b/intercepting-filter/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 intercepting-filter diff --git a/interpreter/pom.xml b/interpreter/pom.xml index 99e399159..815d15a37 100644 --- a/interpreter/pom.xml +++ b/interpreter/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 interpreter diff --git a/iterator/pom.xml b/iterator/pom.xml index 2afca644c..51e84cac0 100644 --- a/iterator/pom.xml +++ b/iterator/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 iterator diff --git a/layers/pom.xml b/layers/pom.xml index 772c53a30..4283376d4 100644 --- a/layers/pom.xml +++ b/layers/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 com.iluwatar.layers layers diff --git a/lazy-loading/pom.xml b/lazy-loading/pom.xml index 8d799d07c..c0e3bc8a4 100644 --- a/lazy-loading/pom.xml +++ b/lazy-loading/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 lazy-loading diff --git a/marker/pom.xml b/marker/pom.xml index 708072d8c..8f4bb7ae6 100644 --- a/marker/pom.xml +++ b/marker/pom.xml @@ -24,7 +24,7 @@ java-design-patterns com.iluwatar - 1.19.0-SNAPSHOT + 1.19.0 4.0.0 diff --git a/mediator/pom.xml b/mediator/pom.xml index c9369b1a9..125f5a6c7 100644 --- a/mediator/pom.xml +++ b/mediator/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 mediator diff --git a/memento/pom.xml b/memento/pom.xml index 2ad5321ba..b4fb1d2c4 100644 --- a/memento/pom.xml +++ b/memento/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 memento diff --git a/message-channel/pom.xml b/message-channel/pom.xml index 3e3028f2a..2f93cd387 100644 --- a/message-channel/pom.xml +++ b/message-channel/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 message-channel diff --git a/model-view-controller/pom.xml b/model-view-controller/pom.xml index f873107fa..89f51086f 100644 --- a/model-view-controller/pom.xml +++ b/model-view-controller/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 model-view-controller diff --git a/model-view-presenter/pom.xml b/model-view-presenter/pom.xml index 60a379996..f708ebce5 100644 --- a/model-view-presenter/pom.xml +++ b/model-view-presenter/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 model-view-presenter model-view-presenter diff --git a/module/pom.xml b/module/pom.xml index dde967bc6..be5f67743 100644 --- a/module/pom.xml +++ b/module/pom.xml @@ -28,7 +28,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 module diff --git a/monad/pom.xml b/monad/pom.xml index 316c4ff9b..15303d941 100644 --- a/monad/pom.xml +++ b/monad/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 monad diff --git a/monostate/pom.xml b/monostate/pom.xml index 5aa68e75b..f8cfc5122 100644 --- a/monostate/pom.xml +++ b/monostate/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 monostate diff --git a/multiton/pom.xml b/multiton/pom.xml index 4ee128a1d..990670792 100644 --- a/multiton/pom.xml +++ b/multiton/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 multiton diff --git a/mute-idiom/pom.xml b/mute-idiom/pom.xml index 905909384..18d08e822 100644 --- a/mute-idiom/pom.xml +++ b/mute-idiom/pom.xml @@ -21,7 +21,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 mute-idiom diff --git a/mutex/pom.xml b/mutex/pom.xml index 5c65d6305..3de74fd6d 100644 --- a/mutex/pom.xml +++ b/mutex/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 mutex diff --git a/naked-objects/dom/pom.xml b/naked-objects/dom/pom.xml index 3efcecdca..23354d338 100644 --- a/naked-objects/dom/pom.xml +++ b/naked-objects/dom/pom.xml @@ -16,7 +16,7 @@ com.iluwatar naked-objects - 1.19.0-SNAPSHOT + 1.19.0 naked-objects-dom diff --git a/naked-objects/fixture/pom.xml b/naked-objects/fixture/pom.xml index bf3cc4de8..2e78e9c52 100644 --- a/naked-objects/fixture/pom.xml +++ b/naked-objects/fixture/pom.xml @@ -16,7 +16,7 @@ com.iluwatar naked-objects - 1.19.0-SNAPSHOT + 1.19.0 naked-objects-fixture diff --git a/naked-objects/integtests/pom.xml b/naked-objects/integtests/pom.xml index 8d2cf3b55..100c10465 100644 --- a/naked-objects/integtests/pom.xml +++ b/naked-objects/integtests/pom.xml @@ -16,7 +16,7 @@ com.iluwatar naked-objects - 1.19.0-SNAPSHOT + 1.19.0 naked-objects-integtests diff --git a/naked-objects/pom.xml b/naked-objects/pom.xml index 222a9d321..16b993a12 100644 --- a/naked-objects/pom.xml +++ b/naked-objects/pom.xml @@ -15,7 +15,7 @@ java-design-patterns com.iluwatar - 1.19.0-SNAPSHOT + 1.19.0 naked-objects @@ -350,17 +350,17 @@ ${project.groupId} naked-objects-dom - 1.19.0-SNAPSHOT + 1.19.0 ${project.groupId} naked-objects-fixture - 1.19.0-SNAPSHOT + 1.19.0 ${project.groupId} naked-objects-webapp - 1.19.0-SNAPSHOT + 1.19.0 diff --git a/naked-objects/webapp/pom.xml b/naked-objects/webapp/pom.xml index 0f9d33bc4..7a9ab9205 100644 --- a/naked-objects/webapp/pom.xml +++ b/naked-objects/webapp/pom.xml @@ -16,7 +16,7 @@ com.iluwatar naked-objects - 1.19.0-SNAPSHOT + 1.19.0 naked-objects-webapp diff --git a/null-object/pom.xml b/null-object/pom.xml index 92831afb0..49e2d5855 100644 --- a/null-object/pom.xml +++ b/null-object/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 null-object diff --git a/object-mother/pom.xml b/object-mother/pom.xml index e58d36f7d..e9d0c8205 100644 --- a/object-mother/pom.xml +++ b/object-mother/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 object-mother diff --git a/object-pool/pom.xml b/object-pool/pom.xml index 5e59bbfd9..3ef4e7dd5 100644 --- a/object-pool/pom.xml +++ b/object-pool/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 object-pool diff --git a/observer/pom.xml b/observer/pom.xml index 20e4aa659..5c154e243 100644 --- a/observer/pom.xml +++ b/observer/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 observer diff --git a/page-object/pom.xml b/page-object/pom.xml index a54998d70..ece7a936c 100644 --- a/page-object/pom.xml +++ b/page-object/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 page-object diff --git a/partial-response/pom.xml b/partial-response/pom.xml index db0a922ee..b52316c6e 100644 --- a/partial-response/pom.xml +++ b/partial-response/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.19.0-SNAPSHOT + 1.19.0 4.0.0 diff --git a/poison-pill/pom.xml b/poison-pill/pom.xml index 5b9d48126..e4d11baa2 100644 --- a/poison-pill/pom.xml +++ b/poison-pill/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 poison-pill diff --git a/pom.xml b/pom.xml index 7e669d396..3e16fa21e 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ 4.0.0 com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 pom 2014 diff --git a/private-class-data/pom.xml b/private-class-data/pom.xml index ddf9cef28..09539cda0 100644 --- a/private-class-data/pom.xml +++ b/private-class-data/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 private-class-data diff --git a/producer-consumer/pom.xml b/producer-consumer/pom.xml index ea9734518..ff17ffad7 100644 --- a/producer-consumer/pom.xml +++ b/producer-consumer/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 producer-consumer diff --git a/promise/pom.xml b/promise/pom.xml index 9b600d5fb..c3f5386f1 100644 --- a/promise/pom.xml +++ b/promise/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 promise diff --git a/property/pom.xml b/property/pom.xml index b3bc915e9..c96d56dda 100644 --- a/property/pom.xml +++ b/property/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 property diff --git a/prototype/pom.xml b/prototype/pom.xml index 54c9ac987..fe434a5ba 100644 --- a/prototype/pom.xml +++ b/prototype/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 prototype diff --git a/proxy/pom.xml b/proxy/pom.xml index 31e87c04b..3e7b78bcc 100644 --- a/proxy/pom.xml +++ b/proxy/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 proxy diff --git a/publish-subscribe/pom.xml b/publish-subscribe/pom.xml index 688cda903..2e928401a 100644 --- a/publish-subscribe/pom.xml +++ b/publish-subscribe/pom.xml @@ -28,7 +28,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 publish-subscribe diff --git a/queue-load-leveling/pom.xml b/queue-load-leveling/pom.xml index 681409e96..dc52a2586 100644 --- a/queue-load-leveling/pom.xml +++ b/queue-load-leveling/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 queue-load-leveling diff --git a/reactor/pom.xml b/reactor/pom.xml index e8a145f7b..18d8ab378 100644 --- a/reactor/pom.xml +++ b/reactor/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 reactor diff --git a/reader-writer-lock/pom.xml b/reader-writer-lock/pom.xml index b0dc137e4..34be6bc0d 100644 --- a/reader-writer-lock/pom.xml +++ b/reader-writer-lock/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 reader-writer-lock diff --git a/repository/pom.xml b/repository/pom.xml index cf08ba4a5..341ffe605 100644 --- a/repository/pom.xml +++ b/repository/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 repository diff --git a/resource-acquisition-is-initialization/pom.xml b/resource-acquisition-is-initialization/pom.xml index 3d68966c5..5ad223e85 100644 --- a/resource-acquisition-is-initialization/pom.xml +++ b/resource-acquisition-is-initialization/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 resource-acquisition-is-initialization diff --git a/retry/pom.xml b/retry/pom.xml index 9fb98d42a..a79da285c 100644 --- a/retry/pom.xml +++ b/retry/pom.xml @@ -26,7 +26,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 retry jar diff --git a/semaphore/pom.xml b/semaphore/pom.xml index 6337951a4..4d86fec77 100644 --- a/semaphore/pom.xml +++ b/semaphore/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 semaphore diff --git a/servant/pom.xml b/servant/pom.xml index 220e197f1..5632b1188 100644 --- a/servant/pom.xml +++ b/servant/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 servant diff --git a/service-layer/pom.xml b/service-layer/pom.xml index 1a654e048..3a04b608e 100644 --- a/service-layer/pom.xml +++ b/service-layer/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 service-layer diff --git a/service-locator/pom.xml b/service-locator/pom.xml index a8fc5ceb1..2656e06ad 100644 --- a/service-locator/pom.xml +++ b/service-locator/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 service-locator diff --git a/singleton/pom.xml b/singleton/pom.xml index f83f5e50c..a8a363d9d 100644 --- a/singleton/pom.xml +++ b/singleton/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 singleton diff --git a/specification/pom.xml b/specification/pom.xml index cfd28ae93..4e11ebefa 100644 --- a/specification/pom.xml +++ b/specification/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 specification diff --git a/state/pom.xml b/state/pom.xml index 478e888bf..0dff4fe87 100644 --- a/state/pom.xml +++ b/state/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 state diff --git a/step-builder/pom.xml b/step-builder/pom.xml index 00a8006de..796e1b5ab 100644 --- a/step-builder/pom.xml +++ b/step-builder/pom.xml @@ -30,7 +30,7 @@ java-design-patterns com.iluwatar - 1.19.0-SNAPSHOT + 1.19.0 step-builder diff --git a/strategy/pom.xml b/strategy/pom.xml index 8bae9c46a..a6266025a 100644 --- a/strategy/pom.xml +++ b/strategy/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 strategy diff --git a/template-method/pom.xml b/template-method/pom.xml index edfc2e2c6..23b0724c1 100644 --- a/template-method/pom.xml +++ b/template-method/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 template-method diff --git a/thread-pool/pom.xml b/thread-pool/pom.xml index 61701e40b..7b4dc6349 100644 --- a/thread-pool/pom.xml +++ b/thread-pool/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 thread-pool diff --git a/throttling/pom.xml b/throttling/pom.xml index 4ac14493d..d52ec9a5b 100644 --- a/throttling/pom.xml +++ b/throttling/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.19.0-SNAPSHOT + 1.19.0 4.0.0 diff --git a/tls/pom.xml b/tls/pom.xml index a25904707..086a00820 100644 --- a/tls/pom.xml +++ b/tls/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 tls diff --git a/tolerant-reader/pom.xml b/tolerant-reader/pom.xml index 3acc0b188..90d4b2069 100644 --- a/tolerant-reader/pom.xml +++ b/tolerant-reader/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 tolerant-reader diff --git a/trampoline/pom.xml b/trampoline/pom.xml index 71de3f8f2..8ab5a2374 100644 --- a/trampoline/pom.xml +++ b/trampoline/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 trampoline diff --git a/twin/pom.xml b/twin/pom.xml index ed7c9a77f..490e24cb2 100644 --- a/twin/pom.xml +++ b/twin/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 twin diff --git a/unit-of-work/pom.xml b/unit-of-work/pom.xml index 8a75b16af..420a2918c 100644 --- a/unit-of-work/pom.xml +++ b/unit-of-work/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.19.0-SNAPSHOT + 1.19.0 4.0.0 diff --git a/value-object/pom.xml b/value-object/pom.xml index 82fca9508..2b09c0bf2 100644 --- a/value-object/pom.xml +++ b/value-object/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 value-object diff --git a/visitor/pom.xml b/visitor/pom.xml index 01f0d4143..8c8e67a08 100644 --- a/visitor/pom.xml +++ b/visitor/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.19.0 visitor From 1c0e0cd88b76194d6e50e2b9e4b9a23fce1323b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sat, 31 Mar 2018 10:36:05 +0300 Subject: [PATCH 24/30] Set version for next development iteration --- abstract-document/pom.xml | 2 +- abstract-factory/pom.xml | 2 +- adapter/pom.xml | 2 +- aggregator-microservices/aggregator-service/pom.xml | 2 +- aggregator-microservices/information-microservice/pom.xml | 2 +- aggregator-microservices/inventory-microservice/pom.xml | 2 +- aggregator-microservices/pom.xml | 2 +- api-gateway/api-gateway-service/pom.xml | 2 +- api-gateway/image-microservice/pom.xml | 2 +- api-gateway/pom.xml | 2 +- api-gateway/price-microservice/pom.xml | 2 +- async-method-invocation/pom.xml | 2 +- balking/pom.xml | 2 +- bridge/pom.xml | 2 +- builder/pom.xml | 2 +- business-delegate/pom.xml | 2 +- caching/pom.xml | 2 +- callback/pom.xml | 2 +- chain/pom.xml | 2 +- command/pom.xml | 2 +- composite/pom.xml | 2 +- converter/pom.xml | 2 +- cqrs/pom.xml | 2 +- dao/pom.xml | 2 +- data-bus/pom.xml | 2 +- data-mapper/pom.xml | 2 +- data-transfer-object/pom.xml | 2 +- decorator/pom.xml | 2 +- delegation/pom.xml | 2 +- dependency-injection/pom.xml | 2 +- double-checked-locking/pom.xml | 2 +- double-dispatch/pom.xml | 2 +- eip-aggregator/pom.xml | 2 +- eip-splitter/pom.xml | 2 +- eip-wire-tap/pom.xml | 2 +- event-aggregator/pom.xml | 2 +- event-asynchronous/pom.xml | 2 +- event-driven-architecture/pom.xml | 2 +- event-queue/pom.xml | 2 +- event-sourcing/pom.xml | 2 +- execute-around/pom.xml | 2 +- extension-objects/pom.xml | 2 +- facade/pom.xml | 2 +- factory-kit/pom.xml | 2 +- factory-method/pom.xml | 2 +- feature-toggle/pom.xml | 2 +- fluentinterface/pom.xml | 2 +- flux/pom.xml | 2 +- flyweight/pom.xml | 2 +- front-controller/pom.xml | 2 +- guarded-suspension/pom.xml | 2 +- half-sync-half-async/pom.xml | 2 +- hexagonal/pom.xml | 2 +- intercepting-filter/pom.xml | 2 +- interpreter/pom.xml | 2 +- iterator/pom.xml | 2 +- layers/pom.xml | 2 +- lazy-loading/pom.xml | 2 +- marker/pom.xml | 2 +- mediator/pom.xml | 2 +- memento/pom.xml | 2 +- message-channel/pom.xml | 2 +- model-view-controller/pom.xml | 2 +- model-view-presenter/pom.xml | 2 +- module/pom.xml | 2 +- monad/pom.xml | 2 +- monostate/pom.xml | 2 +- multiton/pom.xml | 2 +- mute-idiom/pom.xml | 2 +- mutex/pom.xml | 2 +- naked-objects/dom/pom.xml | 2 +- naked-objects/fixture/pom.xml | 2 +- naked-objects/integtests/pom.xml | 2 +- naked-objects/pom.xml | 8 ++++---- naked-objects/webapp/pom.xml | 2 +- null-object/pom.xml | 2 +- object-mother/pom.xml | 2 +- object-pool/pom.xml | 2 +- observer/pom.xml | 2 +- page-object/pom.xml | 2 +- partial-response/pom.xml | 2 +- poison-pill/pom.xml | 2 +- pom.xml | 2 +- private-class-data/pom.xml | 2 +- producer-consumer/pom.xml | 2 +- promise/pom.xml | 2 +- property/pom.xml | 2 +- prototype/pom.xml | 2 +- proxy/pom.xml | 2 +- publish-subscribe/pom.xml | 2 +- queue-load-leveling/pom.xml | 2 +- reactor/pom.xml | 2 +- reader-writer-lock/pom.xml | 2 +- repository/pom.xml | 2 +- resource-acquisition-is-initialization/pom.xml | 2 +- retry/pom.xml | 2 +- semaphore/pom.xml | 2 +- servant/pom.xml | 2 +- service-layer/pom.xml | 2 +- service-locator/pom.xml | 2 +- singleton/pom.xml | 2 +- specification/pom.xml | 2 +- state/pom.xml | 2 +- step-builder/pom.xml | 2 +- strategy/pom.xml | 2 +- template-method/pom.xml | 2 +- thread-pool/pom.xml | 2 +- throttling/pom.xml | 2 +- tls/pom.xml | 2 +- tolerant-reader/pom.xml | 2 +- trampoline/pom.xml | 2 +- twin/pom.xml | 2 +- unit-of-work/pom.xml | 2 +- value-object/pom.xml | 2 +- visitor/pom.xml | 2 +- 115 files changed, 118 insertions(+), 118 deletions(-) diff --git a/abstract-document/pom.xml b/abstract-document/pom.xml index 072ff5432..d1b10a9fd 100644 --- a/abstract-document/pom.xml +++ b/abstract-document/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.19.0 + 1.20.0-SNAPSHOT abstract-document diff --git a/abstract-factory/pom.xml b/abstract-factory/pom.xml index 13ec80067..6d94e70ce 100644 --- a/abstract-factory/pom.xml +++ b/abstract-factory/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT abstract-factory diff --git a/adapter/pom.xml b/adapter/pom.xml index 32260ba3e..95ccee3a9 100644 --- a/adapter/pom.xml +++ b/adapter/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT adapter diff --git a/aggregator-microservices/aggregator-service/pom.xml b/aggregator-microservices/aggregator-service/pom.xml index a5192047b..fb26ff954 100644 --- a/aggregator-microservices/aggregator-service/pom.xml +++ b/aggregator-microservices/aggregator-service/pom.xml @@ -29,7 +29,7 @@ aggregator-microservices com.iluwatar - 1.19.0 + 1.20.0-SNAPSHOT 4.0.0 diff --git a/aggregator-microservices/information-microservice/pom.xml b/aggregator-microservices/information-microservice/pom.xml index a3ddb763c..7afce1e9b 100644 --- a/aggregator-microservices/information-microservice/pom.xml +++ b/aggregator-microservices/information-microservice/pom.xml @@ -29,7 +29,7 @@ aggregator-microservices com.iluwatar - 1.19.0 + 1.20.0-SNAPSHOT 4.0.0 diff --git a/aggregator-microservices/inventory-microservice/pom.xml b/aggregator-microservices/inventory-microservice/pom.xml index e7b4000ab..0d44b037e 100644 --- a/aggregator-microservices/inventory-microservice/pom.xml +++ b/aggregator-microservices/inventory-microservice/pom.xml @@ -29,7 +29,7 @@ aggregator-microservices com.iluwatar - 1.19.0 + 1.20.0-SNAPSHOT 4.0.0 diff --git a/aggregator-microservices/pom.xml b/aggregator-microservices/pom.xml index ffa80e442..ed48768f2 100644 --- a/aggregator-microservices/pom.xml +++ b/aggregator-microservices/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.19.0 + 1.20.0-SNAPSHOT 4.0.0 aggregator-microservices diff --git a/api-gateway/api-gateway-service/pom.xml b/api-gateway/api-gateway-service/pom.xml index d54bdb90c..609fca88d 100644 --- a/api-gateway/api-gateway-service/pom.xml +++ b/api-gateway/api-gateway-service/pom.xml @@ -29,7 +29,7 @@ api-gateway com.iluwatar - 1.19.0 + 1.20.0-SNAPSHOT 4.0.0 api-gateway-service diff --git a/api-gateway/image-microservice/pom.xml b/api-gateway/image-microservice/pom.xml index 2feab1060..e90747eb9 100644 --- a/api-gateway/image-microservice/pom.xml +++ b/api-gateway/image-microservice/pom.xml @@ -29,7 +29,7 @@ api-gateway com.iluwatar - 1.19.0 + 1.20.0-SNAPSHOT 4.0.0 diff --git a/api-gateway/pom.xml b/api-gateway/pom.xml index e83504d7e..72468c7eb 100644 --- a/api-gateway/pom.xml +++ b/api-gateway/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.19.0 + 1.20.0-SNAPSHOT 4.0.0 api-gateway diff --git a/api-gateway/price-microservice/pom.xml b/api-gateway/price-microservice/pom.xml index 4dc770340..deb0627f4 100644 --- a/api-gateway/price-microservice/pom.xml +++ b/api-gateway/price-microservice/pom.xml @@ -29,7 +29,7 @@ api-gateway com.iluwatar - 1.19.0 + 1.20.0-SNAPSHOT 4.0.0 diff --git a/async-method-invocation/pom.xml b/async-method-invocation/pom.xml index 5dc30bfce..c29062630 100644 --- a/async-method-invocation/pom.xml +++ b/async-method-invocation/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT async-method-invocation diff --git a/balking/pom.xml b/balking/pom.xml index 05eac928d..e16065359 100644 --- a/balking/pom.xml +++ b/balking/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.19.0 + 1.20.0-SNAPSHOT 4.0.0 diff --git a/bridge/pom.xml b/bridge/pom.xml index 0c1908ba2..8ab24c159 100644 --- a/bridge/pom.xml +++ b/bridge/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT bridge diff --git a/builder/pom.xml b/builder/pom.xml index 578a9f649..b17d53030 100644 --- a/builder/pom.xml +++ b/builder/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT builder diff --git a/business-delegate/pom.xml b/business-delegate/pom.xml index 78c64f472..d48faeff4 100644 --- a/business-delegate/pom.xml +++ b/business-delegate/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT business-delegate diff --git a/caching/pom.xml b/caching/pom.xml index 6452f7c76..57f8f0119 100644 --- a/caching/pom.xml +++ b/caching/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT caching diff --git a/callback/pom.xml b/callback/pom.xml index f35ad9bf5..387c8a667 100644 --- a/callback/pom.xml +++ b/callback/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT callback diff --git a/chain/pom.xml b/chain/pom.xml index 45f46636e..07b1a5e4a 100644 --- a/chain/pom.xml +++ b/chain/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT chain diff --git a/command/pom.xml b/command/pom.xml index ab0eba18c..68d4b2064 100644 --- a/command/pom.xml +++ b/command/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT command diff --git a/composite/pom.xml b/composite/pom.xml index b72522109..944aa1456 100644 --- a/composite/pom.xml +++ b/composite/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT composite diff --git a/converter/pom.xml b/converter/pom.xml index eff4eab5a..f696048f5 100644 --- a/converter/pom.xml +++ b/converter/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.19.0 + 1.20.0-SNAPSHOT 4.0.0 diff --git a/cqrs/pom.xml b/cqrs/pom.xml index b69fa04b3..7ed2e1208 100644 --- a/cqrs/pom.xml +++ b/cqrs/pom.xml @@ -21,7 +21,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT cqrs diff --git a/dao/pom.xml b/dao/pom.xml index 5d353e039..3700d76a7 100644 --- a/dao/pom.xml +++ b/dao/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT dao diff --git a/data-bus/pom.xml b/data-bus/pom.xml index 72f99168a..6292b71fb 100644 --- a/data-bus/pom.xml +++ b/data-bus/pom.xml @@ -33,7 +33,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT data-bus diff --git a/data-mapper/pom.xml b/data-mapper/pom.xml index 07bbb6f8f..aadcabd3d 100644 --- a/data-mapper/pom.xml +++ b/data-mapper/pom.xml @@ -28,7 +28,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT data-mapper diff --git a/data-transfer-object/pom.xml b/data-transfer-object/pom.xml index fd414e596..17ad1f83f 100644 --- a/data-transfer-object/pom.xml +++ b/data-transfer-object/pom.xml @@ -28,7 +28,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT data-transfer-object diff --git a/decorator/pom.xml b/decorator/pom.xml index 2e1125506..d4e2a887d 100644 --- a/decorator/pom.xml +++ b/decorator/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT decorator diff --git a/delegation/pom.xml b/delegation/pom.xml index 0d99d8a2c..6c7c710d5 100644 --- a/delegation/pom.xml +++ b/delegation/pom.xml @@ -30,7 +30,7 @@ java-design-patterns com.iluwatar - 1.19.0 + 1.20.0-SNAPSHOT 4.0.0 diff --git a/dependency-injection/pom.xml b/dependency-injection/pom.xml index 767b4066d..e8a499918 100644 --- a/dependency-injection/pom.xml +++ b/dependency-injection/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT dependency-injection diff --git a/double-checked-locking/pom.xml b/double-checked-locking/pom.xml index b467cf36a..7efd3c31e 100644 --- a/double-checked-locking/pom.xml +++ b/double-checked-locking/pom.xml @@ -27,7 +27,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT double-checked-locking diff --git a/double-dispatch/pom.xml b/double-dispatch/pom.xml index 7db852d6b..c64ab4ce9 100644 --- a/double-dispatch/pom.xml +++ b/double-dispatch/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT double-dispatch diff --git a/eip-aggregator/pom.xml b/eip-aggregator/pom.xml index 56e3d326d..3b043ad7e 100644 --- a/eip-aggregator/pom.xml +++ b/eip-aggregator/pom.xml @@ -26,7 +26,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT diff --git a/eip-splitter/pom.xml b/eip-splitter/pom.xml index f2ccd8172..ed16337da 100644 --- a/eip-splitter/pom.xml +++ b/eip-splitter/pom.xml @@ -26,7 +26,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT diff --git a/eip-wire-tap/pom.xml b/eip-wire-tap/pom.xml index 9edc9d1a2..752d43077 100644 --- a/eip-wire-tap/pom.xml +++ b/eip-wire-tap/pom.xml @@ -26,7 +26,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT diff --git a/event-aggregator/pom.xml b/event-aggregator/pom.xml index d061e37a5..a39738bf8 100644 --- a/event-aggregator/pom.xml +++ b/event-aggregator/pom.xml @@ -28,7 +28,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT event-aggregator diff --git a/event-asynchronous/pom.xml b/event-asynchronous/pom.xml index 2c24f64e7..9398d25ce 100644 --- a/event-asynchronous/pom.xml +++ b/event-asynchronous/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT event-asynchronous diff --git a/event-driven-architecture/pom.xml b/event-driven-architecture/pom.xml index fcd9a5e93..87aae0070 100644 --- a/event-driven-architecture/pom.xml +++ b/event-driven-architecture/pom.xml @@ -31,7 +31,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT event-driven-architecture diff --git a/event-queue/pom.xml b/event-queue/pom.xml index 647801947..a0c1913a7 100644 --- a/event-queue/pom.xml +++ b/event-queue/pom.xml @@ -30,7 +30,7 @@ java-design-patterns com.iluwatar - 1.19.0 + 1.20.0-SNAPSHOT event-queue diff --git a/event-sourcing/pom.xml b/event-sourcing/pom.xml index 0b3aad20e..785d72c68 100644 --- a/event-sourcing/pom.xml +++ b/event-sourcing/pom.xml @@ -30,7 +30,7 @@ java-design-patterns com.iluwatar - 1.19.0 + 1.20.0-SNAPSHOT event-sourcing diff --git a/execute-around/pom.xml b/execute-around/pom.xml index 65c6c2cb8..358f4eae4 100644 --- a/execute-around/pom.xml +++ b/execute-around/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT execute-around diff --git a/extension-objects/pom.xml b/extension-objects/pom.xml index f142b1130..74f233775 100644 --- a/extension-objects/pom.xml +++ b/extension-objects/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.19.0 + 1.20.0-SNAPSHOT 4.0.0 diff --git a/facade/pom.xml b/facade/pom.xml index fcfd4fc6a..d0c459428 100644 --- a/facade/pom.xml +++ b/facade/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT facade diff --git a/factory-kit/pom.xml b/factory-kit/pom.xml index bdbbabba2..1c8f4248e 100644 --- a/factory-kit/pom.xml +++ b/factory-kit/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT factory-kit diff --git a/factory-method/pom.xml b/factory-method/pom.xml index cb5e1687d..124b1a73c 100644 --- a/factory-method/pom.xml +++ b/factory-method/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT factory-method diff --git a/feature-toggle/pom.xml b/feature-toggle/pom.xml index 43a9b45a9..3c6c7af94 100644 --- a/feature-toggle/pom.xml +++ b/feature-toggle/pom.xml @@ -30,7 +30,7 @@ java-design-patterns com.iluwatar - 1.19.0 + 1.20.0-SNAPSHOT 4.0.0 diff --git a/fluentinterface/pom.xml b/fluentinterface/pom.xml index a52a3d1c7..a91832786 100644 --- a/fluentinterface/pom.xml +++ b/fluentinterface/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.19.0 + 1.20.0-SNAPSHOT 4.0.0 diff --git a/flux/pom.xml b/flux/pom.xml index 098e816a1..59d105b39 100644 --- a/flux/pom.xml +++ b/flux/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT flux diff --git a/flyweight/pom.xml b/flyweight/pom.xml index 22721ae05..adf675b57 100644 --- a/flyweight/pom.xml +++ b/flyweight/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT flyweight diff --git a/front-controller/pom.xml b/front-controller/pom.xml index e45e17b94..b76852e02 100644 --- a/front-controller/pom.xml +++ b/front-controller/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT front-controller diff --git a/guarded-suspension/pom.xml b/guarded-suspension/pom.xml index de8e29804..6b8b977eb 100644 --- a/guarded-suspension/pom.xml +++ b/guarded-suspension/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT jar guarded-suspension diff --git a/half-sync-half-async/pom.xml b/half-sync-half-async/pom.xml index 777e8e80b..e6df33018 100644 --- a/half-sync-half-async/pom.xml +++ b/half-sync-half-async/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT half-sync-half-async diff --git a/hexagonal/pom.xml b/hexagonal/pom.xml index 294c150ef..e6084ac70 100644 --- a/hexagonal/pom.xml +++ b/hexagonal/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT hexagonal diff --git a/intercepting-filter/pom.xml b/intercepting-filter/pom.xml index 267c5c3cb..658dba671 100644 --- a/intercepting-filter/pom.xml +++ b/intercepting-filter/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT intercepting-filter diff --git a/interpreter/pom.xml b/interpreter/pom.xml index 815d15a37..1e61dfb48 100644 --- a/interpreter/pom.xml +++ b/interpreter/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT interpreter diff --git a/iterator/pom.xml b/iterator/pom.xml index 51e84cac0..6581b8224 100644 --- a/iterator/pom.xml +++ b/iterator/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT iterator diff --git a/layers/pom.xml b/layers/pom.xml index 4283376d4..9ca1c58e7 100644 --- a/layers/pom.xml +++ b/layers/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT com.iluwatar.layers layers diff --git a/lazy-loading/pom.xml b/lazy-loading/pom.xml index c0e3bc8a4..6664ddcc7 100644 --- a/lazy-loading/pom.xml +++ b/lazy-loading/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT lazy-loading diff --git a/marker/pom.xml b/marker/pom.xml index 8f4bb7ae6..138ab0c30 100644 --- a/marker/pom.xml +++ b/marker/pom.xml @@ -24,7 +24,7 @@ java-design-patterns com.iluwatar - 1.19.0 + 1.20.0-SNAPSHOT 4.0.0 diff --git a/mediator/pom.xml b/mediator/pom.xml index 125f5a6c7..77c29adda 100644 --- a/mediator/pom.xml +++ b/mediator/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT mediator diff --git a/memento/pom.xml b/memento/pom.xml index b4fb1d2c4..ad4a55236 100644 --- a/memento/pom.xml +++ b/memento/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT memento diff --git a/message-channel/pom.xml b/message-channel/pom.xml index 2f93cd387..28568e6c6 100644 --- a/message-channel/pom.xml +++ b/message-channel/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT message-channel diff --git a/model-view-controller/pom.xml b/model-view-controller/pom.xml index 89f51086f..89f7bd825 100644 --- a/model-view-controller/pom.xml +++ b/model-view-controller/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT model-view-controller diff --git a/model-view-presenter/pom.xml b/model-view-presenter/pom.xml index f708ebce5..d4db8a633 100644 --- a/model-view-presenter/pom.xml +++ b/model-view-presenter/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT model-view-presenter model-view-presenter diff --git a/module/pom.xml b/module/pom.xml index be5f67743..1b1ecb6af 100644 --- a/module/pom.xml +++ b/module/pom.xml @@ -28,7 +28,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT module diff --git a/monad/pom.xml b/monad/pom.xml index 15303d941..947259602 100644 --- a/monad/pom.xml +++ b/monad/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT monad diff --git a/monostate/pom.xml b/monostate/pom.xml index f8cfc5122..94935cbf0 100644 --- a/monostate/pom.xml +++ b/monostate/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT monostate diff --git a/multiton/pom.xml b/multiton/pom.xml index 990670792..cc5103e74 100644 --- a/multiton/pom.xml +++ b/multiton/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT multiton diff --git a/mute-idiom/pom.xml b/mute-idiom/pom.xml index 18d08e822..ec2935e3c 100644 --- a/mute-idiom/pom.xml +++ b/mute-idiom/pom.xml @@ -21,7 +21,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT mute-idiom diff --git a/mutex/pom.xml b/mutex/pom.xml index 3de74fd6d..84a8f58b6 100644 --- a/mutex/pom.xml +++ b/mutex/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT mutex diff --git a/naked-objects/dom/pom.xml b/naked-objects/dom/pom.xml index 23354d338..9be69d7b2 100644 --- a/naked-objects/dom/pom.xml +++ b/naked-objects/dom/pom.xml @@ -16,7 +16,7 @@ com.iluwatar naked-objects - 1.19.0 + 1.20.0-SNAPSHOT naked-objects-dom diff --git a/naked-objects/fixture/pom.xml b/naked-objects/fixture/pom.xml index 2e78e9c52..ff15d19d8 100644 --- a/naked-objects/fixture/pom.xml +++ b/naked-objects/fixture/pom.xml @@ -16,7 +16,7 @@ com.iluwatar naked-objects - 1.19.0 + 1.20.0-SNAPSHOT naked-objects-fixture diff --git a/naked-objects/integtests/pom.xml b/naked-objects/integtests/pom.xml index 100c10465..20cb9868d 100644 --- a/naked-objects/integtests/pom.xml +++ b/naked-objects/integtests/pom.xml @@ -16,7 +16,7 @@ com.iluwatar naked-objects - 1.19.0 + 1.20.0-SNAPSHOT naked-objects-integtests diff --git a/naked-objects/pom.xml b/naked-objects/pom.xml index 16b993a12..1672bd579 100644 --- a/naked-objects/pom.xml +++ b/naked-objects/pom.xml @@ -15,7 +15,7 @@ java-design-patterns com.iluwatar - 1.19.0 + 1.20.0-SNAPSHOT naked-objects @@ -350,17 +350,17 @@ ${project.groupId} naked-objects-dom - 1.19.0 + 1.20.0-SNAPSHOT ${project.groupId} naked-objects-fixture - 1.19.0 + 1.20.0-SNAPSHOT ${project.groupId} naked-objects-webapp - 1.19.0 + 1.20.0-SNAPSHOT diff --git a/naked-objects/webapp/pom.xml b/naked-objects/webapp/pom.xml index 7a9ab9205..6bc7184b9 100644 --- a/naked-objects/webapp/pom.xml +++ b/naked-objects/webapp/pom.xml @@ -16,7 +16,7 @@ com.iluwatar naked-objects - 1.19.0 + 1.20.0-SNAPSHOT naked-objects-webapp diff --git a/null-object/pom.xml b/null-object/pom.xml index 49e2d5855..b471b86d4 100644 --- a/null-object/pom.xml +++ b/null-object/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT null-object diff --git a/object-mother/pom.xml b/object-mother/pom.xml index e9d0c8205..d59799e0c 100644 --- a/object-mother/pom.xml +++ b/object-mother/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT object-mother diff --git a/object-pool/pom.xml b/object-pool/pom.xml index 3ef4e7dd5..75fa63163 100644 --- a/object-pool/pom.xml +++ b/object-pool/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT object-pool diff --git a/observer/pom.xml b/observer/pom.xml index 5c154e243..3843c60c8 100644 --- a/observer/pom.xml +++ b/observer/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT observer diff --git a/page-object/pom.xml b/page-object/pom.xml index ece7a936c..f14050849 100644 --- a/page-object/pom.xml +++ b/page-object/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT page-object diff --git a/partial-response/pom.xml b/partial-response/pom.xml index b52316c6e..afe04012b 100644 --- a/partial-response/pom.xml +++ b/partial-response/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.19.0 + 1.20.0-SNAPSHOT 4.0.0 diff --git a/poison-pill/pom.xml b/poison-pill/pom.xml index e4d11baa2..2ae5c7b31 100644 --- a/poison-pill/pom.xml +++ b/poison-pill/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT poison-pill diff --git a/pom.xml b/pom.xml index 3e16fa21e..115aefc32 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ 4.0.0 com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT pom 2014 diff --git a/private-class-data/pom.xml b/private-class-data/pom.xml index 09539cda0..570b01935 100644 --- a/private-class-data/pom.xml +++ b/private-class-data/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT private-class-data diff --git a/producer-consumer/pom.xml b/producer-consumer/pom.xml index ff17ffad7..9ef208f99 100644 --- a/producer-consumer/pom.xml +++ b/producer-consumer/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT producer-consumer diff --git a/promise/pom.xml b/promise/pom.xml index c3f5386f1..4ae5566b2 100644 --- a/promise/pom.xml +++ b/promise/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT promise diff --git a/property/pom.xml b/property/pom.xml index c96d56dda..d07153e32 100644 --- a/property/pom.xml +++ b/property/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT property diff --git a/prototype/pom.xml b/prototype/pom.xml index fe434a5ba..9674eabb0 100644 --- a/prototype/pom.xml +++ b/prototype/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT prototype diff --git a/proxy/pom.xml b/proxy/pom.xml index 3e7b78bcc..600285dd1 100644 --- a/proxy/pom.xml +++ b/proxy/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT proxy diff --git a/publish-subscribe/pom.xml b/publish-subscribe/pom.xml index 2e928401a..6edc98dbf 100644 --- a/publish-subscribe/pom.xml +++ b/publish-subscribe/pom.xml @@ -28,7 +28,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT publish-subscribe diff --git a/queue-load-leveling/pom.xml b/queue-load-leveling/pom.xml index dc52a2586..11d178dca 100644 --- a/queue-load-leveling/pom.xml +++ b/queue-load-leveling/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT queue-load-leveling diff --git a/reactor/pom.xml b/reactor/pom.xml index 18d8ab378..f05edc244 100644 --- a/reactor/pom.xml +++ b/reactor/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT reactor diff --git a/reader-writer-lock/pom.xml b/reader-writer-lock/pom.xml index 34be6bc0d..4114c88d3 100644 --- a/reader-writer-lock/pom.xml +++ b/reader-writer-lock/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT reader-writer-lock diff --git a/repository/pom.xml b/repository/pom.xml index 341ffe605..02761f524 100644 --- a/repository/pom.xml +++ b/repository/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT repository diff --git a/resource-acquisition-is-initialization/pom.xml b/resource-acquisition-is-initialization/pom.xml index 5ad223e85..c69db9500 100644 --- a/resource-acquisition-is-initialization/pom.xml +++ b/resource-acquisition-is-initialization/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT resource-acquisition-is-initialization diff --git a/retry/pom.xml b/retry/pom.xml index a79da285c..9999e0c3b 100644 --- a/retry/pom.xml +++ b/retry/pom.xml @@ -26,7 +26,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT retry jar diff --git a/semaphore/pom.xml b/semaphore/pom.xml index 4d86fec77..fc4a6e362 100644 --- a/semaphore/pom.xml +++ b/semaphore/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT semaphore diff --git a/servant/pom.xml b/servant/pom.xml index 5632b1188..d72fde86f 100644 --- a/servant/pom.xml +++ b/servant/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT servant diff --git a/service-layer/pom.xml b/service-layer/pom.xml index 3a04b608e..940629be5 100644 --- a/service-layer/pom.xml +++ b/service-layer/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT service-layer diff --git a/service-locator/pom.xml b/service-locator/pom.xml index 2656e06ad..f78436585 100644 --- a/service-locator/pom.xml +++ b/service-locator/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT service-locator diff --git a/singleton/pom.xml b/singleton/pom.xml index a8a363d9d..2f8a55265 100644 --- a/singleton/pom.xml +++ b/singleton/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT singleton diff --git a/specification/pom.xml b/specification/pom.xml index 4e11ebefa..ddd9ebde4 100644 --- a/specification/pom.xml +++ b/specification/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT specification diff --git a/state/pom.xml b/state/pom.xml index 0dff4fe87..fee910c55 100644 --- a/state/pom.xml +++ b/state/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT state diff --git a/step-builder/pom.xml b/step-builder/pom.xml index 796e1b5ab..0a5d1a560 100644 --- a/step-builder/pom.xml +++ b/step-builder/pom.xml @@ -30,7 +30,7 @@ java-design-patterns com.iluwatar - 1.19.0 + 1.20.0-SNAPSHOT step-builder diff --git a/strategy/pom.xml b/strategy/pom.xml index a6266025a..1ca63da0b 100644 --- a/strategy/pom.xml +++ b/strategy/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT strategy diff --git a/template-method/pom.xml b/template-method/pom.xml index 23b0724c1..4d0703858 100644 --- a/template-method/pom.xml +++ b/template-method/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT template-method diff --git a/thread-pool/pom.xml b/thread-pool/pom.xml index 7b4dc6349..517651596 100644 --- a/thread-pool/pom.xml +++ b/thread-pool/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT thread-pool diff --git a/throttling/pom.xml b/throttling/pom.xml index d52ec9a5b..1d7677c37 100644 --- a/throttling/pom.xml +++ b/throttling/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.19.0 + 1.20.0-SNAPSHOT 4.0.0 diff --git a/tls/pom.xml b/tls/pom.xml index 086a00820..291527967 100644 --- a/tls/pom.xml +++ b/tls/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT tls diff --git a/tolerant-reader/pom.xml b/tolerant-reader/pom.xml index 90d4b2069..adbb4d48e 100644 --- a/tolerant-reader/pom.xml +++ b/tolerant-reader/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT tolerant-reader diff --git a/trampoline/pom.xml b/trampoline/pom.xml index 8ab5a2374..e5d4c25c9 100644 --- a/trampoline/pom.xml +++ b/trampoline/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT trampoline diff --git a/twin/pom.xml b/twin/pom.xml index 490e24cb2..bc9d976aa 100644 --- a/twin/pom.xml +++ b/twin/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT twin diff --git a/unit-of-work/pom.xml b/unit-of-work/pom.xml index 420a2918c..cd6f10a0c 100644 --- a/unit-of-work/pom.xml +++ b/unit-of-work/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.19.0 + 1.20.0-SNAPSHOT 4.0.0 diff --git a/value-object/pom.xml b/value-object/pom.xml index 2b09c0bf2..99ca02195 100644 --- a/value-object/pom.xml +++ b/value-object/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT value-object diff --git a/visitor/pom.xml b/visitor/pom.xml index 8c8e67a08..73c8457ec 100644 --- a/visitor/pom.xml +++ b/visitor/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.19.0 + 1.20.0-SNAPSHOT visitor From 40e5cc628a1a3f5c53ed006f093fb7cddffd5d54 Mon Sep 17 00:00:00 2001 From: Dheeraj Mummareddy Date: Sun, 8 Apr 2018 10:56:10 -0400 Subject: [PATCH 25/30] minor code review comments and Updating license header --- serverless/README.md | 2 +- serverless/pom.xml | 2 +- .../baas/api/AbstractDynamoDbHandler.java | 22 ++++ .../baas/api/FindPersonApiHandler.java | 22 ++++ .../baas/api/SavePersonApiHandler.java | 22 ++++ .../serverless/baas/model/Address.java | 22 ++++ .../serverless/baas/model/Person.java | 22 ++++ .../baas/api/FindPersonApiHandlerTest.java | 72 +++++++++++++ .../baas/api/SavePersonApiHandlerTest.java | 101 ++++++++++++++++++ 9 files changed, 285 insertions(+), 2 deletions(-) create mode 100644 serverless/src/test/java/com/iluwatar/serverless/baas/api/FindPersonApiHandlerTest.java create mode 100644 serverless/src/test/java/com/iluwatar/serverless/baas/api/SavePersonApiHandlerTest.java diff --git a/serverless/README.md b/serverless/README.md index 55391f3ec..b0a29fe66 100644 --- a/serverless/README.md +++ b/serverless/README.md @@ -6,7 +6,7 @@ permalink: /patterns/serverless/ categories: Architectural tags: - Java - - Difficulty-Intermittent + - Difficulty-Intermediate --- ## Serverless diff --git a/serverless/pom.xml b/serverless/pom.xml index 85adbc859..cfaf6f23c 100644 --- a/serverless/pom.xml +++ b/serverless/pom.xml @@ -26,7 +26,7 @@ com.iluwatar java-design-patterns - 1.19.0-SNAPSHOT + 1.20.0-SNAPSHOT diff --git a/serverless/src/main/java/com/iluwatar/serverless/baas/api/AbstractDynamoDbHandler.java b/serverless/src/main/java/com/iluwatar/serverless/baas/api/AbstractDynamoDbHandler.java index 2ff4ad961..ac27a9a4a 100644 --- a/serverless/src/main/java/com/iluwatar/serverless/baas/api/AbstractDynamoDbHandler.java +++ b/serverless/src/main/java/com/iluwatar/serverless/baas/api/AbstractDynamoDbHandler.java @@ -1,3 +1,25 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ package com.iluwatar.serverless.baas.api; import com.amazonaws.regions.Regions; diff --git a/serverless/src/main/java/com/iluwatar/serverless/baas/api/FindPersonApiHandler.java b/serverless/src/main/java/com/iluwatar/serverless/baas/api/FindPersonApiHandler.java index ef7dd3fec..2eb1613f8 100644 --- a/serverless/src/main/java/com/iluwatar/serverless/baas/api/FindPersonApiHandler.java +++ b/serverless/src/main/java/com/iluwatar/serverless/baas/api/FindPersonApiHandler.java @@ -1,3 +1,25 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ package com.iluwatar.serverless.baas.api; import com.amazonaws.services.lambda.runtime.Context; diff --git a/serverless/src/main/java/com/iluwatar/serverless/baas/api/SavePersonApiHandler.java b/serverless/src/main/java/com/iluwatar/serverless/baas/api/SavePersonApiHandler.java index 8817f1e48..f00d28b96 100644 --- a/serverless/src/main/java/com/iluwatar/serverless/baas/api/SavePersonApiHandler.java +++ b/serverless/src/main/java/com/iluwatar/serverless/baas/api/SavePersonApiHandler.java @@ -1,3 +1,25 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ package com.iluwatar.serverless.baas.api; import com.amazonaws.services.lambda.runtime.Context; diff --git a/serverless/src/main/java/com/iluwatar/serverless/baas/model/Address.java b/serverless/src/main/java/com/iluwatar/serverless/baas/model/Address.java index 6d6503df5..7331cea2b 100644 --- a/serverless/src/main/java/com/iluwatar/serverless/baas/model/Address.java +++ b/serverless/src/main/java/com/iluwatar/serverless/baas/model/Address.java @@ -1,3 +1,25 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ package com.iluwatar.serverless.baas.model; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute; diff --git a/serverless/src/main/java/com/iluwatar/serverless/baas/model/Person.java b/serverless/src/main/java/com/iluwatar/serverless/baas/model/Person.java index 82a1c96b1..75604999e 100644 --- a/serverless/src/main/java/com/iluwatar/serverless/baas/model/Person.java +++ b/serverless/src/main/java/com/iluwatar/serverless/baas/model/Person.java @@ -1,3 +1,25 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ package com.iluwatar.serverless.baas.model; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute; diff --git a/serverless/src/test/java/com/iluwatar/serverless/baas/api/FindPersonApiHandlerTest.java b/serverless/src/test/java/com/iluwatar/serverless/baas/api/FindPersonApiHandlerTest.java new file mode 100644 index 000000000..561281ab3 --- /dev/null +++ b/serverless/src/test/java/com/iluwatar/serverless/baas/api/FindPersonApiHandlerTest.java @@ -0,0 +1,72 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.serverless.baas.api; + +import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent; +import com.iluwatar.serverless.baas.api.FindPersonApiHandler; +import com.iluwatar.serverless.baas.api.SavePersonApiHandler; +import com.iluwatar.serverless.baas.model.Person; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; + +import java.util.Collections; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +/** + * Unit tests for FindPersonApiHandler + * Created by dheeraj.mummar on 3/5/18. + */ +@RunWith(MockitoJUnitRunner.class) +public class FindPersonApiHandlerTest { + + private FindPersonApiHandler findPersonApiHandler; + + @Mock + private DynamoDBMapper dynamoDbMapper; + + @Before + public void setUp() { + this.findPersonApiHandler = new FindPersonApiHandler(); + this.findPersonApiHandler.setDynamoDbMapper(dynamoDbMapper); + } + + @Test + public void handleRequest() { + findPersonApiHandler.handleRequest(apiGatewayProxyRequestEvent(), mock(Context.class)); + verify(dynamoDbMapper, times(1)).load(Person.class, "37e7a1fe-3544-473d-b764-18128f02d72d"); + } + + private APIGatewayProxyRequestEvent apiGatewayProxyRequestEvent() { + return new APIGatewayProxyRequestEvent() + .withPathParamters(Collections + .singletonMap("id", "37e7a1fe-3544-473d-b764-18128f02d72d")); + } +} diff --git a/serverless/src/test/java/com/iluwatar/serverless/baas/api/SavePersonApiHandlerTest.java b/serverless/src/test/java/com/iluwatar/serverless/baas/api/SavePersonApiHandlerTest.java new file mode 100644 index 000000000..83008bdff --- /dev/null +++ b/serverless/src/test/java/com/iluwatar/serverless/baas/api/SavePersonApiHandlerTest.java @@ -0,0 +1,101 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.serverless.baas.api; + +import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent; +import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.iluwatar.serverless.baas.api.SavePersonApiHandler; +import com.iluwatar.serverless.baas.model.Address; +import com.iluwatar.serverless.baas.model.Person; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; + +import static org.mockito.Mockito.*; + +/** + * Unit tests for SavePersonApiHandler + * Created by dheeraj.mummar on 3/4/18. + */ +@RunWith(MockitoJUnitRunner.class) +public class SavePersonApiHandlerTest { + + private SavePersonApiHandler savePersonApiHandler; + + @Mock + private DynamoDBMapper dynamoDbMapper; + + private ObjectMapper objectMapper = new ObjectMapper(); + + @Before + public void setUp() { + this.savePersonApiHandler = new SavePersonApiHandler(); + this.savePersonApiHandler.setDynamoDbMapper(dynamoDbMapper); + } + + @Test + public void handleRequestSavePersonSuccessful() throws JsonProcessingException { + Person person = newPerson(); + APIGatewayProxyResponseEvent apiGatewayProxyResponseEvent = + this.savePersonApiHandler + .handleRequest(apiGatewayProxyRequestEvent(objectMapper.writeValueAsString(person)), mock(Context.class)); + verify(dynamoDbMapper, times(1)).save(person); + Assert.assertNotNull(apiGatewayProxyResponseEvent); + Assert.assertEquals(new Integer(201), apiGatewayProxyResponseEvent.getStatusCode()); + } + + @Test + public void handleRequestSavePersonException() { + APIGatewayProxyResponseEvent apiGatewayProxyResponseEvent = + this.savePersonApiHandler + .handleRequest(apiGatewayProxyRequestEvent("invalid sample request"), mock(Context.class)); + Assert.assertNotNull(apiGatewayProxyResponseEvent); + Assert.assertEquals(new Integer(400), apiGatewayProxyResponseEvent.getStatusCode()); + } + + private APIGatewayProxyRequestEvent apiGatewayProxyRequestEvent(String body) { + APIGatewayProxyRequestEvent apiGatewayProxyRequestEvent = new APIGatewayProxyRequestEvent(); + return apiGatewayProxyRequestEvent.withBody(body); + } + + private Person newPerson() { + Person person = new Person(); + person.setFirstName("Thor"); + person.setLastName("Odinson"); + Address address = new Address(); + address.setAddressLineOne("1 Odin ln"); + address.setCity("Asgard"); + address.setState("country of the Gods"); + address.setZipCode("00001"); + person.setAddress(address); + + return person; + } +} From 522fbc035fe319fbf6fad58579fdf36491babe18 Mon Sep 17 00:00:00 2001 From: Dheeraj Mummareddy Date: Sun, 8 Apr 2018 10:56:48 -0400 Subject: [PATCH 26/30] delete the incorrect package --- .../baas/api/FindPersonApiHandlerTest.java | 50 ------------ .../baas/api/SavePersonApiHandlerTest.java | 79 ------------------- 2 files changed, 129 deletions(-) delete mode 100644 serverless/src/test/java/com/illuwatar/serverless/baas/api/FindPersonApiHandlerTest.java delete mode 100644 serverless/src/test/java/com/illuwatar/serverless/baas/api/SavePersonApiHandlerTest.java diff --git a/serverless/src/test/java/com/illuwatar/serverless/baas/api/FindPersonApiHandlerTest.java b/serverless/src/test/java/com/illuwatar/serverless/baas/api/FindPersonApiHandlerTest.java deleted file mode 100644 index fbc1e75c9..000000000 --- a/serverless/src/test/java/com/illuwatar/serverless/baas/api/FindPersonApiHandlerTest.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.illuwatar.serverless.baas.api; - -import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper; -import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent; -import com.iluwatar.serverless.baas.api.FindPersonApiHandler; -import com.iluwatar.serverless.baas.api.SavePersonApiHandler; -import com.iluwatar.serverless.baas.model.Person; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.runners.MockitoJUnitRunner; - -import java.util.Collections; - -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; - -/** - * Unit tests for FindPersonApiHandler - * Created by dheeraj.mummar on 3/5/18. - */ -@RunWith(MockitoJUnitRunner.class) -public class FindPersonApiHandlerTest { - - private FindPersonApiHandler findPersonApiHandler; - - @Mock - private DynamoDBMapper dynamoDbMapper; - - @Before - public void setUp() { - this.findPersonApiHandler = new FindPersonApiHandler(); - this.findPersonApiHandler.setDynamoDbMapper(dynamoDbMapper); - } - - @Test - public void handleRequest() { - findPersonApiHandler.handleRequest(apiGatewayProxyRequestEvent(), mock(Context.class)); - verify(dynamoDbMapper, times(1)).load(Person.class, "37e7a1fe-3544-473d-b764-18128f02d72d"); - } - - private APIGatewayProxyRequestEvent apiGatewayProxyRequestEvent() { - return new APIGatewayProxyRequestEvent() - .withPathParamters(Collections - .singletonMap("id", "37e7a1fe-3544-473d-b764-18128f02d72d")); - } -} diff --git a/serverless/src/test/java/com/illuwatar/serverless/baas/api/SavePersonApiHandlerTest.java b/serverless/src/test/java/com/illuwatar/serverless/baas/api/SavePersonApiHandlerTest.java deleted file mode 100644 index 02b2b729d..000000000 --- a/serverless/src/test/java/com/illuwatar/serverless/baas/api/SavePersonApiHandlerTest.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.illuwatar.serverless.baas.api; - -import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper; -import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent; -import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.iluwatar.serverless.baas.api.SavePersonApiHandler; -import com.iluwatar.serverless.baas.model.Address; -import com.iluwatar.serverless.baas.model.Person; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.runners.MockitoJUnitRunner; - -import static org.mockito.Mockito.*; - -/** - * Unit tests for SavePersonApiHandler - * Created by dheeraj.mummar on 3/4/18. - */ -@RunWith(MockitoJUnitRunner.class) -public class SavePersonApiHandlerTest { - - private SavePersonApiHandler savePersonApiHandler; - - @Mock - private DynamoDBMapper dynamoDbMapper; - - private ObjectMapper objectMapper = new ObjectMapper(); - - @Before - public void setUp() { - this.savePersonApiHandler = new SavePersonApiHandler(); - this.savePersonApiHandler.setDynamoDbMapper(dynamoDbMapper); - } - - @Test - public void handleRequestSavePersonSuccessful() throws JsonProcessingException { - Person person = newPerson(); - APIGatewayProxyResponseEvent apiGatewayProxyResponseEvent = - this.savePersonApiHandler - .handleRequest(apiGatewayProxyRequestEvent(objectMapper.writeValueAsString(person)), mock(Context.class)); - verify(dynamoDbMapper, times(1)).save(person); - Assert.assertNotNull(apiGatewayProxyResponseEvent); - Assert.assertEquals(new Integer(201), apiGatewayProxyResponseEvent.getStatusCode()); - } - - @Test - public void handleRequestSavePersonException() { - APIGatewayProxyResponseEvent apiGatewayProxyResponseEvent = - this.savePersonApiHandler - .handleRequest(apiGatewayProxyRequestEvent("invalid sample request"), mock(Context.class)); - Assert.assertNotNull(apiGatewayProxyResponseEvent); - Assert.assertEquals(new Integer(400), apiGatewayProxyResponseEvent.getStatusCode()); - } - - private APIGatewayProxyRequestEvent apiGatewayProxyRequestEvent(String body) { - APIGatewayProxyRequestEvent apiGatewayProxyRequestEvent = new APIGatewayProxyRequestEvent(); - return apiGatewayProxyRequestEvent.withBody(body); - } - - private Person newPerson() { - Person person = new Person(); - person.setFirstName("Thor"); - person.setLastName("Odinson"); - Address address = new Address(); - address.setAddressLineOne("1 Odin ln"); - address.setCity("Asgard"); - address.setState("country of the Gods"); - address.setZipCode("00001"); - person.setAddress(address); - - return person; - } -} From 0b7343dd345f314d02b2c21ea69b84a02ac2c94f Mon Sep 17 00:00:00 2001 From: Michael Ernst Date: Mon, 9 Apr 2018 16:38:09 -0700 Subject: [PATCH 27/30] Correct the command for computing code coverage --- CODE_COVERAGE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CODE_COVERAGE.md b/CODE_COVERAGE.md index 589c7ad79..d1ce7afd2 100644 --- a/CODE_COVERAGE.md +++ b/CODE_COVERAGE.md @@ -1,7 +1,7 @@ # Code Coverage Report generation To generate the code coverage report, execute the following command: -> mvn clean verify +> mvn clean verify jacoco:report This will generate code coverage report in each of the modules. In order to view the same, open the following file in your browser. > target/site/jacoco/index.html From 65e1cae2decfc1b86481eb40607eac0e23b64b0c Mon Sep 17 00:00:00 2001 From: MottoX Date: Wed, 11 Apr 2018 16:11:37 +0800 Subject: [PATCH 28/30] Cleanup unnecessary code --- .../main/java/com/iluwatar/reactor/framework/NioReactor.java | 5 +---- .../iluwatar/reactor/framework/NioServerSocketChannel.java | 4 ++-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/reactor/src/main/java/com/iluwatar/reactor/framework/NioReactor.java b/reactor/src/main/java/com/iluwatar/reactor/framework/NioReactor.java index a315389a3..7fcffa0ac 100644 --- a/reactor/src/main/java/com/iluwatar/reactor/framework/NioReactor.java +++ b/reactor/src/main/java/com/iluwatar/reactor/framework/NioReactor.java @@ -84,11 +84,8 @@ public class NioReactor { /** * Starts the reactor event loop in a new thread. - * - * @throws IOException - * if any I/O error occurs. */ - public void start() throws IOException { + public void start() { reactorMain.execute(() -> { try { LOGGER.info("Reactor started, waiting for events..."); diff --git a/reactor/src/main/java/com/iluwatar/reactor/framework/NioServerSocketChannel.java b/reactor/src/main/java/com/iluwatar/reactor/framework/NioServerSocketChannel.java index 4721d292a..1d91c4eb7 100644 --- a/reactor/src/main/java/com/iluwatar/reactor/framework/NioServerSocketChannel.java +++ b/reactor/src/main/java/com/iluwatar/reactor/framework/NioServerSocketChannel.java @@ -98,9 +98,9 @@ public class NioServerSocketChannel extends AbstractNioChannel { */ @Override public void bind() throws IOException { - ((ServerSocketChannel) getJavaChannel()).socket().bind( + getJavaChannel().socket().bind( new InetSocketAddress(InetAddress.getLocalHost(), port)); - ((ServerSocketChannel) getJavaChannel()).configureBlocking(false); + getJavaChannel().configureBlocking(false); LOGGER.info("Bound TCP socket at port: {}", port); } From 3b45f2cad666726f06f14347026cc25a05051246 Mon Sep 17 00:00:00 2001 From: Milena Sapunova Date: Thu, 12 Apr 2018 15:24:57 +0300 Subject: [PATCH 29/30] Consistent naming for EIP patterns #733 --- {message-channel => eip-message-channel}/.gitignore | 0 {message-channel => eip-message-channel}/README.md | 6 +++--- .../etc/message-channel.png | Bin .../etc/message-channel.ucls | 0 {message-channel => eip-message-channel}/pom.xml | 2 +- .../java/com/iluwatar/eip}/message/channel/App.java | 2 +- .../com/iluwatar/eip/message/channel}/AppTest.java | 2 +- .../.gitignore | 0 .../README.md | 6 +++--- .../etc/publish-subscribe.png | Bin .../etc/publish-subscribe.ucls | 0 .../pom.xml | 4 ++-- .../com/iluwatar/eip}/publish/subscribe/App.java | 2 +- .../src/main/resources/logback.xml | 0 .../iluwatar/eip/publish/subscribe}/AppTest.java | 2 +- pom.xml | 6 +++--- 16 files changed, 16 insertions(+), 16 deletions(-) rename {message-channel => eip-message-channel}/.gitignore (100%) rename {message-channel => eip-message-channel}/README.md (84%) rename {message-channel => eip-message-channel}/etc/message-channel.png (100%) rename {message-channel => eip-message-channel}/etc/message-channel.ucls (100%) rename {message-channel => eip-message-channel}/pom.xml (97%) rename {message-channel/src/main/java/com/iluwatar => eip-message-channel/src/main/java/com/iluwatar/eip}/message/channel/App.java (98%) rename {publish-subscribe/src/test/java/com/iluwatar/publish/subscribe => eip-message-channel/src/test/java/com/iluwatar/eip/message/channel}/AppTest.java (96%) rename {publish-subscribe => eip-publish-subscribe}/.gitignore (100%) rename {publish-subscribe => eip-publish-subscribe}/README.md (83%) rename {publish-subscribe => eip-publish-subscribe}/etc/publish-subscribe.png (100%) rename {publish-subscribe => eip-publish-subscribe}/etc/publish-subscribe.ucls (100%) rename {publish-subscribe => eip-publish-subscribe}/pom.xml (97%) rename {publish-subscribe/src/main/java/com/iluwatar => eip-publish-subscribe/src/main/java/com/iluwatar/eip}/publish/subscribe/App.java (98%) rename {publish-subscribe => eip-publish-subscribe}/src/main/resources/logback.xml (100%) rename {message-channel/src/test/java/com/iluwatar/message/channel => eip-publish-subscribe/src/test/java/com/iluwatar/eip/publish/subscribe}/AppTest.java (96%) diff --git a/message-channel/.gitignore b/eip-message-channel/.gitignore similarity index 100% rename from message-channel/.gitignore rename to eip-message-channel/.gitignore diff --git a/message-channel/README.md b/eip-message-channel/README.md similarity index 84% rename from message-channel/README.md rename to eip-message-channel/README.md index 09361dd4a..606619619 100644 --- a/message-channel/README.md +++ b/eip-message-channel/README.md @@ -1,8 +1,8 @@ --- layout: pattern -title: Message Channel -folder: message-channel -permalink: /patterns/message-channel/ +title: EIP Message Channel +folder: eip-message-channel +permalink: /patterns/eip-message-channel/ categories: Integration tags: - Java diff --git a/message-channel/etc/message-channel.png b/eip-message-channel/etc/message-channel.png similarity index 100% rename from message-channel/etc/message-channel.png rename to eip-message-channel/etc/message-channel.png diff --git a/message-channel/etc/message-channel.ucls b/eip-message-channel/etc/message-channel.ucls similarity index 100% rename from message-channel/etc/message-channel.ucls rename to eip-message-channel/etc/message-channel.ucls diff --git a/message-channel/pom.xml b/eip-message-channel/pom.xml similarity index 97% rename from message-channel/pom.xml rename to eip-message-channel/pom.xml index 28568e6c6..84cde7e2e 100644 --- a/message-channel/pom.xml +++ b/eip-message-channel/pom.xml @@ -32,7 +32,7 @@ java-design-patterns 1.20.0-SNAPSHOT - message-channel + eip-message-channel org.apache.camel diff --git a/message-channel/src/main/java/com/iluwatar/message/channel/App.java b/eip-message-channel/src/main/java/com/iluwatar/eip/message/channel/App.java similarity index 98% rename from message-channel/src/main/java/com/iluwatar/message/channel/App.java rename to eip-message-channel/src/main/java/com/iluwatar/eip/message/channel/App.java index d2974e20b..d5929d0db 100644 --- a/message-channel/src/main/java/com/iluwatar/message/channel/App.java +++ b/eip-message-channel/src/main/java/com/iluwatar/eip/message/channel/App.java @@ -20,7 +20,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.iluwatar.message.channel; +package com.iluwatar.eip.message.channel; import org.apache.camel.CamelContext; import org.apache.camel.builder.RouteBuilder; diff --git a/publish-subscribe/src/test/java/com/iluwatar/publish/subscribe/AppTest.java b/eip-message-channel/src/test/java/com/iluwatar/eip/message/channel/AppTest.java similarity index 96% rename from publish-subscribe/src/test/java/com/iluwatar/publish/subscribe/AppTest.java rename to eip-message-channel/src/test/java/com/iluwatar/eip/message/channel/AppTest.java index 128385faf..127f427b8 100644 --- a/publish-subscribe/src/test/java/com/iluwatar/publish/subscribe/AppTest.java +++ b/eip-message-channel/src/test/java/com/iluwatar/eip/message/channel/AppTest.java @@ -20,7 +20,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.iluwatar.publish.subscribe; +package com.iluwatar.eip.message.channel; import org.junit.jupiter.api.Test; diff --git a/publish-subscribe/.gitignore b/eip-publish-subscribe/.gitignore similarity index 100% rename from publish-subscribe/.gitignore rename to eip-publish-subscribe/.gitignore diff --git a/publish-subscribe/README.md b/eip-publish-subscribe/README.md similarity index 83% rename from publish-subscribe/README.md rename to eip-publish-subscribe/README.md index 462209074..90ac02c9b 100644 --- a/publish-subscribe/README.md +++ b/eip-publish-subscribe/README.md @@ -1,8 +1,8 @@ --- layout: pattern -title: Publish Subscribe -folder: publish-subscribe -permalink: /patterns/publish-subscribe/ +title: EIP Publish Subscribe +folder: eip-publish-subscribe +permalink: /patterns/eip-publish-subscribe/ categories: Integration tags: - Java diff --git a/publish-subscribe/etc/publish-subscribe.png b/eip-publish-subscribe/etc/publish-subscribe.png similarity index 100% rename from publish-subscribe/etc/publish-subscribe.png rename to eip-publish-subscribe/etc/publish-subscribe.png diff --git a/publish-subscribe/etc/publish-subscribe.ucls b/eip-publish-subscribe/etc/publish-subscribe.ucls similarity index 100% rename from publish-subscribe/etc/publish-subscribe.ucls rename to eip-publish-subscribe/etc/publish-subscribe.ucls diff --git a/publish-subscribe/pom.xml b/eip-publish-subscribe/pom.xml similarity index 97% rename from publish-subscribe/pom.xml rename to eip-publish-subscribe/pom.xml index 6edc98dbf..82763b22b 100644 --- a/publish-subscribe/pom.xml +++ b/eip-publish-subscribe/pom.xml @@ -30,7 +30,7 @@ java-design-patterns 1.20.0-SNAPSHOT - publish-subscribe + eip-publish-subscribe org.apache.camel @@ -51,4 +51,4 @@ test - \ No newline at end of file + diff --git a/publish-subscribe/src/main/java/com/iluwatar/publish/subscribe/App.java b/eip-publish-subscribe/src/main/java/com/iluwatar/eip/publish/subscribe/App.java similarity index 98% rename from publish-subscribe/src/main/java/com/iluwatar/publish/subscribe/App.java rename to eip-publish-subscribe/src/main/java/com/iluwatar/eip/publish/subscribe/App.java index d642846fb..7c7e77a18 100644 --- a/publish-subscribe/src/main/java/com/iluwatar/publish/subscribe/App.java +++ b/eip-publish-subscribe/src/main/java/com/iluwatar/eip/publish/subscribe/App.java @@ -20,7 +20,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.iluwatar.publish.subscribe; +package com.iluwatar.eip.publish.subscribe; import org.apache.camel.CamelContext; import org.apache.camel.ProducerTemplate; diff --git a/publish-subscribe/src/main/resources/logback.xml b/eip-publish-subscribe/src/main/resources/logback.xml similarity index 100% rename from publish-subscribe/src/main/resources/logback.xml rename to eip-publish-subscribe/src/main/resources/logback.xml diff --git a/message-channel/src/test/java/com/iluwatar/message/channel/AppTest.java b/eip-publish-subscribe/src/test/java/com/iluwatar/eip/publish/subscribe/AppTest.java similarity index 96% rename from message-channel/src/test/java/com/iluwatar/message/channel/AppTest.java rename to eip-publish-subscribe/src/test/java/com/iluwatar/eip/publish/subscribe/AppTest.java index 97094b864..783c796ac 100644 --- a/message-channel/src/test/java/com/iluwatar/message/channel/AppTest.java +++ b/eip-publish-subscribe/src/test/java/com/iluwatar/eip/publish/subscribe/AppTest.java @@ -20,7 +20,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.iluwatar.message.channel; +package com.iluwatar.eip.publish.subscribe; import org.junit.jupiter.api.Test; diff --git a/pom.xml b/pom.xml index 7f1ff2208..965c8f37c 100644 --- a/pom.xml +++ b/pom.xml @@ -117,11 +117,11 @@ business-delegate half-sync-half-async layers - message-channel + eip-message-channel fluentinterface reactor caching - publish-subscribe + eip-publish-subscribe delegation event-driven-architecture api-gateway @@ -475,4 +475,4 @@ - \ No newline at end of file + From a8d89ca861c51d6610b278ea1a0c778ff48d9f78 Mon Sep 17 00:00:00 2001 From: pelmegov Date: Sat, 28 Apr 2018 19:34:57 +0300 Subject: [PATCH 30/30] Parameters in Converter class methods was renamed. A base class must not contain the concrete entities names or concrete class names --- .../com/iluwatar/converter/Converter.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/converter/src/main/java/com/iluwatar/converter/Converter.java b/converter/src/main/java/com/iluwatar/converter/Converter.java index 918d2d503..4a2bb7381 100644 --- a/converter/src/main/java/com/iluwatar/converter/Converter.java +++ b/converter/src/main/java/com/iluwatar/converter/Converter.java @@ -50,37 +50,37 @@ public class Converter { } /** - * @param userDto DTO entity + * @param dto DTO entity * @return The domain representation - the result of the converting function application on dto entity. */ - public final U convertFromDto(final T userDto) { - return fromDto.apply(userDto); + public final U convertFromDto(final T dto) { + return fromDto.apply(dto); } /** - * @param user domain entity + * @param entity domain entity * @return The DTO representation - the result of the converting function application on domain entity. */ - public final T convertFromEntity(final U user) { - return fromEntity.apply(user); + public final T convertFromEntity(final U entity) { + return fromEntity.apply(entity); } /** - * @param dtoUsers collection of DTO entities + * @param dtos collection of DTO entities * @return List of domain representation of provided entities retrieved by * mapping each of them with the conversion function */ - public final List createFromDtos(final Collection dtoUsers) { - return dtoUsers.stream().map(this::convertFromDto).collect(Collectors.toList()); + public final List createFromDtos(final Collection dtos) { + return dtos.stream().map(this::convertFromDto).collect(Collectors.toList()); } /** - * @param users collection of domain entities + * @param entities collection of domain entities * @return List of domain representation of provided entities retrieved by * mapping each of them with the conversion function */ - public final List createFromEntities(final Collection users) { - return users.stream().map(this::convertFromEntity).collect(Collectors.toList()); + public final List createFromEntities(final Collection entities) { + return entities.stream().map(this::convertFromEntity).collect(Collectors.toList()); } }